Documentation
Everything the engine does is reachable from one CLI and one server-rendered board.
Getting started
Install the CLI, provision a board, put a card on it, and drain it with real workers. init verifies that row-level security is actually enforced rather than merely declared — a check worth having, because a board that believes it is isolated and is not is the worst of both states.
Quick start
brew install interlock/tap/cooddee
cooddee init # provision the schema, verify RLS
cooddee add "Fix the flaky reclaim test" \
--repo /srv/repos/my-service \
--done-when "pytest tests -q"
cooddee board # show the board
cooddee run --agent claude # drain it with real workers
| Command | What it does |
|---|---|
init | Provision the schema and verify RLS enforcement |
add | Place a card on the board |
author | Decompose a goal into validated cards |
board | Show the board |
run | Drain the board with real workers |
cost | Inspect spend against the ceiling |
land | Land cards that passed but have not merged |
reap | Remove worktrees with no live claim |
sync | Two-way issue-tracker synchronisation |
memory | Inspect the episode store |
ui | Serve the board UI |
Choosing a driver
run --agent accepts claude, codex, gemini or openrouter. The first three drive the vendor's own CLI; OpenRouter reaches 200+ models across Anthropic, OpenAI, Google, Meta and Mistral behind a single key.
Model choice per role is separate: --builder-model and --reviewer-model let a cheap model build while a stronger one reviews.
Running continuously
run --watch keeps the fleet alive across a dry board, re-checking every few seconds (--watch-poll-seconds, default 5) instead of exiting when work runs out.
The poll is a backstop rather than the mechanism: a transition made by any process — this one, the UI, another CLI — becomes visible on the next pass, with no cross-process message bus required.