<div align="center">
<pre>
_ _ _ ___ ___ ___
| | | || . || . \| . \
| | | || || /| | |
|__/_/ |_|_||_\_\|___/
</pre>
**GitHub repository management as infrastructure-as-code.**
[](https://rust-lang.org)
[](LICENSE)
[](https://github.com/OriginalMHV/Ward/actions)
[](https://crates.io/crates/ward-cli)
[Install](#install) · [Quick Start](#quick-start) · [Docs](#documentation) · [Contributing](CONTRIBUTING.md)
</div>
────────────────────────────────────────
## What is Ward?
Ward is a Rust CLI that treats GitHub repository management as infrastructure-as-code. Declare your desired state in `ward.toml`, diff it against reality, apply changes, and verify the result. No shell scripts, no cloning, no guessing.
## Install
```bash
# from crates.io (recommended)
cargo install ward-cli
# homebrew (macOS / Linux)
brew install OriginalMHV/tap/ward-cli
# shell script (macOS / Linux)
# powershell (Windows)
# from source
git clone https://github.com/OriginalMHV/Ward.git
cd Ward && cargo install --path .
```
Requires Rust >= 1.85 (source install only) and a GitHub token (`GH_TOKEN`, `GITHUB_TOKEN`, or `gh auth token`).
Token scopes needed: `repo`, `read:org`, `workflow`.
<details>
<summary><b>Shell completions</b></summary>
```bash
ward completions bash > ~/.bash_completion.d/ward
ward completions zsh > ~/.zfunc/_ward
ward completions fish > ~/.config/fish/completions/ward.fish
```
</details>
## Quick Start
```bash
ward init # interactive setup wizard
vim ward.toml # review and adjust config
ward repos list --system backend # see what's out there
ward security plan --system backend # dry-run: what would change?
ward security apply --system backend # apply + auto-verify
```
Use `ward init --non-interactive` to scaffold a minimal `ward.toml` without the wizard.
## Documentation
| [Configuration](docs/configuration.md) | `ward.toml` format, systems, overrides |
| [Commands](docs/commands.md) | Full CLI reference |
| [Templates](docs/templates.md) | Built-in and custom Tera templates |
| [TUI Dashboard](docs/tui.md) | Interactive terminal interface |
| [CI Integration](docs/ci-integration.md) | Using Ward in GitHub Actions |
| [Architecture](docs/architecture.md) | How Ward works under the hood |
## How it works
```
Plan (read) → Apply (write) → Verify (read)
Diff current Execute with Re-read from API,
vs desired audit logging confirm match
```
- **No git cloning** -- file commits use the Git Trees API (blob, tree, commit, update ref). Atomic, no filesystem side effects.
- **Idempotent** -- detects existing state and skips what's already done.
- **Audit log** -- every mutation logged to `~/.ward/audit.log` as JSON lines. Query with `jq`.
- **Custom templates** -- place `.tera` files in `~/.ward/templates/` to add or override built-in templates. Uses [Tera](https://keats.github.io/tera/) (Jinja2-compatible).
────────────────────────────────────────
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md) for setup and workflow details.
```bash
cargo fmt && cargo clippy --tests -- -D warnings && cargo test
```
## License
MIT. See [LICENSE](LICENSE).