CLI Reference
canopy [command] [options]
Running canopy with no command opens the TUI (running setup
first if needed, and checking for updates).
Daemon
| Command | Description |
|---|---|
canopy daemon start |
Start the daemon (MCP server, scheduler, watchers) |
canopy daemon stop |
Stop the daemon |
canopy daemon status |
Show daemon status |
canopy daemon restart |
Restart the daemon |
canopy daemon logs |
Show the daemon log |
canopy daemon install-service |
Register as a system service |
canopy daemon uninstall-service |
Remove the system service |
Setup & diagnostics
| Command | Description |
|---|---|
canopy setup |
Interactive setup wizard — detects AI CLIs, generates ~/.canopy/config.toml |
canopy setup --local-registry <path> |
Use a local registry directory (for registry development) |
canopy mcp |
MCP wizard — sync/add/remove canopy’s MCP entry across platforms |
canopy doctor |
Full health diagnostics |
Loop inspection
| Command | Description |
|---|---|
canopy loop list |
List all loops with status and spec progress |
canopy loop list --workdir <path> |
Filter loops by workdir |
canopy loop info <id-or-name> |
Detailed status for a single loop (specs, runs, hooks) |
Loop ids can be specified by exact id, exact name, or unambiguous id prefix. Ambiguous references list the candidates.
Loop control
Mirrors the loop_run/loop_pause/loop_continue/loop_reset/
loop_schedule_autorun MCP tools — a second way to reach the same daemon
operations when an MCP client can’t. Every command resolves <id-or-name>
locally (same rule as loop inspection above) and then delegates the actual
state change to the daemon over its existing MCP endpoint; it never writes
to the database directly. If the daemon isn’t reachable on the resolved
port, the error says so explicitly instead of looking like the loop is
missing.
| Command | Description |
|---|---|
canopy loop run <id-or-name> |
Run a loop in the background, spec by spec |
canopy loop run <id-or-name> --queue <queue-id> |
Run the queue’s pending specs through the loop’s graph instead |
canopy loop run <id-or-name> --workdir <path> |
Override the loop’s workdir for this run only |
canopy loop pause <id-or-name> |
Pause a running loop after the current node finishes |
canopy loop continue <id-or-name> --retry-current-node |
Resume a paused loop by retrying the current node |
canopy loop continue <id-or-name> --skip-next-spec |
Resume a paused loop by skipping to the next spec |
canopy loop reset <id-or-name> |
Reset a completed/failed loop back to pending (prompts for confirmation) |
canopy loop reset <id-or-name> --specs <id>... |
Reset specific spec ids, even if already completed |
canopy loop reset <id-or-name> --yes |
Skip the confirmation prompt |
canopy loop autorun <id-or-name> --at <iso8601> |
Schedule a one-shot resume at a future time |
canopy loop autorun <id-or-name> --quota-reset-message <text> |
Schedule a resume from a raw CLI quota-limit message |
canopy loop autorun <id-or-name> --cancel |
Cancel a pending autorun schedule |
Spec backlog
| Command | Description |
|---|---|
canopy spec create --name <name> --description <text> |
Create a standalone spec (a backlog item) |
canopy spec create ... --workdir <path> |
Tag the new spec with a workdir, for backlog filtering |
canopy spec create ... --queue <queue-id> |
Also append the new spec to an existing queue |
canopy spec create ... --queue <queue-id> --group <group> |
Add it to the queue within a context group |
canopy spec complete <spec-id> --reason <text> |
Mark a standalone spec as completed |
canopy spec skip <spec-id> --reason <text> |
Mark a standalone spec as skipped |
canopy spec reopen <spec-id> --reason <text> |
Reopen a completed/skipped spec back to pending |
RAG
| Command | Description |
|---|---|
canopy rag auto-index start |
Resume automatic indexing (default state) |
canopy rag auto-index stop |
Pause indexing without losing the queue |
canopy rag report |
Detailed per-file indexing report |
Plumbing
| Command | Description |
|---|---|
canopy stdio |
Run the MCP server over stdio |
canopy bridge --id <session> |
Stdio sidecar proxy that injects canopy identity headers |
Global flags
| Flag | Description |
|---|---|
-p, --port <port> |
Override the daemon port (default 7755) |
--help |
Show help for any command |
--version |
Show canopy version |