commandmate 0.48.0 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +164 -164
- package/.next/app-path-routes-manifest.json +30 -30
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +3 -3
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +30 -30
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1945.js +3 -3
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2422.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/4243.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/4280.js +1 -1
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +1 -1
- package/.next/server/chunks/720.js +2 -2
- package/.next/server/chunks/7604.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +3 -3
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1128-914c559913546bbc.js +1 -0
- package/.next/static/chunks/{2407-26139a8a2f1adbe8.js → 2407-ab92ae9837c39dce.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/{2863-f0121af1cbbedb3b.js → 2863-7173dc305dffc4f6.js} +1 -1
- package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
- package/.next/static/chunks/{8165-c68b3dc844210e6a.js → 8165-263172c17ae8e8c3.js} +1 -1
- package/.next/static/chunks/9079-987939d231704218.js +1 -0
- package/.next/static/chunks/app/{layout-46b4cbf07520d9b6.js → layout-aa8e66164a4367af.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-fb241bed579c67aa.js → page-cfd645305e25fd33.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/{page-cbc7749a33450cc5.js → page-a8d7886703ffc7b4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/css/{743f79ff19ab91e9.css → db8959555c3d9c96.css} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +3 -5
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +5 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +4 -6
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +8 -1
- package/dist/cli/config/duration-constants.d.ts +16 -13
- package/dist/cli/config/duration-constants.d.ts.map +1 -1
- package/dist/cli/config/duration-constants.js +21 -21
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +2 -1
- package/dist/cli/types/api-responses.d.ts +29 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts +24 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +54 -1
- package/dist/config/auto-yes-duration.d.ts +56 -0
- package/dist/config/auto-yes-duration.d.ts.map +1 -0
- package/dist/config/auto-yes-duration.js +76 -0
- package/dist/server/src/config/auto-yes-config.js +14 -19
- package/dist/server/src/config/auto-yes-duration.js +76 -0
- package/dist/server/src/lib/auto-yes-state.js +9 -2
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +137 -14
- package/dist/server/src/lib/detection/composer-text.js +215 -11
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +8 -191
- package/dist/server/src/lib/detection/upstream-faults.js +19 -2
- package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
- package/dist/server/src/lib/polling/auto-yes-manual-answer.js +4 -2
- package/dist/server/src/lib/polling/response-checker.js +12 -15
- package/dist/server/src/lib/session/composer-clear.js +56 -4
- package/dist/server/src/lib/session/current-output-builder.js +2 -1
- package/dist/server/src/lib/session/send-attempt-state.js +2 -1
- package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
- package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
- package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +26 -339
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/gate-runner.js +11 -4
- package/docs/en/user-guide/webapp-guide.md +15 -10
- package/package.json +1 -1
- package/release-notes/0.49.0.json +45 -0
- package/.next/server/chunks/6722.js +0 -1
- package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +0 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
- package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
- package/.next/static/chunks/9079-406b84d3cc891a87.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
- /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → 3_JtAZaKMJEDFIIfkHv4n}/_buildManifest.js +0 -0
- /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → 3_JtAZaKMJEDFIIfkHv4n}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-yes.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auto-yes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,KAAK,EAAE,qBAAqB,EAAoB,MAAM,wBAAwB,CAAC;AAatF,sFAAsF;AACtF,eAAO,MAAM,8BAA8B,QAGoF,CAAC;AAEhI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWpG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKtF;AAuDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CA2BjG;AAED,wBAAgB,oBAAoB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"auto-yes.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auto-yes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,KAAK,EAAE,qBAAqB,EAAoB,MAAM,wBAAwB,CAAC;AAatF,sFAAsF;AACtF,eAAO,MAAM,8BAA8B,QAGoF,CAAC;AAEhI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWpG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKtF;AAuDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CA2BjG;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAkH9C"}
|
|
@@ -162,7 +162,7 @@ function createAutoYesCommand() {
|
|
|
162
162
|
.argument('<worktree-id>', 'Worktree ID')
|
|
163
163
|
.option('--enable', 'Enable auto-yes')
|
|
164
164
|
.option('--disable', 'Disable auto-yes')
|
|
165
|
-
.option('--duration <duration>', `Duration (${duration_constants_1.
|
|
165
|
+
.option('--duration <duration>', `Duration (${duration_constants_1.AUTO_YES_DURATION_FLAG_RANGE}, e.g. 1h, 3h, 8h; default ${duration_constants_1.DEFAULT_DURATION_FLAG})`)
|
|
166
166
|
.option('--stop-pattern <pattern>', 'Stop pattern (regex, max 500 chars). Matched against terminal output; cannot block commands (build logs mentioning the pattern also trigger it). To suppress auto-responses per command, use the task contract\'s autoYes.denyPatterns')
|
|
167
167
|
.option('--answer-mode <mode>', exports.ANSWER_MODE_OPTION_DESCRIPTION)
|
|
168
168
|
.option('--instance <id>', agent_target_options_1.INSTANCE_OPTION_DESCRIPTION)
|
|
@@ -210,11 +210,9 @@ function createAutoYesCommand() {
|
|
|
210
210
|
};
|
|
211
211
|
if (options.enable) {
|
|
212
212
|
// [DR2-02] Convert duration string to ms
|
|
213
|
-
const durationMs = options.duration
|
|
214
|
-
? (0, duration_constants_1.parseDurationToMs)(options.duration)
|
|
215
|
-
: (0, duration_constants_1.parseDurationToMs)('1h');
|
|
213
|
+
const durationMs = (0, duration_constants_1.parseDurationToMs)(options.duration ?? duration_constants_1.DEFAULT_DURATION_FLAG);
|
|
216
214
|
if (durationMs === null) {
|
|
217
|
-
console.error(`Error: Invalid duration. Must be
|
|
215
|
+
console.error(`Error: Invalid duration. Must be ${duration_constants_1.AUTO_YES_DURATION_FLAG_RANGE} (e.g. 5h).`);
|
|
218
216
|
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
219
217
|
}
|
|
220
218
|
body.duration = durationMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAC;AA4VnE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AA2ED,wBAAgB,oBAAoB,IAAI,OAAO,CAiI9C"}
|
|
@@ -197,6 +197,11 @@ async function capturePrompts(worktreeId, options) {
|
|
|
197
197
|
// Issue #1699: what the contract's denyPatterns were judged against.
|
|
198
198
|
// Null on rows recorded before the field existed.
|
|
199
199
|
approvalTarget: m.promptData.approvalTarget ?? null,
|
|
200
|
+
// Issue #3907: what `wait` passes on beside it (#3881) — whether that
|
|
201
|
+
// target is the whole request, and what the screen was read as when
|
|
202
|
+
// the row was saved. Null on rows saved without them.
|
|
203
|
+
approvalTargetCompleteness: m.promptData.approvalTargetCompleteness ?? null,
|
|
204
|
+
reading: m.promptData.reading ?? null,
|
|
200
205
|
// Issue #1725: which structured signal reported an unclassified row,
|
|
201
206
|
// or null when the row is a plain detection failure (#1708).
|
|
202
207
|
source: typeof m.promptData.source === 'string' ? m.promptData.source : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyXpC,wBAAgB,iBAAiB,IAAI,OAAO,CA+J3C"}
|
|
@@ -19,8 +19,6 @@ const command_target_1 = require("./command-target");
|
|
|
19
19
|
const auto_yes_1 = require("./auto-yes");
|
|
20
20
|
const relays_1 = require("./relays");
|
|
21
21
|
const message_dispatch_1 = require("./message-dispatch");
|
|
22
|
-
/** Auto-yes duration used when --duration is omitted. */
|
|
23
|
-
const DEFAULT_AUTO_YES_DURATION = '1h';
|
|
24
22
|
/**
|
|
25
23
|
* The message length `send` is verified to deliver whole (Issue #2464): the
|
|
26
24
|
* largest body sent through the paste path to claude, codex, command-code and
|
|
@@ -49,9 +47,9 @@ function promptWaitingFallback(worktreeId) {
|
|
|
49
47
|
* behind for a message that was never sent.
|
|
50
48
|
*/
|
|
51
49
|
function resolveAutoYesDurationMs(duration) {
|
|
52
|
-
const durationMs = (0, duration_constants_1.parseDurationToMs)(duration ??
|
|
50
|
+
const durationMs = (0, duration_constants_1.parseDurationToMs)(duration ?? duration_constants_1.DEFAULT_DURATION_FLAG);
|
|
53
51
|
if (durationMs === null) {
|
|
54
|
-
console.error(`Error: Invalid duration. Must be
|
|
52
|
+
console.error(`Error: Invalid duration. Must be ${duration_constants_1.AUTO_YES_DURATION_FLAG_RANGE} (e.g. 5h).`);
|
|
55
53
|
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
56
54
|
}
|
|
57
55
|
return durationMs;
|
|
@@ -244,7 +242,7 @@ function validateSendArgs(worktreeId, message, options) {
|
|
|
244
242
|
// Issue #1608: every option that can be judged from its own value is
|
|
245
243
|
// judged here, before the first side effect. --duration used to be the
|
|
246
244
|
// exception: enableAutoYes() validated it, and that runs after
|
|
247
|
-
// --contract has already created the task row, so `--duration
|
|
245
|
+
// --contract has already created the task row, so `--duration 25h` left
|
|
248
246
|
// a `pending` task for a message that was never sent. Validated
|
|
249
247
|
// unconditionally, like --stop-pattern and --model above: a value the
|
|
250
248
|
// CLI cannot honour is an error whether or not --auto-yes accompanies it.
|
|
@@ -317,7 +315,7 @@ function createSendCommand() {
|
|
|
317
315
|
+ ' flag: it applies only when this send starts the session, and a running session answers 400')
|
|
318
316
|
.option('--auto-yes', 'Enable auto-yes before sending (session-wide, no policy guard; for unattended runs prefer --contract with an autoYes policy)')
|
|
319
317
|
.option('--auto-yes-answer-mode <mode>', `With --auto-yes: ${auto_yes_1.ANSWER_MODE_OPTION_DESCRIPTION}`)
|
|
320
|
-
.option('--duration <duration>', `Auto-yes duration (${duration_constants_1.
|
|
318
|
+
.option('--duration <duration>', `Auto-yes duration (${duration_constants_1.AUTO_YES_DURATION_FLAG_RANGE}, e.g. 1h, 3h, 8h; default ${duration_constants_1.DEFAULT_DURATION_FLAG})`)
|
|
321
319
|
.option('--stop-pattern <pattern>', 'Auto-yes stop pattern (regex). Matched against terminal output; cannot block commands (use the task contract\'s autoYes.denyPatterns for that)')
|
|
322
320
|
.option('--contract <path>', 'Execution contract path relative to the worktree root (e.g. .commandmate/tasks/my-task.yaml). Records a task and sends the contract preamble plus its goal.')
|
|
323
321
|
.option('--ignore-structured-prompt', 'Send even if only the agent\'s hooks report an open dialog (Issue #1737). Use when the pane looks idle but sends are refused; a prompt visible in the terminal is still refused.')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,OAAO,KAAK,EAMV,uBAAuB,EAExB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,OAAO,KAAK,EAMV,uBAAuB,EAExB,MAAM,wBAAwB,CAAC;AAuChC;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,uBAAuB,GAAG,IAAI,CA8BrG;AAkFD,wBAAgB,mBAAmB,IAAI,OAAO,CAsE7C"}
|
|
@@ -156,13 +156,20 @@ function inheritedFlag(own, command, key) {
|
|
|
156
156
|
* The run id leads the line even though it is not in the requested field list:
|
|
157
157
|
* without it there is no way to reach `verify show`, which is the only reason
|
|
158
158
|
* to read this listing in the first place.
|
|
159
|
+
*
|
|
160
|
+
* Gates that carry `timing` (#3884) are named after the verdict with their
|
|
161
|
+
* waits and execution apart (#3909), so "this run took 40 minutes" can be read
|
|
162
|
+
* as a queue, a lock or a slow suite without opening every run. A run none of
|
|
163
|
+
* whose gates waited keeps the line it always had.
|
|
159
164
|
*/
|
|
160
165
|
function formatHistoryLine(run) {
|
|
161
166
|
const failed = run.gates
|
|
162
167
|
.filter((gate) => FAILED_GATE_STATUSES.has(gate.status))
|
|
163
168
|
.map((gate) => gate.gateId);
|
|
164
169
|
const suffix = failed.length > 0 ? ` failed: ${failed.join(',')}` : '';
|
|
165
|
-
|
|
170
|
+
const timed = run.gates.flatMap((gate) => gate.timing ? [`${gate.gateId}(${(0, verify_runner_1.formatGateTiming)(gate.timing, ' ')})`] : []);
|
|
171
|
+
const timing = timed.length > 0 ? ` timing: ${timed.join(' ')}` : '';
|
|
172
|
+
return `#${run.id} ${run.startedAt} ${run.worktreeId} ${run.trigger} ${run.status}${suffix}${timing}`;
|
|
166
173
|
}
|
|
167
174
|
function createVerifyCommand() {
|
|
168
175
|
const cmd = new commander_1.Command('verify');
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Duration Constants for CLI
|
|
3
|
-
* Issue #518: CLI-side duration mapping (safe-regex2 dependency avoidance)
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
4
|
+
* Issue #3913: Single source of truth. Re-exports the Auto-Yes duration
|
|
5
|
+
* definitions from the dependency-free `src/config/auto-yes-duration.ts`
|
|
6
|
+
* instead of copying them (same shape as `cli-tool-ids.ts`).
|
|
7
|
+
*
|
|
8
|
+
* - Uses a RELATIVE path, NOT the `@/` alias: tsconfig.cli.json sets `"paths": {}`,
|
|
9
|
+
* so `@/config/...` does not resolve in the CLI build (`npm run build:cli`).
|
|
10
|
+
* `src/config/auto-yes-config.ts` itself stays out of reach (it imports
|
|
11
|
+
* safe-regex2 and `@/`), which is why the definitions sit in their own module.
|
|
12
|
+
*
|
|
13
|
+
* Previously (Issue #518 [DR1-09]): a `'1h'|'3h'|'8h'` → ms copy guarded by a
|
|
14
|
+
* cross-validation test. The cross-validation test
|
|
15
|
+
* (tests/unit/cli/config/cross-validation.test.ts) now checks all 24 values and
|
|
16
|
+
* the shared reference.
|
|
16
17
|
*/
|
|
17
|
-
export
|
|
18
|
+
export { AUTO_YES_DURATIONS, AUTO_YES_DURATION_FLAG_PATTERN, AUTO_YES_DURATION_FLAG_RANGE, parseAutoYesDurationFlag as parseDurationToMs, } from '../../config/auto-yes-duration';
|
|
19
|
+
/** The `--duration` used when the flag is omitted */
|
|
20
|
+
export declare const DEFAULT_DURATION_FLAG = "1h";
|
|
18
21
|
//# sourceMappingURL=duration-constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duration-constants.d.ts","sourceRoot":"","sources":["../../../src/cli/config/duration-constants.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"duration-constants.d.ts","sourceRoot":"","sources":["../../../src/cli/config/duration-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,4BAA4B,EAC5B,wBAAwB,IAAI,iBAAiB,GAC9C,MAAM,gCAAgC,CAAC;AAExC,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,OAAO,CAAC"}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Duration Constants for CLI
|
|
4
|
-
* Issue #518: CLI-side duration mapping (safe-regex2 dependency avoidance)
|
|
5
4
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Issue #3913: Single source of truth. Re-exports the Auto-Yes duration
|
|
6
|
+
* definitions from the dependency-free `src/config/auto-yes-duration.ts`
|
|
7
|
+
* instead of copying them (same shape as `cli-tool-ids.ts`).
|
|
8
|
+
*
|
|
9
|
+
* - Uses a RELATIVE path, NOT the `@/` alias: tsconfig.cli.json sets `"paths": {}`,
|
|
10
|
+
* so `@/config/...` does not resolve in the CLI build (`npm run build:cli`).
|
|
11
|
+
* `src/config/auto-yes-config.ts` itself stays out of reach (it imports
|
|
12
|
+
* safe-regex2 and `@/`), which is why the definitions sit in their own module.
|
|
13
|
+
*
|
|
14
|
+
* Previously (Issue #518 [DR1-09]): a `'1h'|'3h'|'8h'` → ms copy guarded by a
|
|
15
|
+
* cross-validation test. The cross-validation test
|
|
16
|
+
* (tests/unit/cli/config/cross-validation.test.ts) now checks all 24 values and
|
|
17
|
+
* the shared reference.
|
|
8
18
|
*/
|
|
9
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
exports.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/** List of allowed duration strings */
|
|
19
|
-
exports.ALLOWED_DURATIONS = Object.keys(exports.DURATION_MAP);
|
|
20
|
-
/**
|
|
21
|
-
* Parse a duration string to milliseconds.
|
|
22
|
-
* @param duration - Duration string (e.g., '1h', '3h', '8h')
|
|
23
|
-
* @returns Milliseconds or null if invalid
|
|
24
|
-
*/
|
|
25
|
-
function parseDurationToMs(duration) {
|
|
26
|
-
return exports.DURATION_MAP[duration] ?? null;
|
|
27
|
-
}
|
|
20
|
+
exports.DEFAULT_DURATION_FLAG = exports.parseDurationToMs = exports.AUTO_YES_DURATION_FLAG_RANGE = exports.AUTO_YES_DURATION_FLAG_PATTERN = exports.AUTO_YES_DURATIONS = void 0;
|
|
21
|
+
var auto_yes_duration_1 = require("../../config/auto-yes-duration");
|
|
22
|
+
Object.defineProperty(exports, "AUTO_YES_DURATIONS", { enumerable: true, get: function () { return auto_yes_duration_1.AUTO_YES_DURATIONS; } });
|
|
23
|
+
Object.defineProperty(exports, "AUTO_YES_DURATION_FLAG_PATTERN", { enumerable: true, get: function () { return auto_yes_duration_1.AUTO_YES_DURATION_FLAG_PATTERN; } });
|
|
24
|
+
Object.defineProperty(exports, "AUTO_YES_DURATION_FLAG_RANGE", { enumerable: true, get: function () { return auto_yes_duration_1.AUTO_YES_DURATION_FLAG_RANGE; } });
|
|
25
|
+
Object.defineProperty(exports, "parseDurationToMs", { enumerable: true, get: function () { return auto_yes_duration_1.parseAutoYesDurationFlag; } });
|
|
26
|
+
/** The `--duration` used when the flag is omitted */
|
|
27
|
+
exports.DEFAULT_DURATION_FLAG = '1h';
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* This content is embedded as a string constant so that it's available
|
|
6
6
|
* even when installed via `npm install -g commandmate` (where docs/ is not included).
|
|
7
7
|
*/
|
|
8
|
-
export declare const AGENT_OPERATIONS_GUIDE = "# CLI Agent Operations Guide\n\nOperate agent sessions from the CommandMate CLI.\nThese commands enable coding agents (Claude Code, Codex, etc.) to orchestrate other agents in parallel.\n\n## Prerequisites\n\n- CommandMate server must be running: commandmate start --daemon\n- Target worktrees must be registered (visible in browser UI sidebar)\n- Connection target is resolved as: exported CM_PORT > ~/.commandmate/.env CM_PORT > 3000\n (CM_BIND and the CM_HTTPS_CERT + CM_HTTPS_KEY pair are honoured the same way)\n- Use CM_AUTH_TOKEN env var for authenticated servers\n\n## Commands\n\n### commandmate ls\n List worktrees with status.\n\n commandmate ls # Table format (ID, NAME, STATUS, REASON, DEFAULT, AUTO_YES)\n commandmate ls --json # JSON output (for agent consumption)\n commandmate ls --quiet # IDs only, one per line (for piping)\n commandmate ls --branch <prefix> # Filter by branch name prefix\n commandmate ls --id <prefix> # Filter by worktree id prefix\n\n Worktree ids are <repo>-<branch> slugs (e.g. anvil-develop). --id / --branch\n front-match is case-sensitive and does NOT guarantee uniqueness (e.g.\n --id anvil-develop also matches anvil-develop-2). --branch and --id combine\n as AND. Use --id to disambiguate the same branch across repositories.\n\n STATUS values:\n idle - Session not started\n ready - Session running, waiting for input (task completed)\n running - Agent executing a task\n waiting - Confirmation prompt active (Yes/No, etc.)\n\n REASON values (Issue #1926):\n The evidence behind the STATUS beside it. '<reason> (no evidence)' marks a\n frame the detection layer could not classify, so the STATUS is a fallback\n rather than a reading. '-' means the server gives no reason: it predates\n #1926, the session is not running, or the tool has two or more instances and\n the per-tool aggregate dropped it. 'commandmate ls --json' keeps the\n per-tool rows under sessionStatusByCli.<tool>.\n\n AUTO_YES values (Issue #2575):\n Time left on the instance that will lose Auto-Yes FIRST, among the instances\n that explain this row's STATUS (waiting: the ones waiting; running: the ones\n processing; ready: the ones running; idle: the ones that exited -- a bare\n idle row falls back to every armed instance).\n\n MM:SS - time left, under an hour (e.g. 42:10)\n H:MM:SS - time left, an hour or more (e.g. 1:05:33)\n on - armed, with no expiry the server named\n off - at least one of those instances is NOT armed, so a prompt on this\n row waits for a human. 'waiting' + 'off' is a confirmation\n prompt nobody is going to answer -- the cell to look for\n blocked - armed, but the contract running on that instance sets\n autoYes.mode: off, so nothing is answered there either\n (Issue #3723; --json: autoYesByInstance.<id>.blockedByContract)\n off(restart) - off, because the server restarted while the grant was live\n (Issue #3730; --json: autoYesStopReasonByInstance.<id>)\n - - not known: the server predates #2512, or this row is not idle and\n no instance explains its STATUS\n\n A trailing ' (<instanceId>)' names the instance the cell is about, printed\n when that is not the default agent's primary. Pass it to capture / send /\n respond as --instance verbatim.\n\n Time left is a fact about Auto-Yes, not a promise that the prompt gets\n answered: a contract autoYes policy can withhold the answer, and a free-text\n prompt has none to give. 'commandmate capture <id> --json --instance <id>'\n carries autoYes.lastSuppression and autoYes.stopReason; 'commandmate wait'\n returns exit 10 for a prompt no agent is going to clear.\n\n Nothing here is derived in --json: it carries sessionStatusByInstance and\n autoYesByInstance raw, which is where the per-instance breakdown is.\n\n### commandmate sync\n Ask the server to re-scan repositories and sync worktrees to its database\n (same endpoint as the GUI sync button). Run it after 'git worktree add' so the\n new worktree appears in 'commandmate ls' without opening the GUI (Issue #1680).\n\n commandmate sync # Prints the server's summary message\n commandmate sync --json # Full API response (worktreeCount,\n # repositoryCount, repositories,\n # deletedCount, cleanupWarnings)\n\n### commandmate send <worktree-id> \"<message>\"\n Send a message to an agent (async). Starts session automatically if not running.\n\n Options:\n --instance <id> Agent instance ID: <agent> or <agent>-<n> (e.g. claude-2, or codex\n for the codex primary instance). The recommended way to name a\n target: send / wait / respond / capture / auto-yes all take it.\n --agent <id> Ad-hoc CLI tool for an instance the roster does not know:\n claude (default), codex, gemini, vibe-local, opencode, copilot, antigravity\n --register Register the --instance session into the agent-instance roster\n --auto-yes Enable auto-yes before sending (session-wide, no policy\n guard -- for unattended runs prefer --contract with an\n autoYes policy: mode / denyPatterns)\n --auto-yes-answer-mode <m>\n With --auto-yes: recommended (questions answered with the\n recommended option, else the default) or careful\n (questions left to you). See auto-yes below\n --duration <d> Auto-yes duration: 1h, 3h, 8h (default: 1h)\n --stop-pattern <p> Auto-yes stop condition (regex; matches terminal output,\n cannot block commands -- see auto-yes below)\n --ignore-structured-prompt\n Send even if only the agent's hooks report an open dialog.\n For a session whose pane looks idle but keeps refusing;\n a dialog visible in the terminal is still refused.\n --reply-to <target> Deliver the target session's reply into <target>'s composer\n when the turn ends: <worktree-id>[@<instance-id|alias>], or\n 'self' for the session running the command. Nothing blocks --\n there is no wait to run and no pane to scrape.\n --allow-relay-chain Permit --reply-to while answering a message that itself\n arrived over a relay. Refused by default (exit 2); chains\n still stop at 3 hops.\n\n Refused while the agent is waiting on a prompt (exit 2). Keystrokes sent to\n an open dialog never reach the agent -- they pile up in the dialog's own\n input line, and the next respond then carries that text along as a message\n instead of an answer. Nudging a stalled worker is how this gets worse.\n Answer first: commandmate respond <id> <answer>. respond, special keys and\n prompt-response are never refused -- they are the way out. Timer-fired sends\n ARE refused (same service layer) and record [prompt_waiting] as their reason.\n It fails open if the pane cannot be read, so treat it as a narrowing, not a\n guarantee.\n\n Two layers can report the dialog: the terminal scraper, and the agent's own\n hooks. Either one is enough to refuse -- the dialog the scraper cannot read is\n exactly the one that caused this. A frame neither layer classifies is still\n wait's \"unclassified\" case instead.\n\n A hook-reported dialog is released by the agent's next event, and hooks are\n fail-open, so the record can outlive its dialog. It therefore stops blocking\n sends 5 minutes after it was reported -- and immediately with\n --ignore-structured-prompt, or CM_STRUCTURED_SEND_GUARD=off for the server.\n A session nobody can send to is worse than a missed guard. Both bypasses are\n narrow: a prompt on screen is still refused, and the payload still reports it\n (wait and the UI do not go quiet).\n\n Message length: up to 48 KiB and 240 lines arrives whole on claude, codex,\n command-code and antigravity (verified, Issue #2464). Over 512 bytes the\n message is pasted as one bracketed paste and Enter waits until the agent's\n composer shows all of it; if it never does, nothing is submitted and send\n exits 99 (\"Message body did not arrive intact\"). Put a longer brief in a\n file and send a message that names it ('commandmate docs --section delegation').\n\n Finding worktree IDs:\n WT=$(commandmate ls --branch feature/101 --quiet)\n WT=$(commandmate ls --id anvil- --quiet) # disambiguate by repo (id prefix)\n commandmate send \"$WT\" \"Implement this\"\n\n Targeting a non-default agent (Issue #1638): pass --instance, not --agent. Only\n --instance is accepted by every command -- 'wait --agent' does not exist -- so a\n workflow that names the agent on 'send' and nothing on 'wait' waits on the wrong\n session in silence.\n commandmate send \"$WT\" \"Implement this\" --instance codex\n commandmate wait \"$WT\" --instance codex\n\n Delegating without blocking (--reply-to):\n commandmate send \"$WT\" \"Implement this\" --instance codex --reply-to self\n # ... keep working. When codex finishes, its answer arrives in your composer as\n # [from Codex 2 / <worktree>] <reply>, saved in History as a 'relay' message.\n commandmate relays # what is still outstanding\n\n The relay is refused (exit 2, nothing sent) when the message you are answering\n arrived over a relay itself (pass --allow-relay-chain), when the chain would\n exceed 3 hops, or when an open relay between the two sessions already exists.\n If the target stops on a confirmation you are told, once, and the relay stays\n open -- answer the dialog on that session and the reply still arrives. A relay\n nobody could deliver expires after 24h with a single line of notice.\n\n### commandmate relays\n List the standing delegations this session is waiting on and owes.\n\n commandmate relays # the session running the command\n commandmate relays --worktree <id> --instance codex-2\n commandmate relays --json # owed / awaiting / open / counts\n commandmate relays cancel <relay-id> # withdraw one; nothing is delivered\n\n States: pending (the worker has not finished), prompt (it stopped on a\n confirmation and the requester was told; still open), delivered, expired,\n cancelled.\n\n 'relays cancel' cannot withdraw a relay that is being delivered right now\n (a reply or a prompt notice): the server answers 409 and the command exits\n 2. The delivery usually goes through; if it fails, the relay stays open and\n can be cancelled again once that attempt is over. A relay that is already\n closed (delivered, expired, cancelled) exits 2 too.\n\n A reply is held rather than delivered while the requesting session is\n generating -- typing into a running composer interrupts the turn -- and is\n delivered as soon as it is idle again.\n\n### commandmate wait <worktree-id...>\n Block until agent completes or prompt is detected.\n\n Options:\n --timeout <seconds> Maximum wait time\n --on-prompt <mode> agent (default) or human\n --stall-timeout <seconds> Max time without output change\n --instance <id> Agent instance to wait on. There is no --agent here.\n --verify After completion, run every verification gate\n --require-work After completion, run only the work-evidence gate\n --auto-yes-grace <seconds> With the target's Auto-Yes on, how long a prompt may\n stay open before exit 10 (default 30; 0 = at once)\n\n Exit codes:\n 0 - Completed (agent idle/ready), and verified when --verify was given\n 10 - Prompt detected (--on-prompt agent mode)\n 20 - A verification gate failed (--verify)\n 21 - Nothing to verify: no commits, no uncommitted changes\n 124 - Timeout exceeded\n\n --on-prompt modes:\n agent - Returns exit 10 with prompt JSON on stdout: at once, or after the\n Auto-Yes grace below when the target's Auto-Yes is on\n human - Keeps blocking until human responds via browser UI\n\n Auto-Yes on the target (Issue #2463): in agent mode a prompt on a session\n whose Auto-Yes is on is held, not reported, for up to --auto-yes-grace\n seconds (default 30) -- Auto-Yes answers it within seconds, and an exit 10\n would stop a delegation for a prompt nobody had to see. One stderr line says\n so; stdout stays empty. If the prompt clears, wait goes on judging completion\n as usual ('ask' does the same). It still exits 10 when the grace runs out,\n and at once when the Auto-Yes policy withheld the answer -- the payload then\n carries autoYesSuppression. --auto-yes-grace 0 restores the immediate exit.\n\n Prompt JSON output (exit 10):\n {\"worktreeId\":\"...\",\"cliToolId\":\"claude\",\"type\":\"yes_no\",\"question\":\"...\",\"options\":[\"yes\",\"no\"],\"status\":\"pending\"}\n The payload IS the prompt -- read it from stdout before falling back to\n capture. Since Issue #3755 it also carries \"observation\", the payload\n \"commandmate prompt --json\" prints, read off the same capture. For type \"selection_list\", options is empty by design and the\n question field carries the reason.\n\n Three \"type\" values share exit 10; only the first is answerable with\n respond:\n yes_no / multiple_choice a parsed prompt -> commandmate respond\n selection_list arrow-key menu -> special keys\n unclassified the frame is interactive but detection could\n not parse it, and it has stayed that way for\n 60s -> look at the pane: capture <id> --pane\n \"unclassified\" exists because a frame that slips past detection disables\n auto-yes, the contract's autoYes policy and this exit 10 all at once. It\n needs the dwell: a capture taken mid-repaint can raise the flag once.\n --on-prompt human keeps waiting for it, same as the other two.\n\n On opencode the commonest cause has a name and a one-key fix. If its\n sidebar is on -- ctrl+x b, or \"Show sidebar\" in its ctrl+p palette -- it\n shares screen rows with the transcript, covers the marker that ends a\n turn, and every frame after that reads running/unknown_frame. wait says\n so on stderr (paneObstruction=opencode_sidebar) and capture --json\n publishes the same field. Press ctrl+x b in the pane to close it; Escape\n does not.\n\n An opencode DIALOG is the other one, and it exits 10 as selection_list\n rather than waiting out the dwell. Its session list (ctrl+x l), agent list\n (ctrl+x a), timeline (ctrl+x g), command palette (ctrl+p) and pickers are\n painted over the transcript, so the marker of the previous turn is still\n on the pane behind them -- which is what used to make wait report a\n blocked pane as Completed. sessionStatusReason is opencode_modal_overlay\n and Escape closes all of them.\n\n --verify turns \"the agent stopped\" into \"the work passes the repository's own\n checks\". Verification only runs when completion was detected: a prompt (10) or\n a timeout (124) is reported as-is and never verified. With several worktrees,\n gates run one worktree at a time because the server caps concurrent runs.\n\n### commandmate verify <worktree-id>\n Run the gates declared in .commandmate/verify.yaml against a worktree.\n\n Options:\n --gates <id1,id2> Gate ids to run (default: work-evidence + all declared)\n --instance <id> Attribute the run to an agent instance\n --timeout <seconds> Stop polling after N seconds (exit 124)\n --json Print the run and its gate results as JSON on stdout\n\n Exit codes:\n 0 - Every gate passed\n 20 - A gate failed, timed out, or errored\n 21 - work-evidence found nothing to verify (no commits, no changes)\n 99 - The run produced no verdict (bad verify.yaml, gates skipped, cancelled)\n 124 - --timeout elapsed while the run was still going\n\n Output (progress on stderr, verdict on stdout):\n GATE work-evidence PASS (commits=3, uncommitted=2)\n GATE lint PASS (exit=0, 12.3s)\n GATE unit FAIL (exit=1, 45.0s)\n RESULT failed\n\n Gates run in the worktree's own directory. Gates are skipped (run status 99,\n never 0) in the checkout the server itself runs from when verify.yaml sets\n options.skipInPrimaryCheckout, so a 'build' gate cannot replace the assets the\n live app is serving.\n\n### commandmate verify init\n Draft .commandmate/verify.yaml from this repository's own CI definitions\n (Issue #2061). Reads every 'run:' step in .github/workflows/*.yml plus the\n canonical package.json scripts, and declares the ones that are safe to re-run.\n\n Options:\n --cwd <path> Repository to draft for (default: current directory)\n --dry-run Print the proposal on stdout and write nothing\n --json Print gates, refusals and scanned files as JSON\n\n Exit codes:\n 0 - Wrote (or, with --dry-run, proposed) the config\n 2 - The config already exists, or nothing draftable was found\n\n NEVER overwrites. An existing verify.yaml is the repository's own judgement of\n what passing means, usually with the reasoning for each gate beside it, so\n there is no --force: \"throw it away\" is spelled by deleting the file.\n\n The only verify subcommand that needs no server: it is what you run BEFORE the\n repository has anything to verify.\n\n Commands that are found and NOT declared are reported with a reason on stderr\n (setup, network, release, container, mutating, long-running, multi-line,\n multi-command, runner-specific, not-a-check, interactive, redundant,\n unquotable, reserved-id). A gate must be safe to run any number of times, so\n 'npm ci', 'npm publish', 'npm audit' and e2e suites never become gates.\n\n The draft is a draft: it mirrors what CI already runs, not what the repository\n considers sufficient. Read it, then run it once and confirm RESULT passed.\n\n### commandmate verify history / commandmate verify show <run-id>\n Read past verification runs. Both are read-only and never start a run, so\n neither returns 20 or 21 \u2014 those mean \"this tree failed verification\", and a\n question about history is not a verdict on the current tree.\n\n commandmate verify history # every worktree, newest 50\n commandmate verify history --worktree <id> # one worktree\n commandmate verify history --days 14 --limit 100 # window and page size\n commandmate verify history --json # JSON array on stdout\n commandmate verify show 42 # gates + log tails\n commandmate verify show 42 --json\n\n history options:\n --worktree <id> Restrict to one worktree (default: all)\n --days <n> Look back n days, 1..90 (default: no lower bound)\n --limit <n> Maximum runs, 1..500 (default: 50)\n\n One run per line. The leading #<run-id> is what \"verify show\" takes:\n #42 2026-07-31T04:12:00.000Z myrepo-feature-101 manual failed failed: unit,build\n\n The listing carries gate verdicts but NOT gate log bodies \u2014 logTail is absent\n from the JSON, not null. Use \"verify show <run-id>\" when you need the log.\n\n Exit codes:\n 0 - Read succeeded (also when nothing matched: stderr note, or [] in JSON)\n 2 - Bad argument (--days/--limit out of range, bad worktree or run id)\n 99 - No such run (404), or an unexpected failure\n\n### commandmate prompt <worktree-id> --instance <id> [--json]\n Observe, once, the screen an agent is stopped on (Issue #3755): its kind,\n question, options, current selection, approval target, how it is answered,\n a short-lived observation token, and Auto-Yes as two separate items -- the\n poller's last record and the contract's policy re-evaluated now. The token\n is single use and bound to this appearance of the screen and its highlighted\n option; none is issued for unknown or when the session generation is not\n known (\"tokenWithheld\" says which).\n\n Kinds: antigravity-trust, antigravity-model-picker, antigravity-permission,\n antigravity-slash-menu, composer / none (nothing asks), unknown (something\n waits and no measured reading names it -- look at capture <id> --pane).\n A missing poller record does NOT mean Auto-Yes can answer.\n\n Exit codes:\n 0 - The screen was read (also composer / none / unknown)\n 21 - No running session: nothing to read\n\n### commandmate respond <worktree-id> \"<answer>\"\n Respond to an agent's prompt.\n\n commandmate respond <id> \"yes\" # Yes/No\n commandmate respond <id> \"2\" # Multiple choice (number)\n commandmate respond <id> \"custom text\" # Free text\n commandmate respond <id> \"yes\" --instance codex-2 # Specific instance\n\n Exit codes:\n 0 - Response sent\n 99 - Prompt already dismissed (prompt_no_longer_active)\n\n Strict mode (Issue #3756) -- answer only the screen you observed:\n commandmate prompt <id> --instance antigravity --json # kind, token, approvalTarget\n commandmate respond <id> \"Yes\" --instance antigravity \\\n --expect-screen antigravity-trust --observation <token> \\\n --expect-target \"<approvalTarget>\" --json\n The server re-captures the pane and sends nothing unless the kind, the token\n (pane, generation, appearance, options, highlight) and, on a trust screen,\n the folder still match. Own endpoint (prompt-response/strict); an older\n server is a stop, never a fallback. Kinds: antigravity-trust,\n antigravity-permission. Unnumbered screens (trust) take a label only, sent as\n Up/Down + Enter: a number, --default, a label matching two options and an\n option off screen are refused. While the instance's Auto-Yes is on,\n antigravity-permission is refused (auto_yes_active): run auto-yes <id>\n --disable first (the trust screen is answered either way). Retry with the\n same --operation-id and arguments to read the result instead of sending\n twice; other arguments under a used id are operation_id_conflict (41).\n answeredBy in the record is self-reported by the CLI. Residual race: keys typed at the pane\n between the last check and a key are not seen. NOT a way to get auto mode's\n permission for an approval.\n 0 - Answered (outcome advanced / next-prompt / session-ended)\n 40 - Nothing was sent (mismatch, unreadable, old server): observe again\n 41 - Keys sent, result not confirmed: do NOT send again\n\n### commandmate interrupt <worktree-id>\n Interrupt the turn an agent is generating (the GUI's interrupt button).\n Not 'stop' -- that stops the CommandMate server.\n\n commandmate interrupt <id> # Every running session of the worktree\n commandmate interrupt <id> --instance codex-2 # Only that instance\n commandmate interrupt <id> --json # { success, message, interrupted[] }\n\n Omitting --instance is a broadcast, not \"the primary instance\": the route\n interrupts every session that is running. There is no --agent (wait's rule:\n a tool name does not say which session).\n\n Exit codes:\n 0 - At least one session was interrupted\n 30 - The worktree exists but nothing was running (nothing was interrupted)\n 99 - No such worktree\n\n### commandmate capture <worktree-id>\n Get current terminal output.\n\n commandmate capture <id> # Plain text\n commandmate capture <id> --json # JSON with status info\n commandmate capture <id> --instance codex # Specific instance\n\n### commandmate reply <worktree-id>\n Print the latest reply a session wrote, read from its transcript (no pane).\n Use it to read a turn you did not send with 'ask' (e.g. \"stop and report\").\n\n commandmate reply <id> --instance cc-1 # Reply body\n commandmate reply <id> --instance cc-1 --since 2026-09-30T12:00:00Z --json\n\n Only transcript-reader rows (<tool>-turn:<id>) count, as in 'ask'. No reply\n yet: exit 0, empty stdout, one line on stderr; --json prints \"reply\": null.\n\n### commandmate auto-yes <worktree-id>\n Control auto-yes (automatic prompt response).\n\n commandmate auto-yes <id> --enable # Enable (default 1h)\n commandmate auto-yes <id> --enable --duration 3h # With duration\n commandmate auto-yes <id> --enable --stop-pattern \"error\"\n commandmate auto-yes <id> --disable # Disable\n commandmate auto-yes <id> --enable --instance codex-2 # Scoped to one instance\n commandmate auto-yes <id> --enable --answer-mode careful # Questions are yours\n\n --answer-mode (Issue #3863) decides how a question the agent asks (claude's\n AskUserQuestion, command-code's question) is treated: recommended (the\n default) answers it with the option whose title ends in (Recommended) /\n \uFF08\u63A8\u5968\uFF09 / (\u63A8\u5968), else the default option, and leaves it to you when that\n cannot be told (recommended-option-unidentified); careful leaves every such\n question to you (question-left-to-human). Permissions are answered alike\n (allow this call once), and the Submit/Cancel confirm page, OpenCode V2's\n questions and whatever the contract withholds are never answered. Omitted,\n a new grant is recommended and a grant that is on keeps its mode. The mode\n shows as autoYesAnswerMode in capture --json / instances --json.\n\n --stop-pattern matches new terminal output, not the commands an agent runs.\n It cannot block a command; a build log that merely prints the pattern\n (e.g. \"rm -rf\" in an npm script) also triggers it and stops auto-yes.\n To suppress auto-responses for risky prompts, use the task contract's\n autoYes.denyPatterns instead (docs/design/task-contract.md).\n\n When the contract running on the instance sets autoYes.mode: off, --enable\n (and send --auto-yes) print a 'Warning:' line on stderr and still exit 0:\n Auto-Yes is armed but answers nothing there. safe / allow-listed add one\n 'Note:' line naming what is answered (Issue #3723).\n\n A server restart turns every grant OFF and never turns one back on. After a\n graceful stop (SIGINT / SIGTERM, e.g. /rebuild or 'commandmate stop') each\n instance whose grant was live reports why, until that grant's own deadline or\n the next --enable / --disable (Issue #3730): 'capture --json' autoYes.stopReason\n = 'server-restart', 'ls' AUTO_YES 'off(restart)', 'instances' AUTO_YES\n 'no(restart)', a 'wait' exit 10 adds a stderr line, and the UI toggle reads\n \"Released by restart\". Re-enable with --enable --instance <that instance> (a\n bare --enable arms the default primary). A SIGKILL or a crash records\n nothing: those grants come back as a plain off.\n\n### commandmate instances <worktree-id> [action] [args]\n Discover and manage a worktree's agent-instance roster (1 agent, multiple sessions).\n\n commandmate instances <id> # List roster + running/auto-yes status\n commandmate instances <id> --json # JSON output\n commandmate instances <id> add --agent codex # Add an instance (auto-generates ID, e.g. codex-2)\n commandmate instances <id> add --agent codex --alias \"Review\" --id codex-3\n commandmate instances <id> remove <instance-id> # Remove from roster\n commandmate instances <id> remove <instance-id> --kill # Remove and kill its session\n commandmate instances <id> alias <instance-id> \"New Name\"\n commandmate instances <id> kill <instance-id> # Kill only that instance's session\n\n See \"Multi-Session\" below for the ID convention and roster semantics.\n\n### commandmate skill <subcommand>\n Manage official Agent Skills. Every subcommand is a thin client over the same\n APIs the browser UI uses: the CLI never downloads, extracts, writes or deletes\n anything itself, and never sends a filesystem path, artifact URL, file list or\n checksum (the API rejects those outright).\n\n commandmate skill list [--json] [--prerelease]\n commandmate skill info <skill-id> [--version <v>] [--json]\n commandmate skill plan <skill-id> --worktree <id> [--version <v>] [--json]\n commandmate skill install <skill-id> --worktree <id> --version <exact> [--dry-run] [--yes] [--ack-risk <id>@<version>] [--json]\n commandmate skill uninstall <skill-id> --worktree <id> [--dry-run] [--yes] [--json]\n commandmate skill status <skill-id> --worktree <id> [--json]\n\n Confirmation contract (writes = install / uninstall):\n - A plan is always built and shown first. --dry-run stops there.\n - Without a TTY, a write REQUIRES --yes. A missing --yes is refused, never\n assumed: an environment that cannot prompt must not install silently.\n - A high-risk Skill additionally requires --ack-risk <skill-id>@<version>\n with the exact id and version. --yes alone never carries a high-risk\n install, in a TTY or out of one.\n\n Exit codes:\n 0 success\n 1 the server or the Catalog could not be reached (retryable)\n 2 invalid arguments, unknown Skill or unknown version\n 11 the worktree refused it (local change, conflict, lock, plan drift)\n 12 the write was never confirmed (no --yes, declined, or missing --ack-risk)\n 13 files changed but the operation needs reconciliation\n\n --json prints the API response body verbatim on stdout; diagnostics, prompts\n and errors always go to stderr, so a failed --json run leaves stdout empty.\n\n 'skill status' reports one Skill in one worktree, read from the install\n receipt on disk. There is no per-worktree listing endpoint yet, so <skill-id>\n is required.\n\n## Multi-Session (1 agent, multiple sessions)\n\n A worktree can run several sessions of the same CLI tool concurrently. Each\n session is an \"instance\" identified by an instance ID:\n <agent> - the agent's primary instance (e.g. \"claude\")\n <agent>-<n> - an additional instance, n >= 2 (e.g. \"claude-2\", \"claude-3\")\n\n --instance is accepted by send / wait / respond / capture / auto-yes.\n send --instance auto-starts the session if it is not already running.\n\n --instance alone is the recommended way to name a target (Issue #1638). It is\n the only flag all five commands share: --agent is rejected by 'wait'. A\n rostered instance already carries its CLI tool (Issue #1629), and an instance\n id that is itself a tool id resolves to that tool's primary instance even\n without a roster entry, so '--instance codex' needs no --agent.\n\n --agent remains accepted by send / respond / capture / auto-yes as the\n supplement for ad-hoc instances the roster does not know -- notably\n '--register', which cannot infer the tool from an id like codex-3. Passing an\n --agent that contradicts the roster is an error (exit 2), not an override.\n\n The roster (visible in the browser UI's Agent panel) is the list of known\n instances with aliases and display order. Ad-hoc sessions started via\n 'send --instance' do NOT appear in the roster unless registered:\n commandmate send <id> \"...\" --instance claude-2 --register\n Without --register, the session still runs and responds to CLI commands,\n but it will not show up in the UI sidebar/roster until added there or via\n 'commandmate instances <id> add'.\n\n Per-instance auto-yes: --instance scopes --auto-yes/--duration/--stop-pattern\n to that specific session, independent of other instances of the same agent.\n\n --instance also accepts the ALIAS shown in the ALIAS column of\n 'commandmate instances <id>' and in the browser UI's Agent panel\n (Issue #2376), e.g. --instance \"Codex 2\". An alias two roster rows answer to\n is refused with exit 2 and both candidates listed; ids always win over aliases.\n\n commandmate instances <id> # discover valid --instance values\n commandmate send <id> \"task\" --instance codex-2 --auto-yes\n commandmate wait <id> --instance codex-2 --timeout 600\n commandmate capture <id> --instance codex-2\n\n Asking ANOTHER session something and getting its reply is one command, not\n three -- and waiting for it is optional ('ask --async' / 'send --reply-to',\n Issue #2377): see 'commandmate docs --section delegation'.\n\n## All Exit Codes\n\n 0 SUCCESS - Completed successfully\n 1 DEPENDENCY_ERROR - Server not running\n 2 CONFIG_ERROR - Validation error (invalid agent, duration, etc.)\n 10 PROMPT_DETECTED - Prompt detected during wait\n 20 VERIFY_FAILED - A verification gate failed (verify, wait --verify)\n 21 NOT_STARTED - Nothing to verify: no commits, no uncommitted changes\n 30 NO_ACTIVE_SESSIONS - interrupt found no running session to interrupt\n 99 UNEXPECTED_ERROR - Unexpected error / resource not found / no verdict\n 124 TIMEOUT - Wait or verification timeout exceeded\n\n When one 'wait' covers several worktrees, the reported code is the highest\n priority one observed: 10 > 20 > 21 > 124.\n\n## Troubleshooting\n\n Server not running:\n commandmate start --daemon\n CM_PORT=3011 commandmate ls # Different port\n\n Worktree not found:\n commandmate ls --quiet # Check registered IDs\n commandmate sync # Sync new worktrees (e.g. after git worktree add)\n commandmate status # Confirm 'ls' and 'status' report the same Port\n # (with several servers running, an exported CM_PORT\n # points 'ls' at a different one)\n\n Authentication:\n CM_AUTH_TOKEN=your-token commandmate ls\n";
|
|
8
|
+
export declare const AGENT_OPERATIONS_GUIDE = "# CLI Agent Operations Guide\n\nOperate agent sessions from the CommandMate CLI.\nThese commands enable coding agents (Claude Code, Codex, etc.) to orchestrate other agents in parallel.\n\n## Prerequisites\n\n- CommandMate server must be running: commandmate start --daemon\n- Target worktrees must be registered (visible in browser UI sidebar)\n- Connection target is resolved as: exported CM_PORT > ~/.commandmate/.env CM_PORT > 3000\n (CM_BIND and the CM_HTTPS_CERT + CM_HTTPS_KEY pair are honoured the same way)\n- Use CM_AUTH_TOKEN env var for authenticated servers\n\n## Commands\n\n### commandmate ls\n List worktrees with status.\n\n commandmate ls # Table format (ID, NAME, STATUS, REASON, DEFAULT, AUTO_YES)\n commandmate ls --json # JSON output (for agent consumption)\n commandmate ls --quiet # IDs only, one per line (for piping)\n commandmate ls --branch <prefix> # Filter by branch name prefix\n commandmate ls --id <prefix> # Filter by worktree id prefix\n\n Worktree ids are <repo>-<branch> slugs (e.g. anvil-develop). --id / --branch\n front-match is case-sensitive and does NOT guarantee uniqueness (e.g.\n --id anvil-develop also matches anvil-develop-2). --branch and --id combine\n as AND. Use --id to disambiguate the same branch across repositories.\n\n STATUS values:\n idle - Session not started\n ready - Session running, waiting for input (task completed)\n running - Agent executing a task\n waiting - Confirmation prompt active (Yes/No, etc.)\n\n REASON values (Issue #1926):\n The evidence behind the STATUS beside it. '<reason> (no evidence)' marks a\n frame the detection layer could not classify, so the STATUS is a fallback\n rather than a reading. '-' means the server gives no reason: it predates\n #1926, the session is not running, or the tool has two or more instances and\n the per-tool aggregate dropped it. 'commandmate ls --json' keeps the\n per-tool rows under sessionStatusByCli.<tool>.\n\n AUTO_YES values (Issue #2575):\n Time left on the instance that will lose Auto-Yes FIRST, among the instances\n that explain this row's STATUS (waiting: the ones waiting; running: the ones\n processing; ready: the ones running; idle: the ones that exited -- a bare\n idle row falls back to every armed instance).\n\n MM:SS - time left, under an hour (e.g. 42:10)\n H:MM:SS - time left, an hour or more (e.g. 1:05:33)\n on - armed, with no expiry the server named\n off - at least one of those instances is NOT armed, so a prompt on this\n row waits for a human. 'waiting' + 'off' is a confirmation\n prompt nobody is going to answer -- the cell to look for\n blocked - armed, but the contract running on that instance sets\n autoYes.mode: off, so nothing is answered there either\n (Issue #3723; --json: autoYesByInstance.<id>.blockedByContract)\n off(restart) - off, because the server restarted while the grant was live\n (Issue #3730; --json: autoYesStopReasonByInstance.<id>)\n - - not known: the server predates #2512, or this row is not idle and\n no instance explains its STATUS\n\n A trailing ' (<instanceId>)' names the instance the cell is about, printed\n when that is not the default agent's primary. Pass it to capture / send /\n respond as --instance verbatim.\n\n Time left is a fact about Auto-Yes, not a promise that the prompt gets\n answered: a contract autoYes policy can withhold the answer, and a free-text\n prompt has none to give. 'commandmate capture <id> --json --instance <id>'\n carries autoYes.lastSuppression and autoYes.stopReason; 'commandmate wait'\n returns exit 10 for a prompt no agent is going to clear.\n\n Nothing here is derived in --json: it carries sessionStatusByInstance and\n autoYesByInstance raw, which is where the per-instance breakdown is.\n\n### commandmate sync\n Ask the server to re-scan repositories and sync worktrees to its database\n (same endpoint as the GUI sync button). Run it after 'git worktree add' so the\n new worktree appears in 'commandmate ls' without opening the GUI (Issue #1680).\n\n commandmate sync # Prints the server's summary message\n commandmate sync --json # Full API response (worktreeCount,\n # repositoryCount, repositories,\n # deletedCount, cleanupWarnings)\n\n### commandmate send <worktree-id> \"<message>\"\n Send a message to an agent (async). Starts session automatically if not running.\n\n Options:\n --instance <id> Agent instance ID: <agent> or <agent>-<n> (e.g. claude-2, or codex\n for the codex primary instance). The recommended way to name a\n target: send / wait / respond / capture / auto-yes all take it.\n --agent <id> Ad-hoc CLI tool for an instance the roster does not know:\n claude (default), codex, gemini, vibe-local, opencode, copilot, antigravity\n --register Register the --instance session into the agent-instance roster\n --auto-yes Enable auto-yes before sending (session-wide, no policy\n guard -- for unattended runs prefer --contract with an\n autoYes policy: mode / denyPatterns)\n --auto-yes-answer-mode <m>\n With --auto-yes: recommended (questions answered with the\n recommended option, else the default) or careful\n (questions left to you). See auto-yes below\n --duration <d> Auto-yes duration: 1h-24h, whole hours, e.g. 1h, 3h, 8h\n (default: 1h)\n --stop-pattern <p> Auto-yes stop condition (regex; matches terminal output,\n cannot block commands -- see auto-yes below)\n --ignore-structured-prompt\n Send even if only the agent's hooks report an open dialog.\n For a session whose pane looks idle but keeps refusing;\n a dialog visible in the terminal is still refused.\n --reply-to <target> Deliver the target session's reply into <target>'s composer\n when the turn ends: <worktree-id>[@<instance-id|alias>], or\n 'self' for the session running the command. Nothing blocks --\n there is no wait to run and no pane to scrape.\n --allow-relay-chain Permit --reply-to while answering a message that itself\n arrived over a relay. Refused by default (exit 2); chains\n still stop at 3 hops.\n\n Refused while the agent is waiting on a prompt (exit 2). Keystrokes sent to\n an open dialog never reach the agent -- they pile up in the dialog's own\n input line, and the next respond then carries that text along as a message\n instead of an answer. Nudging a stalled worker is how this gets worse.\n Answer first: commandmate respond <id> <answer>. respond, special keys and\n prompt-response are never refused -- they are the way out. Timer-fired sends\n ARE refused (same service layer) and record [prompt_waiting] as their reason.\n It fails open if the pane cannot be read, so treat it as a narrowing, not a\n guarantee.\n\n Two layers can report the dialog: the terminal scraper, and the agent's own\n hooks. Either one is enough to refuse -- the dialog the scraper cannot read is\n exactly the one that caused this. A frame neither layer classifies is still\n wait's \"unclassified\" case instead.\n\n A hook-reported dialog is released by the agent's next event, and hooks are\n fail-open, so the record can outlive its dialog. It therefore stops blocking\n sends 5 minutes after it was reported -- and immediately with\n --ignore-structured-prompt, or CM_STRUCTURED_SEND_GUARD=off for the server.\n A session nobody can send to is worse than a missed guard. Both bypasses are\n narrow: a prompt on screen is still refused, and the payload still reports it\n (wait and the UI do not go quiet).\n\n Message length: up to 48 KiB and 240 lines arrives whole on claude, codex,\n command-code and antigravity (verified, Issue #2464). Over 512 bytes the\n message is pasted as one bracketed paste and Enter waits until the agent's\n composer shows all of it; if it never does, nothing is submitted and send\n exits 99 (\"Message body did not arrive intact\"). Put a longer brief in a\n file and send a message that names it ('commandmate docs --section delegation').\n\n Finding worktree IDs:\n WT=$(commandmate ls --branch feature/101 --quiet)\n WT=$(commandmate ls --id anvil- --quiet) # disambiguate by repo (id prefix)\n commandmate send \"$WT\" \"Implement this\"\n\n Targeting a non-default agent (Issue #1638): pass --instance, not --agent. Only\n --instance is accepted by every command -- 'wait --agent' does not exist -- so a\n workflow that names the agent on 'send' and nothing on 'wait' waits on the wrong\n session in silence.\n commandmate send \"$WT\" \"Implement this\" --instance codex\n commandmate wait \"$WT\" --instance codex\n\n Delegating without blocking (--reply-to):\n commandmate send \"$WT\" \"Implement this\" --instance codex --reply-to self\n # ... keep working. When codex finishes, its answer arrives in your composer as\n # [from Codex 2 / <worktree>] <reply>, saved in History as a 'relay' message.\n commandmate relays # what is still outstanding\n\n The relay is refused (exit 2, nothing sent) when the message you are answering\n arrived over a relay itself (pass --allow-relay-chain), when the chain would\n exceed 3 hops, or when an open relay between the two sessions already exists.\n If the target stops on a confirmation you are told, once, and the relay stays\n open -- answer the dialog on that session and the reply still arrives. A relay\n nobody could deliver expires after 24h with a single line of notice.\n\n### commandmate relays\n List the standing delegations this session is waiting on and owes.\n\n commandmate relays # the session running the command\n commandmate relays --worktree <id> --instance codex-2\n commandmate relays --json # owed / awaiting / open / counts\n commandmate relays cancel <relay-id> # withdraw one; nothing is delivered\n\n States: pending (the worker has not finished), prompt (it stopped on a\n confirmation and the requester was told; still open), delivered, expired,\n cancelled.\n\n 'relays cancel' cannot withdraw a relay that is being delivered right now\n (a reply or a prompt notice): the server answers 409 and the command exits\n 2. The delivery usually goes through; if it fails, the relay stays open and\n can be cancelled again once that attempt is over. A relay that is already\n closed (delivered, expired, cancelled) exits 2 too.\n\n A reply is held rather than delivered while the requesting session is\n generating -- typing into a running composer interrupts the turn -- and is\n delivered as soon as it is idle again.\n\n### commandmate wait <worktree-id...>\n Block until agent completes or prompt is detected.\n\n Options:\n --timeout <seconds> Maximum wait time\n --on-prompt <mode> agent (default) or human\n --stall-timeout <seconds> Max time without output change\n --instance <id> Agent instance to wait on. There is no --agent here.\n --verify After completion, run every verification gate\n --require-work After completion, run only the work-evidence gate\n --auto-yes-grace <seconds> With the target's Auto-Yes on, how long a prompt may\n stay open before exit 10 (default 30; 0 = at once)\n\n Exit codes:\n 0 - Completed (agent idle/ready), and verified when --verify was given\n 10 - Prompt detected (--on-prompt agent mode)\n 20 - A verification gate failed (--verify)\n 21 - Nothing to verify: no commits, no uncommitted changes\n 124 - Timeout exceeded\n\n --on-prompt modes:\n agent - Returns exit 10 with prompt JSON on stdout: at once, or after the\n Auto-Yes grace below when the target's Auto-Yes is on\n human - Keeps blocking until human responds via browser UI\n\n Auto-Yes on the target (Issue #2463): in agent mode a prompt on a session\n whose Auto-Yes is on is held, not reported, for up to --auto-yes-grace\n seconds (default 30) -- Auto-Yes answers it within seconds, and an exit 10\n would stop a delegation for a prompt nobody had to see. One stderr line says\n so; stdout stays empty. If the prompt clears, wait goes on judging completion\n as usual ('ask' does the same). It still exits 10 when the grace runs out,\n and at once when the Auto-Yes policy withheld the answer -- the payload then\n carries autoYesSuppression. --auto-yes-grace 0 restores the immediate exit.\n\n Prompt JSON output (exit 10):\n {\"worktreeId\":\"...\",\"cliToolId\":\"claude\",\"type\":\"yes_no\",\"question\":\"...\",\"options\":[\"yes\",\"no\"],\"status\":\"pending\"}\n The payload IS the prompt -- read it from stdout before falling back to\n capture. Since Issue #3755 it also carries \"observation\", the payload\n \"commandmate prompt --json\" prints, read off the same capture. For type \"selection_list\", options is empty by design and the\n question field carries the reason.\n\n Three \"type\" values share exit 10; only the first is answerable with\n respond:\n yes_no / multiple_choice a parsed prompt -> commandmate respond\n selection_list arrow-key menu -> special keys\n unclassified the frame is interactive but detection could\n not parse it, and it has stayed that way for\n 60s -> look at the pane: capture <id> --pane\n \"unclassified\" exists because a frame that slips past detection disables\n auto-yes, the contract's autoYes policy and this exit 10 all at once. It\n needs the dwell: a capture taken mid-repaint can raise the flag once.\n --on-prompt human keeps waiting for it, same as the other two.\n\n On opencode the commonest cause has a name and a one-key fix. If its\n sidebar is on -- ctrl+x b, or \"Show sidebar\" in its ctrl+p palette -- it\n shares screen rows with the transcript, covers the marker that ends a\n turn, and every frame after that reads running/unknown_frame. wait says\n so on stderr (paneObstruction=opencode_sidebar) and capture --json\n publishes the same field. Press ctrl+x b in the pane to close it; Escape\n does not.\n\n An opencode DIALOG is the other one, and it exits 10 as selection_list\n rather than waiting out the dwell. Its session list (ctrl+x l), agent list\n (ctrl+x a), timeline (ctrl+x g), command palette (ctrl+p) and pickers are\n painted over the transcript, so the marker of the previous turn is still\n on the pane behind them -- which is what used to make wait report a\n blocked pane as Completed. sessionStatusReason is opencode_modal_overlay\n and Escape closes all of them.\n\n --verify turns \"the agent stopped\" into \"the work passes the repository's own\n checks\". Verification only runs when completion was detected: a prompt (10) or\n a timeout (124) is reported as-is and never verified. With several worktrees,\n gates run one worktree at a time because the server caps concurrent runs.\n\n### commandmate verify <worktree-id>\n Run the gates declared in .commandmate/verify.yaml against a worktree.\n\n Options:\n --gates <id1,id2> Gate ids to run (default: work-evidence + all declared)\n --instance <id> Attribute the run to an agent instance\n --timeout <seconds> Stop polling after N seconds (exit 124)\n --json Print the run and its gate results as JSON on stdout\n\n Exit codes:\n 0 - Every gate passed\n 20 - A gate failed, timed out, or errored\n 21 - work-evidence found nothing to verify (no commits, no changes)\n 99 - The run produced no verdict (bad verify.yaml, gates skipped, cancelled)\n 124 - --timeout elapsed while the run was still going\n\n Output (progress on stderr, verdict on stdout):\n GATE work-evidence PASS (commits=3, uncommitted=2)\n GATE lint PASS (exit=0, 12.3s)\n GATE unit FAIL (exit=1, 45.0s)\n RESULT failed\n\n Gates run in the worktree's own directory. Gates are skipped (run status 99,\n never 0) in the checkout the server itself runs from when verify.yaml sets\n options.skipInPrimaryCheckout, so a 'build' gate cannot replace the assets the\n live app is serving.\n\n### commandmate verify init\n Draft .commandmate/verify.yaml from this repository's own CI definitions\n (Issue #2061). Reads every 'run:' step in .github/workflows/*.yml plus the\n canonical package.json scripts, and declares the ones that are safe to re-run.\n\n Options:\n --cwd <path> Repository to draft for (default: current directory)\n --dry-run Print the proposal on stdout and write nothing\n --json Print gates, refusals and scanned files as JSON\n\n Exit codes:\n 0 - Wrote (or, with --dry-run, proposed) the config\n 2 - The config already exists, or nothing draftable was found\n\n NEVER overwrites. An existing verify.yaml is the repository's own judgement of\n what passing means, usually with the reasoning for each gate beside it, so\n there is no --force: \"throw it away\" is spelled by deleting the file.\n\n The only verify subcommand that needs no server: it is what you run BEFORE the\n repository has anything to verify.\n\n Commands that are found and NOT declared are reported with a reason on stderr\n (setup, network, release, container, mutating, long-running, multi-line,\n multi-command, runner-specific, not-a-check, interactive, redundant,\n unquotable, reserved-id). A gate must be safe to run any number of times, so\n 'npm ci', 'npm publish', 'npm audit' and e2e suites never become gates.\n\n The draft is a draft: it mirrors what CI already runs, not what the repository\n considers sufficient. Read it, then run it once and confirm RESULT passed.\n\n### commandmate verify history / commandmate verify show <run-id>\n Read past verification runs. Both are read-only and never start a run, so\n neither returns 20 or 21 \u2014 those mean \"this tree failed verification\", and a\n question about history is not a verdict on the current tree.\n\n commandmate verify history # every worktree, newest 50\n commandmate verify history --worktree <id> # one worktree\n commandmate verify history --days 14 --limit 100 # window and page size\n commandmate verify history --json # JSON array on stdout\n commandmate verify show 42 # gates + log tails\n commandmate verify show 42 --json\n\n history options:\n --worktree <id> Restrict to one worktree (default: all)\n --days <n> Look back n days, 1..90 (default: no lower bound)\n --limit <n> Maximum runs, 1..500 (default: 50)\n\n One run per line. The leading #<run-id> is what \"verify show\" takes:\n #42 2026-07-31T04:12:00.000Z myrepo-feature-101 manual failed failed: unit,build\n\n The listing carries gate verdicts but NOT gate log bodies \u2014 logTail is absent\n from the JSON, not null. Use \"verify show <run-id>\" when you need the log.\n\n Exit codes:\n 0 - Read succeeded (also when nothing matched: stderr note, or [] in JSON)\n 2 - Bad argument (--days/--limit out of range, bad worktree or run id)\n 99 - No such run (404), or an unexpected failure\n\n### commandmate prompt <worktree-id> --instance <id> [--json]\n Observe, once, the screen an agent is stopped on (Issue #3755): its kind,\n question, options, current selection, approval target, how it is answered,\n a short-lived observation token, and Auto-Yes as two separate items -- the\n poller's last record and the contract's policy re-evaluated now. The token\n is single use and bound to this appearance of the screen and its highlighted\n option; none is issued for unknown or when the session generation is not\n known (\"tokenWithheld\" says which).\n\n Kinds: antigravity-trust, antigravity-model-picker, antigravity-permission,\n antigravity-slash-menu, composer / none (nothing asks), unknown (something\n waits and no measured reading names it -- look at capture <id> --pane).\n A missing poller record does NOT mean Auto-Yes can answer.\n\n Exit codes:\n 0 - The screen was read (also composer / none / unknown)\n 21 - No running session: nothing to read\n\n### commandmate respond <worktree-id> \"<answer>\"\n Respond to an agent's prompt.\n\n commandmate respond <id> \"yes\" # Yes/No\n commandmate respond <id> \"2\" # Multiple choice (number)\n commandmate respond <id> \"custom text\" # Free text\n commandmate respond <id> \"yes\" --instance codex-2 # Specific instance\n\n Exit codes:\n 0 - Response sent\n 99 - Prompt already dismissed (prompt_no_longer_active)\n\n Strict mode (Issue #3756) -- answer only the screen you observed:\n commandmate prompt <id> --instance antigravity --json # kind, token, approvalTarget\n commandmate respond <id> \"Yes\" --instance antigravity \\\n --expect-screen antigravity-trust --observation <token> \\\n --expect-target \"<approvalTarget>\" --json\n The server re-captures the pane and sends nothing unless the kind, the token\n (pane, generation, appearance, options, highlight) and, on a trust screen,\n the folder still match. Own endpoint (prompt-response/strict); an older\n server is a stop, never a fallback. Kinds: antigravity-trust,\n antigravity-permission. Unnumbered screens (trust) take a label only, sent as\n Up/Down + Enter: a number, --default, a label matching two options and an\n option off screen are refused. While the instance's Auto-Yes is on,\n antigravity-permission is refused (auto_yes_active): run auto-yes <id>\n --disable first (the trust screen is answered either way). Retry with the\n same --operation-id and arguments to read the result instead of sending\n twice; other arguments under a used id are operation_id_conflict (41).\n answeredBy in the record is self-reported by the CLI. Residual race: keys typed at the pane\n between the last check and a key are not seen. NOT a way to get auto mode's\n permission for an approval.\n 0 - Answered (outcome advanced / next-prompt / session-ended)\n 40 - Nothing was sent (mismatch, unreadable, old server): observe again\n 41 - Keys sent, result not confirmed: do NOT send again\n\n### commandmate interrupt <worktree-id>\n Interrupt the turn an agent is generating (the GUI's interrupt button).\n Not 'stop' -- that stops the CommandMate server.\n\n commandmate interrupt <id> # Every running session of the worktree\n commandmate interrupt <id> --instance codex-2 # Only that instance\n commandmate interrupt <id> --json # { success, message, interrupted[] }\n\n Omitting --instance is a broadcast, not \"the primary instance\": the route\n interrupts every session that is running. There is no --agent (wait's rule:\n a tool name does not say which session).\n\n Exit codes:\n 0 - At least one session was interrupted\n 30 - The worktree exists but nothing was running (nothing was interrupted)\n 99 - No such worktree\n\n### commandmate capture <worktree-id>\n Get current terminal output.\n\n commandmate capture <id> # Plain text\n commandmate capture <id> --json # JSON with status info\n commandmate capture <id> --instance codex # Specific instance\n\n### commandmate reply <worktree-id>\n Print the latest reply a session wrote, read from its transcript (no pane).\n Use it to read a turn you did not send with 'ask' (e.g. \"stop and report\").\n\n commandmate reply <id> --instance cc-1 # Reply body\n commandmate reply <id> --instance cc-1 --since 2026-09-30T12:00:00Z --json\n\n Only transcript-reader rows (<tool>-turn:<id>) count, as in 'ask'. No reply\n yet: exit 0, empty stdout, one line on stderr; --json prints \"reply\": null.\n\n### commandmate auto-yes <worktree-id>\n Control auto-yes (automatic prompt response).\n\n commandmate auto-yes <id> --enable # Enable (default 1h)\n commandmate auto-yes <id> --enable --duration 3h # With duration\n commandmate auto-yes <id> --enable --stop-pattern \"error\"\n commandmate auto-yes <id> --disable # Disable\n commandmate auto-yes <id> --enable --instance codex-2 # Scoped to one instance\n commandmate auto-yes <id> --enable --answer-mode careful # Questions are yours\n\n --answer-mode (Issue #3863) decides how a question the agent asks (claude's\n AskUserQuestion, command-code's question) is treated: recommended (the\n default) answers it with the option whose title ends in (Recommended) /\n \uFF08\u63A8\u5968\uFF09 / (\u63A8\u5968), else the default option, and leaves it to you when that\n cannot be told (recommended-option-unidentified); careful leaves every such\n question to you (question-left-to-human). Permissions are answered alike\n (allow this call once), and the Submit/Cancel confirm page, OpenCode V2's\n questions and whatever the contract withholds are never answered. Omitted,\n a new grant is recommended and a grant that is on keeps its mode. The mode\n shows as autoYesAnswerMode in capture --json / instances --json.\n\n --stop-pattern matches new terminal output, not the commands an agent runs.\n It cannot block a command; a build log that merely prints the pattern\n (e.g. \"rm -rf\" in an npm script) also triggers it and stops auto-yes.\n To suppress auto-responses for risky prompts, use the task contract's\n autoYes.denyPatterns instead (docs/design/task-contract.md).\n\n When the contract running on the instance sets autoYes.mode: off, --enable\n (and send --auto-yes) print a 'Warning:' line on stderr and still exit 0:\n Auto-Yes is armed but answers nothing there. safe / allow-listed add one\n 'Note:' line naming what is answered (Issue #3723).\n\n A server restart turns every grant OFF and never turns one back on. After a\n graceful stop (SIGINT / SIGTERM, e.g. /rebuild or 'commandmate stop') each\n instance whose grant was live reports why, until that grant's own deadline or\n the next --enable / --disable (Issue #3730): 'capture --json' autoYes.stopReason\n = 'server-restart', 'ls' AUTO_YES 'off(restart)', 'instances' AUTO_YES\n 'no(restart)', a 'wait' exit 10 adds a stderr line, and the UI toggle reads\n \"Released by restart\". Re-enable with --enable --instance <that instance> (a\n bare --enable arms the default primary). A SIGKILL or a crash records\n nothing: those grants come back as a plain off.\n\n### commandmate instances <worktree-id> [action] [args]\n Discover and manage a worktree's agent-instance roster (1 agent, multiple sessions).\n\n commandmate instances <id> # List roster + running/auto-yes status\n commandmate instances <id> --json # JSON output\n commandmate instances <id> add --agent codex # Add an instance (auto-generates ID, e.g. codex-2)\n commandmate instances <id> add --agent codex --alias \"Review\" --id codex-3\n commandmate instances <id> remove <instance-id> # Remove from roster\n commandmate instances <id> remove <instance-id> --kill # Remove and kill its session\n commandmate instances <id> alias <instance-id> \"New Name\"\n commandmate instances <id> kill <instance-id> # Kill only that instance's session\n\n See \"Multi-Session\" below for the ID convention and roster semantics.\n\n### commandmate skill <subcommand>\n Manage official Agent Skills. Every subcommand is a thin client over the same\n APIs the browser UI uses: the CLI never downloads, extracts, writes or deletes\n anything itself, and never sends a filesystem path, artifact URL, file list or\n checksum (the API rejects those outright).\n\n commandmate skill list [--json] [--prerelease]\n commandmate skill info <skill-id> [--version <v>] [--json]\n commandmate skill plan <skill-id> --worktree <id> [--version <v>] [--json]\n commandmate skill install <skill-id> --worktree <id> --version <exact> [--dry-run] [--yes] [--ack-risk <id>@<version>] [--json]\n commandmate skill uninstall <skill-id> --worktree <id> [--dry-run] [--yes] [--json]\n commandmate skill status <skill-id> --worktree <id> [--json]\n\n Confirmation contract (writes = install / uninstall):\n - A plan is always built and shown first. --dry-run stops there.\n - Without a TTY, a write REQUIRES --yes. A missing --yes is refused, never\n assumed: an environment that cannot prompt must not install silently.\n - A high-risk Skill additionally requires --ack-risk <skill-id>@<version>\n with the exact id and version. --yes alone never carries a high-risk\n install, in a TTY or out of one.\n\n Exit codes:\n 0 success\n 1 the server or the Catalog could not be reached (retryable)\n 2 invalid arguments, unknown Skill or unknown version\n 11 the worktree refused it (local change, conflict, lock, plan drift)\n 12 the write was never confirmed (no --yes, declined, or missing --ack-risk)\n 13 files changed but the operation needs reconciliation\n\n --json prints the API response body verbatim on stdout; diagnostics, prompts\n and errors always go to stderr, so a failed --json run leaves stdout empty.\n\n 'skill status' reports one Skill in one worktree, read from the install\n receipt on disk. There is no per-worktree listing endpoint yet, so <skill-id>\n is required.\n\n## Multi-Session (1 agent, multiple sessions)\n\n A worktree can run several sessions of the same CLI tool concurrently. Each\n session is an \"instance\" identified by an instance ID:\n <agent> - the agent's primary instance (e.g. \"claude\")\n <agent>-<n> - an additional instance, n >= 2 (e.g. \"claude-2\", \"claude-3\")\n\n --instance is accepted by send / wait / respond / capture / auto-yes.\n send --instance auto-starts the session if it is not already running.\n\n --instance alone is the recommended way to name a target (Issue #1638). It is\n the only flag all five commands share: --agent is rejected by 'wait'. A\n rostered instance already carries its CLI tool (Issue #1629), and an instance\n id that is itself a tool id resolves to that tool's primary instance even\n without a roster entry, so '--instance codex' needs no --agent.\n\n --agent remains accepted by send / respond / capture / auto-yes as the\n supplement for ad-hoc instances the roster does not know -- notably\n '--register', which cannot infer the tool from an id like codex-3. Passing an\n --agent that contradicts the roster is an error (exit 2), not an override.\n\n The roster (visible in the browser UI's Agent panel) is the list of known\n instances with aliases and display order. Ad-hoc sessions started via\n 'send --instance' do NOT appear in the roster unless registered:\n commandmate send <id> \"...\" --instance claude-2 --register\n Without --register, the session still runs and responds to CLI commands,\n but it will not show up in the UI sidebar/roster until added there or via\n 'commandmate instances <id> add'.\n\n Per-instance auto-yes: --instance scopes --auto-yes/--duration/--stop-pattern\n to that specific session, independent of other instances of the same agent.\n\n --instance also accepts the ALIAS shown in the ALIAS column of\n 'commandmate instances <id>' and in the browser UI's Agent panel\n (Issue #2376), e.g. --instance \"Codex 2\". An alias two roster rows answer to\n is refused with exit 2 and both candidates listed; ids always win over aliases.\n\n commandmate instances <id> # discover valid --instance values\n commandmate send <id> \"task\" --instance codex-2 --auto-yes\n commandmate wait <id> --instance codex-2 --timeout 600\n commandmate capture <id> --instance codex-2\n\n Asking ANOTHER session something and getting its reply is one command, not\n three -- and waiting for it is optional ('ask --async' / 'send --reply-to',\n Issue #2377): see 'commandmate docs --section delegation'.\n\n## All Exit Codes\n\n 0 SUCCESS - Completed successfully\n 1 DEPENDENCY_ERROR - Server not running\n 2 CONFIG_ERROR - Validation error (invalid agent, duration, etc.)\n 10 PROMPT_DETECTED - Prompt detected during wait\n 20 VERIFY_FAILED - A verification gate failed (verify, wait --verify)\n 21 NOT_STARTED - Nothing to verify: no commits, no uncommitted changes\n 30 NO_ACTIVE_SESSIONS - interrupt found no running session to interrupt\n 99 UNEXPECTED_ERROR - Unexpected error / resource not found / no verdict\n 124 TIMEOUT - Wait or verification timeout exceeded\n\n When one 'wait' covers several worktrees, the reported code is the highest\n priority one observed: 10 > 20 > 21 > 124.\n\n## Troubleshooting\n\n Server not running:\n commandmate start --daemon\n CM_PORT=3011 commandmate ls # Different port\n\n Worktree not found:\n commandmate ls --quiet # Check registered IDs\n commandmate sync # Sync new worktrees (e.g. after git worktree add)\n commandmate status # Confirm 'ls' and 'status' report the same Port\n # (with several servers running, an exported CM_PORT\n # points 'ls' at a different one)\n\n Authentication:\n CM_AUTH_TOKEN=your-token commandmate ls\n";
|
|
9
9
|
export declare const AGENT_OPERATIONS_SAMPLES = "# CLI Agent Operations - Workflow Samples\n\nCopy and adapt these patterns for your use case.\n\n## 1. Basic: send, wait, capture\n\n WT=$(commandmate ls --branch feature/101 --quiet)\n commandmate send \"$WT\" \"Implement Issue #101 with TDD\"\n commandmate wait \"$WT\" --timeout 600\n commandmate capture \"$WT\"\n\n## 2. With Auto-Yes (unattended execution)\n\n WT=$(commandmate ls --branch feature/101 --quiet)\n commandmate send \"$WT\" \"Implement Issue #101\" --auto-yes --duration 3h\n commandmate wait \"$WT\" --timeout 1800\n commandmate auto-yes \"$WT\" --disable # Disable for safety\n commandmate capture \"$WT\" --json\n\n## 3. Prompt Response Loop\n\n WT=$(commandmate ls --branch feature/101 --quiet)\n commandmate send \"$WT\" \"Refactor this module\"\n\n while true; do\n commandmate wait \"$WT\" --timeout 600 --on-prompt agent\n EXIT_CODE=$?\n\n if [ $EXIT_CODE -eq 0 ]; then\n echo \"Done\"\n break\n elif [ $EXIT_CODE -eq 10 ]; then\n commandmate respond \"$WT\" \"yes\"\n elif [ $EXIT_CODE -eq 124 ]; then\n echo \"Timeout\"\n break\n fi\n done\n\n commandmate capture \"$WT\"\n\n## 4. Parallel Worktrees\n\n WT1=$(commandmate ls --branch feature/101 --quiet)\n WT2=$(commandmate ls --branch feature/102 --quiet)\n\n commandmate send \"$WT1\" \"Implement #101\" --auto-yes\n commandmate send \"$WT2\" \"Implement #102\" --auto-yes --instance codex\n\n # One --instance covers every worktree id in the call, so worktrees on\n # different instances need one wait each. Both agents keep running while the\n # first wait blocks, so this costs no wall clock over a combined wait.\n # A bare 'wait \"$WT2\"' would watch WT2's DEFAULT agent, not the codex session:\n # 'wait' has no --agent to correct that with.\n commandmate wait \"$WT1\" --timeout 1800\n commandmate wait \"$WT2\" --instance codex --timeout 1800\n\n commandmate capture \"$WT1\" --json\n commandmate capture \"$WT2\" --instance codex --json\n\n## 5. Check status before sending\n\n # Find worktrees and check status\n commandmate ls --json | python3 -c \"\n import sys, json\n for wt in json.load(sys.stdin):\n if wt['name'].startswith('feature/'):\n print(f\\\"{wt['id']} {wt['name']}\\\")\n \"\n\n## 6. Error handling pattern\n\n WT=$(commandmate ls --branch feature/101 --quiet)\n\n if [ -z \"$WT\" ]; then\n echo \"Error: worktree not found\"\n exit 1\n fi\n\n commandmate send \"$WT\" \"Fix the bug\" --auto-yes\n commandmate wait \"$WT\" --timeout 600\n EXIT_CODE=$?\n\n case $EXIT_CODE in\n 0) echo \"Success\"; commandmate capture \"$WT\" ;;\n 10) echo \"Prompt detected\"; commandmate respond \"$WT\" \"yes\" ;;\n 124) echo \"Timeout\"; commandmate capture \"$WT\" --json ;;\n *) echo \"Error: exit $EXIT_CODE\" ;;\n esac\n\n## 7. Multi-Session: run a second Codex session alongside the primary agent\n\n WT=$(commandmate ls --branch feature/101 --quiet)\n\n # Discover the roster before picking an --instance value\n commandmate instances \"$WT\"\n\n # Register a second Codex instance, then send/wait/capture scoped to it.\n # Once it is in the roster, --instance alone carries the CLI tool.\n commandmate instances \"$WT\" add --agent codex --alias \"Review\"\n commandmate send \"$WT\" \"Review the diff\" --instance codex-2 --auto-yes\n commandmate wait \"$WT\" --instance codex-2 --timeout 600\n commandmate capture \"$WT\" --instance codex-2 --json\n\n # Ad-hoc instance without pre-registering (still runs; register to show in UI).\n # --agent is required here: codex-3 is not in the roster yet, so nothing else\n # says which CLI tool to start.\n commandmate send \"$WT\" \"Quick check\" --agent codex --instance codex-3 --register\n\n # Clean up when done\n commandmate instances \"$WT\" remove codex-2 --kill\n\n## 8. Verify the work instead of trusting \"the agent stopped\"\n\n WT=$(commandmate ls --branch feature/101 --quiet)\n commandmate send \"$WT\" \"Implement Issue #101 with TDD\" --auto-yes\n\n # One call: wait for completion, then run every gate in .commandmate/verify.yaml\n commandmate wait \"$WT\" --timeout 1800 --verify\n case $? in\n 0) echo \"Verified\" ;;\n 10) commandmate respond \"$WT\" \"yes\" ;;\n 20) echo \"A gate failed\"; commandmate verify \"$WT\" --json ;;\n 21) echo \"The agent produced nothing\" ;;\n esac\n\n # Cheap pre-check: is there any work at all, before paying for the full suite?\n commandmate wait \"$WT\" --require-work || echo \"no commits and no changes\"\n\n # Re-run a subset after a fix, without waiting on the agent\n commandmate verify \"$WT\" --gates lint,unit\n";
|
|
10
10
|
/**
|
|
11
11
|
* Delegation between agent sessions (Issue #2376).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-operations.d.ts","sourceRoot":"","sources":["../../../src/cli/docs/agent-operations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"agent-operations.d.ts","sourceRoot":"","sources":["../../../src/cli/docs/agent-operations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,sBAAsB,ihjCAkmBlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,klJAmIpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,sBAAsB,qxNA+IlC,CAAC"}
|
|
@@ -111,7 +111,8 @@ These commands enable coding agents (Claude Code, Codex, etc.) to orchestrate ot
|
|
|
111
111
|
With --auto-yes: recommended (questions answered with the
|
|
112
112
|
recommended option, else the default) or careful
|
|
113
113
|
(questions left to you). See auto-yes below
|
|
114
|
-
--duration <d> Auto-yes duration: 1h, 3h, 8h
|
|
114
|
+
--duration <d> Auto-yes duration: 1h-24h, whole hours, e.g. 1h, 3h, 8h
|
|
115
|
+
(default: 1h)
|
|
115
116
|
--stop-pattern <p> Auto-yes stop condition (regex; matches terminal output,
|
|
116
117
|
cannot block commands -- see auto-yes below)
|
|
117
118
|
--ignore-structured-prompt
|
|
@@ -916,7 +916,7 @@ export interface CurrentOutputResponse {
|
|
|
916
916
|
* server it dials.
|
|
917
917
|
*/
|
|
918
918
|
upstreamFault?: {
|
|
919
|
-
/** `overloaded` / `retrying` / `limit-reached` / `api-error
|
|
919
|
+
/** `overloaded` / `retrying` / `context-limit` / `model-capacity` / `limit-reached` / `api-error` (`UPSTREAM_FAULTS`). */
|
|
920
920
|
id: string;
|
|
921
921
|
/** The whole line that matched, trimmed and bounded to 200 UTF-8 bytes. */
|
|
922
922
|
matchedText: string;
|
|
@@ -1251,6 +1251,34 @@ export interface PromptMessageResponse {
|
|
|
1251
1251
|
requestId?: string;
|
|
1252
1252
|
archived: boolean;
|
|
1253
1253
|
}
|
|
1254
|
+
/**
|
|
1255
|
+
* One entry of `capture --prompts --json`'s `prompts` (Issue #1685), built by
|
|
1256
|
+
* `src/cli/commands/capture.ts` from a {@link PromptMessageResponse}. A field
|
|
1257
|
+
* the row does not carry is `null`.
|
|
1258
|
+
*/
|
|
1259
|
+
export interface CapturePromptEntry {
|
|
1260
|
+
id: string;
|
|
1261
|
+
timestamp: string;
|
|
1262
|
+
cliToolId: string | null;
|
|
1263
|
+
instanceId: string | null;
|
|
1264
|
+
type: string;
|
|
1265
|
+
question: string;
|
|
1266
|
+
options: unknown[] | null;
|
|
1267
|
+
status: string | null;
|
|
1268
|
+
answer: string | null;
|
|
1269
|
+
answeredAt: string | null;
|
|
1270
|
+
answeredBy: string | null;
|
|
1271
|
+
/** Issue #1699: what the contract's denyPatterns were judged against. */
|
|
1272
|
+
approvalTarget: string | null;
|
|
1273
|
+
/**
|
|
1274
|
+
* Issue #3907: the same audit fields `wait` passes on
|
|
1275
|
+
* ({@link WaitPromptOutput}, #3881), from the stored row.
|
|
1276
|
+
*/
|
|
1277
|
+
approvalTargetCompleteness: PromptData['approvalTargetCompleteness'] | null;
|
|
1278
|
+
reading: PromptData['reading'] | null;
|
|
1279
|
+
/** Issue #1725: which structured signal reported an unclassified row. */
|
|
1280
|
+
source: string | null;
|
|
1281
|
+
}
|
|
1254
1282
|
export interface PromptResponseResult {
|
|
1255
1283
|
success: boolean;
|
|
1256
1284
|
answer: string;
|