commandmate 0.16.0 → 0.18.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 +298 -228
- package/.next/app-path-routes-manifest.json +39 -29
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +57 -0
- package/.next/server/app/_not-found/page_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.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +3 -3
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/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/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.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.js +1 -0
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -0
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- 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/metrics/vibe/route.js +37 -0
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -0
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.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_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/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/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_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_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.js +4 -0
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/tasks/[taskId]/route.js +4 -0
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/templates/[id]/route.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -0
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -0
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/verification/runs/route.js +1 -0
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -0
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -0
- 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 +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]/cli-tool/route.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.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.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]/execution-logs/[logId]/route.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.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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]/interrupt/route.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 +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 +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 +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 +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 +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 +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/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]/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 +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 +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 +2 -2
- 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_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 +1 -1
- 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_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/route.js +2 -2
- 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 +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]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +6 -0
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -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 +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 +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 +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 +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 +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 +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/route.js +4 -0
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/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/chat/page_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.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +2 -2
- 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 +39 -29
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1117.js +1 -1
- package/.next/server/chunks/1503.js +2 -0
- package/.next/server/chunks/2366.js +1 -0
- package/.next/server/chunks/3042.js +1 -1
- package/.next/server/chunks/3736.js +1 -1
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/4689.js +25 -0
- package/.next/server/chunks/5381.js +50 -10
- package/.next/server/chunks/5959.js +3 -3
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +13 -0
- package/.next/server/chunks/646.js +1 -1
- package/.next/server/chunks/8681.js +1 -1
- package/.next/server/chunks/8807.js +194 -51
- package/.next/server/chunks/8856.js +4 -0
- package/.next/server/chunks/9687.js +2 -2
- 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/-BSmW0Ae2YsxyCl_ue7_d/_buildManifest.js +1 -0
- package/.next/static/chunks/{4560-8ffb0bb19f2ba998.js → 4560-0917ae2e6a0e5400.js} +1 -1
- package/.next/static/chunks/{6488-c2a968ec806975c2.js → 6488-109e3825c7249e47.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +1 -0
- package/.next/static/chunks/app/review/{page-f431d630097c2e85.js → page-b559bfb11c46931b.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-20f07a99db64d2ca.js → page-3fa7e767d0ab3889.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-12b3c5f32fc6094e.js +1 -0
- package/.next/trace +12 -11
- package/.next/types/app/api/hooks/agent-event/route.ts +347 -0
- package/.next/types/app/api/metrics/vibe/route.ts +347 -0
- package/.next/types/app/api/tasks/[taskId]/cancel/route.ts +347 -0
- package/.next/types/app/api/tasks/[taskId]/route.ts +347 -0
- package/.next/types/app/api/verification/runs/[runId]/route.ts +347 -0
- package/.next/types/app/api/verification/runs/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/tasks/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/[runId]/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/route.ts +347 -0
- package/.next/types/routes.d.ts +11 -1
- package/.next/types/validator.ts +90 -0
- package/dist/cli/commands/report.d.ts +1 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +54 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +116 -14
- package/dist/cli/commands/task.d.ts +11 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +126 -0
- package/dist/cli/commands/verify.d.ts +19 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +229 -0
- package/dist/cli/commands/wait.d.ts +2 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +128 -13
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +92 -3
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/api-responses.d.ts +180 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +82 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +30 -1
- package/dist/cli/utils/api-client.d.ts +8 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts +63 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -0
- package/dist/cli/utils/verify-runner.js +175 -0
- package/dist/server/server.js +15 -0
- package/dist/server/src/config/auto-yes-config.js +22 -0
- package/dist/server/src/lib/auto-yes-poller.js +34 -2
- package/dist/server/src/lib/auto-yes-state.js +6 -19
- package/dist/server/src/lib/db/db.js +34 -1
- package/dist/server/src/lib/db/migrations/index.js +6 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v49-verification-runs.js +86 -0
- package/dist/server/src/lib/db/migrations/v50-tasks.js +68 -0
- package/dist/server/src/lib/db/migrations/v51-task-events.js +58 -0
- package/dist/server/src/lib/db/task-events-db.js +59 -0
- package/dist/server/src/lib/db/tasks-db.js +263 -0
- package/dist/server/src/lib/db/verification-db.js +290 -0
- package/dist/server/src/lib/polling/auto-yes-policy.js +117 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +144 -4
- package/dist/server/src/lib/polling/response-checker.js +8 -0
- package/dist/server/src/lib/session/agent-event-state.js +46 -0
- package/dist/server/src/lib/session/current-output-builder.js +4 -0
- package/dist/server/src/lib/session/status-mapping.js +146 -0
- package/dist/server/src/lib/tasks/contract-parser.js +385 -0
- package/dist/server/src/lib/tasks/task-state-machine.js +183 -0
- package/dist/server/src/lib/tasks/task-transition-service.js +106 -0
- package/dist/server/src/lib/verification/verification-reconciler.js +49 -0
- package/dist/server/src/types/sidebar.js +7 -20
- package/package.json +5 -2
- package/scripts/hooks/cmate-agent-event.sh +175 -0
- package/.next/server/chunks/2064.js +0 -2
- package/.next/static/AKqbAyuzbFfg05qpbCI_K/_buildManifest.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/skills/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/templates/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/todos/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-55e398bd20e2d7a9.js +0 -1
- package/.next/static/chunks/app/repositories/page-3c4fb889da48ce24.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-59a63a2c013ec1eb.js +0 -1
- /package/.next/static/{AKqbAyuzbFfg05qpbCI_K → -BSmW0Ae2YsxyCl_ue7_d}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session status vocabulary mapping (Issue #1550).
|
|
4
|
+
*
|
|
5
|
+
* The same session reality is expressed in several vocabularies:
|
|
6
|
+
*
|
|
7
|
+
* | Vocabulary | Defined in | Values |
|
|
8
|
+
* |---------------------|-------------------------------------|-------------------------------------------|
|
|
9
|
+
* | `SessionStatus` | `lib/detection/status-detector.ts` | idle / ready / running / waiting |
|
|
10
|
+
* | `BranchStatus` | `types/sidebar.ts` | idle / ready / running / waiting / generating |
|
|
11
|
+
* | boolean triple | `lib/session/worktree-status-helper.ts` | isRunning / isWaitingForResponse / isProcessing |
|
|
12
|
+
* | `UIPhase` | `types/ui-state.ts` | idle / waiting / receiving / prompt / complete |
|
|
13
|
+
*
|
|
14
|
+
* This module is the single place where those vocabularies are converted into
|
|
15
|
+
* one another, so the correspondence cannot drift between call sites. It is a
|
|
16
|
+
* pure module (type-only imports) and is therefore safe to import from client
|
|
17
|
+
* components.
|
|
18
|
+
*
|
|
19
|
+
* ## The live conversion chain
|
|
20
|
+
*
|
|
21
|
+
* terminal output
|
|
22
|
+
* -> detectSessionStatus() (status-detector, NOT touched here)
|
|
23
|
+
* -> SessionStatus
|
|
24
|
+
* -> sessionStatusToActivityFlags() (this module)
|
|
25
|
+
* -> boolean triple (+ isRunning from tmux session existence)
|
|
26
|
+
* -> deriveCliStatus() (this module)
|
|
27
|
+
* -> BranchStatus (sidebar / header / tab dots)
|
|
28
|
+
*
|
|
29
|
+
* `deriveSessionStatus()` is the reverse edge of that chain: the worktrees API
|
|
30
|
+
* folds the boolean triple back into a `SessionStatus` for its JSON payload.
|
|
31
|
+
*
|
|
32
|
+
* ## Why `UIPhase` has no mapping function here
|
|
33
|
+
*
|
|
34
|
+
* `UIPhase` is a state machine, not a projection of `SessionStatus`: `waiting`
|
|
35
|
+
* -> `receiving` -> `complete` is a sequence driven by user sends and streamed
|
|
36
|
+
* output, and the same `SessionStatus` can legitimately correspond to several
|
|
37
|
+
* phases depending on history. The only edge that is a pure table lookup is
|
|
38
|
+
* "an active prompt was detected -> phase `prompt`", and that edge is already
|
|
39
|
+
* expressed exactly once, by the `SHOW_PROMPT` case of `worktreeUIReducer`
|
|
40
|
+
* (`hooks/useWorktreeUIState.ts`). Re-encoding it here would add an indirection
|
|
41
|
+
* with no second call site, so the reducer stays the single owner.
|
|
42
|
+
*/
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.sessionStatusToActivityFlags = sessionStatusToActivityFlags;
|
|
45
|
+
exports.deriveCliStatus = deriveCliStatus;
|
|
46
|
+
exports.deriveSessionStatus = deriveSessionStatus;
|
|
47
|
+
exports.deriveBranchStatus = deriveBranchStatus;
|
|
48
|
+
/**
|
|
49
|
+
* Project a detected `SessionStatus` onto the activity flags.
|
|
50
|
+
*
|
|
51
|
+
* `isRunning` is deliberately NOT derived here: it comes from tmux session
|
|
52
|
+
* existence (plus the Claude health check), which is independent of what the
|
|
53
|
+
* terminal output says.
|
|
54
|
+
*
|
|
55
|
+
* | SessionStatus | isWaitingForResponse | isProcessing |
|
|
56
|
+
* |---------------|----------------------|--------------|
|
|
57
|
+
* | `idle` | false | false |
|
|
58
|
+
* | `ready` | false | false |
|
|
59
|
+
* | `running` | false | true |
|
|
60
|
+
* | `waiting` | true | false |
|
|
61
|
+
*/
|
|
62
|
+
function sessionStatusToActivityFlags(status) {
|
|
63
|
+
switch (status) {
|
|
64
|
+
case 'waiting':
|
|
65
|
+
return { isWaitingForResponse: true, isProcessing: false };
|
|
66
|
+
case 'running':
|
|
67
|
+
return { isWaitingForResponse: false, isProcessing: true };
|
|
68
|
+
case 'idle':
|
|
69
|
+
case 'ready':
|
|
70
|
+
return { isWaitingForResponse: false, isProcessing: false };
|
|
71
|
+
default:
|
|
72
|
+
// exhaustive check: SessionStatus extensions cause a compile error [DR2-005]
|
|
73
|
+
status;
|
|
74
|
+
return { isWaitingForResponse: false, isProcessing: false };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Derive `BranchStatus` from one session's boolean triple.
|
|
79
|
+
*
|
|
80
|
+
* Shared by the sidebar (`toBranchItem`), the worktree detail tab dots, the
|
|
81
|
+
* desktop header status row, Sessions and Review.
|
|
82
|
+
*
|
|
83
|
+
* Precedence is waiting > running > ready > idle: a session that is both
|
|
84
|
+
* waiting for an answer and processing is shown as `waiting`, because the user
|
|
85
|
+
* action it needs is the more significant fact.
|
|
86
|
+
*
|
|
87
|
+
* Note that `generating` is never produced here — it exists in `BranchStatus`
|
|
88
|
+
* but has no boolean-triple source. Resolving that asymmetry is out of scope
|
|
89
|
+
* for Issue #1550 (this issue only moves the conversions to one place).
|
|
90
|
+
*/
|
|
91
|
+
function deriveCliStatus(toolStatus) {
|
|
92
|
+
if (!toolStatus)
|
|
93
|
+
return 'idle';
|
|
94
|
+
if (toolStatus.isWaitingForResponse)
|
|
95
|
+
return 'waiting';
|
|
96
|
+
if (toolStatus.isProcessing)
|
|
97
|
+
return 'running';
|
|
98
|
+
if (toolStatus.isRunning)
|
|
99
|
+
return 'ready';
|
|
100
|
+
return 'idle';
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Fold a worktree-level boolean triple back into a `SessionStatus` for the
|
|
104
|
+
* worktrees API payload — the reverse edge of `sessionStatusToActivityFlags`.
|
|
105
|
+
*
|
|
106
|
+
* Returns `null` (not `'idle'`) when no session is running, because the API
|
|
107
|
+
* contract distinguishes "no session" from "a session that reports idle".
|
|
108
|
+
*/
|
|
109
|
+
function deriveSessionStatus(status) {
|
|
110
|
+
if (!status.isSessionRunning)
|
|
111
|
+
return null;
|
|
112
|
+
if (status.isWaitingForResponse)
|
|
113
|
+
return 'waiting';
|
|
114
|
+
if (status.isProcessing)
|
|
115
|
+
return 'running';
|
|
116
|
+
return 'ready';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The `SessionStatus` -> `BranchStatus` correspondence, as one table.
|
|
120
|
+
*
|
|
121
|
+
* Composed from the two conversions the live chain actually uses, so it can
|
|
122
|
+
* never drift from them.
|
|
123
|
+
*
|
|
124
|
+
* | isRunning | SessionStatus | BranchStatus |
|
|
125
|
+
* |-----------|---------------|--------------|
|
|
126
|
+
* | false | (any / null) | `idle` |
|
|
127
|
+
* | true | `null` | `ready` |
|
|
128
|
+
* | true | `idle` | `ready` |
|
|
129
|
+
* | true | `ready` | `ready` |
|
|
130
|
+
* | true | `running` | `running` |
|
|
131
|
+
* | true | `waiting` | `waiting` |
|
|
132
|
+
*
|
|
133
|
+
* The `idle` -> `ready` row is not a mistake: once a tmux session exists, the
|
|
134
|
+
* sidebar shows `ready` (the user can send a message) even while the detector
|
|
135
|
+
* still reports `idle` for the terminal contents.
|
|
136
|
+
*/
|
|
137
|
+
function deriveBranchStatus(sessionStatus, isRunning) {
|
|
138
|
+
if (!isRunning)
|
|
139
|
+
return 'idle';
|
|
140
|
+
return deriveCliStatus({
|
|
141
|
+
isRunning: true,
|
|
142
|
+
...(sessionStatus
|
|
143
|
+
? sessionStatusToActivityFlags(sessionStatus)
|
|
144
|
+
: { isWaitingForResponse: false, isProcessing: false }),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loader and validator for `.commandmate/tasks/<name>.yaml` — the execution
|
|
4
|
+
* contract (Issue #1545, Phase 2-1).
|
|
5
|
+
*
|
|
6
|
+
* Canonical spec: docs/design/task-contract.md
|
|
7
|
+
*
|
|
8
|
+
* A contract declares, before the message is ever sent, what the task is for,
|
|
9
|
+
* which paths may change, what counts as done, and what the auto-answer policy
|
|
10
|
+
* is. This module only *validates and preserves* those declarations: the scope
|
|
11
|
+
* gate is #1546 and autoYes enforcement is #1547.
|
|
12
|
+
*
|
|
13
|
+
* Written in the same discipline as `lib/verification/verify-config.ts`: the
|
|
14
|
+
* `yaml` package, every violation collected rather than thrown one at a time,
|
|
15
|
+
* a closed key set, and a dedicated error class. Note that the Issue body says
|
|
16
|
+
* "ignore unknown keys" while also requiring that discipline; verify-config
|
|
17
|
+
* rejects them, and so does this. A misspelled `allowPromtTypes` that parsed
|
|
18
|
+
* cleanly would produce a contract that looks like it constrains auto-answering
|
|
19
|
+
* and does not — the worst failure a contract can have.
|
|
20
|
+
*
|
|
21
|
+
* Server-only: reads from disk, so import from API routes / CLI only.
|
|
22
|
+
*
|
|
23
|
+
* @module lib/tasks/contract-parser
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.TaskContractError = exports.MAX_ALLOW_PROMPT_TYPES = exports.MAX_DENY_PATTERNS = exports.MAX_GATE_IDS = exports.MAX_SCOPE_PATTERNS = exports.MAX_PATTERN_LENGTH = exports.MAX_GOAL_LENGTH = exports.MAX_TITLE_LENGTH = exports.PROMPT_TYPES = exports.AUTO_YES_MODES = exports.TASK_CONTRACT_DIR = void 0;
|
|
27
|
+
exports.parseTaskContract = parseTaskContract;
|
|
28
|
+
exports.loadTaskContract = loadTaskContract;
|
|
29
|
+
const fs_1 = require("fs");
|
|
30
|
+
const path_1 = require("path");
|
|
31
|
+
const yaml_1 = require("yaml");
|
|
32
|
+
const path_validator_1 = require("../../lib/security/path-validator");
|
|
33
|
+
/** Directory contracts live in, relative to the worktree root. */
|
|
34
|
+
exports.TASK_CONTRACT_DIR = '.commandmate/tasks';
|
|
35
|
+
/**
|
|
36
|
+
* Auto-answer policy modes.
|
|
37
|
+
*
|
|
38
|
+
* A contract that omits `autoYes.mode` leaves the mode `null`, which is *not*
|
|
39
|
+
* `off`: null means "this contract says nothing about auto-answering, keep the
|
|
40
|
+
* existing behaviour", while `off` is an active prohibition. Phase 2-3's
|
|
41
|
+
* enforcement has to be able to tell those apart.
|
|
42
|
+
*/
|
|
43
|
+
exports.AUTO_YES_MODES = ['off', 'safe', 'allow-listed'];
|
|
44
|
+
/**
|
|
45
|
+
* Prompt-type names accepted in `autoYes.allowPromptTypes`.
|
|
46
|
+
*
|
|
47
|
+
* Built from a `Record<PromptType, true>` so the list is exhaustive by
|
|
48
|
+
* construction: adding a variant to {@link PromptType} without adding it here
|
|
49
|
+
* fails the build, instead of silently making a valid contract invalid.
|
|
50
|
+
*/
|
|
51
|
+
const PROMPT_TYPE_KEYS = {
|
|
52
|
+
yes_no: true,
|
|
53
|
+
multiple_choice: true,
|
|
54
|
+
approval: true,
|
|
55
|
+
choice: true,
|
|
56
|
+
input: true,
|
|
57
|
+
continue: true,
|
|
58
|
+
};
|
|
59
|
+
exports.PROMPT_TYPES = Object.keys(PROMPT_TYPE_KEYS);
|
|
60
|
+
exports.MAX_TITLE_LENGTH = 200;
|
|
61
|
+
exports.MAX_GOAL_LENGTH = 8000;
|
|
62
|
+
/** Applies to scope patterns and to autoYes.denyPatterns (ReDoS bound). */
|
|
63
|
+
exports.MAX_PATTERN_LENGTH = 200;
|
|
64
|
+
exports.MAX_SCOPE_PATTERNS = 200;
|
|
65
|
+
exports.MAX_GATE_IDS = 32;
|
|
66
|
+
exports.MAX_DENY_PATTERNS = 32;
|
|
67
|
+
exports.MAX_ALLOW_PROMPT_TYPES = 16;
|
|
68
|
+
const TOP_LEVEL_KEYS = ['version', 'title', 'goal', 'scope', 'verify', 'autoYes', 'success'];
|
|
69
|
+
const SCOPE_KEYS = ['allow', 'deny'];
|
|
70
|
+
const VERIFY_KEYS = ['gates'];
|
|
71
|
+
const AUTO_YES_KEYS = ['mode', 'allowPromptTypes', 'denyPatterns'];
|
|
72
|
+
const SUCCESS_KEYS = ['requireWorkEvidence', 'requireScopeClean', 'autoVerifyOnStop'];
|
|
73
|
+
/** Mirrors GATE_ID_PATTERN in verify-config.ts: a contract can only name ids that could exist. */
|
|
74
|
+
const GATE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
75
|
+
class TaskContractError extends Error {
|
|
76
|
+
issues;
|
|
77
|
+
constructor(issues) {
|
|
78
|
+
super(`invalid task contract:\n${issues.map((issue) => ` - ${issue}`).join('\n')}`);
|
|
79
|
+
this.name = 'TaskContractError';
|
|
80
|
+
this.issues = issues;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.TaskContractError = TaskContractError;
|
|
84
|
+
function isMapping(value) {
|
|
85
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
86
|
+
}
|
|
87
|
+
function asInteger(value) {
|
|
88
|
+
if (typeof value === 'number')
|
|
89
|
+
return Number.isInteger(value) ? value : null;
|
|
90
|
+
if (typeof value === 'string' && /^-?\d+$/.test(value))
|
|
91
|
+
return Number(value);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
function asBoolean(value) {
|
|
95
|
+
if (typeof value === 'boolean')
|
|
96
|
+
return value;
|
|
97
|
+
if (value === 'true')
|
|
98
|
+
return true;
|
|
99
|
+
if (value === 'false')
|
|
100
|
+
return false;
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function describe(value) {
|
|
104
|
+
if (value === undefined)
|
|
105
|
+
return 'nothing';
|
|
106
|
+
if (value === null)
|
|
107
|
+
return 'null';
|
|
108
|
+
if (typeof value === 'string')
|
|
109
|
+
return JSON.stringify(value);
|
|
110
|
+
if (Array.isArray(value))
|
|
111
|
+
return 'a list';
|
|
112
|
+
if (typeof value === 'object')
|
|
113
|
+
return 'a mapping';
|
|
114
|
+
return String(value);
|
|
115
|
+
}
|
|
116
|
+
function collectUnknownKeys(mapping, allowed, at, issues) {
|
|
117
|
+
for (const key of Object.keys(mapping)) {
|
|
118
|
+
if (!allowed.includes(key)) {
|
|
119
|
+
issues.push(`${at}: unknown key "${key}" (v1 is a closed set)`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate a list of strings, rejecting per-entry violations individually.
|
|
125
|
+
*
|
|
126
|
+
* @returns the accepted entries; entries that produced an issue are dropped so
|
|
127
|
+
* the returned contract never carries a value that failed validation
|
|
128
|
+
*/
|
|
129
|
+
function validateStringList(value, at, limits, issues) {
|
|
130
|
+
if (value === undefined)
|
|
131
|
+
return null;
|
|
132
|
+
if (value === null)
|
|
133
|
+
return [];
|
|
134
|
+
if (!Array.isArray(value)) {
|
|
135
|
+
issues.push(`${at}: must be a list (got ${describe(value)})`);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
if (value.length > limits.maxEntries) {
|
|
139
|
+
issues.push(`${at}: at most ${limits.maxEntries} entries (got ${value.length})`);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const accepted = [];
|
|
143
|
+
value.forEach((entry, index) => {
|
|
144
|
+
const entryAt = `${at}[${index}]`;
|
|
145
|
+
if (typeof entry !== 'string' || entry.trim() === '') {
|
|
146
|
+
issues.push(`${entryAt}: must be a non-empty string (got ${describe(entry)})`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (entry.length > limits.maxLength) {
|
|
150
|
+
issues.push(`${entryAt}: at most ${limits.maxLength} characters (got ${entry.length})`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
accepted.push(entry);
|
|
154
|
+
});
|
|
155
|
+
return accepted;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A scope pattern can only speak about the inside of the worktree.
|
|
159
|
+
*
|
|
160
|
+
* An absolute path or a `..` segment is unjudgeable by the Phase 2-2 gate, and
|
|
161
|
+
* a NUL byte is never a path — all three are rejected at declaration time
|
|
162
|
+
* rather than becoming a pattern that silently matches nothing.
|
|
163
|
+
*/
|
|
164
|
+
function validateScopePattern(pattern, at, issues) {
|
|
165
|
+
if (pattern.includes('\0')) {
|
|
166
|
+
issues.push(`${at}: must not contain a NUL byte`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (pattern.startsWith('/')) {
|
|
170
|
+
issues.push(`${at}: must be relative to the worktree root (got the absolute path "${pattern}")`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (pattern.split('/').includes('..')) {
|
|
174
|
+
issues.push(`${at}: must not escape the worktree root with ".." (got "${pattern}")`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function validateScope(value, issues) {
|
|
178
|
+
const scope = { allow: [], deny: [] };
|
|
179
|
+
if (value === undefined || value === null)
|
|
180
|
+
return scope;
|
|
181
|
+
if (!isMapping(value)) {
|
|
182
|
+
issues.push(`scope: must be a mapping (got ${describe(value)})`);
|
|
183
|
+
return scope;
|
|
184
|
+
}
|
|
185
|
+
collectUnknownKeys(value, SCOPE_KEYS, 'scope', issues);
|
|
186
|
+
const limits = { maxEntries: exports.MAX_SCOPE_PATTERNS, maxLength: exports.MAX_PATTERN_LENGTH };
|
|
187
|
+
for (const key of ['allow', 'deny']) {
|
|
188
|
+
const list = validateStringList(value[key], `scope.${key}`, limits, issues);
|
|
189
|
+
if (!list)
|
|
190
|
+
continue;
|
|
191
|
+
list.forEach((pattern, index) => validateScopePattern(pattern, `scope.${key}[${index}]`, issues));
|
|
192
|
+
scope[key] = list;
|
|
193
|
+
}
|
|
194
|
+
return scope;
|
|
195
|
+
}
|
|
196
|
+
function validateVerify(value, issues) {
|
|
197
|
+
if (value === undefined || value === null)
|
|
198
|
+
return { gates: null };
|
|
199
|
+
if (!isMapping(value)) {
|
|
200
|
+
issues.push(`verify: must be a mapping (got ${describe(value)})`);
|
|
201
|
+
return { gates: null };
|
|
202
|
+
}
|
|
203
|
+
collectUnknownKeys(value, VERIFY_KEYS, 'verify', issues);
|
|
204
|
+
if (value.gates === undefined || value.gates === null)
|
|
205
|
+
return { gates: null };
|
|
206
|
+
const gates = validateStringList(value.gates, 'verify.gates', { maxEntries: exports.MAX_GATE_IDS, maxLength: 32 }, issues);
|
|
207
|
+
if (!gates)
|
|
208
|
+
return { gates: null };
|
|
209
|
+
// An empty list would read as "pass with no gates run". "Run everything" is
|
|
210
|
+
// spelled by omitting the key, so the two can never be confused.
|
|
211
|
+
if (Array.isArray(value.gates) && value.gates.length === 0) {
|
|
212
|
+
issues.push('verify.gates: must name at least one gate (omit the key to run every gate)');
|
|
213
|
+
return { gates: null };
|
|
214
|
+
}
|
|
215
|
+
const valid = [];
|
|
216
|
+
const seen = new Set();
|
|
217
|
+
gates.forEach((id, index) => {
|
|
218
|
+
if (!GATE_ID_PATTERN.test(id)) {
|
|
219
|
+
issues.push(`verify.gates[${index}]: "${id}" must match ${GATE_ID_PATTERN.source}`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (seen.has(id)) {
|
|
223
|
+
issues.push(`verify.gates[${index}]: duplicate gate id "${id}"`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
seen.add(id);
|
|
227
|
+
valid.push(id);
|
|
228
|
+
});
|
|
229
|
+
return { gates: valid.length > 0 ? valid : null };
|
|
230
|
+
}
|
|
231
|
+
function validateAutoYes(value, issues) {
|
|
232
|
+
const autoYes = { mode: null, allowPromptTypes: [], denyPatterns: [] };
|
|
233
|
+
if (value === undefined || value === null)
|
|
234
|
+
return autoYes;
|
|
235
|
+
if (!isMapping(value)) {
|
|
236
|
+
issues.push(`autoYes: must be a mapping (got ${describe(value)})`);
|
|
237
|
+
return autoYes;
|
|
238
|
+
}
|
|
239
|
+
collectUnknownKeys(value, AUTO_YES_KEYS, 'autoYes', issues);
|
|
240
|
+
if (value.mode !== undefined && value.mode !== null) {
|
|
241
|
+
if (typeof value.mode !== 'string' ||
|
|
242
|
+
!exports.AUTO_YES_MODES.includes(value.mode)) {
|
|
243
|
+
issues.push(`autoYes.mode: must be one of ${exports.AUTO_YES_MODES.join(', ')} (got ${describe(value.mode)})`);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
autoYes.mode = value.mode;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const promptTypes = validateStringList(value.allowPromptTypes, 'autoYes.allowPromptTypes', { maxEntries: exports.MAX_ALLOW_PROMPT_TYPES, maxLength: 64 }, issues);
|
|
250
|
+
if (promptTypes) {
|
|
251
|
+
promptTypes.forEach((type, index) => {
|
|
252
|
+
if (!exports.PROMPT_TYPES.includes(type)) {
|
|
253
|
+
issues.push(`autoYes.allowPromptTypes[${index}]: unknown prompt type "${type}" ` +
|
|
254
|
+
`(known: ${exports.PROMPT_TYPES.join(', ')})`);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
autoYes.allowPromptTypes.push(type);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
const denyPatterns = validateStringList(value.denyPatterns, 'autoYes.denyPatterns', { maxEntries: exports.MAX_DENY_PATTERNS, maxLength: exports.MAX_PATTERN_LENGTH }, issues);
|
|
261
|
+
if (denyPatterns) {
|
|
262
|
+
denyPatterns.forEach((pattern, index) => {
|
|
263
|
+
try {
|
|
264
|
+
new RegExp(pattern);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
issues.push(`autoYes.denyPatterns[${index}]: not a valid regular expression: ${error.message}`);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
autoYes.denyPatterns.push(pattern);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return autoYes;
|
|
274
|
+
}
|
|
275
|
+
function validateSuccess(value, issues) {
|
|
276
|
+
const success = {
|
|
277
|
+
requireWorkEvidence: true,
|
|
278
|
+
requireScopeClean: true,
|
|
279
|
+
autoVerifyOnStop: false,
|
|
280
|
+
};
|
|
281
|
+
if (value === undefined || value === null)
|
|
282
|
+
return success;
|
|
283
|
+
if (!isMapping(value)) {
|
|
284
|
+
issues.push(`success: must be a mapping (got ${describe(value)})`);
|
|
285
|
+
return success;
|
|
286
|
+
}
|
|
287
|
+
collectUnknownKeys(value, SUCCESS_KEYS, 'success', issues);
|
|
288
|
+
for (const key of SUCCESS_KEYS) {
|
|
289
|
+
if (value[key] === undefined)
|
|
290
|
+
continue;
|
|
291
|
+
const parsed = asBoolean(value[key]);
|
|
292
|
+
if (parsed === null) {
|
|
293
|
+
issues.push(`success.${key}: must be true or false (got ${describe(value[key])})`);
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
success[key] = parsed;
|
|
297
|
+
}
|
|
298
|
+
return success;
|
|
299
|
+
}
|
|
300
|
+
function validateText(value, key, maxLength, issues) {
|
|
301
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
302
|
+
issues.push(`${key}: required, must be a non-empty string (got ${describe(value)})`);
|
|
303
|
+
return '';
|
|
304
|
+
}
|
|
305
|
+
if (value.length > maxLength) {
|
|
306
|
+
issues.push(`${key}: at most ${maxLength} characters (got ${value.length})`);
|
|
307
|
+
return '';
|
|
308
|
+
}
|
|
309
|
+
return value.trim();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Parse and validate a contract document.
|
|
313
|
+
*
|
|
314
|
+
* @param raw YAML source
|
|
315
|
+
* @param sourceLabel path or label used to prefix document-level issues
|
|
316
|
+
* @throws TaskContractError with every violation collected in `issues`
|
|
317
|
+
*/
|
|
318
|
+
function parseTaskContract(raw, sourceLabel) {
|
|
319
|
+
let document;
|
|
320
|
+
try {
|
|
321
|
+
document = (0, yaml_1.parse)(raw);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
throw new TaskContractError([`${sourceLabel}: YAML parse error: ${error.message}`]);
|
|
325
|
+
}
|
|
326
|
+
if (!isMapping(document)) {
|
|
327
|
+
throw new TaskContractError([
|
|
328
|
+
`${sourceLabel}: expected a YAML mapping at the top level (got ${describe(document)})`,
|
|
329
|
+
]);
|
|
330
|
+
}
|
|
331
|
+
const issues = [];
|
|
332
|
+
collectUnknownKeys(document, TOP_LEVEL_KEYS, 'top level', issues);
|
|
333
|
+
if (!('version' in document)) {
|
|
334
|
+
issues.push('version: required, v1 contracts must declare "version: 1"');
|
|
335
|
+
}
|
|
336
|
+
else if (asInteger(document.version) !== 1) {
|
|
337
|
+
issues.push(`version: must be 1 (got ${describe(document.version)})`);
|
|
338
|
+
}
|
|
339
|
+
const title = validateText(document.title, 'title', exports.MAX_TITLE_LENGTH, issues);
|
|
340
|
+
const goal = validateText(document.goal, 'goal', exports.MAX_GOAL_LENGTH, issues);
|
|
341
|
+
const success = validateSuccess(document.success, issues);
|
|
342
|
+
const scope = validateScope(document.scope, issues);
|
|
343
|
+
const verify = validateVerify(document.verify, issues);
|
|
344
|
+
const autoYes = validateAutoYes(document.autoYes, issues);
|
|
345
|
+
// Checked after both sections are parsed: "keep changes inside scope" with no
|
|
346
|
+
// scope listed makes the Phase 2-2 gate reject every change the moment it
|
|
347
|
+
// switches on, so the contract is rejected now instead.
|
|
348
|
+
if (success.requireScopeClean && scope.allow.length === 0) {
|
|
349
|
+
issues.push('scope.allow: at least one pattern is required while success.requireScopeClean is true');
|
|
350
|
+
}
|
|
351
|
+
if (issues.length > 0)
|
|
352
|
+
throw new TaskContractError(issues);
|
|
353
|
+
return { version: 1, title, goal, scope, verify, autoYes, success };
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Read and validate a contract inside a worktree.
|
|
357
|
+
*
|
|
358
|
+
* `relativePath` is resolved against `worktreePath` and must stay inside it: a
|
|
359
|
+
* contract is a statement about one worktree, and a path that leaves it would
|
|
360
|
+
* let a send read an arbitrary file off the server's disk.
|
|
361
|
+
*
|
|
362
|
+
* @throws TaskContractError when the path escapes, the file is unreadable, or
|
|
363
|
+
* the document is invalid
|
|
364
|
+
*/
|
|
365
|
+
function loadTaskContract(worktreePath, relativePath) {
|
|
366
|
+
if (!(0, path_validator_1.isPathSafe)(relativePath, worktreePath)) {
|
|
367
|
+
throw new TaskContractError([
|
|
368
|
+
`${relativePath}: contract path must be inside the worktree (${worktreePath})`,
|
|
369
|
+
]);
|
|
370
|
+
}
|
|
371
|
+
const absolutePath = (0, path_1.join)(worktreePath, relativePath);
|
|
372
|
+
let raw;
|
|
373
|
+
try {
|
|
374
|
+
raw = (0, fs_1.readFileSync)(absolutePath, 'utf8');
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
const code = error.code;
|
|
378
|
+
throw new TaskContractError([
|
|
379
|
+
code === 'ENOENT'
|
|
380
|
+
? `${relativePath}: contract file not found in ${worktreePath}`
|
|
381
|
+
: `${relativePath}: ${error.message}`,
|
|
382
|
+
]);
|
|
383
|
+
}
|
|
384
|
+
return parseTaskContract(raw, relativePath);
|
|
385
|
+
}
|