# cumulus (Rust CLI)
Standalone, dependency-free Rust build of the **cumulus-sdd** framework. All
prompts, spec templates, and agent personas are embedded into the binary at
compile time via `include_str!` — the binary *is* the framework distribution.
No runtime, no network, no external crates.
## Build & install
Install as a global command (`cargo install` drops it into `~/.cargo/bin/`,
which is on your `PATH`). Two interchangeable names are produced — `cumulus`
and `cumulus-sdd`:
```bash
cargo install --path . # → cumulus, cumulus-sdd on PATH
```
Build without installing:
```bash
cargo build --release # → target/release/{cumulus,cumulus-sdd}
```
> `cargo build` alone does not add the binary to `PATH`. Re-run
> `cargo install --path .` after editing any `agents/` or `templates/`
> file to refresh the embedded copies. For a system-wide command:
> `sudo install -m755 ~/.cargo/bin/cumulus-sdd /usr/local/bin/cumulus-sdd`.
## Commands
### `cumulus-sdd init`
Writes the embedded framework into the current repo and scaffolds specs dir:
```
.cumulus-sdd/agents/*.md # analyst / architect / developer / qa personas
.cumulus-sdd/templates/*.md # brief / prd / arch / story schemas
.cumulus-sdd/templates/skills/ # portable slash-command sources
docs/sdd/ (+ stories/) # generated specs live here
```
### `cumulus-sdd skills [target]`
Transforms the embedded skill sources into target-native slash commands.
`target` ∈ `copilot | claude | gemini | all` (default `all`).
| copilot | `.github/prompts/<name>.prompt.md` | `${input:storyId:story-id}` |
| claude | `.claude/skills/<name>/SKILL.md` | `$ARGUMENTS` |
| gemini | `.gemini/commands/<name>.toml` | `{{args}}` |
Generated commands: `/create-project-context`, `/prd-review`,
`/create-sprint`, `/create-story`, `/implement-story <id>`,
`/code-review <id>`.
## Source of truth
Skill definitions live in `templates/skills/*.md` (portable frontmatter +
caveman-dense body, `{{ARG}}` placeholder). Editing those `.md` files and
rebuilding is all that's needed — the embedded copies are refreshed at compile
time via `include_str!`.