Metadata-Version: 2.5
Name: dikolab-horde
Version: 0.0.2
Summary: A task runner for polyglot monorepos. The CLI is called horde.
Project-URL: Homepage, https://diko316.gitlab.io/dikolab-horde/
Project-URL: Documentation, https://diko316.gitlab.io/dikolab-horde/
Project-URL: Funding, https://paypal.me/dikolab
Author-email: Diko TechSlave <diko316@gmail.com>
License-Expression: AGPL-3.0-or-later
License-File: LICENSE
Keywords: build,cli,monorepo,task-runner,uv,workspace
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Topic :: Software Development :: Build Tools
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: dikolab-horde-common>=0.0.2
Requires-Dist: dikolab-horde-ipc>=0.0.2
Description-Content-Type: text/markdown

<img src="https://diko316.gitlab.io/dikolab-horde/assets/horde-logo.png" alt="horde" width="140">

# dikolab-horde

**One CLI for a repository that speaks several languages.** Horde is a task
runner for polyglot monorepos: it dispatches a command to a plugin and brokers
every effect that plugin asks for. The plugin decides *what* should happen,
horde decides *whether* it happens, and horde is the only side that touches your
disk — which is what lets a failed run undo itself completely.

Install this if you want the `horde` command. Writing a plugin instead? You want
[dikolab-horde-sdk](https://pypi.org/project/dikolab-horde-sdk/).

> **Status: alpha.** All four plugins — Python, Rust, TypeScript and C — are
> implemented and published. `0.0.2` adds `--debug`, a build cache that notices
> a deleted artifact, and a rollback that no longer removes packages it never
> touched. The interfaces may still move.

## Prerequisites

- Python 3.11 or newer
- The toolchain for each language you use — `uv`, `cargo`, `node`, `cmake` —
  on your `PATH`. **Horde never installs a toolchain**; it checks and refuses.

## Getting started

```sh
pip install dikolab-horde
horde init
```

```
created horde.toml
created .gitignore
created .editorconfig
created .env
created .horde
created .venv
```

`.env` is created in the same step that gitignores it, so a credential can never
land in a file that is not yet ignored.

Add a plugin. This installs it **and** registers it — a plugin missing from
`horde.toml` is invisible to horde however you installed it:

```sh
horde use python
```

```
installed python
registered [plugin.python] in horde.toml
```

Then scaffold a package and work on it:

```sh
horde python create toolkit --type lib --publishable
horde python build toolkit
horde python lint toolkit
```

```
created lib toolkit in python/toolkit
built toolkit into dist/wheels/toolkit
ruff, mypy passed
```

The same commands work for a Rust crate, a TypeScript package or a C library —
only the plugin name changes.

### Two kinds of command

Horde runs five itself: `init`, `use`, `unuse`, `list`, `replay`. Everything
else is routed to a plugin as `horde <plugin> <command>`, from the ten names
horde knows — `configure`, `create`, `list`, `bump`, `lint`, `test`, `build`,
`run`, `publish`, `delete`.

Three of those do more than route: `build`, `test` and `run` resolve the
dependency graph first and build what your target needs, **across plugins**. So
a TypeScript package can depend on a Rust crate, and one command builds both in
order:

```toml
# typescript/api/horde-package.toml
depends_on = ["rust:wasm-core"]
```

### When something goes wrong

```sh
horde -v python build      # what did my build print?
horde --debug python build # what is horde itself doing?
```

A failed run rolls back — including files the build tools wrote, not only the
ones a plugin asked horde to write.

**Full command reference, guides and the authoring manual:**
https://diko316.gitlab.io/dikolab-horde/cli/

## Documentation

- [Start here](https://diko316.gitlab.io/dikolab-horde/guide/) — install, your first workspace, the ten commands
- [Command reference](https://diko316.gitlab.io/dikolab-horde/cli/) — every command, every flag, the exit codes
- [Manual](https://diko316.gitlab.io/dikolab-horde/dikolab-horde/manual/)
- [Release notes](https://diko316.gitlab.io/dikolab-horde/dikolab-horde/release-notes/)

## Support

If horde saves you time, you can support its development:
https://paypal.me/dikolab

---

© 2025–2026 dikolab. Released under the GNU Affero General Public License v3.0 or later.
