gsd-pi 2.71.0 → 2.72.0-dev.de4c4b3
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/README.md +57 -17
- package/dist/cli.js +29 -3
- package/dist/headless-events.d.ts +2 -0
- package/dist/headless-events.js +7 -0
- package/dist/headless.js +16 -3
- package/dist/mcp-server.js +40 -17
- package/dist/provider-migrations.d.ts +10 -0
- package/dist/provider-migrations.js +12 -0
- package/dist/resource-loader.js +139 -13
- package/dist/resources/GSD-WORKFLOW.md +1 -1
- package/dist/resources/agents/debugger.md +58 -0
- package/dist/resources/agents/doc-writer.md +43 -0
- package/dist/resources/agents/git-ops.md +56 -0
- package/dist/resources/agents/javascript-pro.md +46 -271
- package/dist/resources/agents/planner.md +55 -0
- package/dist/resources/agents/refactorer.md +47 -0
- package/dist/resources/agents/reviewer.md +48 -0
- package/dist/resources/agents/security.md +59 -0
- package/dist/resources/agents/tester.md +50 -0
- package/dist/resources/agents/typescript-pro.md +41 -235
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +113 -10
- package/dist/resources/extensions/gsd/auto/infra-errors.js +34 -0
- package/dist/resources/extensions/gsd/auto/loop.js +32 -1
- package/dist/resources/extensions/gsd/auto/phases.js +5 -1
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -16
- package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
- package/dist/resources/extensions/gsd/auto-start.js +34 -7
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +56 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +63 -51
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -0
- package/dist/resources/extensions/gsd/commands/context.js +15 -6
- package/dist/resources/extensions/gsd/commands/dispatcher.js +12 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -33
- package/dist/resources/extensions/gsd/commands/handlers/core.js +56 -11
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +15 -6
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +4 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +8 -3
- package/dist/resources/extensions/gsd/dispatch-guard.js +18 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
- package/dist/resources/extensions/gsd/error-classifier.js +5 -2
- package/dist/resources/extensions/gsd/forensics.js +19 -6
- package/dist/resources/extensions/gsd/gate-registry.js +208 -0
- package/dist/resources/extensions/gsd/gsd-db.js +41 -0
- package/dist/resources/extensions/gsd/guided-flow.js +5 -10
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +10 -4
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
- package/dist/resources/extensions/gsd/notification-overlay.js +42 -13
- package/dist/resources/extensions/gsd/notification-store.js +56 -5
- package/dist/resources/extensions/gsd/notification-widget.js +5 -13
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +8 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -2
- package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +22 -19
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +3 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
- package/dist/resources/extensions/gsd/session-model-override.js +25 -0
- package/dist/resources/extensions/gsd/shortcut-defs.js +40 -0
- package/dist/resources/extensions/gsd/state.js +9 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +4 -1
- package/dist/resources/extensions/ollama/index.js +13 -5
- package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
- package/dist/resources/extensions/subagent/agents.js +8 -0
- package/dist/resources/extensions/subagent/index.js +17 -0
- package/dist/resources/skills/create-skill/SKILL.md +2 -0
- package/dist/startup-model-validation.d.ts +0 -1
- package/dist/startup-model-validation.js +6 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/server.d.ts +12 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +90 -42
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -12
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/server.ts +110 -38
- package/packages/mcp-server/src/workflow-tools.test.ts +110 -0
- package/packages/mcp-server/src/workflow-tools.ts +32 -12
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +11 -2
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +20 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +4 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +44 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +2 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +7 -4
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +11 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +13 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +32 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +55 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +14 -3
- package/packages/pi-ai/src/providers/anthropic.ts +8 -4
- package/packages/pi-ai/src/providers/openai-completions.ts +14 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js +61 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +2 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +27 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +85 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +22 -18
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +55 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +57 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +38 -5
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js +71 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +43 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +7 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +4 -2
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +108 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -0
- package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
- package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +22 -18
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +60 -1
- package/packages/pi-coding-agent/src/core/sdk.test.ts +89 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +45 -9
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +47 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -2
- package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -3
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +1 -1
- package/src/resources/agents/debugger.md +58 -0
- package/src/resources/agents/doc-writer.md +43 -0
- package/src/resources/agents/git-ops.md +56 -0
- package/src/resources/agents/javascript-pro.md +46 -271
- package/src/resources/agents/planner.md +55 -0
- package/src/resources/agents/refactorer.md +47 -0
- package/src/resources/agents/reviewer.md +48 -0
- package/src/resources/agents/security.md +59 -0
- package/src/resources/agents/tester.md +50 -0
- package/src/resources/agents/typescript-pro.md +41 -235
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +122 -8
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +189 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +38 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +45 -1
- package/src/resources/extensions/gsd/auto/phases.ts +6 -0
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +29 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
- package/src/resources/extensions/gsd/auto-start.ts +41 -7
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +72 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +79 -60
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +7 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -5
- package/src/resources/extensions/gsd/commands/dispatcher.ts +14 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +10 -36
- package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -11
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +17 -7
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +4 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -3
- package/src/resources/extensions/gsd/dispatch-guard.ts +18 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
- package/src/resources/extensions/gsd/error-classifier.ts +5 -2
- package/src/resources/extensions/gsd/forensics.ts +23 -7
- package/src/resources/extensions/gsd/gate-registry.ts +251 -0
- package/src/resources/extensions/gsd/gsd-db.ts +51 -0
- package/src/resources/extensions/gsd/guided-flow.ts +5 -10
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/metrics.ts +12 -1
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -3
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
- package/src/resources/extensions/gsd/notification-overlay.ts +47 -14
- package/src/resources/extensions/gsd/notification-store.ts +54 -5
- package/src/resources/extensions/gsd/notification-widget.ts +5 -14
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +39 -2
- package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +22 -19
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/queue.md +3 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
- package/src/resources/extensions/gsd/session-model-override.ts +36 -0
- package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
- package/src/resources/extensions/gsd/state.ts +13 -2
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +18 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +4 -1
- package/src/resources/extensions/gsd/types.ts +26 -0
- package/src/resources/extensions/ollama/index.ts +13 -3
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
- package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
- package/src/resources/extensions/subagent/agents.ts +10 -0
- package/src/resources/extensions/subagent/index.ts +18 -0
- package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
- package/src/resources/skills/create-skill/SKILL.md +2 -0
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → f-Gremw0nLxxFUySaHRPw}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → f-Gremw0nLxxFUySaHRPw}/_ssgManifest.js +0 -0
|
@@ -55,46 +55,80 @@ function textContent(text: string): { content: Array<{ type: 'text'; text: strin
|
|
|
55
55
|
// gsd_query filesystem reader
|
|
56
56
|
// ---------------------------------------------------------------------------
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Normalized query categories for {@link readProjectState}.
|
|
60
|
+
*
|
|
61
|
+
* Maps user-supplied query strings (or empty) to the set of fields we return.
|
|
62
|
+
* Accepts common synonyms so the MCP client can pass intuitive values.
|
|
63
|
+
*/
|
|
64
|
+
const QUERY_FIELDS = {
|
|
65
|
+
all: ['state', 'project', 'requirements', 'milestones'] as const,
|
|
66
|
+
state: ['state'] as const,
|
|
67
|
+
status: ['state'] as const,
|
|
68
|
+
project: ['project'] as const,
|
|
69
|
+
requirements: ['requirements'] as const,
|
|
70
|
+
milestones: ['milestones'] as const,
|
|
71
|
+
} as const;
|
|
72
|
+
|
|
73
|
+
type QueryCategory = keyof typeof QUERY_FIELDS;
|
|
74
|
+
type ProjectStateField = (typeof QUERY_FIELDS)[QueryCategory][number];
|
|
75
|
+
|
|
76
|
+
function normalizeQuery(query: string | undefined): QueryCategory {
|
|
77
|
+
const key = (query ?? 'all').trim().toLowerCase();
|
|
78
|
+
if (key in QUERY_FIELDS) return key as QueryCategory;
|
|
79
|
+
return 'all';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function readProjectState(projectDir: string, query: string | undefined): Promise<Record<string, unknown>> {
|
|
59
83
|
const gsdDir = join(resolve(projectDir), '.gsd');
|
|
60
|
-
const
|
|
84
|
+
const category = normalizeQuery(query);
|
|
85
|
+
const wanted = new Set<ProjectStateField>(QUERY_FIELDS[category]);
|
|
61
86
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
87
|
+
const result: Record<string, unknown> = {
|
|
88
|
+
projectDir: resolve(projectDir),
|
|
89
|
+
query: category,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
if (wanted.has('state')) {
|
|
93
|
+
try {
|
|
94
|
+
result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');
|
|
95
|
+
} catch {
|
|
96
|
+
result.state = null;
|
|
97
|
+
}
|
|
67
98
|
}
|
|
68
99
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
100
|
+
if (wanted.has('project')) {
|
|
101
|
+
try {
|
|
102
|
+
result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');
|
|
103
|
+
} catch {
|
|
104
|
+
result.project = null;
|
|
105
|
+
}
|
|
74
106
|
}
|
|
75
107
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
108
|
+
if (wanted.has('requirements')) {
|
|
109
|
+
try {
|
|
110
|
+
result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');
|
|
111
|
+
} catch {
|
|
112
|
+
result.requirements = null;
|
|
113
|
+
}
|
|
81
114
|
}
|
|
82
115
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
116
|
+
if (wanted.has('milestones')) {
|
|
117
|
+
const milestonesDir = join(gsdDir, 'milestones');
|
|
118
|
+
try {
|
|
119
|
+
const entries = await readdir(milestonesDir, { withFileTypes: true });
|
|
120
|
+
const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
if (!entry.isDirectory()) continue;
|
|
123
|
+
const mDir = join(milestonesDir, entry.name);
|
|
124
|
+
const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));
|
|
125
|
+
const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));
|
|
126
|
+
milestones.push({ id: entry.name, hasRoadmap, hasSummary });
|
|
127
|
+
}
|
|
128
|
+
result.milestones = milestones;
|
|
129
|
+
} catch {
|
|
130
|
+
result.milestones = [];
|
|
94
131
|
}
|
|
95
|
-
result.milestones = milestones;
|
|
96
|
-
} catch {
|
|
97
|
-
result.milestones = [];
|
|
98
132
|
}
|
|
99
133
|
|
|
100
134
|
return result;
|
|
@@ -128,8 +162,25 @@ interface ElicitRequestFormParams {
|
|
|
128
162
|
};
|
|
129
163
|
}
|
|
130
164
|
|
|
165
|
+
/**
|
|
166
|
+
* Handler extra — the second argument passed by McpServer.tool handlers.
|
|
167
|
+
* Contains an AbortSignal scoped to the JSON-RPC request (cancelled when
|
|
168
|
+
* the client cancels the `tools/call`) plus other per-request metadata.
|
|
169
|
+
* Tools that can actually be stopped mid-flight should honour `signal`.
|
|
170
|
+
*/
|
|
171
|
+
export interface McpToolExtra {
|
|
172
|
+
signal?: AbortSignal;
|
|
173
|
+
requestId?: string | number;
|
|
174
|
+
sendNotification?: (notification: unknown) => void | Promise<void>;
|
|
175
|
+
}
|
|
176
|
+
|
|
131
177
|
interface McpServerInstance {
|
|
132
|
-
tool(
|
|
178
|
+
tool(
|
|
179
|
+
name: string,
|
|
180
|
+
description: string,
|
|
181
|
+
params: Record<string, unknown>,
|
|
182
|
+
handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>,
|
|
183
|
+
): unknown;
|
|
133
184
|
server: {
|
|
134
185
|
elicitInput(
|
|
135
186
|
params: AskUserQuestionsElicitRequest | ElicitRequestFormParams,
|
|
@@ -302,7 +353,12 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
|
|
|
302
353
|
);
|
|
303
354
|
|
|
304
355
|
// -----------------------------------------------------------------------
|
|
305
|
-
// gsd_execute — start a new GSD auto-mode session
|
|
356
|
+
// gsd_execute — start a new GSD auto-mode session.
|
|
357
|
+
//
|
|
358
|
+
// If the JSON-RPC request is aborted while the session is starting (or
|
|
359
|
+
// immediately after), we cancel the session so we don't leak a background
|
|
360
|
+
// RpcClient process. Once the session is running the caller should use
|
|
361
|
+
// `gsd_cancel` to stop it via sessionId.
|
|
306
362
|
// -----------------------------------------------------------------------
|
|
307
363
|
server.tool(
|
|
308
364
|
'gsd_execute',
|
|
@@ -313,12 +369,20 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
|
|
|
313
369
|
model: z.string().optional().describe('Model ID override'),
|
|
314
370
|
bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),
|
|
315
371
|
},
|
|
316
|
-
async (args: Record<string, unknown
|
|
372
|
+
async (args: Record<string, unknown>, extra?: McpToolExtra) => {
|
|
317
373
|
const { projectDir, command, model, bare } = args as {
|
|
318
374
|
projectDir: string; command?: string; model?: string; bare?: boolean;
|
|
319
375
|
};
|
|
320
376
|
try {
|
|
321
377
|
const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });
|
|
378
|
+
|
|
379
|
+
// If the client aborted while startSession was running, cancel the
|
|
380
|
+
// newly-created session rather than leaving an orphaned process.
|
|
381
|
+
if (extra?.signal?.aborted) {
|
|
382
|
+
await sessionManager.cancelSession(sessionId).catch(() => { /* swallow */ });
|
|
383
|
+
return errorContent('gsd_execute aborted by client before returning');
|
|
384
|
+
}
|
|
385
|
+
|
|
322
386
|
return jsonContent({ sessionId, status: 'started' });
|
|
323
387
|
} catch (err) {
|
|
324
388
|
return errorContent(err instanceof Error ? err.message : String(err));
|
|
@@ -411,17 +475,25 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
|
|
|
411
475
|
);
|
|
412
476
|
|
|
413
477
|
// -----------------------------------------------------------------------
|
|
414
|
-
// gsd_query — read project state from filesystem (no session needed)
|
|
478
|
+
// gsd_query — read project state from filesystem (no session needed).
|
|
479
|
+
//
|
|
480
|
+
// `query` is optional: when omitted the tool returns all fields (STATE.md,
|
|
481
|
+
// PROJECT.md, requirements, milestone listing). Accepted narrow values:
|
|
482
|
+
// "state" / "status", "project", "requirements", "milestones", "all".
|
|
483
|
+
// Unknown values fall back to "all" for forward-compatibility.
|
|
415
484
|
// -----------------------------------------------------------------------
|
|
416
485
|
server.tool(
|
|
417
486
|
'gsd_query',
|
|
418
|
-
'Query GSD project state from the filesystem.
|
|
487
|
+
'Query GSD project state from the filesystem. By default returns STATE.md, PROJECT.md, requirements, and milestone listing. Pass `query` to narrow the response (accepted: "state"/"status", "project", "requirements", "milestones", "all"). Does not require an active session.',
|
|
419
488
|
{
|
|
420
489
|
projectDir: z.string().describe('Absolute path to the project directory'),
|
|
421
|
-
query: z
|
|
490
|
+
query: z
|
|
491
|
+
.enum(['all', 'state', 'status', 'project', 'requirements', 'milestones'])
|
|
492
|
+
.optional()
|
|
493
|
+
.describe('Narrow the response to a single field (default: "all")'),
|
|
422
494
|
},
|
|
423
495
|
async (args: Record<string, unknown>) => {
|
|
424
|
-
const { projectDir, query } = args as { projectDir: string; query
|
|
496
|
+
const { projectDir, query } = args as { projectDir: string; query?: string };
|
|
425
497
|
try {
|
|
426
498
|
const state = await readProjectState(projectDir, query);
|
|
427
499
|
return jsonContent(state);
|
|
@@ -384,6 +384,116 @@ describe("workflow MCP tools", () => {
|
|
|
384
384
|
}
|
|
385
385
|
});
|
|
386
386
|
|
|
387
|
+
it("gsd_requirement_save opens the DB before inline requirement writes", async () => {
|
|
388
|
+
const base = makeTmpBase();
|
|
389
|
+
try {
|
|
390
|
+
const server = makeMockServer();
|
|
391
|
+
registerWorkflowTools(server as any);
|
|
392
|
+
const requirementTool = server.tools.find((t) => t.name === "gsd_requirement_save");
|
|
393
|
+
assert.ok(requirementTool, "requirement tool should be registered");
|
|
394
|
+
|
|
395
|
+
closeDatabase();
|
|
396
|
+
|
|
397
|
+
const result = await requirementTool!.handler({
|
|
398
|
+
projectDir: base,
|
|
399
|
+
class: "operability",
|
|
400
|
+
description: "Inline MCP requirement save regression",
|
|
401
|
+
why: "Reproduce missing ensureDbOpen in workflow-tools",
|
|
402
|
+
source: "user",
|
|
403
|
+
status: "active",
|
|
404
|
+
primary_owner: "M010/S10",
|
|
405
|
+
validation: "n/a",
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
assert.match((result as any).content[0].text as string, /Saved requirement R\d+/);
|
|
409
|
+
assert.ok(existsSync(join(base, ".gsd", "REQUIREMENTS.md")), "REQUIREMENTS.md should be written to disk");
|
|
410
|
+
const row = _getAdapter()!
|
|
411
|
+
.prepare("SELECT id, class, description FROM requirements WHERE description = ?")
|
|
412
|
+
.get("Inline MCP requirement save regression") as Record<string, unknown> | undefined;
|
|
413
|
+
assert.ok(row, "requirement should be written to the database");
|
|
414
|
+
assert.equal(row["class"], "operability");
|
|
415
|
+
} finally {
|
|
416
|
+
cleanup(base);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it("gsd_plan_task reopens the DB before inline task planning writes", async () => {
|
|
421
|
+
const base = makeTmpBase();
|
|
422
|
+
try {
|
|
423
|
+
const server = makeMockServer();
|
|
424
|
+
registerWorkflowTools(server as any);
|
|
425
|
+
const milestoneTool = server.tools.find((t) => t.name === "gsd_plan_milestone");
|
|
426
|
+
const sliceTool = server.tools.find((t) => t.name === "gsd_plan_slice");
|
|
427
|
+
const taskTool = server.tools.find((t) => t.name === "gsd_plan_task");
|
|
428
|
+
assert.ok(milestoneTool, "milestone planning tool should be registered");
|
|
429
|
+
assert.ok(sliceTool, "slice planning tool should be registered");
|
|
430
|
+
assert.ok(taskTool, "task planning tool should be registered");
|
|
431
|
+
|
|
432
|
+
await milestoneTool!.handler({
|
|
433
|
+
projectDir: base,
|
|
434
|
+
milestoneId: "M010",
|
|
435
|
+
title: "Inline task planning DB reopen",
|
|
436
|
+
vision: "Seed a slice, close the DB, then plan another task inline.",
|
|
437
|
+
slices: [
|
|
438
|
+
{
|
|
439
|
+
sliceId: "S10",
|
|
440
|
+
title: "Inline task planning",
|
|
441
|
+
risk: "medium",
|
|
442
|
+
depends: [],
|
|
443
|
+
demo: "Inline gsd_plan_task reopens the DB after it was closed.",
|
|
444
|
+
goal: "Preserve MCP task planning after the DB adapter is closed.",
|
|
445
|
+
successCriteria: "The second task plan persists after a closed DB is reopened.",
|
|
446
|
+
proofLevel: "integration",
|
|
447
|
+
integrationClosure: "The inline MCP handler reopens the DB before planning.",
|
|
448
|
+
observabilityImpact: "workflow-tools MCP tests cover the inline reopen path.",
|
|
449
|
+
},
|
|
450
|
+
],
|
|
451
|
+
});
|
|
452
|
+
await sliceTool!.handler({
|
|
453
|
+
projectDir: base,
|
|
454
|
+
milestoneId: "M010",
|
|
455
|
+
sliceId: "S10",
|
|
456
|
+
goal: "Create the initial slice plan before closing the DB.",
|
|
457
|
+
tasks: [
|
|
458
|
+
{
|
|
459
|
+
taskId: "T10",
|
|
460
|
+
title: "Seed existing task",
|
|
461
|
+
description: "Create the initial task plan before closing the DB.",
|
|
462
|
+
estimate: "5m",
|
|
463
|
+
files: ["packages/mcp-server/src/workflow-tools.ts"],
|
|
464
|
+
verify: "node --test",
|
|
465
|
+
inputs: ["M010-ROADMAP.md"],
|
|
466
|
+
expectedOutput: ["T10-PLAN.md"],
|
|
467
|
+
},
|
|
468
|
+
],
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
closeDatabase();
|
|
472
|
+
|
|
473
|
+
const result = await taskTool!.handler({
|
|
474
|
+
projectDir: base,
|
|
475
|
+
milestoneId: "M010",
|
|
476
|
+
sliceId: "S10",
|
|
477
|
+
taskId: "T11",
|
|
478
|
+
title: "Reopen and plan",
|
|
479
|
+
description: "Exercise the inline plan-task path after the DB was closed.",
|
|
480
|
+
estimate: "5m",
|
|
481
|
+
files: ["packages/mcp-server/src/workflow-tools.ts"],
|
|
482
|
+
verify: "node --test",
|
|
483
|
+
inputs: ["M010-ROADMAP.md", "S10-PLAN.md"],
|
|
484
|
+
expectedOutput: ["T11-PLAN.md"],
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
assert.match((result as any).content[0].text as string, /Planned task T11/);
|
|
488
|
+
assert.ok(
|
|
489
|
+
existsSync(join(base, ".gsd", "milestones", "M010", "slices", "S10", "tasks", "T11-PLAN.md")),
|
|
490
|
+
"T11 plan should be written after reopening the DB",
|
|
491
|
+
);
|
|
492
|
+
} finally {
|
|
493
|
+
cleanup(base);
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
|
|
387
497
|
it("gsd_replan_slice and gsd_slice_replan work end-to-end", async () => {
|
|
388
498
|
const base = makeTmpBase();
|
|
389
499
|
try {
|
|
@@ -244,6 +244,10 @@ type WorkflowWriteGateModule = {
|
|
|
244
244
|
) => { block: boolean; reason?: string };
|
|
245
245
|
};
|
|
246
246
|
|
|
247
|
+
type WorkflowDbBootstrapModule = {
|
|
248
|
+
ensureDbOpen: (basePath?: string) => Promise<boolean>;
|
|
249
|
+
};
|
|
250
|
+
|
|
247
251
|
let workflowToolExecutorsPromise: Promise<WorkflowToolExecutors> | null = null;
|
|
248
252
|
let workflowExecutionQueue: Promise<void> = Promise.resolve();
|
|
249
253
|
let workflowWriteGatePromise: Promise<WorkflowWriteGateModule> | null = null;
|
|
@@ -506,6 +510,22 @@ async function runSerializedWorkflowOperation<T>(fn: () => Promise<T>): Promise<
|
|
|
506
510
|
}
|
|
507
511
|
}
|
|
508
512
|
|
|
513
|
+
async function runSerializedWorkflowDbOperation<T>(
|
|
514
|
+
projectDir: string,
|
|
515
|
+
fn: () => Promise<T>,
|
|
516
|
+
): Promise<T> {
|
|
517
|
+
return runSerializedWorkflowOperation(async () => {
|
|
518
|
+
const { ensureDbOpen } = await importLocalModule<WorkflowDbBootstrapModule>(
|
|
519
|
+
"../../../src/resources/extensions/gsd/bootstrap/dynamic-tools.js",
|
|
520
|
+
);
|
|
521
|
+
const dbAvailable = await ensureDbOpen(projectDir);
|
|
522
|
+
if (!dbAvailable) {
|
|
523
|
+
throw new Error("GSD database is not available");
|
|
524
|
+
}
|
|
525
|
+
return fn();
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
|
|
509
529
|
async function enforceWorkflowWriteGate(
|
|
510
530
|
toolName: string,
|
|
511
531
|
projectDir: string,
|
|
@@ -767,7 +787,7 @@ const saveGateResultParams = {
|
|
|
767
787
|
projectDir: projectDirParam,
|
|
768
788
|
milestoneId: z.string().describe("Milestone ID (e.g. M001)"),
|
|
769
789
|
sliceId: z.string().describe("Slice ID (e.g. S01)"),
|
|
770
|
-
gateId: z.enum(["Q3", "Q4", "Q5", "Q6", "Q7", "Q8"]).describe("Gate ID"),
|
|
790
|
+
gateId: z.enum(["Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "MV01", "MV02", "MV03", "MV04"]).describe("Gate ID"),
|
|
771
791
|
taskId: z.string().optional().describe("Task ID for task-scoped gates"),
|
|
772
792
|
verdict: z.enum(["pass", "flag", "omitted"]).describe("Gate verdict"),
|
|
773
793
|
rationale: z.string().describe("One-sentence justification"),
|
|
@@ -969,7 +989,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
969
989
|
const parsed = parseWorkflowArgs(decisionSaveSchema, args);
|
|
970
990
|
const { projectDir, ...params } = parsed;
|
|
971
991
|
await enforceWorkflowWriteGate("gsd_decision_save", projectDir);
|
|
972
|
-
const result = await
|
|
992
|
+
const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
973
993
|
const { saveDecisionToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
|
|
974
994
|
return saveDecisionToDb(params, projectDir);
|
|
975
995
|
});
|
|
@@ -985,7 +1005,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
985
1005
|
const parsed = parseWorkflowArgs(decisionSaveSchema, args);
|
|
986
1006
|
const { projectDir, ...params } = parsed;
|
|
987
1007
|
await enforceWorkflowWriteGate("gsd_decision_save", projectDir);
|
|
988
|
-
const result = await
|
|
1008
|
+
const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
989
1009
|
const { saveDecisionToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
|
|
990
1010
|
return saveDecisionToDb(params, projectDir);
|
|
991
1011
|
});
|
|
@@ -1001,7 +1021,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1001
1021
|
const parsed = parseWorkflowArgs(requirementUpdateSchema, args);
|
|
1002
1022
|
const { projectDir, id, ...updates } = parsed;
|
|
1003
1023
|
await enforceWorkflowWriteGate("gsd_requirement_update", projectDir);
|
|
1004
|
-
await
|
|
1024
|
+
await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1005
1025
|
const { updateRequirementInDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
|
|
1006
1026
|
return updateRequirementInDb(id, updates, projectDir);
|
|
1007
1027
|
});
|
|
@@ -1017,7 +1037,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1017
1037
|
const parsed = parseWorkflowArgs(requirementUpdateSchema, args);
|
|
1018
1038
|
const { projectDir, id, ...updates } = parsed;
|
|
1019
1039
|
await enforceWorkflowWriteGate("gsd_requirement_update", projectDir);
|
|
1020
|
-
await
|
|
1040
|
+
await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1021
1041
|
const { updateRequirementInDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
|
|
1022
1042
|
return updateRequirementInDb(id, updates, projectDir);
|
|
1023
1043
|
});
|
|
@@ -1033,7 +1053,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1033
1053
|
const parsed = parseWorkflowArgs(requirementSaveSchema, args);
|
|
1034
1054
|
const { projectDir, ...params } = parsed;
|
|
1035
1055
|
await enforceWorkflowWriteGate("gsd_requirement_save", projectDir);
|
|
1036
|
-
const result = await
|
|
1056
|
+
const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1037
1057
|
const { saveRequirementToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
|
|
1038
1058
|
return saveRequirementToDb(params, projectDir);
|
|
1039
1059
|
});
|
|
@@ -1049,7 +1069,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1049
1069
|
const parsed = parseWorkflowArgs(requirementSaveSchema, args);
|
|
1050
1070
|
const { projectDir, ...params } = parsed;
|
|
1051
1071
|
await enforceWorkflowWriteGate("gsd_requirement_save", projectDir);
|
|
1052
|
-
const result = await
|
|
1072
|
+
const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1053
1073
|
const { saveRequirementToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
|
|
1054
1074
|
return saveRequirementToDb(params, projectDir);
|
|
1055
1075
|
});
|
|
@@ -1064,7 +1084,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1064
1084
|
async (args: Record<string, unknown>) => {
|
|
1065
1085
|
const { projectDir } = parseWorkflowArgs(milestoneGenerateIdSchema, args);
|
|
1066
1086
|
await enforceWorkflowWriteGate("gsd_milestone_generate_id", projectDir);
|
|
1067
|
-
const id = await
|
|
1087
|
+
const id = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1068
1088
|
const {
|
|
1069
1089
|
claimReservedId,
|
|
1070
1090
|
findMilestoneIds,
|
|
@@ -1092,7 +1112,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1092
1112
|
async (args: Record<string, unknown>) => {
|
|
1093
1113
|
const { projectDir } = parseWorkflowArgs(milestoneGenerateIdSchema, args);
|
|
1094
1114
|
await enforceWorkflowWriteGate("gsd_milestone_generate_id", projectDir);
|
|
1095
|
-
const id = await
|
|
1115
|
+
const id = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1096
1116
|
const {
|
|
1097
1117
|
claimReservedId,
|
|
1098
1118
|
findMilestoneIds,
|
|
@@ -1147,7 +1167,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1147
1167
|
const parsed = parseWorkflowArgs(planTaskSchema, args);
|
|
1148
1168
|
const { projectDir, ...params } = parsed;
|
|
1149
1169
|
await enforceWorkflowWriteGate("gsd_plan_task", projectDir, params.milestoneId);
|
|
1150
|
-
const result = await
|
|
1170
|
+
const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1151
1171
|
const { handlePlanTask } = await importLocalModule<any>("../../../src/resources/extensions/gsd/tools/plan-task.js");
|
|
1152
1172
|
return handlePlanTask(params, projectDir);
|
|
1153
1173
|
});
|
|
@@ -1168,7 +1188,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1168
1188
|
const parsed = parseWorkflowArgs(planTaskSchema, args);
|
|
1169
1189
|
const { projectDir, ...params } = parsed;
|
|
1170
1190
|
await enforceWorkflowWriteGate("gsd_plan_task", projectDir, params.milestoneId);
|
|
1171
|
-
const result = await
|
|
1191
|
+
const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1172
1192
|
const { handlePlanTask } = await importLocalModule<any>("../../../src/resources/extensions/gsd/tools/plan-task.js");
|
|
1173
1193
|
return handlePlanTask(params, projectDir);
|
|
1174
1194
|
});
|
|
@@ -1228,7 +1248,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
|
|
|
1228
1248
|
async (args: Record<string, unknown>) => {
|
|
1229
1249
|
const { projectDir, milestoneId, sliceId, reason } = parseWorkflowArgs(skipSliceSchema, args);
|
|
1230
1250
|
await enforceWorkflowWriteGate("gsd_skip_slice", projectDir, milestoneId);
|
|
1231
|
-
await
|
|
1251
|
+
await runSerializedWorkflowDbOperation(projectDir, async () => {
|
|
1232
1252
|
const { getSlice, updateSliceStatus } = await importLocalModule<any>("../../../src/resources/extensions/gsd/gsd-db.js");
|
|
1233
1253
|
const { invalidateStateCache } = await importLocalModule<any>("../../../src/resources/extensions/gsd/state.js");
|
|
1234
1254
|
const { rebuildState } = await importLocalModule<any>("../../../src/resources/extensions/gsd/doctor.js");
|
|
@@ -84,7 +84,7 @@ export const streamBedrock = (model, context, options = {}) => {
|
|
|
84
84
|
messages: convertMessages(context, model, cacheRetention),
|
|
85
85
|
system: buildSystemPrompt(context.systemPrompt, model, cacheRetention),
|
|
86
86
|
inferenceConfig: { maxTokens: options.maxTokens, temperature: options.temperature },
|
|
87
|
-
toolConfig: convertToolConfig(context.tools, options.toolChoice),
|
|
87
|
+
toolConfig: convertToolConfig(context.tools, options.toolChoice, model, cacheRetention),
|
|
88
88
|
additionalModelRequestFields: buildAdditionalModelRequestFields(model, options),
|
|
89
89
|
};
|
|
90
90
|
const nextCommandInput = await options?.onPayload?.(commandInput, model);
|
|
@@ -497,7 +497,7 @@ function convertMessages(context, model, cacheRetention) {
|
|
|
497
497
|
}
|
|
498
498
|
return result;
|
|
499
499
|
}
|
|
500
|
-
function convertToolConfig(tools, toolChoice) {
|
|
500
|
+
function convertToolConfig(tools, toolChoice, model, cacheRetention) {
|
|
501
501
|
if (!tools?.length || toolChoice === "none")
|
|
502
502
|
return undefined;
|
|
503
503
|
const bedrockTools = tools.map((tool) => ({
|
|
@@ -507,6 +507,15 @@ function convertToolConfig(tools, toolChoice) {
|
|
|
507
507
|
inputSchema: { json: tool.parameters },
|
|
508
508
|
},
|
|
509
509
|
}));
|
|
510
|
+
// Add cachePoint after last tool for supported models
|
|
511
|
+
if (cacheRetention !== "none" && supportsPromptCaching(model)) {
|
|
512
|
+
bedrockTools.push({
|
|
513
|
+
cachePoint: {
|
|
514
|
+
type: CachePointType.DEFAULT,
|
|
515
|
+
...(cacheRetention === "long" ? { ttl: CacheTTL.ONE_HOUR } : {}),
|
|
516
|
+
},
|
|
517
|
+
});
|
|
518
|
+
}
|
|
510
519
|
let bedrockToolChoice;
|
|
511
520
|
switch (toolChoice) {
|
|
512
521
|
case "auto":
|