commandmate 0.43.0 → 0.44.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 +209 -209
- package/.next/app-path-routes-manifest.json +36 -36
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- 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.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/app/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js.nft.json +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.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +7 -7
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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]/resolve-target/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +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.js.nft.json +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.js +103 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +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.js.nft.json +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 +1 -1
- 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.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +36 -36
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +14 -0
- package/.next/server/chunks/650.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/{5742.js → 6927.js} +1 -1
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +1 -1
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -0
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +105 -3
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +2 -2
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +2 -2
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-340774f1a24f2b45.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
- package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
- package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
- package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
- package/.next/static/chunks/app/{layout-057c850cd0df978e.js → layout-0fc249fb7de75a27.js} +1 -1
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +58 -620
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +11 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +5 -0
- package/dist/cli/commands/remote.d.ts +24 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +155 -6
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +255 -112
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +53 -1
- package/dist/cli/commands/sync.js +3 -3
- package/dist/cli/docs/setup-guide.d.ts +14 -0
- package/dist/cli/docs/setup-guide.d.ts.map +1 -0
- package/dist/cli/docs/setup-guide.js +366 -0
- package/dist/cli/types/api-responses.d.ts +11 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/daemon.d.ts +42 -2
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +222 -40
- package/dist/cli/utils/docs-reader.d.ts +6 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.js +14 -13
- package/dist/cli/utils/npm-runner.d.ts +12 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +36 -0
- package/dist/cli/utils/process-inspect.d.ts +55 -0
- package/dist/cli/utils/process-inspect.d.ts.map +1 -0
- package/dist/cli/utils/process-inspect.js +214 -0
- package/dist/cli/utils/remote-pairing.d.ts +68 -0
- package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
- package/dist/cli/utils/remote-pairing.js +117 -0
- package/dist/cli/utils/server-identity.d.ts +50 -0
- package/dist/cli/utils/server-identity.d.ts.map +1 -0
- package/dist/cli/utils/server-identity.js +118 -0
- package/dist/cli/utils/server-ready.d.ts +13 -0
- package/dist/cli/utils/server-ready.d.ts.map +1 -1
- package/dist/cli/utils/server-ready.js +16 -0
- package/dist/lib/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +28 -6
- package/dist/server/locales/ja/worktree.json +28 -6
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/lib/auto-yes-poller.js +22 -0
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +27 -2
- package/dist/server/src/lib/detection/cli-patterns.js +94 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
- package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/session/claude-executor.js +2 -2
- package/dist/server/src/lib/session/claude-session.js +131 -15
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- package/docs/en/architecture.md +722 -0
- package/docs/en/user-guide/agents-guide.md +306 -0
- package/docs/en/user-guide/cli-setup-guide.md +676 -0
- package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
- package/docs/en/user-guide/commands-guide.md +467 -0
- package/docs/en/user-guide/quick-start.md +231 -0
- package/docs/en/user-guide/webapp-guide.md +1020 -0
- package/docs/en/user-guide/workflow-examples.md +463 -0
- package/package.json +18 -7
- package/release-notes/0.44.0.json +82 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/6491.js +0 -103
- package/.next/server/chunks/7004.js +0 -1
- package/.next/server/chunks/8673.js +0 -14
- package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
- package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
|
@@ -17,9 +17,13 @@
|
|
|
17
17
|
* counted, and it is the single failure this gate must not reproduce.
|
|
18
18
|
* 2. **Additions and removals are judged asymmetrically.** Everything that
|
|
19
19
|
* existed at task start must still exist, whoever it belonged to — that is
|
|
20
|
-
* the pkill (#1739) and `kill-server` (#1624) case — with
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* the pkill (#1739) and `kill-server` (#1624) case — with three exceptions,
|
|
21
|
+
* each recorded in the baseline rather than guessed at verification: a
|
|
22
|
+
* tmux session of *another CommandMate server* (#2627) or of *this* server's
|
|
23
|
+
* worktree in *another repository* (#3043), which their owners close
|
|
24
|
+
* whenever they like, and a `.commandmate-demo-vitest-<pid>` directory
|
|
25
|
+
* whose pid was already dead (#3043), which the demo-video tests clean up
|
|
26
|
+
* by design. New things are a
|
|
23
27
|
* violation *unless they are attributable to another worker*, because
|
|
24
28
|
* parallel delegations legitimately start their own sessions and servers
|
|
25
29
|
* inside each other's measurement windows — or unless they are the one
|
|
@@ -31,7 +35,7 @@
|
|
|
31
35
|
* @module lib/verification/env-clean-gate
|
|
32
36
|
*/
|
|
33
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
exports.ENV_CLEAN_GUIDANCE = exports.MAX_REPORTED_ENV_CHANGES = exports.readLivePidCwd = exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT = exports.REQUIRE_ENV_CLEAN_SOURCE_CONFIG = void 0;
|
|
38
|
+
exports.ENV_CLEAN_GUIDANCE = exports.MAX_REPORTED_ENV_CHANGES = exports.isLivePid = exports.readLivePidCwd = exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT = exports.REQUIRE_ENV_CLEAN_SOURCE_CONFIG = void 0;
|
|
35
39
|
exports.resolveRequireEnvClean = resolveRequireEnvClean;
|
|
36
40
|
exports.attributeSessionName = attributeSessionName;
|
|
37
41
|
exports.attributeAnchor = attributeAnchor;
|
|
@@ -44,6 +48,10 @@ exports.currentSessionServer = currentSessionServer;
|
|
|
44
48
|
exports.isOtherServerSession = isOtherServerSession;
|
|
45
49
|
exports.recordOtherServerSessions = recordOtherServerSessions;
|
|
46
50
|
exports.readOtherServerSessions = readOtherServerSessions;
|
|
51
|
+
exports.recordOtherRepositorySessions = recordOtherRepositorySessions;
|
|
52
|
+
exports.readOtherRepositorySessions = readOtherRepositorySessions;
|
|
53
|
+
exports.recordDeadDemoVitestEntries = recordDeadDemoVitestEntries;
|
|
54
|
+
exports.readDeadDemoVitestEntries = readDeadDemoVitestEntries;
|
|
47
55
|
exports.diffEnvSnapshots = diffEnvSnapshots;
|
|
48
56
|
exports.formatEnvCleanReport = formatEnvCleanReport;
|
|
49
57
|
exports.envCleanNoBaseline = envCleanNoBaseline;
|
|
@@ -51,6 +59,8 @@ exports.evaluateEnvClean = evaluateEnvClean;
|
|
|
51
59
|
const child_process_1 = require("child_process");
|
|
52
60
|
const fs_1 = require("fs");
|
|
53
61
|
const path_1 = require("path");
|
|
62
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
63
|
+
const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
54
64
|
const session_name_1 = require("../../lib/cli-tools/session-name");
|
|
55
65
|
const types_1 = require("../../lib/cli-tools/types");
|
|
56
66
|
const env_snapshot_1 = require("./env-snapshot");
|
|
@@ -189,6 +199,16 @@ exports.readLivePidCwd = readLivePidCwd;
|
|
|
189
199
|
* entry whose owner can be established.
|
|
190
200
|
*/
|
|
191
201
|
const DEMO_VITEST_HOME_ENTRY = /^\.commandmate-demo-vitest-([1-9]\d*)$/;
|
|
202
|
+
const isLivePid = (pid) => {
|
|
203
|
+
try {
|
|
204
|
+
process.kill(pid, 0);
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return error.code === 'EPERM';
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
exports.isLivePid = isLivePid;
|
|
192
212
|
/** The pid a `.commandmate-demo-vitest-<pid>` name carries; null for any other name. */
|
|
193
213
|
function demoVitestPid(name) {
|
|
194
214
|
const match = DEMO_VITEST_HOME_ENTRY.exec(name);
|
|
@@ -252,11 +272,13 @@ function resolveTaskSessionName(task) {
|
|
|
252
272
|
}
|
|
253
273
|
}
|
|
254
274
|
/** A freshly captured baseline, stamped with its task's own agent session. */
|
|
255
|
-
function recordTaskSession(snapshot, task, server = currentSessionServer()) {
|
|
275
|
+
function recordTaskSession(snapshot, task, server = currentSessionServer(), isPidAlive = exports.isLivePid) {
|
|
256
276
|
return {
|
|
257
277
|
...snapshot,
|
|
258
278
|
taskSession: resolveTaskSessionName(task),
|
|
259
279
|
otherServerSessions: recordOtherServerSessions(snapshot, server),
|
|
280
|
+
otherRepositorySessions: recordOtherRepositorySessions(snapshot, task.worktreeId, server),
|
|
281
|
+
deadDemoVitestEntries: recordDeadDemoVitestEntries(snapshot, isPidAlive),
|
|
260
282
|
};
|
|
261
283
|
}
|
|
262
284
|
/**
|
|
@@ -292,6 +314,14 @@ function currentSessionServer() {
|
|
|
292
314
|
return undefined;
|
|
293
315
|
}
|
|
294
316
|
},
|
|
317
|
+
repositoryOf: (worktreeId) => {
|
|
318
|
+
try {
|
|
319
|
+
return (0, worktree_db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId)?.repositoryPath || null;
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
},
|
|
295
325
|
};
|
|
296
326
|
}
|
|
297
327
|
/**
|
|
@@ -370,6 +400,131 @@ function readOtherServerSessions(baseline) {
|
|
|
370
400
|
return new Set();
|
|
371
401
|
return new Set(recorded.filter((name) => typeof name === 'string'));
|
|
372
402
|
}
|
|
403
|
+
// =============================================================================
|
|
404
|
+
// This server's sessions of another repository (Issue #3043)
|
|
405
|
+
// =============================================================================
|
|
406
|
+
/**
|
|
407
|
+
* The repository a session of this server belongs to, or null when that
|
|
408
|
+
* cannot be pinned to exactly one.
|
|
409
|
+
*
|
|
410
|
+
* The worktree id and the instance suffix are not separable by name alone
|
|
411
|
+
* (`parseSessionName`), so every hyphen-boundary prefix of the tail is looked
|
|
412
|
+
* up; a prefix that is not a registered worktree answers null and is skipped.
|
|
413
|
+
* More than one repository among the answers is ambiguous and answers null —
|
|
414
|
+
* the strict direction, because null excuses nothing.
|
|
415
|
+
*/
|
|
416
|
+
function sessionRepository(tail, server) {
|
|
417
|
+
const repositoryOf = server.repositoryOf;
|
|
418
|
+
if (!repositoryOf)
|
|
419
|
+
return null;
|
|
420
|
+
const repositories = new Set();
|
|
421
|
+
let end = tail.indexOf('-');
|
|
422
|
+
for (;;) {
|
|
423
|
+
const candidate = end === -1 ? tail : tail.slice(0, end);
|
|
424
|
+
const repository = repositoryOf(candidate);
|
|
425
|
+
if (repository)
|
|
426
|
+
repositories.add(repository);
|
|
427
|
+
if (end === -1)
|
|
428
|
+
break;
|
|
429
|
+
end = tail.indexOf('-', end + 1);
|
|
430
|
+
}
|
|
431
|
+
return repositories.size === 1 ? [...repositories][0] : null;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* The baseline's `mcbd-*` sessions of *this* server whose worktree belongs to a
|
|
435
|
+
* repository other than the task's, at task creation.
|
|
436
|
+
*
|
|
437
|
+
* Why this is the second line removals are excused on — the design note for
|
|
438
|
+
* #3043, which extends the one for #2627 rather than contradicting it:
|
|
439
|
+
*
|
|
440
|
+
* - #1624, the case the removal rule exists for, was a worker killing a
|
|
441
|
+
* *sibling worktree of the same repository*. Those sessions stay guarded
|
|
442
|
+
* exactly as before: a same-repository removal is never excused, however
|
|
443
|
+
* plainly `other` its name is.
|
|
444
|
+
* - A worktree of another repository is driven by another orchestrate on the
|
|
445
|
+
* same server, which closes its workers' sessions when they finish (the
|
|
446
|
+
* 2026-09-29 and 2026-09-30 runs, `commandagent-issue-546/554` against
|
|
447
|
+
* `commandmate-issue-3023`). A delegation has no business in another
|
|
448
|
+
* repository, and the one it is judged for cannot tell that close from a
|
|
449
|
+
* kill any better than it could for another server's.
|
|
450
|
+
* - It uses the database the #2627 note rejected, but not for what that note
|
|
451
|
+
* rejected it for: there the other server's worktrees lived in a different
|
|
452
|
+
* database under colliding ids. Here the session carries *this* server's
|
|
453
|
+
* namespace, so *this* server's worktree table is the authority on it.
|
|
454
|
+
* - Recorded at task creation, like {@link recordOtherServerSessions}: the
|
|
455
|
+
* other orchestrate may remove its worktree — and with it the row — before
|
|
456
|
+
* this task is verified, and an unknown worktree excuses nothing.
|
|
457
|
+
*
|
|
458
|
+
* Still rejected: excusing every `other` removal (drops #1624), counting,
|
|
459
|
+
* timing and the worker's command log, for the reasons in the #2627 note; and
|
|
460
|
+
* a "needs review" verdict of its own, because the orchestrator's review of the
|
|
461
|
+
* same-repository case is exactly the one #1624 needs a hard failure for.
|
|
462
|
+
*
|
|
463
|
+
* @returns the names, or null when `server` has no namespace or cannot place
|
|
464
|
+
* the task's own worktree
|
|
465
|
+
*/
|
|
466
|
+
function recordOtherRepositorySessions(snapshot, taskWorktreeId, server) {
|
|
467
|
+
if (server.namespace === null || !server.repositoryOf)
|
|
468
|
+
return null;
|
|
469
|
+
const ownRepository = server.repositoryOf(taskWorktreeId);
|
|
470
|
+
if (!ownRepository)
|
|
471
|
+
return null;
|
|
472
|
+
const sessions = snapshot.probes['tmux-sessions'];
|
|
473
|
+
if (!sessions || sessions.status !== 'ok')
|
|
474
|
+
return [];
|
|
475
|
+
return sessions.entries
|
|
476
|
+
.map((entry) => entry.key)
|
|
477
|
+
.filter((name) => {
|
|
478
|
+
if (attributeSessionName(name, taskWorktreeId) !== 'other')
|
|
479
|
+
return false;
|
|
480
|
+
if (isOtherServerSession(name, server))
|
|
481
|
+
return false;
|
|
482
|
+
const parsed = (0, session_name_1.parseSessionName)(name);
|
|
483
|
+
if (!parsed)
|
|
484
|
+
return false;
|
|
485
|
+
const repository = sessionRepository(parsed.rest, server);
|
|
486
|
+
return repository !== null && repository !== ownRepository;
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
/** The recorded other-repository sessions of a baseline; empty when none was recorded. */
|
|
490
|
+
function readOtherRepositorySessions(baseline) {
|
|
491
|
+
const recorded = baseline.otherRepositorySessions;
|
|
492
|
+
if (!Array.isArray(recorded))
|
|
493
|
+
return new Set();
|
|
494
|
+
return new Set(recorded.filter((name) => typeof name === 'string'));
|
|
495
|
+
}
|
|
496
|
+
// =============================================================================
|
|
497
|
+
// Stale demo-vitest directories (Issue #3043)
|
|
498
|
+
// =============================================================================
|
|
499
|
+
/**
|
|
500
|
+
* The baseline's `.commandmate-demo-vitest-<pid>` entries whose pid was already
|
|
501
|
+
* dead at task creation.
|
|
502
|
+
*
|
|
503
|
+
* Recorded then, because only then is it knowable: a removed directory's pid is
|
|
504
|
+
* always dead by verification, so the gate could not otherwise tell a leftover
|
|
505
|
+
* swept up by `env-scripts.test.ts` (#3025, run by any parallel worktree's unit
|
|
506
|
+
* gate) from a directory a live test run was still using. The latter — a pid
|
|
507
|
+
* alive at task start — stays a violation: a worker may have deleted a parallel
|
|
508
|
+
* test's working directory.
|
|
509
|
+
*/
|
|
510
|
+
function recordDeadDemoVitestEntries(snapshot, isPidAlive = exports.isLivePid) {
|
|
511
|
+
const home = snapshot.probes['home-entries'];
|
|
512
|
+
if (!home || home.status !== 'ok')
|
|
513
|
+
return [];
|
|
514
|
+
return home.entries
|
|
515
|
+
.map((entry) => entry.key)
|
|
516
|
+
.filter((name) => {
|
|
517
|
+
const pid = demoVitestPid(name);
|
|
518
|
+
return pid !== null && !isPidAlive(pid);
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
/** The recorded dead-pid demo-vitest entries of a baseline; empty when none was recorded. */
|
|
522
|
+
function readDeadDemoVitestEntries(baseline) {
|
|
523
|
+
const recorded = baseline.deadDemoVitestEntries;
|
|
524
|
+
if (!Array.isArray(recorded))
|
|
525
|
+
return new Set();
|
|
526
|
+
return new Set(recorded.filter((name) => typeof name === 'string' && demoVitestPid(name) !== null));
|
|
527
|
+
}
|
|
373
528
|
function toChange(entry, owner) {
|
|
374
529
|
return { key: entry.key, detail: entry.detail, owner };
|
|
375
530
|
}
|
|
@@ -384,6 +539,8 @@ function toChange(entry, owner) {
|
|
|
384
539
|
function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
385
540
|
const taskSession = readTaskSession(baseline);
|
|
386
541
|
const otherServerSessions = readOtherServerSessions(baseline);
|
|
542
|
+
const otherRepositorySessions = readOtherRepositorySessions(baseline);
|
|
543
|
+
const deadDemoVitestEntries = readDeadDemoVitestEntries(baseline);
|
|
387
544
|
const ignoredHomeEntries = new Set(options.ignoreHomeEntries ?? []);
|
|
388
545
|
const resolvePidCwd = options.resolvePidCwd ?? exports.readLivePidCwd;
|
|
389
546
|
const probes = env_snapshot_1.ENV_PROBE_IDS.map((probeId) => {
|
|
@@ -399,6 +556,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
399
556
|
taskSessionAdded: [],
|
|
400
557
|
removed: [],
|
|
401
558
|
removedByOtherServer: [],
|
|
559
|
+
removedByOtherRepository: [],
|
|
560
|
+
removedStaleDemoVitest: [],
|
|
402
561
|
ignoredByConfig: [],
|
|
403
562
|
};
|
|
404
563
|
}
|
|
@@ -412,6 +571,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
412
571
|
taskSessionAdded: [],
|
|
413
572
|
removed: [],
|
|
414
573
|
removedByOtherServer: [],
|
|
574
|
+
removedByOtherRepository: [],
|
|
575
|
+
removedStaleDemoVitest: [],
|
|
415
576
|
ignoredByConfig: [],
|
|
416
577
|
};
|
|
417
578
|
}
|
|
@@ -448,6 +609,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
448
609
|
after.entries.some((entry) => beforeKeys.has(entry.key) || (taskSession !== null && entry.key === taskSession));
|
|
449
610
|
const removed = [];
|
|
450
611
|
const removedByOtherServer = [];
|
|
612
|
+
const removedByOtherRepository = [];
|
|
613
|
+
const removedStaleDemoVitest = [];
|
|
451
614
|
for (const entry of before.entries) {
|
|
452
615
|
if (afterKeys.has(entry.key))
|
|
453
616
|
continue;
|
|
@@ -460,6 +623,14 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
460
623
|
otherServerSessions.has(entry.key)) {
|
|
461
624
|
removedByOtherServer.push(change);
|
|
462
625
|
}
|
|
626
|
+
else if (tmuxServerSurvived &&
|
|
627
|
+
change.owner === 'other' &&
|
|
628
|
+
otherRepositorySessions.has(entry.key)) {
|
|
629
|
+
removedByOtherRepository.push(change);
|
|
630
|
+
}
|
|
631
|
+
else if (probeId === 'home-entries' && deadDemoVitestEntries.has(entry.key)) {
|
|
632
|
+
removedStaleDemoVitest.push(change);
|
|
633
|
+
}
|
|
463
634
|
else {
|
|
464
635
|
removed.push(change);
|
|
465
636
|
}
|
|
@@ -473,6 +644,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
473
644
|
taskSessionAdded,
|
|
474
645
|
removed,
|
|
475
646
|
removedByOtherServer,
|
|
647
|
+
removedByOtherRepository,
|
|
648
|
+
removedStaleDemoVitest,
|
|
476
649
|
ignoredByConfig,
|
|
477
650
|
};
|
|
478
651
|
});
|
|
@@ -534,6 +707,14 @@ function formatTaskSessionChanges(changes) {
|
|
|
534
707
|
function formatRemovedByOtherServer(changes) {
|
|
535
708
|
return changes.map((change) => ` · - ${change.key} (ignored: another CommandMate server's session, recorded at task start)`);
|
|
536
709
|
}
|
|
710
|
+
/** Removals excused as this server's sessions of another repository (#3043), one line each. */
|
|
711
|
+
function formatRemovedByOtherRepository(changes) {
|
|
712
|
+
return changes.map((change) => ` · - ${change.key} (ignored: a worktree of another repository on this server, recorded at task start)`);
|
|
713
|
+
}
|
|
714
|
+
/** Removals excused as leftover demo-vitest directories (#3043), one line each. */
|
|
715
|
+
function formatRemovedStaleDemoVitest(changes) {
|
|
716
|
+
return changes.map((change) => ` · - ${change.key} (ignored: its pid was already dead at task start — a leftover swept by the demo-video tests)`);
|
|
717
|
+
}
|
|
537
718
|
function formatIgnoredByConfig(changes) {
|
|
538
719
|
if (changes.length === 0)
|
|
539
720
|
return [];
|
|
@@ -567,6 +748,8 @@ function formatEnvCleanReport(diff) {
|
|
|
567
748
|
lines.push(` ${probe.probeId} clean (${label})${excused}`);
|
|
568
749
|
lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
|
|
569
750
|
lines.push(...formatRemovedByOtherServer(probe.removedByOtherServer));
|
|
751
|
+
lines.push(...formatRemovedByOtherRepository(probe.removedByOtherRepository));
|
|
752
|
+
lines.push(...formatRemovedStaleDemoVitest(probe.removedStaleDemoVitest));
|
|
570
753
|
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
571
754
|
continue;
|
|
572
755
|
}
|
|
@@ -575,6 +758,8 @@ function formatEnvCleanReport(diff) {
|
|
|
575
758
|
lines.push(...formatChanges('-', probe.removed));
|
|
576
759
|
lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
|
|
577
760
|
lines.push(...formatRemovedByOtherServer(probe.removedByOtherServer));
|
|
761
|
+
lines.push(...formatRemovedByOtherRepository(probe.removedByOtherRepository));
|
|
762
|
+
lines.push(...formatRemovedStaleDemoVitest(probe.removedStaleDemoVitest));
|
|
578
763
|
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
579
764
|
for (const excused of probe.ignoredAdded) {
|
|
580
765
|
lines.push(` · ${excused.key} (ignored: belongs to another worktree)`);
|
|
@@ -599,7 +784,11 @@ function envCleanNoBaseline(taskId, sources) {
|
|
|
599
784
|
return (`${verify_config_1.ENV_CLEAN_GATE_ID}: UNKNOWN — no baseline snapshot exists for ${who}, so nothing can be ` +
|
|
600
785
|
'compared. This is NOT "the environment is unchanged": no measurement was taken. ' +
|
|
601
786
|
'A baseline is recorded when the task is created (`send --contract`) and only while the ' +
|
|
602
|
-
`gate is switched on (currently: ${how}). Switch it on, then re-send the task.`
|
|
787
|
+
`gate is switched on (currently: ${how}). Switch it on, then re-send the task.` +
|
|
788
|
+
(taskId
|
|
789
|
+
? ''
|
|
790
|
+
: ' To re-verify this worktree\'s contract task (this run is not attached to a task), run ' +
|
|
791
|
+
'`commandmate verify <worktree> --task <id>`.'));
|
|
603
792
|
}
|
|
604
793
|
/**
|
|
605
794
|
* Judge the machine against the task's baseline.
|
|
@@ -50,6 +50,8 @@ const worktree_index_1 = require("./worktree-index");
|
|
|
50
50
|
// exit-code table the pane prints, so the producer and the reader are one string.
|
|
51
51
|
const run_verdict_vocabulary_1 = require("./run-verdict-vocabulary");
|
|
52
52
|
const scope_gate_1 = require("./scope-gate");
|
|
53
|
+
const receipt_owned_paths_1 = require("../../lib/skills/receipt-owned-paths");
|
|
54
|
+
const agent_state_paths_1 = require("../../lib/skills/agent-state-paths");
|
|
53
55
|
const verify_config_1 = require("./verify-config");
|
|
54
56
|
Object.defineProperty(exports, "ENV_CLEAN_GATE_ID", { enumerable: true, get: function () { return verify_config_1.ENV_CLEAN_GATE_ID; } });
|
|
55
57
|
Object.defineProperty(exports, "SCOPE_GATE_ID", { enumerable: true, get: function () { return verify_config_1.SCOPE_GATE_ID; } });
|
|
@@ -816,10 +818,35 @@ async function evaluateWorkEvidence(worktreePath, baseRef, requireCommit, agentE
|
|
|
816
818
|
if (porcelain.code !== 0) {
|
|
817
819
|
return done('error', "work-evidence: 'git status --porcelain' failed.", null);
|
|
818
820
|
}
|
|
819
|
-
|
|
821
|
+
// Untracked files a recorded Skill install placed, untouched since, are
|
|
822
|
+
// CommandMate's and not the agent's (#3092): installing a Skill alone must
|
|
823
|
+
// still read as `not_started`. Anything the receipt does not vouch for —
|
|
824
|
+
// including a Skill file whose bytes changed — is counted as before.
|
|
825
|
+
const skillOwned = (0, receipt_owned_paths_1.collectSkillReceiptOwnedPaths)(worktreePath);
|
|
826
|
+
let skillInstalledCount = 0;
|
|
827
|
+
const agentStateExcluded = new Set();
|
|
828
|
+
const uncommittedCount = (0, scope_gate_1.parsePorcelainStatusEntries)(porcelain.stdout).filter((entry) => {
|
|
829
|
+
if (!entry.paths.some((path) => !(0, scope_gate_1.isContractPath)(path)))
|
|
830
|
+
return false;
|
|
831
|
+
if ((0, scope_gate_1.isSkillInstalledUntrackedEntry)(entry, skillOwned)) {
|
|
832
|
+
skillInstalledCount += 1;
|
|
833
|
+
return false;
|
|
834
|
+
}
|
|
835
|
+
if ((0, agent_state_paths_1.isAgentStateUntrackedEntry)(entry)) {
|
|
836
|
+
entry.paths.forEach((path) => agentStateExcluded.add(path));
|
|
837
|
+
return false;
|
|
838
|
+
}
|
|
839
|
+
return true;
|
|
840
|
+
}).length;
|
|
820
841
|
const summary = `work-evidence: baseRef=${baseRef} commits=${commitCount} uncommitted=${uncommittedCount}` +
|
|
821
842
|
(requireCommit.required ? ' requireCommit=true' : '') +
|
|
822
|
-
' (contract files excluded)'
|
|
843
|
+
' (contract files excluded)' +
|
|
844
|
+
(skillInstalledCount > 0
|
|
845
|
+
? ` (${skillInstalledCount} CommandMate-installed Skill file(s) excluded)`
|
|
846
|
+
: '') +
|
|
847
|
+
(agentStateExcluded.size > 0
|
|
848
|
+
? ` (agent-managed state file(s) excluded: ${[...agentStateExcluded].sort().join(', ')})`
|
|
849
|
+
: '');
|
|
823
850
|
if (!Number.isFinite(commitCount) || (commitCount === 0 && uncommittedCount === 0)) {
|
|
824
851
|
// Issue #2043, and the ONLY place this gate's verdict differs from what it
|
|
825
852
|
// was: git found nothing, so ask the agent. `null` — every tool but
|
|
@@ -33,10 +33,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
33
33
|
exports.SCOPE_SKIP_NOT_REQUIRED = exports.SCOPE_SKIP_NO_CONTRACT = exports.ScopeMatcher = exports.CONTRACT_DIR_PREFIX = exports.SCOPE_EXEMPT_CONTRACT_PATH = exports.SCOPE_EXEMPT_ALWAYS_ALLOWED = exports.SCOPE_PATTERN_ARROW = exports.ALWAYS_ALLOWED_PREFIX = exports.SCOPE_ALLOW_GUIDANCE = exports.MAX_REPORTED_VIOLATIONS = void 0;
|
|
34
34
|
exports.isContractPath = isContractPath;
|
|
35
35
|
exports.parsePorcelainEntries = parsePorcelainEntries;
|
|
36
|
+
exports.parsePorcelainStatusEntries = parsePorcelainStatusEntries;
|
|
37
|
+
exports.isSkillInstalledUntrackedEntry = isSkillInstalledUntrackedEntry;
|
|
36
38
|
exports.collectChangedPaths = collectChangedPaths;
|
|
37
39
|
exports.scopeSkipDetachedContract = scopeSkipDetachedContract;
|
|
38
40
|
exports.evaluateScope = evaluateScope;
|
|
39
41
|
const child_process_1 = require("child_process");
|
|
42
|
+
const receipt_owned_paths_1 = require("../../lib/skills/receipt-owned-paths");
|
|
43
|
+
const agent_state_paths_1 = require("../../lib/skills/agent-state-paths");
|
|
40
44
|
/**
|
|
41
45
|
* Violations listed in `log_tail` before the rest are summarised as a count.
|
|
42
46
|
*
|
|
@@ -311,6 +315,10 @@ function splitNul(output) {
|
|
|
311
315
|
* as one change (#1580).
|
|
312
316
|
*/
|
|
313
317
|
function parsePorcelainEntries(output) {
|
|
318
|
+
return parsePorcelainStatusEntries(output).map((entry) => entry.paths);
|
|
319
|
+
}
|
|
320
|
+
/** {@link parsePorcelainEntries}, keeping each record's status code (#3092). */
|
|
321
|
+
function parsePorcelainStatusEntries(output) {
|
|
314
322
|
const fields = output.split('\0');
|
|
315
323
|
const entries = [];
|
|
316
324
|
let i = 0;
|
|
@@ -328,10 +336,22 @@ function parsePorcelainEntries(output) {
|
|
|
328
336
|
if (original)
|
|
329
337
|
paths.push(original);
|
|
330
338
|
}
|
|
331
|
-
entries.push(paths);
|
|
339
|
+
entries.push({ status: entry.slice(0, 2), paths });
|
|
332
340
|
}
|
|
333
341
|
return entries;
|
|
334
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* Whether a status record is an untracked file a recorded Skill install placed
|
|
345
|
+
* there, untouched since (#3092).
|
|
346
|
+
*
|
|
347
|
+
* Untracked only: a tracked Skill file that changed is a change to what the
|
|
348
|
+
* branch carries, and stays counted. `owned` comes from
|
|
349
|
+
* `collectSkillReceiptOwnedPaths`, which already rejects files whose bytes no
|
|
350
|
+
* longer match the receipt.
|
|
351
|
+
*/
|
|
352
|
+
function isSkillInstalledUntrackedEntry(entry, owned) {
|
|
353
|
+
return entry.status === '??' && entry.paths.every((path) => owned.has(path));
|
|
354
|
+
}
|
|
335
355
|
/**
|
|
336
356
|
* Every path this worktree changed relative to `baseRef`.
|
|
337
357
|
*
|
|
@@ -368,10 +388,30 @@ async function collectChangedPaths(worktreePath, baseRef) {
|
|
|
368
388
|
(status.stderr.trim() ? `\n${status.stderr.trim()}` : ''),
|
|
369
389
|
};
|
|
370
390
|
}
|
|
391
|
+
// Untracked files a recorded Skill install placed are CommandMate's, not the
|
|
392
|
+
// agent's (#3092). Dropped from the working-tree side only; a committed Skill
|
|
393
|
+
// file is still judged by the diff above.
|
|
394
|
+
const skillOwned = (0, receipt_owned_paths_1.collectSkillReceiptOwnedPaths)(worktreePath);
|
|
395
|
+
// Likewise the state files an agent CLI writes for itself (#3126), by an
|
|
396
|
+
// explicit declaration of paths; they are reported, not silently dropped.
|
|
397
|
+
const agentStateExcluded = new Set();
|
|
398
|
+
const workingTree = parsePorcelainStatusEntries(status.stdout).filter((entry) => {
|
|
399
|
+
if (isSkillInstalledUntrackedEntry(entry, skillOwned))
|
|
400
|
+
return false;
|
|
401
|
+
if ((0, agent_state_paths_1.isAgentStateUntrackedEntry)(entry)) {
|
|
402
|
+
entry.paths.forEach((path) => agentStateExcluded.add(path));
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
return true;
|
|
406
|
+
});
|
|
371
407
|
// Both sides are filtered, not just the working tree: an orchestrator may
|
|
372
408
|
// also have committed the contract as a setup commit (#1580).
|
|
373
|
-
const paths = new Set([...splitNul(diff.stdout), ...
|
|
374
|
-
return {
|
|
409
|
+
const paths = new Set([...splitNul(diff.stdout), ...workingTree.flatMap((entry) => entry.paths)].filter((path) => !isContractPath(path)));
|
|
410
|
+
return {
|
|
411
|
+
paths: [...paths].sort(),
|
|
412
|
+
mergeBase: base,
|
|
413
|
+
agentStateExcluded: [...agentStateExcluded].sort(),
|
|
414
|
+
};
|
|
375
415
|
}
|
|
376
416
|
// =============================================================================
|
|
377
417
|
// Gate evaluation
|
|
@@ -418,6 +458,18 @@ function formatAdmitted(admitted) {
|
|
|
418
458
|
...(remainder > 0 ? [` ... (+${remainder} more)`] : []),
|
|
419
459
|
];
|
|
420
460
|
}
|
|
461
|
+
/** The `excluded:` section naming agent-managed state files left out (#3126). */
|
|
462
|
+
function formatAgentStateExcluded(excluded) {
|
|
463
|
+
if (excluded.length === 0)
|
|
464
|
+
return [];
|
|
465
|
+
const listed = excluded.slice(0, exports.MAX_REPORTED_VIOLATIONS);
|
|
466
|
+
const remainder = excluded.length - listed.length;
|
|
467
|
+
return [
|
|
468
|
+
'excluded (agent-managed state files, not counted as change):',
|
|
469
|
+
...listed.map((path) => ` ~ ${path}`),
|
|
470
|
+
...(remainder > 0 ? [` ... (+${remainder} more)`] : []),
|
|
471
|
+
];
|
|
472
|
+
}
|
|
421
473
|
/**
|
|
422
474
|
* Reasons the gate has nothing to judge, phrased for `log_tail`.
|
|
423
475
|
*
|
|
@@ -440,7 +492,8 @@ exports.SCOPE_SKIP_NOT_REQUIRED = 'scope: the contract sets success.requireScope
|
|
|
440
492
|
function scopeSkipDetachedContract(taskId, status) {
|
|
441
493
|
return (`scope: task ${taskId} declares a scope for this worktree, but it is ${status} and ` +
|
|
442
494
|
'this run was not attached to it, so its scope was NOT judged. ' +
|
|
443
|
-
'
|
|
495
|
+
'`wait --verify` attaches only to an in-flight task; to re-verify a finished task, run ' +
|
|
496
|
+
`\`commandmate verify <worktree> --task ${taskId}\`.`);
|
|
444
497
|
}
|
|
445
498
|
/**
|
|
446
499
|
* Judge the worktree's changes against a contract's scope.
|
|
@@ -492,6 +545,7 @@ async function evaluateScope(worktreePath, scope, requireScopeClean, baseRef, co
|
|
|
492
545
|
`allow: ${formatPatterns(scope.allow)}`,
|
|
493
546
|
`deny: ${formatPatterns(scope.deny)}`,
|
|
494
547
|
...formatAdmitted(admitted),
|
|
548
|
+
...formatAgentStateExcluded(changed.agentStateExcluded),
|
|
495
549
|
].join('\n');
|
|
496
550
|
if (violations.length === 0) {
|
|
497
551
|
// An empty change set passes: work-evidence is the gate that judges "nothing
|