qrate is the one public surface for scripts and agents. The desktop app keeps a single private control endpoint (crates/app/src/app_control.rs, app-control.json, loopback TCP, bearer token); everything outside the app goes through crates/cli and its JSON and exit codes. The loopback agent bridge is removed, not deprecated: its request types (ai::agent), live adapter, program runner and Agent panel log stay, only the transport changed.
The branch is feature/qrate-cli (PR #122). PLAN.md at the repo root tracks the branch; docs/dev/cli-plan.md is the full design, including later phases that are not in scope here.
qrate [PROJECT], qrate open, qrate app status|path|launch, qrate project info, qrate agent overview|query|program-save|program-run|thumbnails|stage-findings, qrate completion <shell>, qrate man <dir>, qrate version, qrate help.--format human|json on app status and project info: human on a terminal, JSON in a pipe.0 answered, 1 refused or failed (a refusal is JSON on stdout), 2 usage, 3 qrate unreachable. AGENTS.md and qrate-pi-extension rely on these.bin\qrate.exe (a copy of qrate-cli.exe) on PATH through NSIS and MSI; macOS Contents/MacOS/qrate-cli; Linux bin/qrate symlink plus share/man/man1; Store MSIX carries qrate-cli.exe for the on-demand agent component.agent-runtime sets QRATE_CLI and QRATE_AGENT=pi; qrate-pi-extension is pinned (0.3.0) in scripts/fetch-agent-runtime.* because scripts/package-component.sh reads the agent component's version from that pin.docs/cli/ (the command, command reference, agents and skills), skills/qrate-cli, docs/agent-panel.md, AGENTS.md.crates/cli also changes docs/cli/commands.md. skills/qrate-cli lists no flags on purpose.clap is pinned to =4.5.53 (4.6 moves the derive macro to syn 3); clap_complete is ~4.5 and clap_mangen 0.2 for the same reason.stage-findings only publishes drafts.MCP server (ASNT-98), offline --use <PATH> commands against a saved .qrate, any command that writes a cell, qrate app quit.
app_control exists in the app.qrate agent.