@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.75048e7
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/dist/cli.js +3 -2
- package/dist/help-text.js +10 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
- package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
- package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/dist/resources/extensions/browser-tools/index.js +57 -9
- package/dist/resources/extensions/browser-tools/package.json +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
- package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
- package/dist/resources/extensions/gsd/auto/phases.js +4 -3
- package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
- package/dist/resources/extensions/gsd/auto-dispatch.js +55 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +72 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +7 -8
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +94 -15
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +18 -65
- package/dist/resources/extensions/gsd/auto-worktree.js +18 -5
- package/dist/resources/extensions/gsd/auto.js +31 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -4
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +56 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +33 -38
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +61 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
- package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
- package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
- package/dist/resources/extensions/gsd/config-overlay.js +2 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
- package/dist/resources/extensions/gsd/error-classifier.js +2 -1
- package/dist/resources/extensions/gsd/escalation.js +4 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
- package/dist/resources/extensions/gsd/forensics.js +74 -2
- package/dist/resources/extensions/gsd/gsd-db.js +42 -6
- package/dist/resources/extensions/gsd/guided-flow.js +119 -176
- package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
- package/dist/resources/extensions/gsd/memory-store.js +4 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
- package/dist/resources/extensions/gsd/milestone-closeout.js +3 -1
- package/dist/resources/extensions/gsd/pending-auto-start.js +0 -1
- package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/dist/resources/extensions/gsd/prompts/system.md +3 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/dist/resources/extensions/gsd/recovery-classification.js +20 -0
- package/dist/resources/extensions/gsd/rule-registry.js +428 -52
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
- package/dist/resources/extensions/gsd/skill-activation.js +20 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
- package/dist/resources/extensions/gsd/state.js +17 -14
- package/dist/resources/extensions/gsd/templates/plan.md +3 -1
- package/dist/resources/extensions/gsd/tool-contract.js +5 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +143 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +483 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +169 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
- package/dist/resources/extensions/gsd/verification-gate.js +72 -1
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
- package/dist/resources/extensions/gsd/workflow-mcp.js +5 -73
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
- package/dist/resources/extensions/mcp-client/manager.js +31 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
- package/dist/rtk.d.ts +7 -1
- package/dist/rtk.js +27 -11
- package/dist/update-check.d.ts +15 -1
- package/dist/update-check.js +87 -12
- package/dist/update-cmd.d.ts +1 -0
- package/dist/update-cmd.js +53 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +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/package.json +5 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +32 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/index.d.ts +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +1 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
- package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
- package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
- package/packages/gsd-agent-core/package.json +6 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
- package/packages/mcp-server/dist/remote-questions.js +23 -9
- package/packages/mcp-server/dist/remote-questions.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +84 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +42 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js +3 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +6 -1
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/api-registry.d.ts +2 -0
- package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
- package/packages/pi-ai/dist/api-registry.js +23 -0
- package/packages/pi-ai/dist/api-registry.js.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +15 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +411 -39
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +504 -153
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/stream.js +6 -6
- package/packages/pi-ai/dist/stream.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +2 -2
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js +6 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/terminal.d.ts +1 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +8 -4
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
- package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/src/resources/extensions/browser-tools/index.ts +60 -9
- package/src/resources/extensions/browser-tools/package.json +5 -1
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
- package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +5 -3
- package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
- package/src/resources/extensions/gsd/auto-dispatch.ts +67 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +106 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -7
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
- package/src/resources/extensions/gsd/auto-start.ts +112 -17
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -73
- package/src/resources/extensions/gsd/auto-worktree.ts +23 -5
- package/src/resources/extensions/gsd/auto.ts +47 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +96 -4
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +81 -25
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +70 -63
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +137 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
- package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
- package/src/resources/extensions/gsd/config-overlay.ts +3 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
- package/src/resources/extensions/gsd/error-classifier.ts +2 -1
- package/src/resources/extensions/gsd/escalation.ts +4 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
- package/src/resources/extensions/gsd/forensics.ts +99 -5
- package/src/resources/extensions/gsd/gsd-db.ts +46 -8
- package/src/resources/extensions/gsd/guided-flow.ts +215 -217
- package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
- package/src/resources/extensions/gsd/memory-store.ts +4 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +3 -1
- package/src/resources/extensions/gsd/pending-auto-start.ts +0 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/src/resources/extensions/gsd/prompts/system.md +3 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/src/resources/extensions/gsd/recovery-classification.ts +20 -0
- package/src/resources/extensions/gsd/rule-registry.ts +558 -58
- package/src/resources/extensions/gsd/rule-types.ts +2 -0
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
- package/src/resources/extensions/gsd/skill-activation.ts +20 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
- package/src/resources/extensions/gsd/state.ts +18 -14
- package/src/resources/extensions/gsd/templates/plan.md +3 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +9 -15
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +26 -16
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +31 -79
- package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +40 -4
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +72 -10
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +83 -1
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +493 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
- package/src/resources/extensions/gsd/tool-contract.ts +6 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +589 -8
- package/src/resources/extensions/gsd/types.ts +69 -5
- package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +186 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
- package/src/resources/extensions/gsd/verification-gate.ts +87 -1
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
- package/src/resources/extensions/gsd/workflow-mcp.ts +5 -73
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
- package/src/resources/extensions/mcp-client/manager.ts +33 -1
- package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +0 -246
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +0 -218
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_ssgManifest.js +0 -0
|
@@ -83,6 +83,10 @@ const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
|
|
|
83
83
|
const TOOLS_ALL = { mode: "all" };
|
|
84
84
|
const TOOLS_PLANNING = { mode: "planning" };
|
|
85
85
|
const TOOLS_VERIFICATION = { mode: "verification" };
|
|
86
|
+
const TOOLS_VERIFICATION_DISPATCH_UAT = {
|
|
87
|
+
mode: "verification",
|
|
88
|
+
allowedSubagents: ["mnemo", "scout", "reviewer", "tester"],
|
|
89
|
+
};
|
|
86
90
|
// Like TOOLS_PLANNING but permits dispatch to read-only recon/planning
|
|
87
91
|
// specialists. Runtime-enforced by write-gate.ts before the subagent tool runs.
|
|
88
92
|
const TOOLS_PLANNING_DISPATCH_RECON = {
|
|
@@ -372,7 +376,7 @@ export const UNIT_MANIFESTS = {
|
|
|
372
376
|
codebaseMap: false,
|
|
373
377
|
preferences: "active-only",
|
|
374
378
|
contextMode: "verification",
|
|
375
|
-
tools:
|
|
379
|
+
tools: TOOLS_VERIFICATION_DISPATCH_UAT,
|
|
376
380
|
artifacts: {
|
|
377
381
|
inline: ["slice-uat"],
|
|
378
382
|
excerpt: ["slice-summary"],
|
|
@@ -551,9 +555,10 @@ export function compileSubagentPermissionContract(policy) {
|
|
|
551
555
|
if (policy.mode === "all") {
|
|
552
556
|
return { allowed: true, allowedSubagents: ["*"], toolsMode: policy.mode };
|
|
553
557
|
}
|
|
554
|
-
if (policy.mode === "planning-dispatch")
|
|
558
|
+
if ((policy.mode === "planning-dispatch" || policy.mode === "verification") &&
|
|
559
|
+
Array.isArray(policy.allowedSubagents)) {
|
|
555
560
|
return {
|
|
556
|
-
allowed:
|
|
561
|
+
allowed: policy.allowedSubagents.length > 0,
|
|
557
562
|
allowedSubagents: [...policy.allowedSubagents],
|
|
558
563
|
toolsMode: policy.mode,
|
|
559
564
|
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Central Unit-to-tool contracts for phase-aware GSD tool surfaces.
|
|
3
|
+
export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
|
|
4
|
+
"gsd_uat_exec",
|
|
5
|
+
"gsd_uat_result_save",
|
|
6
|
+
"gsd_resume",
|
|
7
|
+
"gsd_milestone_status",
|
|
8
|
+
"gsd_journal_query",
|
|
9
|
+
];
|
|
10
|
+
export const RUN_UAT_READ_ONLY_TOOL_NAMES = [
|
|
11
|
+
"find",
|
|
12
|
+
"glob",
|
|
13
|
+
"grep",
|
|
14
|
+
"ls",
|
|
15
|
+
"read",
|
|
16
|
+
];
|
|
17
|
+
export const RUN_UAT_BROWSER_TOOL_NAMES = [
|
|
18
|
+
"browser_navigate",
|
|
19
|
+
"browser_click",
|
|
20
|
+
"browser_type",
|
|
21
|
+
"browser_fill_form",
|
|
22
|
+
"browser_click_ref",
|
|
23
|
+
"browser_fill_ref",
|
|
24
|
+
"browser_wait_for",
|
|
25
|
+
"browser_assert",
|
|
26
|
+
"browser_verify",
|
|
27
|
+
"browser_screenshot",
|
|
28
|
+
"browser_snapshot_refs",
|
|
29
|
+
"browser_find",
|
|
30
|
+
"browser_get_console_logs",
|
|
31
|
+
"browser_get_network_logs",
|
|
32
|
+
"browser_evaluate",
|
|
33
|
+
"browser_reload",
|
|
34
|
+
"browser_batch",
|
|
35
|
+
"browser_act",
|
|
36
|
+
];
|
|
37
|
+
export const RUN_UAT_TOOL_PRESENTATION_PLAN_ID = "run-uat/default-v1";
|
|
38
|
+
export const UNIT_TOOL_CONTRACTS = {
|
|
39
|
+
"research-milestone": {
|
|
40
|
+
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
|
|
41
|
+
requiredWorkflowTools: ["gsd_summary_save"],
|
|
42
|
+
},
|
|
43
|
+
"plan-milestone": {
|
|
44
|
+
allowedGsdTools: ["gsd_plan_milestone", "gsd_decision_save", "gsd_requirement_update"],
|
|
45
|
+
requiredWorkflowTools: ["gsd_plan_milestone"],
|
|
46
|
+
},
|
|
47
|
+
"discuss-milestone": {
|
|
48
|
+
allowedGsdTools: [
|
|
49
|
+
"gsd_summary_save",
|
|
50
|
+
"gsd_decision_save",
|
|
51
|
+
"gsd_requirement_save",
|
|
52
|
+
"gsd_requirement_update",
|
|
53
|
+
"gsd_plan_milestone",
|
|
54
|
+
"gsd_milestone_generate_id",
|
|
55
|
+
],
|
|
56
|
+
requiredWorkflowTools: [
|
|
57
|
+
"gsd_summary_save",
|
|
58
|
+
"gsd_requirement_save",
|
|
59
|
+
"gsd_requirement_update",
|
|
60
|
+
"gsd_plan_milestone",
|
|
61
|
+
"gsd_milestone_generate_id",
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
"discuss-slice": {
|
|
65
|
+
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
|
|
66
|
+
requiredWorkflowTools: ["gsd_summary_save"],
|
|
67
|
+
},
|
|
68
|
+
"validate-milestone": {
|
|
69
|
+
allowedGsdTools: ["gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
|
|
70
|
+
requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
|
|
71
|
+
},
|
|
72
|
+
"complete-milestone": {
|
|
73
|
+
allowedGsdTools: ["gsd_complete_milestone", "subagent"],
|
|
74
|
+
requiredWorkflowTools: ["gsd_milestone_status", "gsd_complete_milestone"],
|
|
75
|
+
},
|
|
76
|
+
"research-slice": {
|
|
77
|
+
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
|
|
78
|
+
requiredWorkflowTools: ["gsd_summary_save"],
|
|
79
|
+
},
|
|
80
|
+
"plan-slice": {
|
|
81
|
+
allowedGsdTools: ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
82
|
+
requiredWorkflowTools: ["gsd_plan_slice"],
|
|
83
|
+
},
|
|
84
|
+
"refine-slice": {
|
|
85
|
+
allowedGsdTools: ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
86
|
+
requiredWorkflowTools: [],
|
|
87
|
+
},
|
|
88
|
+
"replan-slice": {
|
|
89
|
+
allowedGsdTools: ["gsd_replan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
90
|
+
requiredWorkflowTools: ["gsd_replan_slice"],
|
|
91
|
+
},
|
|
92
|
+
"complete-slice": {
|
|
93
|
+
allowedGsdTools: [
|
|
94
|
+
"gsd_slice_complete",
|
|
95
|
+
"gsd_task_reopen",
|
|
96
|
+
"gsd_replan_slice",
|
|
97
|
+
"gsd_decision_save",
|
|
98
|
+
"gsd_requirement_update",
|
|
99
|
+
"subagent",
|
|
100
|
+
],
|
|
101
|
+
requiredWorkflowTools: ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"],
|
|
102
|
+
forbiddenGsdTools: {
|
|
103
|
+
gsd_uat_result_save: "Run UAT owns persisted UAT Assessment.",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
"reassess-roadmap": {
|
|
107
|
+
allowedGsdTools: ["gsd_reassess_roadmap"],
|
|
108
|
+
requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
|
|
109
|
+
},
|
|
110
|
+
"execute-task": {
|
|
111
|
+
allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
|
|
112
|
+
requiredWorkflowTools: ["gsd_task_complete"],
|
|
113
|
+
},
|
|
114
|
+
"execute-task-simple": {
|
|
115
|
+
allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
|
|
116
|
+
requiredWorkflowTools: ["gsd_task_complete"],
|
|
117
|
+
},
|
|
118
|
+
"reactive-execute": {
|
|
119
|
+
allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
|
|
120
|
+
requiredWorkflowTools: ["gsd_task_complete"],
|
|
121
|
+
},
|
|
122
|
+
"run-uat": {
|
|
123
|
+
allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
|
|
124
|
+
requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
|
|
125
|
+
forbiddenGsdTools: {
|
|
126
|
+
gsd_exec: "Use gsd_uat_exec so acceptance evidence is typed as UAT-owned.",
|
|
127
|
+
gsd_save_gate_result: "gsd_uat_result_save owns the aggregate UAT gate.",
|
|
128
|
+
gsd_summary_save: "gsd_uat_result_save owns persisted UAT Assessment writes.",
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
"gate-evaluate": {
|
|
132
|
+
allowedGsdTools: ["gsd_save_gate_result"],
|
|
133
|
+
requiredWorkflowTools: ["gsd_save_gate_result"],
|
|
134
|
+
},
|
|
135
|
+
"rewrite-docs": {
|
|
136
|
+
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
|
|
137
|
+
requiredWorkflowTools: [],
|
|
138
|
+
},
|
|
139
|
+
"workflow-preferences": {
|
|
140
|
+
allowedGsdTools: ["gsd_summary_save"],
|
|
141
|
+
requiredWorkflowTools: [],
|
|
142
|
+
},
|
|
143
|
+
"discuss-project": {
|
|
144
|
+
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
145
|
+
requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
|
|
146
|
+
},
|
|
147
|
+
"discuss-requirements": {
|
|
148
|
+
allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
|
|
149
|
+
requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
|
|
150
|
+
},
|
|
151
|
+
"research-decision": {
|
|
152
|
+
allowedGsdTools: ["gsd_summary_save"],
|
|
153
|
+
requiredWorkflowTools: ["ask_user_questions"],
|
|
154
|
+
},
|
|
155
|
+
"research-project": {
|
|
156
|
+
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
|
|
157
|
+
requiredWorkflowTools: [],
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
export const AUTO_UNIT_SCOPED_TOOLS = Object.fromEntries(Object.entries(UNIT_TOOL_CONTRACTS).map(([unitType, contract]) => [unitType, contract.allowedGsdTools]));
|
|
161
|
+
export function getUnitToolSurfaceContract(unitType) {
|
|
162
|
+
return UNIT_TOOL_CONTRACTS[unitType];
|
|
163
|
+
}
|
|
164
|
+
export function getRequiredWorkflowToolsForUnit(unitType) {
|
|
165
|
+
return [...(UNIT_TOOL_CONTRACTS[unitType]?.requiredWorkflowTools ?? [])];
|
|
166
|
+
}
|
|
167
|
+
export function getForbiddenGsdToolReason(unitType, toolName) {
|
|
168
|
+
return UNIT_TOOL_CONTRACTS[unitType]?.forbiddenGsdTools?.[toolName];
|
|
169
|
+
}
|
|
@@ -8,6 +8,8 @@ import { deriveState } from "./state.js";
|
|
|
8
8
|
import { detectWorktreeName } from "./worktree.js";
|
|
9
9
|
const VALIDATION_BLOCK_RE = /milestone validation returned needs-(?:attention|remediation)|validation verdict is needs-(?:attention|remediation)/i;
|
|
10
10
|
const VALIDATION_SAFE_DISPATCH_COMMANDS = new Set([
|
|
11
|
+
"reassess",
|
|
12
|
+
"reassess-roadmap",
|
|
11
13
|
"validate",
|
|
12
14
|
"validate-milestone",
|
|
13
15
|
]);
|
|
@@ -5,7 +5,62 @@
|
|
|
5
5
|
* (e.g. `passed` → `pass`) are applied consistently across the codebase.
|
|
6
6
|
*/
|
|
7
7
|
import { extractUatType } from "./files.js";
|
|
8
|
+
import { splitFrontmatter, parseFrontmatterMap } from "../shared/frontmatter.js";
|
|
9
|
+
import { parse as parseYaml } from "yaml";
|
|
10
|
+
function normalizeVerdict(value) {
|
|
11
|
+
if (typeof value !== "string")
|
|
12
|
+
return undefined;
|
|
13
|
+
let verdict = value.trim().toLowerCase();
|
|
14
|
+
if (!verdict)
|
|
15
|
+
return undefined;
|
|
16
|
+
if (verdict === "passed")
|
|
17
|
+
verdict = "pass";
|
|
18
|
+
return verdict;
|
|
19
|
+
}
|
|
20
|
+
function getCaseInsensitive(obj, key) {
|
|
21
|
+
const lowerKey = key.toLowerCase();
|
|
22
|
+
for (const [candidate, value] of Object.entries(obj)) {
|
|
23
|
+
if (candidate.toLowerCase() === lowerKey)
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
8
28
|
// ── Verdict extraction ──────────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Extract and normalize the frontmatter `verdict` value.
|
|
31
|
+
*
|
|
32
|
+
* Supports both top-level `verdict` and the hook outcome shape
|
|
33
|
+
* `outcome.verdict`. Returns `undefined` when frontmatter is absent or has no
|
|
34
|
+
* verdict field.
|
|
35
|
+
*/
|
|
36
|
+
export function extractFrontmatterVerdict(content) {
|
|
37
|
+
const [frontmatterLines] = splitFrontmatter(content);
|
|
38
|
+
if (!frontmatterLines)
|
|
39
|
+
return undefined;
|
|
40
|
+
try {
|
|
41
|
+
const parsed = parseYaml(frontmatterLines.join("\n"));
|
|
42
|
+
if (parsed && typeof parsed === "object") {
|
|
43
|
+
const root = parsed;
|
|
44
|
+
const topLevel = normalizeVerdict(getCaseInsensitive(root, "verdict"));
|
|
45
|
+
if (topLevel)
|
|
46
|
+
return topLevel;
|
|
47
|
+
const outcome = getCaseInsensitive(root, "outcome");
|
|
48
|
+
if (outcome && typeof outcome === "object") {
|
|
49
|
+
const nested = normalizeVerdict(getCaseInsensitive(outcome, "verdict"));
|
|
50
|
+
if (nested)
|
|
51
|
+
return nested;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Fall through to the permissive parser used by legacy frontmatter paths.
|
|
57
|
+
}
|
|
58
|
+
const frontmatter = parseFrontmatterMap(frontmatterLines);
|
|
59
|
+
const topLevel = normalizeVerdict(getCaseInsensitive(frontmatter, "verdict"));
|
|
60
|
+
if (topLevel)
|
|
61
|
+
return topLevel;
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
9
64
|
/**
|
|
10
65
|
* Extract and normalize the `verdict` value from YAML frontmatter.
|
|
11
66
|
*
|
|
@@ -17,25 +72,14 @@ import { extractUatType } from "./files.js";
|
|
|
17
72
|
*/
|
|
18
73
|
export function extractVerdict(content) {
|
|
19
74
|
// Primary: YAML frontmatter verdict (canonical format)
|
|
20
|
-
const
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
if (verdictMatch) {
|
|
24
|
-
let v = verdictMatch[1].toLowerCase();
|
|
25
|
-
if (v === "passed")
|
|
26
|
-
v = "pass";
|
|
27
|
-
return v;
|
|
28
|
-
}
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
75
|
+
const [frontmatterLines] = splitFrontmatter(content);
|
|
76
|
+
if (frontmatterLines)
|
|
77
|
+
return extractFrontmatterVerdict(content);
|
|
31
78
|
// Fallback: detect verdict in markdown body (LLM manual writes, #2960).
|
|
32
79
|
// Matches patterns like: **Verdict:** PASS, **Verdict:** ✅ PASS, **Verdict** needs-remediation
|
|
33
80
|
const bodyMatch = content.match(/\*\*Verdict:?\*\*\s*(?:✅\s*)?(\w[\w-]*)/i);
|
|
34
81
|
if (bodyMatch) {
|
|
35
|
-
|
|
36
|
-
if (v === "passed")
|
|
37
|
-
v = "pass";
|
|
38
|
-
return v;
|
|
82
|
+
return normalizeVerdict(bodyMatch[1]);
|
|
39
83
|
}
|
|
40
84
|
return undefined;
|
|
41
85
|
}
|
|
@@ -246,6 +246,76 @@ function hasUnsafeShellSyntax(cmd) {
|
|
|
246
246
|
}
|
|
247
247
|
return false;
|
|
248
248
|
}
|
|
249
|
+
function splitLeadingShellWords(cmd) {
|
|
250
|
+
const words = [];
|
|
251
|
+
let current = "";
|
|
252
|
+
let inSingle = false;
|
|
253
|
+
let inDouble = false;
|
|
254
|
+
let escaped = false;
|
|
255
|
+
for (let i = 0; i < cmd.length; i += 1) {
|
|
256
|
+
const ch = cmd[i];
|
|
257
|
+
if (escaped) {
|
|
258
|
+
current += ch;
|
|
259
|
+
escaped = false;
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (ch === "\\" && !inSingle) {
|
|
263
|
+
escaped = true;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (ch === "'" && !inDouble) {
|
|
267
|
+
inSingle = !inSingle;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
if (ch === "\"" && !inSingle) {
|
|
271
|
+
inDouble = !inDouble;
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (!inSingle && !inDouble) {
|
|
275
|
+
if (/\s/.test(ch)) {
|
|
276
|
+
if (current) {
|
|
277
|
+
words.push(current);
|
|
278
|
+
current = "";
|
|
279
|
+
}
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if ([";", "|", "&", "<", ">"].includes(ch)) {
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
current += ch;
|
|
287
|
+
}
|
|
288
|
+
if (current) {
|
|
289
|
+
words.push(current);
|
|
290
|
+
}
|
|
291
|
+
return words;
|
|
292
|
+
}
|
|
293
|
+
function isCountFlag(token) {
|
|
294
|
+
return (token === "--count" ||
|
|
295
|
+
token.startsWith("--count=") ||
|
|
296
|
+
token === "--count-matches" ||
|
|
297
|
+
token.startsWith("--count-matches=") ||
|
|
298
|
+
/^-[A-Za-z]*c[A-Za-z]*$/.test(token));
|
|
299
|
+
}
|
|
300
|
+
function countSearchWarning(command, exitCode) {
|
|
301
|
+
if (exitCode !== 1)
|
|
302
|
+
return null;
|
|
303
|
+
const trimmed = command.trim();
|
|
304
|
+
if (trimmed.startsWith("!"))
|
|
305
|
+
return null;
|
|
306
|
+
const [tool, ...args] = splitLeadingShellWords(trimmed);
|
|
307
|
+
if (tool !== "grep" && tool !== "rg")
|
|
308
|
+
return null;
|
|
309
|
+
if (!args.some(isCountFlag))
|
|
310
|
+
return null;
|
|
311
|
+
return `verification-gate: warning: '${tool} -c' returns exit 1 when count=0; for absence checks use '! ${tool} -q ...' instead.`;
|
|
312
|
+
}
|
|
313
|
+
function appendStderrWarning(stderr, warning) {
|
|
314
|
+
if (!warning)
|
|
315
|
+
return stderr;
|
|
316
|
+
const trimmed = stderr.trimEnd();
|
|
317
|
+
return trimmed ? `${trimmed}\n${warning}` : warning;
|
|
318
|
+
}
|
|
249
319
|
/**
|
|
250
320
|
* Known executable first-tokens that are safe to run.
|
|
251
321
|
* Lowercase commands, common build/test tools, and npm/yarn/pnpm invocations.
|
|
@@ -411,11 +481,12 @@ export function runVerificationGate(options) {
|
|
|
411
481
|
exitCode = result.status ?? 1;
|
|
412
482
|
stderr = truncate(result.stderr, MAX_OUTPUT_BYTES);
|
|
413
483
|
}
|
|
484
|
+
const warning = countSearchWarning(command, exitCode);
|
|
414
485
|
checks.push({
|
|
415
486
|
command,
|
|
416
487
|
exitCode,
|
|
417
488
|
stdout: truncate(result.stdout, MAX_OUTPUT_BYTES),
|
|
418
|
-
stderr,
|
|
489
|
+
stderr: truncate(appendStderrWarning(stderr, warning), MAX_OUTPUT_BYTES),
|
|
419
490
|
durationMs,
|
|
420
491
|
});
|
|
421
492
|
}
|
|
@@ -33,6 +33,8 @@ export function shouldAutoPrepareWorkflowMcp(ctx) {
|
|
|
33
33
|
const authMode = getAuthModeSafe(ctx, provider);
|
|
34
34
|
if (provider !== "claude-code")
|
|
35
35
|
return false;
|
|
36
|
+
if (authMode === undefined)
|
|
37
|
+
return true;
|
|
36
38
|
return usesWorkflowMcpTransport(authMode, baseUrl) || authMode === "externalCli";
|
|
37
39
|
}
|
|
38
40
|
export function prepareWorkflowMcpForProject(ctx, projectRoot, modelOverride) {
|
|
@@ -42,7 +44,7 @@ export function prepareWorkflowMcpForProject(ctx, projectRoot, modelOverride) {
|
|
|
42
44
|
try {
|
|
43
45
|
const result = ensureProjectWorkflowMcpConfig(projectRoot);
|
|
44
46
|
if (result.status !== "unchanged") {
|
|
45
|
-
prepCtx.ui?.notify?.(`
|
|
47
|
+
prepCtx.ui?.notify?.(`GSD MCP Server Prepared at ${result.configPath}`, "info");
|
|
46
48
|
}
|
|
47
49
|
return result;
|
|
48
50
|
}
|
|
@@ -2,6 +2,7 @@ import { execSync } from "node:child_process";
|
|
|
2
2
|
import { existsSync, realpathSync } from "node:fs";
|
|
3
3
|
import { dirname, resolve, sep } from "node:path";
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
5
6
|
/** Session cwd may be a milestone worktree; MCP config and server discovery use the project root. */
|
|
6
7
|
export function resolveWorkflowMcpProjectRoot(sessionCwd) {
|
|
7
8
|
let resolved;
|
|
@@ -77,6 +78,8 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
|
77
78
|
"gsd_task_complete",
|
|
78
79
|
"gsd_task_reopen",
|
|
79
80
|
"gsd_update_requirement",
|
|
81
|
+
"gsd_uat_exec",
|
|
82
|
+
"gsd_uat_result_save",
|
|
80
83
|
"gsd_validate_milestone",
|
|
81
84
|
]);
|
|
82
85
|
/** Workflow MCP tools are validated by transport compatibility, not pi tool-compat profiles. */
|
|
@@ -347,81 +350,10 @@ export function buildWorkflowMcpServers(projectRoot = process.cwd(), env = proce
|
|
|
347
350
|
};
|
|
348
351
|
}
|
|
349
352
|
export function getRequiredWorkflowToolsForGuidedUnit(unitType) {
|
|
350
|
-
|
|
351
|
-
case "discuss-project":
|
|
352
|
-
return ["ask_user_questions", "gsd_summary_save"];
|
|
353
|
-
case "discuss-requirements":
|
|
354
|
-
return ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"];
|
|
355
|
-
case "research-decision":
|
|
356
|
-
return ["ask_user_questions"];
|
|
357
|
-
case "discuss-milestone":
|
|
358
|
-
return [
|
|
359
|
-
"gsd_summary_save",
|
|
360
|
-
"gsd_requirement_save",
|
|
361
|
-
"gsd_requirement_update",
|
|
362
|
-
"gsd_plan_milestone",
|
|
363
|
-
"gsd_milestone_generate_id",
|
|
364
|
-
];
|
|
365
|
-
case "discuss-slice":
|
|
366
|
-
return ["gsd_summary_save"];
|
|
367
|
-
case "research-milestone":
|
|
368
|
-
case "research-slice":
|
|
369
|
-
return ["gsd_summary_save"];
|
|
370
|
-
case "plan-milestone":
|
|
371
|
-
return ["gsd_plan_milestone"];
|
|
372
|
-
case "plan-slice":
|
|
373
|
-
return ["gsd_plan_slice"];
|
|
374
|
-
case "execute-task":
|
|
375
|
-
return ["gsd_task_complete"];
|
|
376
|
-
case "complete-slice":
|
|
377
|
-
return ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"];
|
|
378
|
-
default:
|
|
379
|
-
return [];
|
|
380
|
-
}
|
|
353
|
+
return getRequiredWorkflowToolsForUnit(unitType);
|
|
381
354
|
}
|
|
382
355
|
export function getRequiredWorkflowToolsForAutoUnit(unitType) {
|
|
383
|
-
|
|
384
|
-
case "discuss-project":
|
|
385
|
-
return ["ask_user_questions", "gsd_summary_save"];
|
|
386
|
-
case "discuss-requirements":
|
|
387
|
-
return ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"];
|
|
388
|
-
case "research-decision":
|
|
389
|
-
return ["ask_user_questions"];
|
|
390
|
-
case "discuss-milestone":
|
|
391
|
-
return [
|
|
392
|
-
"gsd_summary_save",
|
|
393
|
-
"gsd_requirement_save",
|
|
394
|
-
"gsd_requirement_update",
|
|
395
|
-
"gsd_plan_milestone",
|
|
396
|
-
"gsd_milestone_generate_id",
|
|
397
|
-
];
|
|
398
|
-
case "research-milestone":
|
|
399
|
-
case "research-slice":
|
|
400
|
-
case "run-uat":
|
|
401
|
-
return ["gsd_summary_save"];
|
|
402
|
-
case "plan-milestone":
|
|
403
|
-
return ["gsd_plan_milestone"];
|
|
404
|
-
case "plan-slice":
|
|
405
|
-
return ["gsd_plan_slice"];
|
|
406
|
-
case "execute-task":
|
|
407
|
-
case "execute-task-simple":
|
|
408
|
-
case "reactive-execute":
|
|
409
|
-
return ["gsd_task_complete"];
|
|
410
|
-
case "complete-slice":
|
|
411
|
-
return ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"];
|
|
412
|
-
case "replan-slice":
|
|
413
|
-
return ["gsd_replan_slice"];
|
|
414
|
-
case "reassess-roadmap":
|
|
415
|
-
return ["gsd_milestone_status", "gsd_reassess_roadmap"];
|
|
416
|
-
case "gate-evaluate":
|
|
417
|
-
return ["gsd_save_gate_result"];
|
|
418
|
-
case "validate-milestone":
|
|
419
|
-
return ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"];
|
|
420
|
-
case "complete-milestone":
|
|
421
|
-
return ["gsd_milestone_status", "gsd_complete_milestone"];
|
|
422
|
-
default:
|
|
423
|
-
return [];
|
|
424
|
-
}
|
|
356
|
+
return getRequiredWorkflowToolsForUnit(unitType);
|
|
425
357
|
}
|
|
426
358
|
export function usesWorkflowMcpTransport(authMode, baseUrl) {
|
|
427
359
|
return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
|
|
@@ -34,6 +34,8 @@ import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain, } fr
|
|
|
34
34
|
import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
|
|
35
35
|
import { invalidateAllCaches } from "./cache.js";
|
|
36
36
|
import { resolveMilestoneFile } from "./paths.js";
|
|
37
|
+
import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
|
|
38
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
37
39
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
38
40
|
// ADR-016 phase 2 / C1 (#5624): file-system + git-CLI leaf primitives
|
|
39
41
|
// inlined as direct imports rather than injected through `WorktreeLifecycleDeps`.
|
|
@@ -55,6 +57,26 @@ const MERGE_FAILURE_DEDUPE_MS = 60_000;
|
|
|
55
57
|
export function resetRecentWorktreeMergeFailuresForTest() {
|
|
56
58
|
recentWorktreeMergeFailures.clear();
|
|
57
59
|
}
|
|
60
|
+
function markMilestoneClosedAfterMerge(milestoneId, completedAt) {
|
|
61
|
+
if (!isDbAvailable())
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
const existing = getMilestone(milestoneId);
|
|
65
|
+
if (!existing) {
|
|
66
|
+
insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
|
|
67
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
68
|
+
invalidateAllCaches();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!isClosedStatus(existing.status)) {
|
|
72
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
73
|
+
invalidateAllCaches();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logWarning("worktree", `Merged ${milestoneId} but failed to mark milestone complete in DB: ${err instanceof Error ? err.message : String(err)}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
58
80
|
/**
|
|
59
81
|
* Internal sentinel — thrown by `_mergeBranchMode` when it has already
|
|
60
82
|
* emitted a user-visible error. The outer `mergeAndExit` catches the type
|
|
@@ -1195,6 +1217,8 @@ export class WorktreeLifecycle {
|
|
|
1195
1217
|
}
|
|
1196
1218
|
// #4764 — record merge completion. Only reaches here when an actual
|
|
1197
1219
|
// merge ran; failure paths throw out before this point.
|
|
1220
|
+
const mergeCompletedAt = new Date().toISOString();
|
|
1221
|
+
markMilestoneClosedAfterMerge(milestoneId, mergeCompletedAt);
|
|
1198
1222
|
try {
|
|
1199
1223
|
emitWorktreeMerged(this.s.originalBasePath || this.s.basePath, milestoneId, {
|
|
1200
1224
|
reason: "milestone-complete",
|
|
@@ -29,6 +29,7 @@ const CHILD_ENV_ALLOWLIST = new Set([
|
|
|
29
29
|
"XDG_CONFIG_HOME",
|
|
30
30
|
"XDG_CACHE_HOME",
|
|
31
31
|
]);
|
|
32
|
+
const MCP_STDERR_MAX_BYTES = 4096;
|
|
32
33
|
let cachedStatus = null;
|
|
33
34
|
let cachedStatusKey = "";
|
|
34
35
|
export function clearMcpConfigCache() {
|
|
@@ -126,6 +127,33 @@ export function resolveMcpEnv(env) {
|
|
|
126
127
|
export function resolveMcpString(value) {
|
|
127
128
|
return value.replace(/\$\{([^}]+)\}/g, (_match, varName) => process.env[varName] ?? "");
|
|
128
129
|
}
|
|
130
|
+
function captureTransportStderr(transport) {
|
|
131
|
+
const chunks = [];
|
|
132
|
+
let totalBytes = 0;
|
|
133
|
+
const stderr = transport.stderr;
|
|
134
|
+
stderr?.on("data", (chunk) => {
|
|
135
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
|
|
136
|
+
totalBytes += buffer.byteLength;
|
|
137
|
+
chunks.push(buffer);
|
|
138
|
+
while (chunks.reduce((sum, entry) => sum + entry.byteLength, 0) > MCP_STDERR_MAX_BYTES) {
|
|
139
|
+
chunks.shift();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return () => {
|
|
143
|
+
const captured = Buffer.concat(chunks).toString("utf-8").trim();
|
|
144
|
+
if (!captured)
|
|
145
|
+
return "";
|
|
146
|
+
return totalBytes > MCP_STDERR_MAX_BYTES
|
|
147
|
+
? `[stderr truncated to last ${MCP_STDERR_MAX_BYTES} bytes]\n${captured}`
|
|
148
|
+
: captured;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function formatConnectionError(error, stderr) {
|
|
152
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
153
|
+
if (!stderr)
|
|
154
|
+
return message;
|
|
155
|
+
return `${message}\nStderr:\n${stderr}`;
|
|
156
|
+
}
|
|
129
157
|
export function upsertProjectLocalMcpServer(input, options = {}) {
|
|
130
158
|
const projectDir = options.projectDir ?? process.cwd();
|
|
131
159
|
const nextName = input.name.trim();
|
|
@@ -224,6 +252,7 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
|
|
|
224
252
|
}
|
|
225
253
|
const client = new Client({ name: "gsd", version: "1.0.0" });
|
|
226
254
|
let transport;
|
|
255
|
+
let readCapturedStderr;
|
|
227
256
|
const timeout = options.timeoutMs ?? 30_000;
|
|
228
257
|
try {
|
|
229
258
|
if (config.transport === "stdio") {
|
|
@@ -234,6 +263,7 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
|
|
|
234
263
|
cwd: config.cwd,
|
|
235
264
|
stderr: "pipe",
|
|
236
265
|
});
|
|
266
|
+
readCapturedStderr = captureTransportStderr(transport);
|
|
237
267
|
}
|
|
238
268
|
else {
|
|
239
269
|
const resolvedUrl = resolveMcpString(config.url ?? "");
|
|
@@ -259,7 +289,7 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
|
|
|
259
289
|
toolCount: 0,
|
|
260
290
|
tools: [],
|
|
261
291
|
warnings: config.envWarnings,
|
|
262
|
-
error: error
|
|
292
|
+
error: formatConnectionError(error, readCapturedStderr?.() ?? ""),
|
|
263
293
|
};
|
|
264
294
|
}
|
|
265
295
|
finally {
|