Extended CLI Reference
This companion page keeps the main CLI Reference focused on common operator families while preserving the less-common command families, fleet helpers, diagnostics, transport helpers, and onboarding commands in the same reference style.
caco action — Configured Actions
| Command | Purpose |
|---|---|
ACTION="status"; caco action run "$ACTION" | Run a configured action (supports passthrough args after --); --node <node> routes execution through the same authoritative remote path as caco @<node> action run, including from MCP |
caco action list | List available actions |
Actions are operator-defined commands declared under projects.<name>.actions or global/node scopes. Args after -- are shell-escaped and appended. With resolved node/project context, action commands receive CACO_NODE, CACOPHONY_NODE, CACO_PROJECT, and CACOPHONY_PROJECT.
caco audio — Speech & Transcription
| Command | Purpose |
|---|---|
caco audio speak | Synthesize text to speech via the daemon audio proxy |
caco audio transcribe | Transcribe audio from file or live microphone via the daemon audio proxy; explicit --model values are validated against daemon-advertised STT capabilities, including configured command-template labels |
caco audio live start|status|stop | Start, inspect, or gracefully stop a non-blocking live transcription session for agent/MCP use |
caco audio capabilities | Show available audio models, voices, and provider status |
caco audio prewarm | Download/prewarm a local STT model (e.g. scribble whisper variants) |
caco audio mcp stdio | Expose audio/STT commands, including live transcription control, as MCP tools |
caco image — Image Generation
| Command | Purpose |
|---|---|
caco image generate | Generate an image from a text prompt or configured preset |
caco changelog — Release Changelog
| Command | Purpose |
|---|---|
caco changelog show | Show beads grouped by versioned release |
caco log — Service Logs
| Command | Purpose |
|---|---|
caco log tail | Show recent log lines for a service |
caco log stream | Stream log output from a service in real time |
caco log error | Report a structured project error into the Cacophony feed |
caco log exceptions | List structured process exceptions |
caco log perf | Report a structured performance event |
caco log perf-list | Perf query; --top |
For scripting, caco log exceptions --json returns the canonical {ok,data,meta} envelope: exception rows live under data.exceptions, while meta carries node, totals, component filter, and returned-count metadata.
caco event — Command Audit Log
| Command | Purpose |
|---|---|
caco event log | Show the command audit event log |
caco notify — Notifications
| Command | Purpose |
|---|---|
caco notify send | Create a notification |
caco notify list | List recent notifications |
NOTIFICATION_ID="notification-id"; caco notify get "$NOTIFICATION_ID" | Get a notification by ID |
NOTIFICATION_ID="notification-id"; caco notify ack "$NOTIFICATION_ID" | Acknowledge a notification |
caco notify ack --all | Acknowledge every notification on this node in one request (--project narrows it; --id a,b,c acknowledges several) |
caco notify send --json reports missing or whitespace-only titles as structured stdout errors with ok=false and error.code set to missing_argument or invalid_argument.
caco outbox — Cross-Node Write Outbox
| Command | Purpose |
|---|---|
caco outbox list | List outbox entries (pending, delivered, failed) |
OUTBOX_ID="outbox-id"; caco outbox show "$OUTBOX_ID" | Show details of a single outbox entry |
OUTBOX_ID="outbox-id"; caco outbox retry "$OUTBOX_ID" | Retry a specific outbox entry |
caco outbox flush | Retry all pending and failed outbox entries now |
OUTBOX_ID="outbox-id"; caco outbox drop "$OUTBOX_ID" | Permanently discard an outbox entry |
caco decision-point — Decision-Point Rewind Previews
| Command | Purpose |
|---|---|
caco decision-point rewind --agent-id agent-id --decision-point-id dp-id --dry-run | Render a read-only rewind plan from an existing decision-point snapshot; --preview is an alias, --bead-id can assert the expected bead, JSON output includes dry_run:true / would_spawn:false, and non-preview execution is rejected until successor spawning lands |
caco secret — Encrypted Secrets
caco secret
Manage encrypted secrets through the local daemon.
caco relay — Relay & Gateway
| Command | Purpose |
|---|---|
caco relay serve | Run the relay/gateway daemon surface in the foreground without resolving hosted-project credentials |
Useful for credential-light deploy shapes where a mesh bridge node forwards cluster traffic without needing full hosted-project secrets.
caco service — Native Lifecycle Supervisor
| Command | Purpose |
|---|---|
caco service status | Show normalized native lifecycle supervisor status (systemd/launchd/supervisord) |
caco service show | Show canonical native identity and configuration detail |
caco service start | Start the native lifecycle supervisor entry |
caco service stop | Stop the native lifecycle supervisor entry |
caco service disable | Disable/unload the native lifecycle supervisor for deliberate manual-startup policy |
caco service restart | Restart the native lifecycle supervisor entry |
caco service load | Idempotently reload/bootstrap an installed-but-not-loaded native lifecycle supervisor entry |
caco service logs | Show logs from the native lifecycle supervisor |
This is for inspecting the native service manager, not for routine daemon convergence. Use caco up/caco down/caco restart for that. caco service status --json reports healthy, health_state, and a repair hint/command when the supervisor is installed but not loaded, inactive, or failed; caco ops check surfaces the same condition for controller alerting. On launchd, caco service load enables the canonical label before bootstrap; bootstrap itself is the load/start operation, so load no longer follows with an immediate kickstart -k that could restart a just-launched supervisor during daemon/TTS/STT adoption. Disabled-label state and bootstrap failures still produce plist/domain-specific diagnostics instead of a generic native-command failure. Use caco service disable instead of raw launchctl/systemctl when the operator intentionally wants manual startup: it disables/unloads the supervisor, treats already-unloaded launchd bootout as success, and prints follow-up guidance to verify status and run caco up --skip-update if daemon/web/TTS services should remain running outside native supervision.
caco prune — Artifact Cleanup
| Command | Purpose |
|---|---|
caco prune list | Enumerate prunable agents and estimated reclaimable space, including legacy logs/session.log capture bytes when present |
caco prune run | Execute pruning for matching agents (--delete to remove whole directories; automatic and retention pruning ignore agents whose project is absent from the current valid config; --tui-logs --dry-run previews TUI log trimming; --direct-integration-tempdirs --dry-run previews stale caco-direct-integration-* temp checkout cleanup) |
caco cron — Scheduled Tasks
| Command | Purpose |
|---|---|
caco cron list | List configured cron entries |
caco cron show --name hourly-review | Show one full cron declaration |
caco cron status --name hourly-review | Show the latest execution receipt, expected cadence, and schedule-derived driver staleness |
caco cron logs --name hourly-review --tail 200 | Tail the bounded durable daemon log without dispatching work |
CRON_NAME="hourly-review"; caco cron run --name "$CRON_NAME" | Trigger a cron entry on all configured nodes |
caco cron check --name hourly-review | Run the cron's side-effect-free check: command on its target nodes; omit --name to check every cron |
caco action check --name deploy-preview | Run one action's check: command on the local daemon |
Use caco @<node> cron status --name <name> for a node-scoped scheduled driver. Status distinguishes healthy, running, failed, never_observed, and stalled; staleness is derived from the configured cron expression and the latest scheduled execution receipt or durable log activity.
A cron or action may declare check:, a shell command that exercises its prerequisites (identity, SSH key, pinned gh account, secret paths, tools) without side effects. Checks run in the real command's environment with CACO_CRON_CHECK=1 and write no cron receipt. Each daemon re-runs its own cron checks after every served config change and at least hourly, and reports only new failures to the errors feed.
A cron that declares project:, and every project-scoped action, runs as that project: it gets the project's environment (for example SOPS_AGE_KEY_FILE), the same GitHub routing an agent spawn gets, and the configured account's gh credential for the routed host. Inherited gh tokens are cleared and there is no fallback to the node's active account; the check fails when that environment does not resolve.
caco summary — Activity Summary
caco summary --since 3h
Print a high-level activity summary for a time period. Shows bead throughput, agent completions, and notable events. This singular command only accepts --since; recorded session summaries live under the plural caco summaries list / caco summaries show commands.
caco stats — Unified Fleet Stats
caco stats --window 7d --bucket day --json
Show the unified fleet stats aggregate from /api/v1/stats: the compute/storage rollup, per-node sysinfo, token usage by project, and bead throughput (closed-rate plus a closed-bead time-series for charts). Token usage preserves input/output/cache-read/cache-write totals and also reports cached versus fresh input and output. --project / --all-projects scope the throughput section (fleet-wide by default), --node narrows the per-node rows while the compute rollup stays whole, and --window (24h/7d/2w or a bare hour count, default 24h) with --bucket (hour/day) tune the throughput series. --json emits machine output and --gfx renders kitty graphics; the underlying endpoint is read-only and readable at worker and project-controller scope.
caco context-budget — Injected-Context Budget
caco context-budget --project cacophony
Show the per-declaration injected-context budget for a project: the shared AGENTS.md bytes plus each persistent-agent declaration's composed profile-stack bytes, so context-mass growth is visible. Because AGENTS.md is injected into every managed agent it dominates the budget; this read-only view is the companion to the caco ops AGENTS.md soft-budget watch (env CACO_OPS_AGENTS_MD_BUDGET_BYTES). --project defaults to CACO_PROJECT / CACOPHONY_PROJECT / the first configured project; --json emits machine output. Pass --record to also emit each declaration's total as a caco log perf event (component context-budget, metric injected_context_bytes, label = declaration) so injected-context growth is board-visible on a cadence. With --record, add --threshold <bytes> to record declarations whose total exceeds the budget at severity regression (and mark them [OVER BUDGET] in the text view) so context bloat surfaces as a regression rather than plain info.
caco ps — Process Listing
PROJECT="cacophony"
NODE="primary-node"
caco ps --project "$PROJECT" --kind agent --state running --node "$NODE"
List services, sidecars, and agents, with PID/uptime when known. Terminal agents are hidden unless --state is set.
caco ls — Runtime Directories
PROJECT="cacophony"
AGENT_ID="agent-id"
caco ls --project "$PROJECT" --kind agents --agent "$AGENT_ID"
List owned runtime directories and checkout roots. Useful for understanding the on-disk layout of a running Cacophony installation.
caco bd daemon — Standalone Beads Service
| Command | Purpose |
|---|---|
caco bd daemon serve | Run the standalone caco-bd-daemon service in the foreground |
caco bd daemon restart | Restart only the standalone beads service (independent of main daemon) |
caco mcp — MCP Gateway
caco mcp stdio
Start the aggregate MCP stdio server. See MCP Integration for details.
caco update — Self-Update and Companion Updates
| Command | Purpose |
|---|---|
caco update | Install CLI; @nodes works after --restart |
caco update status | Show current version and available updates; draft matches are labeled (draft). Stable status also reports the selected host platform artifact, platform-gap warnings when a newer release lacks that artifact, and commit-level JSON/text posture for ambiguous semver: current commit, release tag/commit, main commit, compare relations, and same-semver drift warnings. |
caco update android | Check or install the latest configured Android companion APK on explicit updates.android.targets; dry-run/status is the default, --install installs only missing or older packages, --target narrows by configured target name or adb serial, --force permits same-version/reinstall cases, remote-host installs copy the APK to the configured adb host before adb install, and the command never starts emulators or installs to arbitrary attached devices |
caco launcher — Launcher Archive
Manage the launcher binary archive for multi-version rollback. When a launcher is promoted from pending to active, the outgoing binary is archived. If health checks fail after a restart, the rollback path walks the archive from newest to oldest until a healthy daemon is restored. The default retention cap is one previous rollback generation; live archived launcher binaries are retained beyond that cap and reported until their process exits.
| Command | Purpose |
|---|---|
caco launcher list | List archived launcher binaries (version, fingerprint, timestamp, and live-process marker; newest first) |
caco launcher rollback | Rollback to an archived binary (for example VERSION="1.2.3"; FINGERPRINT="abc123"; caco launcher rollback --version "$VERSION" --fingerprint "$FINGERPRINT", or omit both flags for the most recent archive) |
caco node — Node Inspection
| Command | Purpose |
|---|---|
caco node list | List configured nodes and their liveness |
NODE="example-node"; caco node show "$NODE" | Show detailed information for a single node |
caco node status | Show node runtime status including services and agents |
caco node drain --reason "fleet switch" | Before a fleet switch: hold new work on this node, stop each GitHub runner listener once its in-flight job finishes, and park local agents (stop with an off-node WIP checkpoint; pause logical sessions); prints one line, exits 75 while not fully drained, safe to re-run (--dry-run previews) |
caco node undrain | After the switch: start the drained runner listeners, resume exactly the agents the drain parked (once each), then release new work |
caco node drain-status --json | Show this node's drain record and whether it still holds new work |
caco node disk --json | Show local Cacophony-managed disk categories; partial deadline-limited walks keep total_bytes at least as large as the counted top-level category sum, while runtime hot spots such as daemon_checkouts, build_artifacts, test_artifacts, daemon_build_target, tui_logs, and state_branches are split out from generic other |
caco foreach — Fleet-Wide Commands
| Command | Purpose |
|---|---|
caco foreach node status | Run a caco command on every configured node |
caco doctor — Diagnostics
caco doctor
Diagnose local and mesh health: daemon, sidecar, beads host/listener reachability, config hash parity, peers, PKI, lifecycle test fake-daemons, stale agents, release-capable GitHub Actions runner health when gh works, and more.
Supports --json.
- Beads: Bead-count divergence probes are batched across projects/peers.
Beads-primary rows can trust a successful local
/api/v1/beads/statusauthority probe so stale peer snapshots do not mark a working primary down. - Agents: Accounting-only/watch stale-agent rows stay separate from actionable stuck-agent errors.
- Storage: Storage hints prefer retention/VACUUM and targeted cleanup; an oversized
daemon-fts.dbis probed read-only for SQLite page/freelist evidence so a large compact search corpus stays informational, while reclaimable fragmentation, an unavailable compactness probe, or an oversized WAL remains actionable without recommending a manual live-store VACUUM. - macOS release runner: For the shared macOS release runner, use
caco action run --project cacophony github-runner-status--ms-macfor status and node-routedcaco @ms-mac action run --project cacophony restart-github-runner--ms-macfor the approved repair; when the status action is routed toms-mac, it also prints best-effort LaunchDaemon ownership, rescue tmux runner sessions, and runner processes so operators can distinguish the permanent service from incident-only rescue sessions. The persistentupdate-helperprofile may invoke that repair when Release binaries are queued on an offline ms-mac runner. The repair requires each listener to remain running across two bounded launchd observations, emits launchd and log diagnostics after another exit, and narrowly resets thecacophony-ms-maccredential state when its logs prove GitHub deleted the registration so the Nix-managed startup path can register it again. - Routing: Routed command failures preserve bounded remote stdout when a JSON action returns useful diagnostics there with empty SSH stderr.
caco doctor feed checks the feed ledger: it scans the active feed JSONL (or --path), reports malformed or non-UTF-8 lines (bounded by --max-findings), and rewrites a damaged ledger only with --repair --yes.
Deep-doctor findings (stale tmux sessions, agent directories, lifecycle locks, config hashes, feed and index counters, performance) are read-only and never run cleanup or restarts. Each finding has a severity, a subject, up to six evidence lines and, where one is safe, a repair command:
- Text:
[severity] kind: subjectorseverity metric value unit subject, then evidence and an optionalrepair:line;<no performance findings>or<no stale-state findings>when empty. - JSON: stable
kind/metric,severity,value,unit,subject,evidence.shown/evidence.omittedand nullablesafe_repair_command;[]when empty.
caco bisect — Bead-aware Regression Bisect
| Command | Purpose |
|---|---|
caco bisect start --bead-id <bd> --test-command <cmd> --candidates-file <json> | Create bisect state for a bead from a JSON array of candidate commits |
caco bisect run --bead-id <bd> | Run the next candidate in an isolated worktree and record its good/bad outcome |
caco bisect status --bead-id <bd> | Show the bisect plan, remaining candidate counts, and guilty-bead links |
caco bisect reset --bead-id <bd> | Clear bisect state for a bead |
Bead-aware regression bisect drives a good/bad search over a supplied set of candidate commits to find the change that introduced a regression for a bead. start takes a required --test-command (exit 0 = good, non-zero = bad) and a --candidates-file (a JSON array of {commit, bead_ids, summary} objects); each run checks out the next candidate in an isolated worktree, runs the test, and records the outcome, narrowing toward the guilty commit and surfacing the bead IDs its message references. status reports progress and guilty-bead links; reset clears the state. Supports --json.
caco microvm — MicroVM Worker Capability
| Command | Purpose |
|---|---|
CACHE_DIR="$CACOPHONY_DIR/microvm/cache"; caco microvm preflight --cache-dir "$CACHE_DIR" | Check whether the local worker node can admit microVM-wrapped transient agents |
REPORT="microvm-validation.json"; caco microvm validate --report "$REPORT" | Validate recorded microVM agent-isolation evidence for rollout gates |
caco microvm node status --name micro-0 | Report declared persistent full-node microVM launcher state without booting or mutating a VM |
caco microvm node up --name micro-0 --variant isolated --dry-run | Run full-node launch preparation, variant validation, preflight gating, and boot-harness planning without building or booting |
caco microvm node up --name micro-0 --variant isolated | On a ready Linux/KVM host, launch the persistent node through the boot-proof harness in detached keep-running mode and write launcher state |
caco microvm node down --name micro-0 | Stop a registered persistent full-node microVM without deleting state; safe no-op when nothing is running |
caco microvm node destroy --name micro-0 --force | Stop any registered runner best-effort and delete the persistent node state directory; without --force it previews only |
just microvm-dispatch-integration --execute --json-report /tmp/caco-microvm-dispatch.json | Run the Docker-free multinode dispatch-lane scaffold on a Linux/KVM host |
caco microvm preflight is read-only and provider-neutral. It checks KVM, tun/tap, vsock, cgroup v2, nftables, supported hypervisor binaries such as cloud-hypervisor, and the microVM cache root. Treat ready=false as a placement blocker until the reported remediation hints are resolved.
For the reusable secret-free guest, build .#caco-microvm-agent-image-info and follow its kernel/initrd/rootfs env values. caco microvm node status reports state-dir, preflight, and cert contract without booting. caco microvm node up --dry-run runs launch preparation and tells you whether a real boot would be refused. On a ready Linux/KVM host, caco microvm node up wraps the repo-owned boot-proof harness in detached keep-running mode, records launcher.json, and leaves live boot/readiness details in the boot report; caco microvm node down stops the registered tmux session, runs runner shutdown when present, clears the launcher marker, and leaves state for the next launch; caco microvm node destroy previews by default and deletes that state only with --force. See micro-0 full-node microVM rollout for the current KVM host, boot-proof, and validation steps.
caco microvm validate checks a caco.microvm.validation.v1 JSON or YAML report from a microVM runner. It passes only when:
- host paths outside the declared
--projected-mountvalues are denied; - Docker, Podman and ssh-agent sockets are unreachable unless allowed with
--allow-host-socket; - daemon agent and project auth boundaries hold;
- CPU, memory and disk probes hit their configured limits;
- tap, vsock and cgroup cleanup leaves nothing behind, and startup and teardown timings are present.
Reports share one format across Cloud Hypervisor, Firecracker and Kata (RuntimeClass) runs: benchmark phases, denial probes, pass/fail/skip counts and short log excerpts, never secrets. For Kata, one managed agent maps to one pod labelled with its project, node, agent, bead and isolation; secrets stay as projected files or named environment handles; and a fallback reports both the requested kata and the backend actually used.
The validator only classifies evidence; it never launches or changes Kubernetes resources.
--template prints a sample report, --report "$REPORT" --output microvm-validation-summary.json writes the summary, and --json prints JSON. A missing --report under --json returns a missing_argument envelope; validation failures exit with code 2.
just microvm-dispatch-integration is the first-party Docker-free two-node dispatch-lane scaffold. It prepares hermetic local git/profile inputs, records Linux/KVM/preflight skip evidence unless --require is used, writes alpha/beta configs and runtime projections, and produces a bounded evidence directory with VM network, asset, execution-plan, and runbook receipts. In --execute mode the current lane reaches daemon-status checks, beads-routing checks, and a hermetic dispatch-enqueue check before stopping explicitly at the remaining worker-pickup/completion boundary; it must not fall back to production ports or external credentials.
caco release — Release Management
| Command | Purpose |
|---|---|
caco release trigger | Trigger a release build |
caco release status | Show current release queue status |
caco release list | List release jobs |
RUN_ID="release-run-id"; caco release logs "$RUN_ID" | View release job logs |
RUN_ID="release-run-id"; caco release cancel "$RUN_ID" | Cancel a release job |
caco release refresh | Refresh release state from upstream |
caco release config | Show release configuration |
Release jobs are reconciled with their real execution after a daemon restart rather than blindly restarted.
- GitHub jobs: Queued jobs return to the FIFO. A GitHub-strategy job durably records dispatch intent before invoking the workflow and persists its uniquely correlated Actions run ID before polling. Restart re-polls that run; if restart fell in the dispatch-to-ID gap, the daemon boundedly correlates exactly one workflow/ref/commit/time-window run and re-polls it without redispatching, while missing or ambiguous matches become restart-recovered errors.
- Legacy repair:
caco release refreshalso repairs the narrowly identifiable legacygha-*false restart error caused by a missing durable run handle, while preserving unrelated terminal history. - Node jobs: Node/local jobs re-adopt a still-live detached build or publish leader, or recover a completed phase from its durable exit status. An idempotent build phase may be restarted only when neither live-process nor exit-status evidence survives.
- Publish: The side-effectful publish phase is never blindly re-run: if it cannot be re-adopted or finalized from durable evidence, the job becomes a restart-recovered error with a manual verification hint to avoid a double publish (external product contract §17.7.7).
caco project — Project Management
| Command | Purpose |
|---|---|
caco project list | List configured projects |
PROJECT="cacophony"; caco project show "$PROJECT" | Show project details |
caco project status | Show project checkout and agent status |
PROJECT="example-project"; caco project create "$PROJECT" | Create a new project configuration |
caco project reintegrate --checkout <path> --reason <r> | Land a human/config-only edit made directly in a manual project checkout (manual/project_checkout/*) through the same publish-or-refuse direct-reintegration machinery; gated on a clean worktree, a non-agent branch, and an audited --reason . An operator on a managed agent/... branch is routed to caco agent reintegrate instead. |
caco project land | Alias for caco project reintegrate. |
caco pr — Product Pull Request Worktrees
| Command | Purpose |
|---|---|
caco pr list [--project project] [--needs-review] | List open PRs with explicit ready, draft, conflict, behind-base, check, and review attention states; a blocked PR with zero review requests is reported as review_never_requested rather than generic BLOCKED |
caco pr checkout <N> --project project | Create a managed in-project agent checkout that tracks the existing live PR head (GitHub integration + effective PR backend required) |
caco pr adopt --pr <N> --bead-id bd-XXXXXX | Plan an isolated exact PR checkout while preserving clean ambient ahead/diverged generations; dry-run emits the required --adoption-receipt, clone records bounded phase/PID/error with exact resume, sync merges main, and push is verified same-PR/non-force only. Repair acquisition may remove a failed ordinary partial only after auditing an exact empty-index/all-HEAD-deleted checkout with no extra bytes or live process; its proof receipt binds the historical operation, old/current base, head, tree digest, no-provider-mutation result, and rollback while operation and registry evidence remain preserved. |
caco pr init --repo owner/repo --base main --name slug [--resume] | Create or resume a bounded product PR worktree initialization; sibling metadata records phase/PID/error before clone and status prints the safe recovery command |
caco pr status | Show managed-checkout/product-worktree branch roles plus forbidden operational-file diagnostics |
caco pr apply --path src/file.rs --dry-run | Copy allowed product paths into the PR worktree while denying Cacophony runtime/state artefacts by default |
caco pr push --title "..." --body-file body.md | Push the product branch and open or reuse a ready-for-review GitHub PR through gh |
Publish ready-for-review by default.
Drafts are only for source that must not merge yet: explicit operator-requested review/RFC, experiments, or projects whose integration.default_intent is upstream_draft_pr.
Pending parent/umbrella acceptance, unrelated CI, or live acceptance are not reasons to draft.
For a deliberate draft, use caco pr push --draft --draft-reason "Operator-requested RFC; do not merge yet" --title "..." --body-file body.md.
A non-empty, single-line --draft-reason is required unless upstream_draft_pr supplies the project-intent reason.
The reason is recorded in the PR body and publication receipt; caco pr list shows drafts separately, including missing or unavailable reasons.
Existing PR readiness is preserved; changing draft state is a separate owner decision.
caco profile — Profile Inspection
| Command | Purpose |
|---|---|
caco profile list | List discovered repo, user, and embedded profiles |
PROFILE="worker"; caco profile show "$PROFILE" | Show full metadata for one profile |
caco profile compose --dry-run worker merge-queue | Preview an ordered composed profile stack with provenance rows and composition errors without launching anything; --agent <decl> resolves a declaration's full profile stack instead of hand-listing names |
caco profile mcp stdio | Expose profile inspection over MCP |
caco checkout — Canonical Checkout Maintenance
caco checkout manages disposable canonical project caches. caco checkout status --project <name> distinguishes absent, empty, placeholder, partial, preservation-sensitive, policy-excluded, and valid shapes and prints the exact next action. A controller/operator uses caco checkout refresh --project <name> to atomically materialize a proven-clean shape. Use caco checkout regenerate --project <name> only after inspecting preserved dirty/local-only evidence; it is the first-party repair path instead of raw rm -rf, remote edits, manual reclone, or hand-written live-config repair. In agent contexts mutating subcommands may be hidden; use caco ls --kind checkout for read-only checkout inspection.
caco warmup-cache — Advisory Warmup Cache Inspection
| Command | Purpose |
|---|---|
caco warmup-cache list --root "$CACOPHONY_DIR" --preview-chars 96 | Scan warmup-cache/*.json, list valid project/profile/model summaries, and report invalid artifacts or read errors |
caco warmup-cache show --key cacophony:worker:gpt-5 | Filter the scanned inventory to one stable key and report missing-key details when absent |
caco warmup-cache list --json | Return the normalized request and output envelope for scripts or MCP callers |
Warmup-cache helpers normalize generate/list/show/clear requests and can explicitly delete selected cache artifacts through clear plans, but the shipped public CLI branch currently exposes read-only list and show. Treat it as advisory cache inspection, not automatic session extraction, prompt injection, or startup context reuse.
caco fleet — Fleet Snapshots
| Command | Purpose |
|---|---|
caco fleet snapshot | Dump nodes, agents, beads, and feed tail into one JSON envelope for postmortem analysis |
caco codespace — GitHub Codespaces Nodes
Manage GitHub Codespaces enrolled as Cacophony nodes. Operator shells expose lifecycle subcommands such as new, ls, stop, resume, revoke, remove, rekey, and enroll; agent contexts may hide mutating entries. Read-only inspection adds caco codespace status (the desired-vs-real pool view) and caco codespace reconcile --dry-run (the reconcile plan), both pure inspection over declared codespace_nodes pools with no cloud mutation. caco codespace new --source-repo <url-or-owner/repo> (or CACO_CODESPACE_SOURCE_REPO) selects the Cacophony source cloned/installed during remote bootstrap, defaulting to the upstream repository. There is no shipped caco codespace secret push/list/remove surface yet; use GitHub Codespaces user secrets or the repo-owned container secret-file path documented in the Codespaces guide.
caco stt — Speech-to-Text Diagnostics and Daemon Control
| Command | Purpose |
|---|---|
caco stt doctor | Diagnose local STT setup, configured model/VAD, scribble feature availability, and a self-test transcription |
caco stt daemon | Run the headless foreground STT daemon; it starts muted by default unless durable runtime state or an explicit startup flag says otherwise. Use --instance <name> for a named daemon (ASCII letters, digits, -, or _ only), --scratchpad-id <note> to override the default transcription:ambient:<instance> marker buffer, and --transcript-max-entries / --transcript-max-bytes to bound the local JSONL transcript buffer (defaults: 1000 entries and about 1 MiB). Startup refuses duplicate live instances or responsive leftover control ports, while stale dead PID/port files are cleaned before relaunch. |
caco stt daemon status / logs | Inspect the headless STT daemon process/control-port liveness and recent log output; pass --instance <name> for named instances. |
caco stt status | Show runtime mute/capture state, transcript cursor, transcript entry/byte counts, scratchpad, log, and transcript paths; pass --instance <name> for named instances. |
caco stt mute / unmute / toggle-mute | Control whether ambient capture is allowed; muted means no capture child should be running |
caco stt diff --cursor <n> --limit <n> | Read transcript entries after a cursor so listener/router agents can poll deltas without rereading the whole buffer; profiles must still apply their own instruction-auth policy |
caco ambient-narration — Ambient Narration Controls
| Command | Purpose |
|---|---|
caco ambient-narration status | Render the current ambient narration state and compact control-panel summary; add --json for structured status/panel output. |
caco ambient-narration enable --cadence-secs 30 --verbosity compact | Apply an enable request to the ambient narration config projection, clamping cadence to at least one second and normalizing verbosity. |
caco ambient-narration disable --reason "quiet window" | Disable ambient narration and include the operator-facing reason in the rendered status. |
caco timeline — Activity Timeline
Aggregates commit/changelog/bead activity. Defaults to 48h or 100 commits; tune with --max-age-hours, --min-commits, --limit, and PROJECT="cacophony"; caco timeline --scope project --project "$PROJECT". --json errors return envelopes.
caco summaries — Session Summaries
| Command | Purpose |
|---|---|
caco summaries list --agent "$CACO_AGENT_ID" --limit 20 | List recorded summaries, newest first |
caco summaries next-index --agent "$CACO_AGENT_ID" | Compatibility helper to preview the next zero-padded summary/<NNNN>/ index; daemon state-branch publication assigns final indices for ordinary direct summaries |
caco summaries show --agent "$CACO_AGENT_ID" --index "$SUMMARY_INDEX" | Show one parsed session summary |
summaries list and summaries show use a bounded CLI HTTP client (20-second request budget plus a short connect timeout) so a slow or unhealthy summaries endpoint returns a retryable summaries-specific error instead of hanging the terminal. When the daemon health probe still succeeds, startup/context-rehydration errors include a local managed-checkout fallback hint for .cacophony/agent/.../summary/*/summary.md.
caco operator-actions — Operator-Required Tasks
| Command | Purpose |
|---|---|
caco operator-actions list | List open beads tagged [operator-action], sorted by age |
caco tendril — Tendril-Adjacent Operator Helpers
caco tendril watch watches recorded-summary screenshot artefacts (.cacophony/agent/*/summary/*/screenshots/*) across runtime agent checkouts, supports --project and repeatable --agent filters, skips already-present images unless --include-existing is supplied, and renders new or updated screenshots inline with kitten icat when available. Actual computer-control actions still use the separate tendril CLI (tendril list --json, WINDOW_ID="window-id"; tendril capture --window "$WINDOW_ID", DSL='hold(ctrl),c,release(ctrl)'; tendril run --window "$WINDOW_ID" "$DSL") or managed Pi Tendril MCP tools (tendril_list, tendril_capture, tendril_run, tendril_listen). For visual audits, list targets immediately before acting, capture before input, run one small Tendril action with waits, then capture again to verify the result. Preserve the JSON error envelope when capture fails: a target can be listed with capture=true while Wayland xdg-desktop-portal or another platform screenshot backend still times out or denies capture.
caco bootstrap — Developer Onboarding
| Command | Purpose |
|---|---|
caco bootstrap dev | Run first-run developer onboarding; bare invocation chains check, config init, daemon start, sandbox creation, and demo bead unless narrowed with flags such as --check |
Node-Aware Transport Helpers (cacophony-spec section 8.1.2)
Canonical wrappers around SSH-family transport that resolve node connection details from config:
| Command | Purpose |
|---|---|
NODE="example-node"; caco ssh "$NODE" | SSH to a configured node using resolved host, port, user, and key with strict host-key verification |
NODE="example-node"; caco ssh "$NODE" --enroll-host-key | Scan and enroll a static OpenSSH host key only when it exactly matches the operator-audited ssh.host_key_fingerprint |
NODE="example-node"; caco mosh "$NODE" | Mosh to a configured node (uses SSH metadata for --ssh= flag) |
NODE="example-node"; REMOTE_PATH="/var/log/caco.log"; LOCAL_PATH="./caco.log"; caco scp "$NODE:$REMOTE_PATH" "$LOCAL_PATH" | SCP with node-aware endpoint resolution |
All three commands support --print to show the resolved command without executing, and --json for structured output. Static OpenSSH commands never auto-accept unknown keys. Configure nodes[].ssh.host_key_fingerprint with an independently verified OpenSSH SHA-256 fingerprint before enrollment; a scan mismatch changes nothing. Noninteractive @node status/update/restart routing runs a bounded BatchMode=yes no-op preflight first, reports typed askpass, unknown-key, changed-key, network, authentication, or remote-command failures, and starts no requested update when preflight fails. Interactive caco ssh may still use the operator TTY for authentication but retains strict host-key checking. When these helpers or the @node shorthand run a first-party remote caco command, the remote shell string is prefixed with exec so the login shell is replaced by the managed child instead of lingering under sshd-session after the command exits.
These helpers are valid for static nodes whose config includes a host field and optional ssh metadata. They also have a first-party GitHub Codespaces exception: caco ssh cs-<hash> resolves the derived Codespace node ID through caco codespace ls and delegates to gh codespace ssh. Other dynamic/container nodes fail with a clear error unless their template declares an explicit SSH transport contract.
Operator Access for Dynamic/Container Nodes
Dynamic and container nodes (those matching a dynamic_nodes template) do not imply SSH reachability. There is no sshd or authorized_keys path on these nodes by default. SSH-based commands (caco ssh, caco mosh, caco scp, caco tui --node) fail explicitly when targeting a generic dynamic node, with an error message explaining the supported alternatives. GitHub Codespaces are the explicit exception: caco ssh cs-<hash> and caco @cs-<hash> tui use gh codespace ssh after resolving the live Codespace name from caco codespace ls.
Supported inspection and debug paths
| Method | How |
|---|---|
| Daemon HTTP API | caco status --json or a local/secured daemon endpoint — prefer the first-party CLI and avoid exposing plaintext HTTP outside trusted loopback/debug networks |
| Agent logs | AGENT_ID="agent-id"; caco agent logs --id "$AGENT_ID" — fetches logs via the daemon API, works for remote agents |
| Agent status | AGENT_ID="agent-id"; caco agent status --id "$AGENT_ID" or caco agent list — cluster-wide status via the daemon; direct status reads refresh newer persisted agent.json state before responding and can surface optional lineage_metadata plus tagged-enum placement_reason when present. Add --lineage-filters or --lineage-participant/--lineage-transition/--lineage-source/--lineage-reason to render the read-only lineage-chain summary, persisted lineage filter options, and filtered lineage records. |
| Agent replay | AGENT_ID="agent-id"; caco agent replay --id "$AGENT_ID" --since 1h --grep test — read-only parsed structured-session-log timeline text/JSON viewer; uses log-style since/until/grep/line filters and does not attach to panes or write replay artefacts. |
| Reintegration preview | AGENT_ID="agent-id"; caco agent reintegrate --id "$AGENT_ID" --preview — exits before hooks, merge, state publication, or ref publication; renders codeowner preflight when present, builds a bounded git dry-run artifact summary from the checkout and target ref, evaluates the deterministic hook gate, and includes preflight data in JSON output. |
| Explicit-checkout publication | caco agent reintegrate --id "$AGENT_ID" --project project --checkout /managed/isolate --dry-run emits a receipt bound to first-party metadata or same-git-common-dir ownership, exact bead, allowed operational paths, actual branch/HEAD/path, and target HEAD; a blobless/promisor source must first resolve a distinct authoritative object remote, and direct integration uses a filtered remote seed plus an exact local-head promisor fetch without hydrating whole history. Real --mode direct --backend local_merge must pass that exact --checkout-receipt, and drift fails before publication. Multi-assigned metadata-less workers also pass authoritative --bead-id. |
| Agent placement preview | caco agent new --profile worker --node-selector least_overloaded --dry-run — renders the would-request placement metadata, endpoint, passthrough args, selected/ready/blocked node readiness rows plus deterministic readiness text, and daemon/spawn skipped flags without contacting the daemon or starting an agent; pure helpers can derive a non-persisted placement reason from the selected dry-run plan. --preview is an alias. Real spawns support --async for accepted-before-ready launch and --sync for historical readiness waiting; Pi/debug-shell starts default to async unless forced. |
| Dispatch placement preview | caco bd dispatch --bead-id --dry-run — renders the would-request bead dispatch and placement readiness metadata/text without claiming the bead, contacting the daemon for spawn, or starting an agent; --preview is an alias. |
| Container platform logs | Use your platform CLI to inspect container stdout/stderr (e.g. az containerapp logs show, docker logs, kubectl logs) |
| Private Kubernetes exec | KUBE_CONTEXT="example-aks"; caco "@cluster:${KUBE_CONTEXT}" status --json, caco "@cluster:${KUBE_CONTEXT}" tui, or caco "@cluster:${KUBE_CONTEXT}/cacophony" bd list --project cacophony --status open --limit 20 run in-pod caco; tui needs a real TTY. |
| TUI (local node) | The TUI receives replicated state from all nodes including dynamic ones — agent status, bead state, and messaging are visible without SSH |
| Messaging | caco msg send / caco msg broadcast — dynamic nodes participate in the cluster messaging system normally |
What does not work for dynamic nodes
NODE="dynamic-node"; caco ssh "$NODE"— fails with a clear error for generic dynamic nodes. Codespace nodes are the exception:caco ssh cs-<hash>delegates togh codespace ssh.NODE="dynamic-node"; caco mosh "$NODE"— fails with a clear errorNODE="dynamic-node"; REMOTE_PATH="/tmp/file"; caco scp "$NODE:$REMOTE_PATH" .— fails with a clear errorNODE="dynamic-node"; caco tui --node "$NODE"— fails (delegates tocaco ssh)NODE="dynamic-node"; caco cert distribute --node "$NODE"— usecaco cert issueorcaco node joinbootstrap path insteadcaco foreach node ssh ...— only iterates static nodes; dynamic nodes are not includedKUBE_CONTEXT="example-aks"; caco "@cluster:${KUBE_CONTEXT}" tui— works only for Kubernetes-hosted clusters reachable through the caller's kubeconfig; it is private exec, not generic dynamic-node SSH, and non-interactive runs can fail with the expectedUnable to use a TTYmessage
Future work
Generic SSH or platform-exec transport for arbitrary dynamic/container nodes remains future work. The current @cluster:<kube-context>[/namespace] target is Kubernetes-specific private exec, and the Codespace path is GitHub-specific gh codespace ssh routing; broader support should use an explicit remote-exec transport contract, not silently assume container sshd. See cacophony-spec section 8.1.2 and cacophony-spec section 6.5.9.
caco version — Version
caco version
Print the caco version. Supports --json for structured output.
caco hooks — Webhook Ingress
caco hooks list
caco hooks show <scope>/<id>
caco hooks test <scope>/<id> --body ...
Inspect configured webhook ingress handlers (tokens redacted) and invoke one locally, bypassing HTTP. Distinct from project lifecycle hooks automation; see the webhook ingress contract.
caco link — Link Artifacts
caco link add --url ...
caco link list / show / search
caco link update / delete / sync
Manage first-class URL/link artifacts with bounded metadata, bead/agent associations, and freshness. Internal cluster-API URLs are refused in user-facing url fields.
caco plans — Plans
caco plans list / show
Inspect bead-linked plans surfaced across web/macOS/Android/iOS detail views.
caco search — Search
caco search <query>
Cross-surface bead/content search backed by the daemon search index.
caco suggest — Operator Suggestions
caco suggest list / show
Read node-local suggestion sets; suggesting never runs anything and each option runs at most once. Backed by the daemon /api/v1/suggest* endpoints.
caco remediation — Remediation Status
caco remediation status --json
Show current agent/queue remediation diagnostics (idle, stuck, zombie, rate-limited, frozen).
caco pi / caco pico / caco codex — Runtime Backends
caco pi # launch a managed Pi agent runtime
caco pico # launch a managed Pico agent runtime
caco codex # launch a managed Codex runtime
pico # launch the separate unmanaged standalone Pico TUI
Runtime-backend entrypoints. caco pico --managed remains a no-op compatibility alias for caco pico; the daemon's internal --managed --host <socket> activation still starts the embedded backing host rather than recursively creating another agent. Interactive Pi-family launches open the accepted agent ID in standalone chrome immediately, show a starting placeholder while runtime and attach metadata continue asynchronously, and promote the same pane from daemon snapshot/SSE state. JSON and non-interactive callers receive the accepted result for status or later attach.
caco pi-daemon — Standalone Pi SDK Host
caco pi-daemon status
Read-only probe of the separately supervised, opt-in Pi SDK host through the local daemon. Unconfigured nodes report configured: false; configured nodes report independent bounded socket, authenticated API, and embedded Dashboard reachability, nonsecret URLs, readiness, host instance, event, and session counts or typed retryable failure without exposing bearer contents, credentials, prompts, or output. Remote-node inspection uses ordinary caco @node pi-daemon status routing. The internal caco pi-daemon serve entrypoint is lifecycle-owned and starts the optional API and Dashboard in that same supervised process, not an ad-hoc web process.
caco chat / caco inbox — TUI Shortcuts
caco chat
caco inbox
Shortcuts into the TUI runtime focused on chat or inbox, not separate frontends.
caco macos — macOS Companion
caco update macos --dry-run / --install
Pull, sha256-verify, and install the macOS companion app from the matching release.
caco supervise / caco token
caco supervise # native lifecycle supervisor loop
Lifecycle supervisor entrypoint and node-token material (see caco service and the release docs).