gsd-pi 2.70.1 → 2.71.0-dev.4c35d99
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 +242 -40
- package/dist/resources/extensions/get-secrets-from-user.js +17 -1
- 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 +37 -18
- 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 +6 -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/custom-workflow-engine.js +16 -12
- 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 +1 -1
- package/dist/resources/extensions/gsd/file-lock.js +60 -0
- 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 +17 -20
- package/dist/resources/extensions/gsd/init-wizard.js +3 -11
- 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 +33 -13
- 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 +241 -332
- 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 +38 -1
- package/dist/resources/extensions/gsd/workflow-events.js +25 -13
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +56 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -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 +17 -17
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- 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 +17 -17
- 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-react-loadable-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/2826.dd3dc8bbd3025fa5.js +9 -0
- 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/.next/static/chunks/{webpack-6e4d7e9a4f57bed4.js → webpack-b868033a5834586d.js} +1 -1
- 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/env-writer.d.ts +39 -0
- package/packages/mcp-server/dist/env-writer.d.ts.map +1 -0
- package/packages/mcp-server/dist/env-writer.js +158 -0
- package/packages/mcp-server/dist/env-writer.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +23 -3
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +192 -44
- 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/env-writer.test.ts +280 -0
- package/packages/mcp-server/src/env-writer.ts +183 -0
- package/packages/mcp-server/src/secure-env-collect.test.ts +265 -0
- package/packages/mcp-server/src/server.ts +247 -41
- 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/chat-controller-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +388 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.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/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/dynamic-border.d.ts +19 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +50 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
- 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 +175 -25
- 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-state.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +6 -0
- 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 +62 -5
- 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/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.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/chat-controller-ordering.test.ts +468 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -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/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/dynamic-border.ts +58 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +2 -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 +205 -31
- package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +70 -5
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.js +9 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +66 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -0
- package/packages/pi-tui/dist/components/input.d.ts +2 -0
- package/packages/pi-tui/dist/components/input.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/input.js +7 -4
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/markdown.d.ts +3 -0
- package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/markdown.js +17 -1
- package/packages/pi-tui/dist/components/markdown.js.map +1 -1
- package/packages/pi-tui/src/components/__tests__/input.test.ts +11 -0
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +75 -0
- package/packages/pi-tui/src/components/input.ts +7 -4
- package/packages/pi-tui/src/components/markdown.ts +22 -1
- 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 +288 -39
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +330 -2
- package/src/resources/extensions/get-secrets-from-user.ts +24 -1
- 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 +44 -20
- 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 +6 -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/custom-workflow-engine.ts +19 -14
- 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 +1 -1
- package/src/resources/extensions/gsd/file-lock.ts +59 -0
- 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 +17 -19
- package/src/resources/extensions/gsd/init-wizard.ts +3 -13
- 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 +33 -13
- 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 +285 -344
- 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/derive-state-helpers.test.ts +436 -0
- package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +9 -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/file-lock.test.ts +103 -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 +7 -0
- package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +45 -0
- 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/tests/workflow-mcp-auto-prep.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +155 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +22 -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 +64 -26
- package/src/resources/extensions/gsd/types.ts +26 -0
- package/src/resources/extensions/gsd/workflow-events.ts +34 -25
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +76 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -1
- 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/2826.821e01b07d92e948.js +0 -9
- 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/{9pw9EXtXjdM7EFrCXUEPf → OI4n_CKC-lM8IQbvGJ_tK}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{9pw9EXtXjdM7EFrCXUEPf → OI4n_CKC-lM8IQbvGJ_tK}/_ssgManifest.js +0 -0
|
@@ -21,7 +21,10 @@ import {
|
|
|
21
21
|
getMilestone,
|
|
22
22
|
updateSliceStatus,
|
|
23
23
|
setSliceSummaryMd,
|
|
24
|
+
saveGateResult,
|
|
25
|
+
getPendingGatesForTurn,
|
|
24
26
|
} from "../gsd-db.js";
|
|
27
|
+
import { getGatesForTurn } from "../gate-registry.js";
|
|
25
28
|
import { resolveSliceFile, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
26
29
|
import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
|
|
27
30
|
import { saveFile, clearParseCache } from "../files.js";
|
|
@@ -39,6 +42,23 @@ export interface CompleteSliceResult {
|
|
|
39
42
|
uatPath: string;
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Map a complete-slice-owned gate id to the CompleteSliceParams field
|
|
47
|
+
* whose presence drives `pass` vs. `omitted`. Keep this in lockstep with
|
|
48
|
+
* the gates declared in gate-registry.ts under ownerTurn "complete-slice".
|
|
49
|
+
*/
|
|
50
|
+
function sliceGateFieldForId(
|
|
51
|
+
id: string,
|
|
52
|
+
params: CompleteSliceParams,
|
|
53
|
+
): string | undefined {
|
|
54
|
+
switch (id) {
|
|
55
|
+
case "Q8":
|
|
56
|
+
return params.operationalReadiness;
|
|
57
|
+
default:
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
42
62
|
/**
|
|
43
63
|
* Render slice summary markdown matching the template format.
|
|
44
64
|
* YAML frontmatter uses snake_case keys for parseSummary() compatibility.
|
|
@@ -169,6 +189,10 @@ ${reqSurfaced}
|
|
|
169
189
|
|
|
170
190
|
${reqInvalidated}
|
|
171
191
|
|
|
192
|
+
## Operational Readiness
|
|
193
|
+
|
|
194
|
+
${params.operationalReadiness?.trim() || "None."}
|
|
195
|
+
|
|
172
196
|
## Deviations
|
|
173
197
|
|
|
174
198
|
${params.deviations || "None."}
|
|
@@ -330,6 +354,45 @@ export async function handleCompleteSlice(
|
|
|
330
354
|
// Store rendered markdown in DB for D004 recovery
|
|
331
355
|
setSliceSummaryMd(params.milestoneId, params.sliceId, summaryMd, uatMd);
|
|
332
356
|
|
|
357
|
+
// ── Close gates owned by complete-slice (Q8) ───────────────────────────
|
|
358
|
+
// Each owned gate maps to a specific summary section via the registry.
|
|
359
|
+
// If the caller populated the corresponding field, record `pass`; if the
|
|
360
|
+
// field is empty, record `omitted`. Without this loop, Q8 would stay
|
|
361
|
+
// pending forever and block future state derivation (see gate-registry).
|
|
362
|
+
try {
|
|
363
|
+
const pendingGates = getPendingGatesForTurn(
|
|
364
|
+
params.milestoneId,
|
|
365
|
+
params.sliceId,
|
|
366
|
+
"complete-slice",
|
|
367
|
+
);
|
|
368
|
+
if (pendingGates.length > 0) {
|
|
369
|
+
const ownedDefs = new Map(getGatesForTurn("complete-slice").map((g) => [g.id, g] as const));
|
|
370
|
+
for (const row of pendingGates) {
|
|
371
|
+
const def = ownedDefs.get(row.gate_id);
|
|
372
|
+
if (!def) continue;
|
|
373
|
+
// Map gate id → param field it maps to. Keep the map local so
|
|
374
|
+
// adding a new complete-slice gate is a single place change.
|
|
375
|
+
const field = sliceGateFieldForId(def.id, params);
|
|
376
|
+
const hasContent = typeof field === "string" && field.trim().length > 0;
|
|
377
|
+
saveGateResult({
|
|
378
|
+
milestoneId: params.milestoneId,
|
|
379
|
+
sliceId: params.sliceId,
|
|
380
|
+
gateId: def.id,
|
|
381
|
+
verdict: hasContent ? "pass" : "omitted",
|
|
382
|
+
rationale: hasContent
|
|
383
|
+
? `${def.promptSection} section populated in slice summary`
|
|
384
|
+
: `${def.promptSection} section left empty — recorded as omitted`,
|
|
385
|
+
findings: hasContent ? (field as string).trim() : "",
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
} catch (gateErr) {
|
|
390
|
+
logWarning(
|
|
391
|
+
"tool",
|
|
392
|
+
`complete-slice gate close warning for ${params.milestoneId}/${params.sliceId}: ${(gateErr as Error).message}`,
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
|
|
333
396
|
// Invalidate all caches
|
|
334
397
|
invalidateStateCache();
|
|
335
398
|
clearPathCache();
|
|
@@ -24,7 +24,10 @@ import {
|
|
|
24
24
|
updateTaskStatus,
|
|
25
25
|
setTaskSummaryMd,
|
|
26
26
|
deleteVerificationEvidence,
|
|
27
|
+
saveGateResult,
|
|
28
|
+
getPendingGatesForTurn,
|
|
27
29
|
} from "../gsd-db.js";
|
|
30
|
+
import { getGatesForTurn } from "../gate-registry.js";
|
|
28
31
|
import { resolveSliceFile, resolveTasksDir, clearPathCache } from "../paths.js";
|
|
29
32
|
import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
30
33
|
import { saveFile, clearParseCache } from "../files.js";
|
|
@@ -44,6 +47,27 @@ export interface CompleteTaskResult {
|
|
|
44
47
|
|
|
45
48
|
import type { TaskRow } from "../gsd-db.js";
|
|
46
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
52
|
+
* presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
|
|
53
|
+
* declared in gate-registry.ts under ownerTurn "execute-task".
|
|
54
|
+
*/
|
|
55
|
+
function taskGateFieldForId(
|
|
56
|
+
id: string,
|
|
57
|
+
params: CompleteTaskParams,
|
|
58
|
+
): string | undefined {
|
|
59
|
+
switch (id) {
|
|
60
|
+
case "Q5":
|
|
61
|
+
return params.failureModes;
|
|
62
|
+
case "Q6":
|
|
63
|
+
return params.loadProfile;
|
|
64
|
+
case "Q7":
|
|
65
|
+
return params.negativeTests;
|
|
66
|
+
default:
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
47
71
|
/**
|
|
48
72
|
* Normalize a list parameter that may arrive as a string (newline-delimited
|
|
49
73
|
* bullet list from the LLM) into a string array (#3361).
|
|
@@ -236,6 +260,45 @@ export async function handleCompleteTask(
|
|
|
236
260
|
// Store rendered markdown in DB for D004 recovery
|
|
237
261
|
setTaskSummaryMd(params.milestoneId, params.sliceId, params.taskId, summaryMd);
|
|
238
262
|
|
|
263
|
+
// ── Close gates owned by execute-task (Q5/Q6/Q7) for this task ────────
|
|
264
|
+
// Each gate id maps to a specific params field via taskGateFieldForId.
|
|
265
|
+
// When the model populates the field, record `pass`; when it's empty,
|
|
266
|
+
// record `omitted`. Task-scoped rows are filtered by taskId so a single
|
|
267
|
+
// task's completion doesn't touch sibling tasks' gate rows.
|
|
268
|
+
try {
|
|
269
|
+
const pendingGates = getPendingGatesForTurn(
|
|
270
|
+
params.milestoneId,
|
|
271
|
+
params.sliceId,
|
|
272
|
+
"execute-task",
|
|
273
|
+
params.taskId,
|
|
274
|
+
);
|
|
275
|
+
if (pendingGates.length > 0) {
|
|
276
|
+
const ownedDefs = new Map(getGatesForTurn("execute-task").map((g) => [g.id, g] as const));
|
|
277
|
+
for (const row of pendingGates) {
|
|
278
|
+
const def = ownedDefs.get(row.gate_id);
|
|
279
|
+
if (!def) continue;
|
|
280
|
+
const field = taskGateFieldForId(def.id, params);
|
|
281
|
+
const hasContent = typeof field === "string" && field.trim().length > 0;
|
|
282
|
+
saveGateResult({
|
|
283
|
+
milestoneId: params.milestoneId,
|
|
284
|
+
sliceId: params.sliceId,
|
|
285
|
+
taskId: params.taskId,
|
|
286
|
+
gateId: def.id,
|
|
287
|
+
verdict: hasContent ? "pass" : "omitted",
|
|
288
|
+
rationale: hasContent
|
|
289
|
+
? `${def.promptSection} section populated in task summary`
|
|
290
|
+
: `${def.promptSection} section left empty — recorded as omitted`,
|
|
291
|
+
findings: hasContent ? (field as string).trim() : "",
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} catch (gateErr) {
|
|
296
|
+
logWarning(
|
|
297
|
+
"tool",
|
|
298
|
+
`complete-task gate close warning for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(gateErr as Error).message}`,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
239
302
|
// Invalidate all caches
|
|
240
303
|
invalidateStateCache();
|
|
241
304
|
clearPathCache();
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
_getAdapter,
|
|
9
9
|
saveGateResult,
|
|
10
10
|
} from "../gsd-db.js";
|
|
11
|
+
import { GATE_REGISTRY } from "../gate-registry.js";
|
|
11
12
|
import { saveArtifactToDb } from "../db-writer.js";
|
|
12
13
|
import type { CompleteMilestoneParams } from "./complete-milestone.js";
|
|
13
14
|
import { handleCompleteMilestone } from "./complete-milestone.js";
|
|
@@ -38,6 +39,7 @@ export function isSupportedSummaryArtifactType(
|
|
|
38
39
|
export interface ToolExecutionResult {
|
|
39
40
|
content: Array<{ type: "text"; text: string }>;
|
|
40
41
|
details: Record<string, unknown>;
|
|
42
|
+
isError?: boolean;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
export interface SummarySaveParams {
|
|
@@ -57,13 +59,15 @@ export async function executeSummarySave(
|
|
|
57
59
|
return {
|
|
58
60
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot save artifact." }],
|
|
59
61
|
details: { operation: "save_summary", error: "db_unavailable" },
|
|
60
|
-
|
|
62
|
+
isError: true,
|
|
63
|
+
};
|
|
61
64
|
}
|
|
62
65
|
if (!isSupportedSummaryArtifactType(params.artifact_type)) {
|
|
63
66
|
return {
|
|
64
67
|
content: [{ type: "text", text: `Error: Invalid artifact_type "${params.artifact_type}". Must be one of: ${SUPPORTED_SUMMARY_ARTIFACT_TYPES.join(", ")}` }],
|
|
65
68
|
details: { operation: "save_summary", error: "invalid_artifact_type" },
|
|
66
|
-
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
67
71
|
}
|
|
68
72
|
const contextGuard = shouldBlockContextArtifactSaveInSnapshot(
|
|
69
73
|
loadWriteGateSnapshot(basePath),
|
|
@@ -75,7 +79,8 @@ export async function executeSummarySave(
|
|
|
75
79
|
return {
|
|
76
80
|
content: [{ type: "text", text: `Error saving artifact: ${contextGuard.reason ?? "context write blocked"}` }],
|
|
77
81
|
details: { operation: "save_summary", error: "context_write_blocked" },
|
|
78
|
-
|
|
82
|
+
isError: true,
|
|
83
|
+
};
|
|
79
84
|
}
|
|
80
85
|
try {
|
|
81
86
|
let relativePath: string;
|
|
@@ -108,7 +113,8 @@ export async function executeSummarySave(
|
|
|
108
113
|
return {
|
|
109
114
|
content: [{ type: "text", text: `Error saving artifact: ${msg}` }],
|
|
110
115
|
details: { operation: "save_summary", error: msg },
|
|
111
|
-
|
|
116
|
+
isError: true,
|
|
117
|
+
};
|
|
112
118
|
}
|
|
113
119
|
}
|
|
114
120
|
|
|
@@ -163,7 +169,8 @@ export async function executeTaskComplete(
|
|
|
163
169
|
return {
|
|
164
170
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot complete task." }],
|
|
165
171
|
details: { operation: "complete_task", error: "db_unavailable" },
|
|
166
|
-
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
167
174
|
}
|
|
168
175
|
try {
|
|
169
176
|
const coerced = { ...params };
|
|
@@ -176,6 +183,7 @@ export async function executeTaskComplete(
|
|
|
176
183
|
return {
|
|
177
184
|
content: [{ type: "text", text: `Error completing task: ${result.error}` }],
|
|
178
185
|
details: { operation: "complete_task", error: result.error },
|
|
186
|
+
isError: true,
|
|
179
187
|
};
|
|
180
188
|
}
|
|
181
189
|
return {
|
|
@@ -194,7 +202,8 @@ export async function executeTaskComplete(
|
|
|
194
202
|
return {
|
|
195
203
|
content: [{ type: "text", text: `Error completing task: ${msg}` }],
|
|
196
204
|
details: { operation: "complete_task", error: msg },
|
|
197
|
-
|
|
205
|
+
isError: true,
|
|
206
|
+
};
|
|
198
207
|
}
|
|
199
208
|
}
|
|
200
209
|
|
|
@@ -207,7 +216,8 @@ export async function executeSliceComplete(
|
|
|
207
216
|
return {
|
|
208
217
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot complete slice." }],
|
|
209
218
|
details: { operation: "complete_slice", error: "db_unavailable" },
|
|
210
|
-
|
|
219
|
+
isError: true,
|
|
220
|
+
};
|
|
211
221
|
}
|
|
212
222
|
try {
|
|
213
223
|
const splitPair = (s: string): [string, string] => {
|
|
@@ -257,6 +267,7 @@ export async function executeSliceComplete(
|
|
|
257
267
|
return {
|
|
258
268
|
content: [{ type: "text", text: `Error completing slice: ${result.error}` }],
|
|
259
269
|
details: { operation: "complete_slice", error: result.error },
|
|
270
|
+
isError: true,
|
|
260
271
|
};
|
|
261
272
|
}
|
|
262
273
|
return {
|
|
@@ -275,7 +286,8 @@ export async function executeSliceComplete(
|
|
|
275
286
|
return {
|
|
276
287
|
content: [{ type: "text", text: `Error completing slice: ${msg}` }],
|
|
277
288
|
details: { operation: "complete_slice", error: msg },
|
|
278
|
-
|
|
289
|
+
isError: true,
|
|
290
|
+
};
|
|
279
291
|
}
|
|
280
292
|
}
|
|
281
293
|
|
|
@@ -288,7 +300,8 @@ export async function executeCompleteMilestone(
|
|
|
288
300
|
return {
|
|
289
301
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot complete milestone." }],
|
|
290
302
|
details: { operation: "complete_milestone", error: "db_unavailable" },
|
|
291
|
-
|
|
303
|
+
isError: true,
|
|
304
|
+
};
|
|
292
305
|
}
|
|
293
306
|
try {
|
|
294
307
|
const sanitized = sanitizeCompleteMilestoneParams(params);
|
|
@@ -297,6 +310,7 @@ export async function executeCompleteMilestone(
|
|
|
297
310
|
return {
|
|
298
311
|
content: [{ type: "text", text: `Error completing milestone: ${result.error}` }],
|
|
299
312
|
details: { operation: "complete_milestone", error: result.error },
|
|
313
|
+
isError: true,
|
|
300
314
|
};
|
|
301
315
|
}
|
|
302
316
|
return {
|
|
@@ -313,7 +327,8 @@ export async function executeCompleteMilestone(
|
|
|
313
327
|
return {
|
|
314
328
|
content: [{ type: "text", text: `Error completing milestone: ${msg}` }],
|
|
315
329
|
details: { operation: "complete_milestone", error: msg },
|
|
316
|
-
|
|
330
|
+
isError: true,
|
|
331
|
+
};
|
|
317
332
|
}
|
|
318
333
|
}
|
|
319
334
|
|
|
@@ -326,7 +341,8 @@ export async function executeValidateMilestone(
|
|
|
326
341
|
return {
|
|
327
342
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot validate milestone." }],
|
|
328
343
|
details: { operation: "validate_milestone", error: "db_unavailable" },
|
|
329
|
-
|
|
344
|
+
isError: true,
|
|
345
|
+
};
|
|
330
346
|
}
|
|
331
347
|
try {
|
|
332
348
|
const result = await handleValidateMilestone(params, basePath);
|
|
@@ -334,6 +350,7 @@ export async function executeValidateMilestone(
|
|
|
334
350
|
return {
|
|
335
351
|
content: [{ type: "text", text: `Error validating milestone: ${result.error}` }],
|
|
336
352
|
details: { operation: "validate_milestone", error: result.error },
|
|
353
|
+
isError: true,
|
|
337
354
|
};
|
|
338
355
|
}
|
|
339
356
|
return {
|
|
@@ -351,7 +368,8 @@ export async function executeValidateMilestone(
|
|
|
351
368
|
return {
|
|
352
369
|
content: [{ type: "text", text: `Error validating milestone: ${msg}` }],
|
|
353
370
|
details: { operation: "validate_milestone", error: msg },
|
|
354
|
-
|
|
371
|
+
isError: true,
|
|
372
|
+
};
|
|
355
373
|
}
|
|
356
374
|
}
|
|
357
375
|
|
|
@@ -364,7 +382,8 @@ export async function executeReassessRoadmap(
|
|
|
364
382
|
return {
|
|
365
383
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot reassess roadmap." }],
|
|
366
384
|
details: { operation: "reassess_roadmap", error: "db_unavailable" },
|
|
367
|
-
|
|
385
|
+
isError: true,
|
|
386
|
+
};
|
|
368
387
|
}
|
|
369
388
|
try {
|
|
370
389
|
const result = await handleReassessRoadmap(params, basePath);
|
|
@@ -372,6 +391,7 @@ export async function executeReassessRoadmap(
|
|
|
372
391
|
return {
|
|
373
392
|
content: [{ type: "text", text: `Error reassessing roadmap: ${result.error}` }],
|
|
374
393
|
details: { operation: "reassess_roadmap", error: result.error },
|
|
394
|
+
isError: true,
|
|
375
395
|
};
|
|
376
396
|
}
|
|
377
397
|
return {
|
|
@@ -390,7 +410,8 @@ export async function executeReassessRoadmap(
|
|
|
390
410
|
return {
|
|
391
411
|
content: [{ type: "text", text: `Error reassessing roadmap: ${msg}` }],
|
|
392
412
|
details: { operation: "reassess_roadmap", error: msg },
|
|
393
|
-
|
|
413
|
+
isError: true,
|
|
414
|
+
};
|
|
394
415
|
}
|
|
395
416
|
}
|
|
396
417
|
|
|
@@ -403,15 +424,19 @@ export async function executeSaveGateResult(
|
|
|
403
424
|
return {
|
|
404
425
|
content: [{ type: "text", text: "Error: GSD database is not available." }],
|
|
405
426
|
details: { operation: "save_gate_result", error: "db_unavailable" },
|
|
406
|
-
|
|
427
|
+
isError: true,
|
|
428
|
+
};
|
|
407
429
|
}
|
|
408
430
|
|
|
409
|
-
|
|
431
|
+
// Source of truth: gate-registry.ts. Every declared GateId is accepted,
|
|
432
|
+
// so adding a new gate in one place automatically flows through here.
|
|
433
|
+
const validGates = Object.keys(GATE_REGISTRY);
|
|
410
434
|
if (!validGates.includes(params.gateId)) {
|
|
411
435
|
return {
|
|
412
436
|
content: [{ type: "text", text: `Error: Invalid gateId "${params.gateId}". Must be one of: ${validGates.join(", ")}` }],
|
|
413
437
|
details: { operation: "save_gate_result", error: "invalid_gate_id" },
|
|
414
|
-
|
|
438
|
+
isError: true,
|
|
439
|
+
};
|
|
415
440
|
}
|
|
416
441
|
|
|
417
442
|
const validVerdicts = ["pass", "flag", "omitted"];
|
|
@@ -419,7 +444,8 @@ export async function executeSaveGateResult(
|
|
|
419
444
|
return {
|
|
420
445
|
content: [{ type: "text", text: `Error: Invalid verdict "${params.verdict}". Must be one of: ${validVerdicts.join(", ")}` }],
|
|
421
446
|
details: { operation: "save_gate_result", error: "invalid_verdict" },
|
|
422
|
-
|
|
447
|
+
isError: true,
|
|
448
|
+
};
|
|
423
449
|
}
|
|
424
450
|
|
|
425
451
|
try {
|
|
@@ -443,7 +469,8 @@ export async function executeSaveGateResult(
|
|
|
443
469
|
return {
|
|
444
470
|
content: [{ type: "text", text: `Error saving gate result: ${msg}` }],
|
|
445
471
|
details: { operation: "save_gate_result", error: msg },
|
|
446
|
-
|
|
472
|
+
isError: true,
|
|
473
|
+
};
|
|
447
474
|
}
|
|
448
475
|
}
|
|
449
476
|
|
|
@@ -456,7 +483,8 @@ export async function executePlanMilestone(
|
|
|
456
483
|
return {
|
|
457
484
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot plan milestone." }],
|
|
458
485
|
details: { operation: "plan_milestone", error: "db_unavailable" },
|
|
459
|
-
|
|
486
|
+
isError: true,
|
|
487
|
+
};
|
|
460
488
|
}
|
|
461
489
|
try {
|
|
462
490
|
const result = await handlePlanMilestone(params, basePath);
|
|
@@ -464,6 +492,7 @@ export async function executePlanMilestone(
|
|
|
464
492
|
return {
|
|
465
493
|
content: [{ type: "text", text: `Error planning milestone: ${result.error}` }],
|
|
466
494
|
details: { operation: "plan_milestone", error: result.error },
|
|
495
|
+
isError: true,
|
|
467
496
|
};
|
|
468
497
|
}
|
|
469
498
|
return {
|
|
@@ -480,7 +509,8 @@ export async function executePlanMilestone(
|
|
|
480
509
|
return {
|
|
481
510
|
content: [{ type: "text", text: `Error planning milestone: ${msg}` }],
|
|
482
511
|
details: { operation: "plan_milestone", error: msg },
|
|
483
|
-
|
|
512
|
+
isError: true,
|
|
513
|
+
};
|
|
484
514
|
}
|
|
485
515
|
}
|
|
486
516
|
|
|
@@ -493,7 +523,8 @@ export async function executePlanSlice(
|
|
|
493
523
|
return {
|
|
494
524
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot plan slice." }],
|
|
495
525
|
details: { operation: "plan_slice", error: "db_unavailable" },
|
|
496
|
-
|
|
526
|
+
isError: true,
|
|
527
|
+
};
|
|
497
528
|
}
|
|
498
529
|
try {
|
|
499
530
|
const result = await handlePlanSlice(params, basePath);
|
|
@@ -501,6 +532,7 @@ export async function executePlanSlice(
|
|
|
501
532
|
return {
|
|
502
533
|
content: [{ type: "text", text: `Error planning slice: ${result.error}` }],
|
|
503
534
|
details: { operation: "plan_slice", error: result.error },
|
|
535
|
+
isError: true,
|
|
504
536
|
};
|
|
505
537
|
}
|
|
506
538
|
return {
|
|
@@ -519,7 +551,8 @@ export async function executePlanSlice(
|
|
|
519
551
|
return {
|
|
520
552
|
content: [{ type: "text", text: `Error planning slice: ${msg}` }],
|
|
521
553
|
details: { operation: "plan_slice", error: msg },
|
|
522
|
-
|
|
554
|
+
isError: true,
|
|
555
|
+
};
|
|
523
556
|
}
|
|
524
557
|
}
|
|
525
558
|
|
|
@@ -532,7 +565,8 @@ export async function executeReplanSlice(
|
|
|
532
565
|
return {
|
|
533
566
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot replan slice." }],
|
|
534
567
|
details: { operation: "replan_slice", error: "db_unavailable" },
|
|
535
|
-
|
|
568
|
+
isError: true,
|
|
569
|
+
};
|
|
536
570
|
}
|
|
537
571
|
try {
|
|
538
572
|
const result = await handleReplanSlice(params, basePath);
|
|
@@ -540,6 +574,7 @@ export async function executeReplanSlice(
|
|
|
540
574
|
return {
|
|
541
575
|
content: [{ type: "text", text: `Error replanning slice: ${result.error}` }],
|
|
542
576
|
details: { operation: "replan_slice", error: result.error },
|
|
577
|
+
isError: true,
|
|
543
578
|
};
|
|
544
579
|
}
|
|
545
580
|
return {
|
|
@@ -558,7 +593,8 @@ export async function executeReplanSlice(
|
|
|
558
593
|
return {
|
|
559
594
|
content: [{ type: "text", text: `Error replanning slice: ${msg}` }],
|
|
560
595
|
details: { operation: "replan_slice", error: msg },
|
|
561
|
-
|
|
596
|
+
isError: true,
|
|
597
|
+
};
|
|
562
598
|
}
|
|
563
599
|
}
|
|
564
600
|
|
|
@@ -576,6 +612,7 @@ export async function executeMilestoneStatus(
|
|
|
576
612
|
return {
|
|
577
613
|
content: [{ type: "text", text: "Error: GSD database is not available." }],
|
|
578
614
|
details: { operation: "milestone_status", error: "db_unavailable" },
|
|
615
|
+
isError: true,
|
|
579
616
|
};
|
|
580
617
|
}
|
|
581
618
|
|
|
@@ -624,6 +661,7 @@ export async function executeMilestoneStatus(
|
|
|
624
661
|
return {
|
|
625
662
|
content: [{ type: "text", text: `Error querying milestone status: ${msg}` }],
|
|
626
663
|
details: { operation: "milestone_status", error: msg },
|
|
627
|
-
|
|
664
|
+
isError: true,
|
|
665
|
+
};
|
|
628
666
|
}
|
|
629
667
|
}
|
|
@@ -536,6 +536,24 @@ export interface CompleteTaskParams {
|
|
|
536
536
|
verdict: string;
|
|
537
537
|
durationMs: number;
|
|
538
538
|
}>;
|
|
539
|
+
/**
|
|
540
|
+
* Q5 failure-modes section content (what breaks when dependencies fail).
|
|
541
|
+
* Populated → `pass`; omitted/empty → `omitted`.
|
|
542
|
+
* @optional
|
|
543
|
+
*/
|
|
544
|
+
failureModes?: string;
|
|
545
|
+
/**
|
|
546
|
+
* Q6 load-profile section content (10x breakpoint + protection).
|
|
547
|
+
* Populated → `pass`; omitted/empty → `omitted`.
|
|
548
|
+
* @optional
|
|
549
|
+
*/
|
|
550
|
+
loadProfile?: string;
|
|
551
|
+
/**
|
|
552
|
+
* Q7 negative-tests section content (malformed inputs, error paths,
|
|
553
|
+
* boundaries). Populated → `pass`; omitted/empty → `omitted`.
|
|
554
|
+
* @optional
|
|
555
|
+
*/
|
|
556
|
+
negativeTests?: string;
|
|
539
557
|
/** Optional caller-provided identity for audit trail */
|
|
540
558
|
actorName?: string;
|
|
541
559
|
/** Optional caller-provided reason this action was triggered */
|
|
@@ -584,6 +602,14 @@ export interface CompleteSliceParams {
|
|
|
584
602
|
affects?: string[];
|
|
585
603
|
/** @optional — defaults to [] when omitted */
|
|
586
604
|
drillDownPaths?: string[];
|
|
605
|
+
/**
|
|
606
|
+
* Q8 operational readiness section content (health signal, failure signal,
|
|
607
|
+
* recovery, monitoring gaps). When populated, the complete-slice handler
|
|
608
|
+
* records Q8 as `pass`; when omitted or empty, Q8 is recorded as `omitted`.
|
|
609
|
+
* See gate-registry.ts.
|
|
610
|
+
* @optional
|
|
611
|
+
*/
|
|
612
|
+
operationalReadiness?: string;
|
|
587
613
|
/** Optional caller-provided identity for audit trail */
|
|
588
614
|
actorName?: string;
|
|
589
615
|
/** Optional caller-provided reason this action was triggered */
|
|
@@ -2,6 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
5
|
+
import { withFileLockSync } from "./file-lock.js";
|
|
5
6
|
import { logWarning } from "./workflow-logger.js";
|
|
6
7
|
|
|
7
8
|
// ─── Session ID ───────────────────────────────────────────────────────────
|
|
@@ -127,31 +128,39 @@ export function compactMilestoneEvents(
|
|
|
127
128
|
const logPath = join(basePath, ".gsd", "event-log.jsonl");
|
|
128
129
|
const archivePath = join(basePath, ".gsd", `event-log-${milestoneId}.jsonl.archived`);
|
|
129
130
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
131
|
+
return withFileLockSync(logPath, () => {
|
|
132
|
+
const allEvents = readEvents(logPath);
|
|
133
|
+
|
|
134
|
+
// Single-pass partition to halve the work (per reviewer agent)
|
|
135
|
+
const toArchive: WorkflowEvent[] = [];
|
|
136
|
+
const remaining: WorkflowEvent[] = [];
|
|
137
|
+
|
|
138
|
+
for (const e of allEvents) {
|
|
139
|
+
if ((e.params as { milestoneId?: string }).milestoneId === milestoneId) {
|
|
140
|
+
toArchive.push(e);
|
|
141
|
+
} else {
|
|
142
|
+
remaining.push(e);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
137
145
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
146
|
+
if (toArchive.length === 0) {
|
|
147
|
+
return { archived: 0 };
|
|
148
|
+
}
|
|
141
149
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
150
|
+
// Write archived events to .jsonl.archived file (crash-safe)
|
|
151
|
+
atomicWriteSync(
|
|
152
|
+
archivePath,
|
|
153
|
+
toArchive.map((e) => JSON.stringify(e)).join("\n") + "\n",
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Truncate active log to remaining events only
|
|
157
|
+
atomicWriteSync(
|
|
158
|
+
logPath,
|
|
159
|
+
remaining.length > 0
|
|
160
|
+
? remaining.map((e) => JSON.stringify(e)).join("\n") + "\n"
|
|
161
|
+
: "",
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
return { archived: toArchive.length };
|
|
165
|
+
});
|
|
157
166
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
type EnsureProjectWorkflowMcpConfigResult,
|
|
5
|
+
ensureProjectWorkflowMcpConfig,
|
|
6
|
+
} from "./mcp-project-config.js";
|
|
7
|
+
import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
|
|
8
|
+
|
|
9
|
+
interface WorkflowMcpAutoPrepContext {
|
|
10
|
+
model?: { provider?: string; baseUrl?: string };
|
|
11
|
+
modelRegistry?: {
|
|
12
|
+
getProviderAuthMode?: (provider: string) => string;
|
|
13
|
+
isProviderRequestReady?: (provider: string) => boolean;
|
|
14
|
+
};
|
|
15
|
+
ui?: Pick<ExtensionContext["ui"], "notify">;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getAuthModeSafe(
|
|
19
|
+
ctx: WorkflowMcpAutoPrepContext,
|
|
20
|
+
provider: string | undefined,
|
|
21
|
+
): string | undefined {
|
|
22
|
+
if (!provider) return undefined;
|
|
23
|
+
const getAuthMode = ctx.modelRegistry?.getProviderAuthMode;
|
|
24
|
+
if (typeof getAuthMode !== "function") return undefined;
|
|
25
|
+
try {
|
|
26
|
+
return getAuthMode(provider);
|
|
27
|
+
} catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function hasClaudeCodeProvider(ctx: WorkflowMcpAutoPrepContext): boolean {
|
|
33
|
+
return getAuthModeSafe(ctx, "claude-code") === "externalCli";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isClaudeCodeProviderReady(ctx: WorkflowMcpAutoPrepContext): boolean {
|
|
37
|
+
const readyCheck = ctx.modelRegistry?.isProviderRequestReady;
|
|
38
|
+
if (typeof readyCheck !== "function") return false;
|
|
39
|
+
try {
|
|
40
|
+
return readyCheck("claude-code");
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function shouldAutoPrepareWorkflowMcp(ctx: WorkflowMcpAutoPrepContext): boolean {
|
|
47
|
+
const provider = ctx.model?.provider;
|
|
48
|
+
const baseUrl = ctx.model?.baseUrl;
|
|
49
|
+
const authMode = getAuthModeSafe(ctx, provider);
|
|
50
|
+
|
|
51
|
+
if (usesWorkflowMcpTransport(authMode as any, baseUrl)) return true;
|
|
52
|
+
if (provider === "claude-code") return true;
|
|
53
|
+
if (hasClaudeCodeProvider(ctx)) return true;
|
|
54
|
+
return isClaudeCodeProviderReady(ctx);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function prepareWorkflowMcpForProject(
|
|
58
|
+
ctx: WorkflowMcpAutoPrepContext,
|
|
59
|
+
projectRoot: string,
|
|
60
|
+
): EnsureProjectWorkflowMcpConfigResult | null {
|
|
61
|
+
if (!shouldAutoPrepareWorkflowMcp(ctx)) return null;
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const result = ensureProjectWorkflowMcpConfig(projectRoot);
|
|
65
|
+
if (result.status !== "unchanged") {
|
|
66
|
+
ctx.ui?.notify?.(`Claude Code MCP prepared at ${result.configPath}`, "info");
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
} catch (err) {
|
|
70
|
+
ctx.ui?.notify?.(
|
|
71
|
+
`Claude Code MCP prep failed: ${err instanceof Error ? err.message : String(err)}. Detected Claude Code model but no workflow MCP. Please run /gsd mcp init . from your project root.`,
|
|
72
|
+
"warning",
|
|
73
|
+
);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|