commandmate 0.14.1 → 0.16.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/.env.example +7 -0
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +418 -354
- package/.next/app-path-routes-manifest.json +42 -34
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +22 -24
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +15 -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 +1 -1
- 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.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 +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 +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 +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 +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 +7 -0
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -0
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/fs/recent-paths/route.js +7 -0
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -0
- package/.next/server/app/api/fs/recent-paths/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/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.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/repositories/[id]/route.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/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +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.js.nft.json +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.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 +1 -0
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sidebar/group-order/route.js +2 -2
- 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 +23 -0
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/operations/route.js +13 -0
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/reindex/route.js +23 -0
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -0
- 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 +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/templates/[id]/route.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 +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/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/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 +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.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 +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]/execution-logs/[logId]/route.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 +2 -2
- 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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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]/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.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 +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 +2 -2
- 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 +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 +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 +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]/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.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 +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 +2 -2
- 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 +18 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -0
- 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/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 +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]/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]/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.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 +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 +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 +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 +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 +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]/viewed/route.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/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.js +1 -1
- package/.next/server/app/chat/page.js.nft.json +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.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 +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.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- 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.js +2 -0
- package/.next/server/app/skills/installed/page.js.nft.json +1 -0
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -0
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +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 +9 -9
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +42 -34
- package/.next/server/chunks/1117.js +1 -1
- package/.next/server/chunks/1185.js +1 -0
- package/.next/server/chunks/1239.js +1 -0
- package/.next/server/chunks/1355.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2710.js +2 -0
- package/.next/server/chunks/28.js +35 -0
- package/.next/server/chunks/3042.js +1 -2
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3722.js +1 -1
- package/.next/server/chunks/3736.js +1 -1
- package/.next/server/chunks/3753.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4390.js +1 -0
- package/.next/server/chunks/4440.js +2 -0
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/4548.js +1 -0
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5381.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/5737.js +1 -0
- package/.next/server/chunks/5793.js +1 -0
- package/.next/server/chunks/5959.js +2 -2
- package/.next/server/chunks/6065.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/646.js +2 -2
- package/.next/server/chunks/7593.js +1 -0
- package/.next/server/chunks/8356.js +1 -1
- package/.next/server/chunks/8681.js +1 -1
- package/.next/server/chunks/8807.js +66 -3
- package/.next/server/chunks/9051.js +1 -0
- package/.next/server/chunks/9123.js +1 -1
- package/.next/server/chunks/9687.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/AKqbAyuzbFfg05qpbCI_K/_buildManifest.js +1 -0
- package/.next/static/chunks/1191-b7dfdfe86b1d31d1.js +1 -0
- package/.next/static/chunks/2751-7fabd91275b14ca3.js +1 -0
- package/.next/static/chunks/{4459.03172449db395039.js → 4459.a94b52985a76509a.js} +1 -1
- package/.next/static/chunks/{4560-04e5aebcab96bfa1.js → 4560-8ffb0bb19f2ba998.js} +1 -1
- package/.next/static/chunks/530.e31cc754677fed0f.js +1 -0
- package/.next/static/chunks/5542-b6457f305d724a6b.js +1 -0
- package/.next/static/chunks/{6488-74d2f443e43c07b7.js → 6488-c2a968ec806975c2.js} +1 -1
- package/.next/static/chunks/{7485.43871aedf3dbb980.js → 7485.442b21101fca7257.js} +1 -1
- package/.next/static/chunks/8562-6e2ab32452f4fa5b.js +1 -0
- package/.next/static/chunks/8566-a6a7c70558927410.js +1 -0
- package/.next/static/chunks/9263.5259f73f89220d64.js +1 -0
- package/.next/static/chunks/9599-d29d2f8eeaf7c249.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/skills/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/templates/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/todos/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/more/{page-082d4ae496f9a36e.js → page-1619018cac999bbc.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-55e398bd20e2d7a9.js +1 -0
- package/.next/static/chunks/app/repositories/page-3c4fb889da48ce24.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-6008b904225ebb25.js +1 -0
- package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +1 -0
- package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-6a45f3744da50d95.js → page-6041d3c3db326317.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-59a63a2c013ec1eb.js +1 -0
- package/.next/static/chunks/webpack-180bebdee221b6f4.js +1 -0
- package/.next/static/css/d3453a6876553d32.css +1 -0
- package/.next/trace +11 -11
- package/.next/types/app/api/fs/browse/route.ts +347 -0
- package/.next/types/app/api/fs/recent-paths/route.ts +347 -0
- package/.next/types/app/api/repositories/validate-path/route.ts +347 -0
- package/.next/types/app/api/skills/installations/route.ts +347 -0
- package/.next/types/app/api/skills/operations/route.ts +347 -0
- package/.next/types/app/api/skills/reindex/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.ts +347 -0
- package/.next/types/app/skills/installed/page.ts +84 -0
- package/.next/types/routes.d.ts +10 -2
- package/.next/types/validator.ts +72 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +15 -0
- package/dist/cli/commands/skill.d.ts +2 -1
- package/dist/cli/commands/skill.d.ts.map +1 -1
- package/dist/cli/commands/skill.js +136 -2
- package/dist/cli/types/api-responses.d.ts +40 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +12 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.d.ts +8 -0
- package/dist/cli/utils/env-setup.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.js +23 -0
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v48-skill-operations-audit-index.js +117 -0
- package/dist/server/src/lib/git/git-exec.js +48 -1
- package/dist/server/src/lib/selected-agents-validator.js +3 -2
- package/dist/server/src/lib/skills/compatibility-matrix.js +256 -0
- package/dist/server/src/lib/skills/compatibility.js +132 -11
- package/dist/server/src/lib/skills/operation-audit.js +85 -15
- package/dist/server/src/lib/skills/operation-journal.js +14 -1
- package/dist/server/src/types/markdown-editor.js +13 -1
- package/package.json +1 -1
- package/.next/server/chunks/1808.js +0 -1
- package/.next/server/chunks/186.js +0 -1
- package/.next/server/chunks/5226.js +0 -28
- package/.next/server/chunks/5306.js +0 -2
- package/.next/server/chunks/7013.js +0 -1
- package/.next/server/chunks/9067.js +0 -1
- package/.next/server/chunks/9192.js +0 -1
- package/.next/static/1WyelLMRgPnhvA2HmhZmm/_buildManifest.js +0 -1
- package/.next/static/chunks/1668-e703b8b55775844b.js +0 -1
- package/.next/static/chunks/2069-c55de93eb6403961.js +0 -1
- package/.next/static/chunks/3418-7e47651340d940b0.js +0 -1
- package/.next/static/chunks/4027-000402aee1e3520b.js +0 -1
- package/.next/static/chunks/530.e377b0f1a7a89620.js +0 -1
- package/.next/static/chunks/6007-de36119357dcd418.js +0 -1
- package/.next/static/chunks/6497-ea466b22a6c1ae89.js +0 -1
- package/.next/static/chunks/8361.4bf062be2d2962f4.js +0 -1
- package/.next/static/chunks/8566-9da32e46c9d3fd54.js +0 -1
- package/.next/static/chunks/934-a37509667baa86ee.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/skills/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/templates/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/todos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/chat/page-623f5cb9040de639.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/repositories/page-70d4b997492884b8.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-68ed5e9186efe56d.js +0 -1
- package/.next/static/chunks/app/skills/page-46242c428ee8bccf.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-983a80ece6289026.js +0 -1
- package/.next/static/chunks/webpack-e655374fed175528.js +0 -1
- package/.next/static/css/b4bdb1f3457fe9a7.css +0 -1
- /package/.next/static/{1WyelLMRgPnhvA2HmhZmm → AKqbAyuzbFfg05qpbCI_K}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Measured Agent discovery matrix (Issue #1246)
|
|
4
|
+
*
|
|
5
|
+
* What a Skill package *declares* about an Agent and what CommandMate has
|
|
6
|
+
* actually *measured* are different claims. `compatibility.ts` carries the
|
|
7
|
+
* declaration; this module carries the measurement, so the UI can show both and
|
|
8
|
+
* never present one as the other.
|
|
9
|
+
*
|
|
10
|
+
* Two axes, not one. A single `native`/`unsupported` value cannot describe
|
|
11
|
+
* Codex CLI 0.145.0, which discovers a Skill from `.agents/skills` but does not
|
|
12
|
+
* expose it as a slash command. Collapsing that into one value would either
|
|
13
|
+
* promise an invocation route that does not exist or deny a discovery that does.
|
|
14
|
+
* So discovery and invocation are recorded separately and only discovery feeds
|
|
15
|
+
* the support verdict; invocation becomes a stated limitation.
|
|
16
|
+
*
|
|
17
|
+
* Pure data and pure functions: no filesystem, no network, no clock. `now` is
|
|
18
|
+
* always an explicit argument so a staleness verdict is reproducible.
|
|
19
|
+
*
|
|
20
|
+
* Evidence provenance: the 2026-07-26 measurements were taken in an isolated
|
|
21
|
+
* environment (dedicated port, dedicated database, a fresh repository with no
|
|
22
|
+
* Skills installed) against CommandMate 0.15.0. They are recorded here rather
|
|
23
|
+
* than re-derived at runtime — CommandMate does not drive a CLI to answer a
|
|
24
|
+
* catalog request.
|
|
25
|
+
*
|
|
26
|
+
* @module lib/skills/compatibility-matrix
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.AGENT_LIMITATION_MESSAGE_KEYS = exports.AGENT_RELOAD_MESSAGE_KEYS = exports.SKILL_EVIDENCE_MAX_AGE_DAYS = exports.AGENT_EVIDENCE_KIND_LABEL_KEYS = exports.AGENT_AXIS_OUTCOME_LABEL_KEYS = exports.AGENT_AXIS_LABEL_KEYS = exports.SKILL_EVIDENCE_KINDS = exports.SKILL_AGENT_AXIS_OUTCOMES = void 0;
|
|
30
|
+
exports.getSkillAgentMatrix = getSkillAgentMatrix;
|
|
31
|
+
exports.findSkillAgentMatrixEntry = findSkillAgentMatrixEntry;
|
|
32
|
+
exports.isAgentMeasured = isAgentMeasured;
|
|
33
|
+
exports.deriveMatrixAgentSupport = deriveMatrixAgentSupport;
|
|
34
|
+
exports.evidenceAgeInDays = evidenceAgeInDays;
|
|
35
|
+
exports.isEvidenceStale = isEvidenceStale;
|
|
36
|
+
exports.unmeasuredAgents = unmeasuredAgents;
|
|
37
|
+
exports.agentsMissingFromMatrix = agentsMissingFromMatrix;
|
|
38
|
+
const types_1 = require("../../lib/cli-tools/types");
|
|
39
|
+
const constants_1 = require("../../lib/skills/constants");
|
|
40
|
+
exports.SKILL_AGENT_AXIS_OUTCOMES = [
|
|
41
|
+
'verified',
|
|
42
|
+
'unsupported',
|
|
43
|
+
'unknown',
|
|
44
|
+
];
|
|
45
|
+
exports.SKILL_EVIDENCE_KINDS = [
|
|
46
|
+
'mechanical',
|
|
47
|
+
'self_report',
|
|
48
|
+
'not_measured',
|
|
49
|
+
];
|
|
50
|
+
/** i18n keys naming each axis, shared by UI and CLI (UX-05). */
|
|
51
|
+
exports.AGENT_AXIS_LABEL_KEYS = {
|
|
52
|
+
discovery: 'skills.compatibility.axis.discovery',
|
|
53
|
+
invocation: 'skills.compatibility.axis.invocation',
|
|
54
|
+
};
|
|
55
|
+
exports.AGENT_AXIS_OUTCOME_LABEL_KEYS = {
|
|
56
|
+
verified: 'skills.compatibility.axisOutcome.verified',
|
|
57
|
+
unsupported: 'skills.compatibility.axisOutcome.unsupported',
|
|
58
|
+
unknown: 'skills.compatibility.axisOutcome.unknown',
|
|
59
|
+
};
|
|
60
|
+
exports.AGENT_EVIDENCE_KIND_LABEL_KEYS = {
|
|
61
|
+
mechanical: 'skills.compatibility.evidenceKind.mechanical',
|
|
62
|
+
self_report: 'skills.compatibility.evidenceKind.selfReport',
|
|
63
|
+
not_measured: 'skills.compatibility.evidenceKind.notMeasured',
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* How long a measurement stays quotable before the UI flags it.
|
|
67
|
+
*
|
|
68
|
+
* Agent CLIs ship far faster than CommandMate re-measures them, so evidence
|
|
69
|
+
* that is merely old is presented as old rather than silently trusted.
|
|
70
|
+
*/
|
|
71
|
+
exports.SKILL_EVIDENCE_MAX_AGE_DAYS = 180;
|
|
72
|
+
const NOT_MEASURED_AXIS = {
|
|
73
|
+
outcome: 'unknown',
|
|
74
|
+
evidenceKind: 'not_measured',
|
|
75
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.unknown,
|
|
76
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.not_measured,
|
|
77
|
+
limitationKey: null,
|
|
78
|
+
};
|
|
79
|
+
const NOT_MEASURED_SKIP_REASON_KEY = 'skills.compatibility.skipReason.notMeasured';
|
|
80
|
+
/** Reload guidance keys. Keyed by behavior, not by Agent, so they stay reusable. */
|
|
81
|
+
exports.AGENT_RELOAD_MESSAGE_KEYS = {
|
|
82
|
+
SESSION_RESTART: 'skills.compatibility.reload.sessionRestart',
|
|
83
|
+
SESSION_RESTART_NO_SLASH: 'skills.compatibility.reload.sessionRestartNoSlash',
|
|
84
|
+
UNKNOWN: 'skills.compatibility.reload.unknown',
|
|
85
|
+
};
|
|
86
|
+
/** Known limitation keys attached to an axis outcome. */
|
|
87
|
+
exports.AGENT_LIMITATION_MESSAGE_KEYS = {
|
|
88
|
+
NO_SLASH_COMMAND: 'skills.compatibility.limitation.noSlashCommand',
|
|
89
|
+
};
|
|
90
|
+
/** Evidence reference for the 2026-07-26 isolated-environment measurement. */
|
|
91
|
+
const G4_EVIDENCE_SOURCE = 'https://github.com/Kewton/CommandMate/issues/1513#issuecomment-5083878264';
|
|
92
|
+
const MEASURED_DATE_2026_07_26 = '2026-07-26';
|
|
93
|
+
function unmeasuredEntry(agent) {
|
|
94
|
+
return {
|
|
95
|
+
agent,
|
|
96
|
+
discoveryRoots: [],
|
|
97
|
+
discovery: NOT_MEASURED_AXIS,
|
|
98
|
+
invocation: NOT_MEASURED_AXIS,
|
|
99
|
+
testedVersion: null,
|
|
100
|
+
testedDate: null,
|
|
101
|
+
evidenceSource: null,
|
|
102
|
+
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.UNKNOWN,
|
|
103
|
+
skipReasonKey: NOT_MEASURED_SKIP_REASON_KEY,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// The matrix
|
|
108
|
+
// =============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* Every Agent CommandMate knows about, measured or not.
|
|
111
|
+
*
|
|
112
|
+
* The unmeasured entries are listed rather than omitted: an Agent missing from
|
|
113
|
+
* the table would render as no statement at all, which a reader completes as
|
|
114
|
+
* "presumably fine". An explicit `unknown` with a skip reason is the honest
|
|
115
|
+
* shape of "we did not test this".
|
|
116
|
+
*/
|
|
117
|
+
const AGENT_DISCOVERY_MATRIX = [
|
|
118
|
+
{
|
|
119
|
+
agent: 'claude',
|
|
120
|
+
// Measured to read `.claude/skills` and *not* `.agents/skills`. The official
|
|
121
|
+
// catalog's older entries credited `.agents/skills` for Claude support; the
|
|
122
|
+
// conclusion was right and the reason was wrong — it works because #1460
|
|
123
|
+
// installs into `.claude/skills` too.
|
|
124
|
+
discoveryRoots: [constants_1.SKILL_CLAUDE_INSTALL_ROOT_PREFIX],
|
|
125
|
+
discovery: {
|
|
126
|
+
outcome: 'verified',
|
|
127
|
+
evidenceKind: 'mechanical',
|
|
128
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
129
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
130
|
+
limitationKey: null,
|
|
131
|
+
},
|
|
132
|
+
invocation: {
|
|
133
|
+
outcome: 'verified',
|
|
134
|
+
evidenceKind: 'mechanical',
|
|
135
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
136
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
137
|
+
limitationKey: null,
|
|
138
|
+
},
|
|
139
|
+
testedVersion: '2.1.220',
|
|
140
|
+
testedDate: MEASURED_DATE_2026_07_26,
|
|
141
|
+
evidenceSource: G4_EVIDENCE_SOURCE,
|
|
142
|
+
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.SESSION_RESTART,
|
|
143
|
+
skipReasonKey: null,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
agent: 'codex',
|
|
147
|
+
discoveryRoots: [constants_1.SKILL_INSTALL_ROOT_PREFIX],
|
|
148
|
+
discovery: {
|
|
149
|
+
// The Agent named the absolute SKILL.md path under `.agents/skills` when
|
|
150
|
+
// asked without tools. That is evidence, and it is the Agent describing
|
|
151
|
+
// itself, so it is recorded as a self report rather than as a match.
|
|
152
|
+
outcome: 'verified',
|
|
153
|
+
evidenceKind: 'self_report',
|
|
154
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
155
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.self_report,
|
|
156
|
+
limitationKey: null,
|
|
157
|
+
},
|
|
158
|
+
invocation: {
|
|
159
|
+
// Ruled out as a placement problem by control: `/mo` matched `/model`, so
|
|
160
|
+
// the palette works, and a Skill already sitting in `~/.codex/skills` did
|
|
161
|
+
// not match either. This CLI version does not expose Skills as slash
|
|
162
|
+
// commands wherever they are placed.
|
|
163
|
+
outcome: 'unsupported',
|
|
164
|
+
evidenceKind: 'mechanical',
|
|
165
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.unsupported,
|
|
166
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
167
|
+
limitationKey: exports.AGENT_LIMITATION_MESSAGE_KEYS.NO_SLASH_COMMAND,
|
|
168
|
+
},
|
|
169
|
+
testedVersion: '0.145.0',
|
|
170
|
+
testedDate: MEASURED_DATE_2026_07_26,
|
|
171
|
+
evidenceSource: G4_EVIDENCE_SOURCE,
|
|
172
|
+
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.SESSION_RESTART_NO_SLASH,
|
|
173
|
+
skipReasonKey: null,
|
|
174
|
+
},
|
|
175
|
+
unmeasuredEntry('gemini'),
|
|
176
|
+
unmeasuredEntry('vibe-local'),
|
|
177
|
+
unmeasuredEntry('opencode'),
|
|
178
|
+
unmeasuredEntry('copilot'),
|
|
179
|
+
// CommandMate's own slash palette serves `.agents/skills` entries to
|
|
180
|
+
// antigravity sessions (#1504). That is CommandMate injecting a command, not
|
|
181
|
+
// the Agent discovering a Skill, so it is not evidence for this table.
|
|
182
|
+
unmeasuredEntry('antigravity'),
|
|
183
|
+
];
|
|
184
|
+
/** The measured matrix, in CLI-tool declaration order. */
|
|
185
|
+
function getSkillAgentMatrix() {
|
|
186
|
+
return AGENT_DISCOVERY_MATRIX;
|
|
187
|
+
}
|
|
188
|
+
/** The entry for one Agent, or null when the id is not a known CLI tool. */
|
|
189
|
+
function findSkillAgentMatrixEntry(agent) {
|
|
190
|
+
return AGENT_DISCOVERY_MATRIX.find((entry) => entry.agent === agent) ?? null;
|
|
191
|
+
}
|
|
192
|
+
/** Whether CommandMate has any measurement at all for this Agent. */
|
|
193
|
+
function isAgentMeasured(entry) {
|
|
194
|
+
return entry.discovery.evidenceKind !== 'not_measured';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* The four-valued support verdict implied by the measurement.
|
|
198
|
+
*
|
|
199
|
+
* Only the discovery axis decides it. An Agent that finds and can run a Skill
|
|
200
|
+
* supports it natively even when its palette does not list it, so a failed
|
|
201
|
+
* invocation axis is reported as a limitation instead of demoting the verdict
|
|
202
|
+
* to `unsupported` — which would read as "this will not work".
|
|
203
|
+
*
|
|
204
|
+
* `commandmate_runtime` is never produced here: the Runtime is not shipped, and
|
|
205
|
+
* inventing that verdict would promise a fallback that does not exist.
|
|
206
|
+
*/
|
|
207
|
+
function deriveMatrixAgentSupport(entry) {
|
|
208
|
+
switch (entry.discovery.outcome) {
|
|
209
|
+
case 'verified':
|
|
210
|
+
return 'native';
|
|
211
|
+
case 'unsupported':
|
|
212
|
+
return 'unsupported';
|
|
213
|
+
case 'unknown':
|
|
214
|
+
return 'unknown';
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// =============================================================================
|
|
218
|
+
// Staleness
|
|
219
|
+
// =============================================================================
|
|
220
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
221
|
+
const MEASURED_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
222
|
+
/**
|
|
223
|
+
* Whole days between the measurement and `now`, or null when unmeasured or when
|
|
224
|
+
* the recorded date is unusable. A measurement dated in the future yields 0
|
|
225
|
+
* rather than a negative age.
|
|
226
|
+
*/
|
|
227
|
+
function evidenceAgeInDays(entry, now) {
|
|
228
|
+
if (entry.testedDate === null || !MEASURED_DATE_PATTERN.test(entry.testedDate))
|
|
229
|
+
return null;
|
|
230
|
+
const measured = Date.parse(`${entry.testedDate}T00:00:00Z`);
|
|
231
|
+
const current = now.getTime();
|
|
232
|
+
if (Number.isNaN(measured) || Number.isNaN(current))
|
|
233
|
+
return null;
|
|
234
|
+
return Math.max(0, Math.floor((current - measured) / MS_PER_DAY));
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Whether the measurement is old enough to warn about.
|
|
238
|
+
*
|
|
239
|
+
* An unmeasured Agent is not stale — it is unknown, which the UI already states
|
|
240
|
+
* more strongly. Marking it stale as well would imply a measurement had expired.
|
|
241
|
+
*/
|
|
242
|
+
function isEvidenceStale(entry, now, maxAgeDays = exports.SKILL_EVIDENCE_MAX_AGE_DAYS) {
|
|
243
|
+
const age = evidenceAgeInDays(entry, now);
|
|
244
|
+
return age !== null && age > maxAgeDays;
|
|
245
|
+
}
|
|
246
|
+
// =============================================================================
|
|
247
|
+
// Coverage
|
|
248
|
+
// =============================================================================
|
|
249
|
+
/** CLI tools with no measurement, in matrix order. */
|
|
250
|
+
function unmeasuredAgents() {
|
|
251
|
+
return AGENT_DISCOVERY_MATRIX.filter((entry) => !isAgentMeasured(entry)).map((entry) => entry.agent);
|
|
252
|
+
}
|
|
253
|
+
/** CLI tool ids the matrix does not mention. Empty in a consistent build. */
|
|
254
|
+
function agentsMissingFromMatrix() {
|
|
255
|
+
return types_1.CLI_TOOL_IDS.filter((id) => findSkillAgentMatrixEntry(id) === null);
|
|
256
|
+
}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* CommandMate compatibility judgement and version resolution (Issue #1231)
|
|
4
4
|
*
|
|
5
5
|
* Pure functions: no filesystem, no network, no process state. The host version
|
|
6
|
-
*
|
|
7
|
-
* Catalog against the same rules and reach the same verdict.
|
|
6
|
+
* and the current instant are always explicit arguments so UI, API and CLI can
|
|
7
|
+
* evaluate the same Catalog against the same rules and reach the same verdict.
|
|
8
8
|
*
|
|
9
9
|
* Every verdict carries a stable machine code *and* a human-readable message
|
|
10
10
|
* (受入条件: "互換性NGの理由がmachine-readable codeとhuman-readable messageで返る").
|
|
@@ -14,16 +14,19 @@
|
|
|
14
14
|
* @module lib/skills/compatibility
|
|
15
15
|
*/
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.SkillRecommendationReason = exports.UNKNOWN_HOST_VERSION_SENTINEL = exports.SKILL_COMPATIBILITY_MESSAGE_KEYS = exports.SkillCompatibilityReason = void 0;
|
|
17
|
+
exports.SkillRecommendationReason = exports.SKILL_AGENT_VERIFICATION_MESSAGE_KEYS = exports.SkillAgentVerification = exports.UNKNOWN_HOST_VERSION_SENTINEL = exports.SKILL_COMPATIBILITY_MESSAGE_KEYS = exports.SkillCompatibilityReason = void 0;
|
|
18
18
|
exports.normalizeHostVersion = normalizeHostVersion;
|
|
19
19
|
exports.evaluateCommandMateCompatibility = evaluateCommandMateCompatibility;
|
|
20
20
|
exports.evaluateVersionCompatibility = evaluateVersionCompatibility;
|
|
21
|
+
exports.capSupportByMeasurement = capSupportByMeasurement;
|
|
22
|
+
exports.reconcileAgentSupport = reconcileAgentSupport;
|
|
21
23
|
exports.describeAgentCompatibility = describeAgentCompatibility;
|
|
22
24
|
exports.resolveSkillVersions = resolveSkillVersions;
|
|
23
25
|
exports.findSkillCatalogEntry = findSkillCatalogEntry;
|
|
24
26
|
// Sibling modules of the same package are imported directly rather than through
|
|
25
27
|
// the `@/lib/skills` barrel, so adding this module to the barrel later can never
|
|
26
28
|
// introduce an import cycle. External callers still go through the barrel.
|
|
29
|
+
const compatibility_matrix_1 = require("../../lib/skills/compatibility-matrix");
|
|
27
30
|
const constants_1 = require("../../lib/skills/constants");
|
|
28
31
|
const semver_1 = require("../../lib/skills/semver");
|
|
29
32
|
/** Stable reason codes for a CommandMate compatibility verdict. */
|
|
@@ -122,14 +125,132 @@ function evaluateCommandMateCompatibility(requiredRange, currentVersion) {
|
|
|
122
125
|
function evaluateVersionCompatibility(version, currentVersion) {
|
|
123
126
|
return evaluateCommandMateCompatibility(version.compatibility.commandmate, currentVersion);
|
|
124
127
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
// =============================================================================
|
|
129
|
+
// Agent compatibility
|
|
130
|
+
// =============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* How the publisher's declaration stands up against what CommandMate measured
|
|
133
|
+
* (Issue #1246).
|
|
134
|
+
*/
|
|
135
|
+
exports.SkillAgentVerification = {
|
|
136
|
+
/** Declaration and measurement agree. */
|
|
137
|
+
CONFIRMED: 'SKILL_AGENT_EVIDENCE_CONFIRMED',
|
|
138
|
+
/** Measurement is weaker than the declaration, so the declaration is capped. */
|
|
139
|
+
RESTRICTED: 'SKILL_AGENT_EVIDENCE_RESTRICTED',
|
|
140
|
+
/** Measurement is stronger than the declaration; the manifest has fallen behind. */
|
|
141
|
+
STALE_DECLARATION: 'SKILL_AGENT_EVIDENCE_STALE_DECLARATION',
|
|
142
|
+
/** CommandMate has never measured this Agent. */
|
|
143
|
+
UNVERIFIED: 'SKILL_AGENT_EVIDENCE_UNVERIFIED',
|
|
144
|
+
};
|
|
145
|
+
exports.SKILL_AGENT_VERIFICATION_MESSAGE_KEYS = {
|
|
146
|
+
[exports.SkillAgentVerification.CONFIRMED]: 'skills.compatibility.verification.confirmed',
|
|
147
|
+
[exports.SkillAgentVerification.RESTRICTED]: 'skills.compatibility.verification.restricted',
|
|
148
|
+
[exports.SkillAgentVerification.STALE_DECLARATION]: 'skills.compatibility.verification.staleDeclaration',
|
|
149
|
+
[exports.SkillAgentVerification.UNVERIFIED]: 'skills.compatibility.verification.unverified',
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Ordering used to cap a declaration by a measurement. Higher is stronger.
|
|
153
|
+
*
|
|
154
|
+
* `unknown` outranks `unsupported` because "we could not tell" leaves more room
|
|
155
|
+
* than "we established it does not work".
|
|
156
|
+
*/
|
|
157
|
+
const AGENT_SUPPORT_RANK = {
|
|
158
|
+
unsupported: 0,
|
|
159
|
+
unknown: 1,
|
|
160
|
+
commandmate_runtime: 2,
|
|
161
|
+
native: 3,
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Cap a publisher's declaration by what CommandMate measured.
|
|
165
|
+
*
|
|
166
|
+
* Downward only. A weaker measurement wins, which is what keeps an
|
|
167
|
+
* evidence-free `native` off the screen. A stronger one does not: raising a
|
|
168
|
+
* package's own claim is the publisher's call, so the mismatch is reported as
|
|
169
|
+
* a declaration that has fallen behind.
|
|
170
|
+
*/
|
|
171
|
+
function capSupportByMeasurement(declared, measured) {
|
|
172
|
+
const declaredRank = AGENT_SUPPORT_RANK[declared];
|
|
173
|
+
const measuredRank = AGENT_SUPPORT_RANK[measured];
|
|
174
|
+
if (measuredRank < declaredRank) {
|
|
175
|
+
return { support: measured, verification: exports.SkillAgentVerification.RESTRICTED };
|
|
176
|
+
}
|
|
177
|
+
if (measuredRank > declaredRank) {
|
|
178
|
+
return { support: declared, verification: exports.SkillAgentVerification.STALE_DECLARATION };
|
|
179
|
+
}
|
|
180
|
+
return { support: declared, verification: exports.SkillAgentVerification.CONFIRMED };
|
|
181
|
+
}
|
|
182
|
+
function toAxisView(axis, evidence) {
|
|
183
|
+
return {
|
|
184
|
+
axis,
|
|
185
|
+
axisKey: compatibility_matrix_1.AGENT_AXIS_LABEL_KEYS[axis],
|
|
186
|
+
outcome: evidence.outcome,
|
|
187
|
+
outcomeKey: evidence.labelKey,
|
|
188
|
+
evidenceKind: evidence.evidenceKind,
|
|
189
|
+
evidenceKindKey: evidence.evidenceKindKey,
|
|
190
|
+
limitationKey: evidence.limitationKey,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function toMeasuredView(entry, now) {
|
|
194
|
+
return {
|
|
195
|
+
discovery: toAxisView('discovery', entry.discovery),
|
|
196
|
+
invocation: toAxisView('invocation', entry.invocation),
|
|
197
|
+
discoveryRoots: [...entry.discoveryRoots],
|
|
198
|
+
testedVersion: entry.testedVersion,
|
|
199
|
+
testedDate: entry.testedDate,
|
|
200
|
+
evidenceSource: entry.evidenceSource,
|
|
201
|
+
ageDays: (0, compatibility_matrix_1.evidenceAgeInDays)(entry, now),
|
|
202
|
+
stale: (0, compatibility_matrix_1.isEvidenceStale)(entry, now),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Reconcile one declared Agent claim with the measured discovery matrix.
|
|
207
|
+
*
|
|
208
|
+
* The declaration is never rewritten upward: a measurement stronger than the
|
|
209
|
+
* manifest is reported as a stale declaration, not silently promoted, because
|
|
210
|
+
* the publisher is the one who decides what their package claims to support.
|
|
211
|
+
* It *is* capped downward, which is what keeps "evidence-free native" off the
|
|
212
|
+
* screen when a manifest asserts an Agent CommandMate measured as unsupported.
|
|
213
|
+
*/
|
|
214
|
+
function reconcileAgentSupport(declared, now) {
|
|
215
|
+
const entry = (0, compatibility_matrix_1.findSkillAgentMatrixEntry)(declared.agent);
|
|
216
|
+
const base = {
|
|
217
|
+
agent: declared.agent,
|
|
218
|
+
evidence: declared.evidence,
|
|
219
|
+
declaredSupport: declared.support,
|
|
220
|
+
declaredLabelKey: constants_1.AGENT_SUPPORT_LABEL_KEYS[declared.support],
|
|
221
|
+
};
|
|
222
|
+
if (entry === null || !(0, compatibility_matrix_1.isAgentMeasured)(entry)) {
|
|
223
|
+
return {
|
|
224
|
+
...base,
|
|
225
|
+
support: declared.support,
|
|
226
|
+
labelKey: constants_1.AGENT_SUPPORT_LABEL_KEYS[declared.support],
|
|
227
|
+
verification: exports.SkillAgentVerification.UNVERIFIED,
|
|
228
|
+
verificationKey: exports.SKILL_AGENT_VERIFICATION_MESSAGE_KEYS[exports.SkillAgentVerification.UNVERIFIED],
|
|
229
|
+
measured: null,
|
|
230
|
+
skipReasonKey: entry?.skipReasonKey ?? null,
|
|
231
|
+
reloadKey: entry?.reloadKey ?? compatibility_matrix_1.AGENT_RELOAD_MESSAGE_KEYS.UNKNOWN,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const { support, verification } = capSupportByMeasurement(declared.support, (0, compatibility_matrix_1.deriveMatrixAgentSupport)(entry));
|
|
235
|
+
return {
|
|
236
|
+
...base,
|
|
237
|
+
support,
|
|
238
|
+
labelKey: constants_1.AGENT_SUPPORT_LABEL_KEYS[support],
|
|
239
|
+
verification,
|
|
240
|
+
verificationKey: exports.SKILL_AGENT_VERIFICATION_MESSAGE_KEYS[verification],
|
|
241
|
+
measured: toMeasuredView(entry, now),
|
|
242
|
+
skipReasonKey: null,
|
|
243
|
+
reloadKey: entry.reloadKey,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Attach the shared i18n label key and the measured evidence to each claim.
|
|
248
|
+
*
|
|
249
|
+
* @param now - Evaluated against for evidence staleness. Passed explicitly by
|
|
250
|
+
* tests so a verdict never depends on when the suite runs.
|
|
251
|
+
*/
|
|
252
|
+
function describeAgentCompatibility(agents, now = new Date()) {
|
|
253
|
+
return agents.map((entry) => reconcileAgentSupport(entry, now));
|
|
133
254
|
}
|
|
134
255
|
// =============================================================================
|
|
135
256
|
// Version resolution
|
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
* @module lib/skills/operation-audit
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.SKILL_AUDIT_MAX_LIMIT = exports.SKILL_AUDIT_DEFAULT_LIMIT = void 0;
|
|
19
20
|
exports.buildSkillOperationAuditInput = buildSkillOperationAuditInput;
|
|
20
21
|
exports.recordSkillOperationAudit = recordSkillOperationAudit;
|
|
21
22
|
exports.getSkillOperationAuditByOperationId = getSkillOperationAuditByOperationId;
|
|
23
|
+
exports.querySkillOperationAudit = querySkillOperationAudit;
|
|
22
24
|
exports.listSkillOperationAudit = listSkillOperationAudit;
|
|
23
25
|
const crypto_1 = require("crypto");
|
|
24
26
|
const operation_store_1 = require("../../lib/skills/operation-store");
|
|
@@ -36,6 +38,8 @@ function mapRow(row) {
|
|
|
36
38
|
worktreeId: row.worktree_id,
|
|
37
39
|
skillId: row.skill_id,
|
|
38
40
|
skillVersion: row.skill_version,
|
|
41
|
+
fromVersion: row.from_version,
|
|
42
|
+
toVersion: row.to_version,
|
|
39
43
|
sourceOrigin: row.source_origin,
|
|
40
44
|
sourceRepository: row.source_repository,
|
|
41
45
|
sourceRef: row.source_ref,
|
|
@@ -48,15 +52,23 @@ function mapRow(row) {
|
|
|
48
52
|
}
|
|
49
53
|
const SELECT_COLUMNS = `
|
|
50
54
|
id, operation_id, idempotency_key, binding_hash, operation, state, result,
|
|
51
|
-
actor_type, actor_id, worktree_id, skill_id, skill_version,
|
|
55
|
+
actor_type, actor_id, worktree_id, skill_id, skill_version, from_version, to_version,
|
|
52
56
|
source_origin, source_repository, source_ref, source_commit, artifact_sha256,
|
|
53
57
|
error_code, error_message, recorded_at
|
|
54
58
|
`;
|
|
55
59
|
/**
|
|
56
60
|
* Build an audit input from a journal entry, so the two records cannot drift.
|
|
57
61
|
* The journal already holds the actor, target, source and typed error.
|
|
62
|
+
*
|
|
63
|
+
* The version transition (#1248) is derived from the journal rather than passed
|
|
64
|
+
* in, because for the two operations that exist today the journal fully
|
|
65
|
+
* determines it: an install ends at its target version and starts nowhere, an
|
|
66
|
+
* uninstall starts at the version it removes and ends nowhere. An `update` is
|
|
67
|
+
* the one case where `fromVersion` is not derivable — it has no writer yet
|
|
68
|
+
* (#1243/#1244), and whoever adds one has to supply the replaced version here.
|
|
58
69
|
*/
|
|
59
70
|
function buildSkillOperationAuditInput(entry, result, recordedAt) {
|
|
71
|
+
const isUninstall = entry.operation === 'uninstall';
|
|
60
72
|
return {
|
|
61
73
|
operationId: entry.operationId,
|
|
62
74
|
idempotencyKey: entry.idempotencyKey,
|
|
@@ -69,6 +81,8 @@ function buildSkillOperationAuditInput(entry, result, recordedAt) {
|
|
|
69
81
|
worktreeId: entry.target.worktreeId,
|
|
70
82
|
skillId: entry.target.skillId,
|
|
71
83
|
skillVersion: entry.target.version,
|
|
84
|
+
fromVersion: isUninstall ? entry.target.version : null,
|
|
85
|
+
toVersion: isUninstall ? null : entry.target.version,
|
|
72
86
|
sourceOrigin: entry.source?.origin ?? null,
|
|
73
87
|
sourceRepository: entry.source?.repository ?? null,
|
|
74
88
|
sourceRef: entry.source?.ref ?? null,
|
|
@@ -89,10 +103,10 @@ function recordSkillOperationAudit(db, input) {
|
|
|
89
103
|
};
|
|
90
104
|
db.prepare(`INSERT INTO skill_operations (
|
|
91
105
|
id, operation_id, idempotency_key, binding_hash, operation, state, result,
|
|
92
|
-
actor_type, actor_id, worktree_id, skill_id, skill_version,
|
|
106
|
+
actor_type, actor_id, worktree_id, skill_id, skill_version, from_version, to_version,
|
|
93
107
|
source_origin, source_repository, source_ref, source_commit, artifact_sha256,
|
|
94
108
|
error_code, error_message, recorded_at
|
|
95
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(record.id, record.operationId, record.idempotencyKey, record.bindingHash, record.operation, record.state, record.result, record.actorType, record.actorId, record.worktreeId, record.skillId, record.skillVersion, record.sourceOrigin, record.sourceRepository, record.sourceRef, record.sourceCommit, record.artifactSha256, record.errorCode, record.errorMessage, record.recordedAt);
|
|
109
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(record.id, record.operationId, record.idempotencyKey, record.bindingHash, record.operation, record.state, record.result, record.actorType, record.actorId, record.worktreeId, record.skillId, record.skillVersion, record.fromVersion, record.toVersion, record.sourceOrigin, record.sourceRepository, record.sourceRef, record.sourceCommit, record.artifactSha256, record.errorCode, record.errorMessage, record.recordedAt);
|
|
96
110
|
return record;
|
|
97
111
|
}
|
|
98
112
|
/** Audit trail of one operation, oldest first. */
|
|
@@ -103,18 +117,74 @@ function getSkillOperationAuditByOperationId(db, operationId) {
|
|
|
103
117
|
.all(operationId);
|
|
104
118
|
return rows.map(mapRow);
|
|
105
119
|
}
|
|
120
|
+
/** Default page size for an audit query. */
|
|
121
|
+
exports.SKILL_AUDIT_DEFAULT_LIMIT = 50;
|
|
122
|
+
/** Hard ceiling on one audit page, so a client cannot ask for the whole log. */
|
|
123
|
+
exports.SKILL_AUDIT_MAX_LIMIT = 200;
|
|
124
|
+
function buildAuditWhere(query) {
|
|
125
|
+
const conditions = [];
|
|
126
|
+
const params = [];
|
|
127
|
+
if (query.worktreeId !== undefined) {
|
|
128
|
+
conditions.push('worktree_id = ?');
|
|
129
|
+
params.push(query.worktreeId);
|
|
130
|
+
}
|
|
131
|
+
if (query.skillId !== undefined) {
|
|
132
|
+
conditions.push('skill_id = ?');
|
|
133
|
+
params.push(query.skillId);
|
|
134
|
+
}
|
|
135
|
+
if (query.operation !== undefined) {
|
|
136
|
+
conditions.push('operation = ?');
|
|
137
|
+
params.push(query.operation);
|
|
138
|
+
}
|
|
139
|
+
if (query.result !== undefined) {
|
|
140
|
+
conditions.push('result = ?');
|
|
141
|
+
params.push(query.result);
|
|
142
|
+
}
|
|
143
|
+
if (query.since !== undefined) {
|
|
144
|
+
conditions.push('recorded_at >= ?');
|
|
145
|
+
params.push(query.since);
|
|
146
|
+
}
|
|
147
|
+
if (query.until !== undefined) {
|
|
148
|
+
conditions.push('recorded_at < ?');
|
|
149
|
+
params.push(query.until);
|
|
150
|
+
}
|
|
151
|
+
if (query.after !== undefined) {
|
|
152
|
+
conditions.push('(recorded_at < ? OR (recorded_at = ? AND id < ?))');
|
|
153
|
+
params.push(query.after.recordedAt, query.after.recordedAt, query.after.id);
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
clause: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',
|
|
157
|
+
params,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* One page of the audit feed, newest first.
|
|
162
|
+
*
|
|
163
|
+
* Fetches one row beyond the page to decide `hasMore` without a second COUNT
|
|
164
|
+
* over a table that only ever grows.
|
|
165
|
+
*/
|
|
166
|
+
function querySkillOperationAudit(db, query = {}) {
|
|
167
|
+
const limit = Math.min(Math.max(1, Math.trunc(query.limit ?? exports.SKILL_AUDIT_DEFAULT_LIMIT)), exports.SKILL_AUDIT_MAX_LIMIT);
|
|
168
|
+
const { clause, params } = buildAuditWhere(query);
|
|
169
|
+
const rows = db
|
|
170
|
+
.prepare(`SELECT ${SELECT_COLUMNS} FROM skill_operations
|
|
171
|
+
${clause}
|
|
172
|
+
ORDER BY recorded_at DESC, id DESC LIMIT ?`)
|
|
173
|
+
.all(...params, limit + 1);
|
|
174
|
+
const hasMore = rows.length > limit;
|
|
175
|
+
const records = (hasMore ? rows.slice(0, limit) : rows).map(mapRow);
|
|
176
|
+
const last = records[records.length - 1];
|
|
177
|
+
return {
|
|
178
|
+
records,
|
|
179
|
+
hasMore,
|
|
180
|
+
nextCursor: hasMore && last ? { recordedAt: last.recordedAt, id: last.id } : null,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
106
183
|
/** Audit trail for one Skill in one worktree, newest first. */
|
|
107
184
|
function listSkillOperationAudit(db, filter) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
.all(filter.worktreeId, limit)
|
|
114
|
-
: db
|
|
115
|
-
.prepare(`SELECT ${SELECT_COLUMNS} FROM skill_operations
|
|
116
|
-
WHERE worktree_id = ? AND skill_id = ?
|
|
117
|
-
ORDER BY recorded_at DESC, id DESC LIMIT ?`)
|
|
118
|
-
.all(filter.worktreeId, filter.skillId, limit));
|
|
119
|
-
return rows.map(mapRow);
|
|
185
|
+
return querySkillOperationAudit(db, {
|
|
186
|
+
worktreeId: filter.worktreeId,
|
|
187
|
+
skillId: filter.skillId,
|
|
188
|
+
limit: filter.limit ?? 100,
|
|
189
|
+
}).records;
|
|
120
190
|
}
|
|
@@ -207,6 +207,15 @@ function pruneExpiredSkillOperationJournal(options = {}) {
|
|
|
207
207
|
*
|
|
208
208
|
* A replay hands back the recorded entry so the caller can answer with the
|
|
209
209
|
* original outcome instead of writing the payload a second time.
|
|
210
|
+
*
|
|
211
|
+
* `isReplayable` is how the caller says the recorded outcome is no longer true
|
|
212
|
+
* of the world (Issue #1552). A derived key is a function of the binding alone,
|
|
213
|
+
* so a genuinely new request — the install that follows an uninstall — arrives
|
|
214
|
+
* under the key of the old one; without this it would be answered from an entry
|
|
215
|
+
* describing a payload that is no longer there. An entry rejected this way is
|
|
216
|
+
* superseded: it is dropped and a fresh operation is opened, because the request
|
|
217
|
+
* really is new work. A PREPARING entry is never superseded, whatever the
|
|
218
|
+
* predicate says: the operation that owns it may still be running.
|
|
210
219
|
*/
|
|
211
220
|
function beginSkillOperation(input, options = {}) {
|
|
212
221
|
const bindingHash = computeSkillOperationBindingHash(input.binding);
|
|
@@ -216,7 +225,11 @@ function beginSkillOperation(input, options = {}) {
|
|
|
216
225
|
if (existing.bindingHash !== bindingHash) {
|
|
217
226
|
return { ok: false, reason: 'IDEMPOTENCY_KEY_CONFLICT', entry: existing };
|
|
218
227
|
}
|
|
219
|
-
|
|
228
|
+
const supersede = existing.state !== 'PREPARING' && input.isReplayable?.(existing) === false;
|
|
229
|
+
if (!supersede) {
|
|
230
|
+
return { ok: true, entry: existing, replayed: true };
|
|
231
|
+
}
|
|
232
|
+
deleteSkillOperationJournal(idempotencyKey, options);
|
|
220
233
|
}
|
|
221
234
|
const now = options.now ?? Date.now();
|
|
222
235
|
const entry = {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @module types/markdown-editor
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.DEFAULT_LAYOUT_STATE = exports.AUTO_SAVE_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_AUTO_SAVE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
|
|
8
|
+
exports.DEFAULT_LAYOUT_STATE = exports.INDENT_UNIT = exports.LOCAL_STORAGE_KEY_TAB_MOVES_FOCUS = exports.AUTO_SAVE_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_AUTO_SAVE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
|
|
9
9
|
exports.isValidSplitRatio = isValidSplitRatio;
|
|
10
10
|
exports.isValidBoolean = isValidBoolean;
|
|
11
11
|
/**
|
|
@@ -79,6 +79,18 @@ exports.LOCAL_STORAGE_KEY_AUTO_SAVE = 'commandmate:md-editor-auto-save';
|
|
|
79
79
|
* Auto-save debounce delay (3 seconds)
|
|
80
80
|
*/
|
|
81
81
|
exports.AUTO_SAVE_DEBOUNCE_MS = 3000;
|
|
82
|
+
/**
|
|
83
|
+
* Local storage key for the "Tab moves focus" accessibility toggle (Issue #1518)
|
|
84
|
+
*/
|
|
85
|
+
exports.LOCAL_STORAGE_KEY_TAB_MOVES_FOCUS = 'commandmate:md-editor-tab-moves-focus';
|
|
86
|
+
/**
|
|
87
|
+
* Indent unit inserted by Tab (Issue #1518).
|
|
88
|
+
*
|
|
89
|
+
* Spaces, never a tab character: the same textarea edits YAML in text mode and
|
|
90
|
+
* YAML forbids tabs, and a literal tab renders at the browser's default 8-column
|
|
91
|
+
* `tab-size` which breaks Markdown nested lists.
|
|
92
|
+
*/
|
|
93
|
+
exports.INDENT_UNIT = ' ';
|
|
82
94
|
/**
|
|
83
95
|
* Default editor layout state
|
|
84
96
|
*/
|
package/package.json
CHANGED