@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.9bb7453
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 +44 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +68 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -4
- 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 +2 -1
- package/dist/resources/extensions/gsd/auto.js +31 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +83 -4
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +39 -14
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -10
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- 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 +30 -69
- 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/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 +48 -24
- 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/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-presentation-plan.js +120 -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 +403 -3
- package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
- 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 -1
- 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 +6 -6
- 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 +6 -6
- 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/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 +38 -0
- 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/types.d.ts +3 -0
- 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 +406 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +484 -116
- 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/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/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 +53 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +102 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +4 -4
- 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 +2 -1
- package/src/resources/extensions/gsd/auto.ts +47 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +90 -4
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +60 -19
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +21 -10
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- 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 +91 -83
- 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/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 +48 -24
- 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/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-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/browser-evidence.test.ts +142 -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-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/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.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -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/migration-auto-check.test.ts +3 -3
- 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 +53 -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 +35 -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/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 +213 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +25 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +167 -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 +489 -3
- 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/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 -1
- 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/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_ssgManifest.js +0 -0
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
/** browser-tools —
|
|
1
|
+
/** browser-tools — Pi Browser Automation Contract adapter. */
|
|
2
2
|
import { importExtensionModule, type ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
import { closeManagedGsdBrowser, registerManagedGsdBrowserTools } from "./engine/managed-gsd-browser.js";
|
|
5
|
+
import { resolveBrowserEngineMode, type BrowserEngineMode } from "./engine/selection.js";
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
let legacyRegistrationPromise: Promise<void> | null = null;
|
|
8
|
+
let managedRegistrationPromise: Promise<void> | null = null;
|
|
9
|
+
let registeredEngine: Exclude<BrowserEngineMode, "off"> | null = null;
|
|
10
|
+
|
|
11
|
+
async function registerLegacyBrowserTools(pi: ExtensionAPI): Promise<void> {
|
|
12
|
+
if (!legacyRegistrationPromise) {
|
|
13
|
+
legacyRegistrationPromise = (async () => {
|
|
9
14
|
const [
|
|
10
15
|
lifecycle,
|
|
11
16
|
capture,
|
|
@@ -136,12 +141,55 @@ async function registerBrowserTools(pi: ExtensionAPI): Promise<void> {
|
|
|
136
141
|
injectionDetection.registerInjectionDetectionTools(pi, deps);
|
|
137
142
|
verify.registerVerifyTools(pi, deps);
|
|
138
143
|
})().catch((error) => {
|
|
139
|
-
|
|
144
|
+
legacyRegistrationPromise = null;
|
|
140
145
|
throw error;
|
|
141
146
|
});
|
|
142
147
|
}
|
|
143
148
|
|
|
144
|
-
return
|
|
149
|
+
return legacyRegistrationPromise;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function registerBrowserTools(pi: ExtensionAPI): Promise<void> {
|
|
153
|
+
const engine = resolveBrowserEngineMode();
|
|
154
|
+
if (engine === "off") return;
|
|
155
|
+
if (registeredEngine && registeredEngine !== engine) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`Browser tools already registered with GSD_BROWSER_ENGINE=${registeredEngine}. Restart GSD before switching to ${engine}.`,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
let registration: Promise<void>;
|
|
162
|
+
if (engine === "legacy") {
|
|
163
|
+
registration = registerLegacyBrowserTools(pi);
|
|
164
|
+
} else if (!managedRegistrationPromise) {
|
|
165
|
+
managedRegistrationPromise = Promise.resolve()
|
|
166
|
+
.then(() => {
|
|
167
|
+
registerManagedGsdBrowserTools(pi);
|
|
168
|
+
})
|
|
169
|
+
.catch((error) => {
|
|
170
|
+
managedRegistrationPromise = null;
|
|
171
|
+
throw error;
|
|
172
|
+
});
|
|
173
|
+
registration = managedRegistrationPromise;
|
|
174
|
+
} else {
|
|
175
|
+
registration = managedRegistrationPromise;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
registeredEngine = engine;
|
|
179
|
+
try {
|
|
180
|
+
await registration;
|
|
181
|
+
} catch (error) {
|
|
182
|
+
if (registeredEngine === engine) registeredEngine = null;
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function closeActiveBrowserEngines(): Promise<void> {
|
|
188
|
+
await closeManagedGsdBrowser();
|
|
189
|
+
if (legacyRegistrationPromise) {
|
|
190
|
+
const { closeBrowser } = await importExtensionModule<typeof import("./lifecycle.js")>(import.meta.url, "./lifecycle.js");
|
|
191
|
+
await closeBrowser();
|
|
192
|
+
}
|
|
145
193
|
}
|
|
146
194
|
|
|
147
195
|
export default function (pi: ExtensionAPI) {
|
|
@@ -157,7 +205,10 @@ export default function (pi: ExtensionAPI) {
|
|
|
157
205
|
});
|
|
158
206
|
|
|
159
207
|
pi.on("session_shutdown", async () => {
|
|
160
|
-
|
|
161
|
-
|
|
208
|
+
await closeActiveBrowserEngines();
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
pi.on("session_switch", async () => {
|
|
212
|
+
await closeActiveBrowserEngines();
|
|
162
213
|
});
|
|
163
214
|
}
|
|
@@ -4,16 +4,20 @@
|
|
|
4
4
|
"version": "1.0.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "node --test tests/*.test.mjs"
|
|
7
|
+
"test": "node --import ../gsd/tests/resolve-ts.mjs --experimental-strip-types --test tests/*.test.mjs"
|
|
8
8
|
},
|
|
9
9
|
"pi": {
|
|
10
10
|
"extensions": ["./index.ts"]
|
|
11
11
|
},
|
|
12
12
|
"peerDependencies": {
|
|
13
|
+
"@opengsd/gsd-browser": ">=0.1.27",
|
|
13
14
|
"playwright": ">=1.40.0",
|
|
14
15
|
"sharp": ">=0.33.0"
|
|
15
16
|
},
|
|
16
17
|
"peerDependenciesMeta": {
|
|
18
|
+
"@opengsd/gsd-browser": {
|
|
19
|
+
"optional": true
|
|
20
|
+
},
|
|
17
21
|
"playwright": {
|
|
18
22
|
"optional": true
|
|
19
23
|
},
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const jiti = require("jiti")(__dirname, { interopDefault: true, debug: false });
|
|
10
|
+
|
|
11
|
+
const { resolveBrowserEngineMode } = jiti("../engine/selection.ts");
|
|
12
|
+
|
|
13
|
+
describe("resolveBrowserEngineMode", () => {
|
|
14
|
+
it("defaults to gsd-browser", () => {
|
|
15
|
+
assert.equal(resolveBrowserEngineMode({}), "gsd-browser");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("accepts the explicit engine modes", () => {
|
|
19
|
+
assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "gsd-browser" }), "gsd-browser");
|
|
20
|
+
assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "legacy" }), "legacy");
|
|
21
|
+
assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "off" }), "off");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("accepts compatibility aliases", () => {
|
|
25
|
+
assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "playwright" }), "legacy");
|
|
26
|
+
assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "false" }), "off");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("rejects unknown engine modes", () => {
|
|
30
|
+
assert.throws(
|
|
31
|
+
() => resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "surprise" }),
|
|
32
|
+
/Expected "gsd-browser", "legacy", or "off"/,
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
MANAGED_GSD_BROWSER_TOOL_NAMES,
|
|
6
|
+
registerManagedGsdBrowserTools,
|
|
7
|
+
} = await import("../engine/managed-gsd-browser.ts");
|
|
8
|
+
|
|
9
|
+
describe("registerManagedGsdBrowserTools", () => {
|
|
10
|
+
it("registers the curated Pi browser contract", () => {
|
|
11
|
+
const tools = [];
|
|
12
|
+
registerManagedGsdBrowserTools({
|
|
13
|
+
registerTool(tool) {
|
|
14
|
+
tools.push(tool);
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
assert.deepEqual(tools.map((tool) => tool.name), [...MANAGED_GSD_BROWSER_TOOL_NAMES]);
|
|
19
|
+
assert.equal(new Set(tools.map((tool) => tool.name)).size, tools.length);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("keeps screenshots marked as image-producing evidence", () => {
|
|
23
|
+
const tools = [];
|
|
24
|
+
registerManagedGsdBrowserTools({
|
|
25
|
+
registerTool(tool) {
|
|
26
|
+
tools.push(tool);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const screenshot = tools.find((tool) => tool.name === "browser_screenshot");
|
|
31
|
+
assert.equal(screenshot?.compatibility?.producesImages, true);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -27,10 +27,21 @@ import { homedir } from "node:os";
|
|
|
27
27
|
import { createRequire } from "node:module";
|
|
28
28
|
import { dirname, join } from "node:path";
|
|
29
29
|
import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
30
|
-
import {
|
|
31
|
-
|
|
30
|
+
import {
|
|
31
|
+
buildWorkflowMcpServers,
|
|
32
|
+
getRequiredWorkflowToolsForAutoUnit,
|
|
33
|
+
resolveWorkflowMcpProjectRoot,
|
|
34
|
+
} from "../gsd/workflow-mcp.js";
|
|
35
|
+
import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
|
|
32
36
|
import { loadProjectGSDPreferences } from "../gsd/preferences.js";
|
|
33
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
discoverBrowserMcpServerName,
|
|
39
|
+
discoverMcpServers,
|
|
40
|
+
discoverMcpServerNames,
|
|
41
|
+
discoverWorkflowMcpServerName,
|
|
42
|
+
computeMcpDisallowedTools,
|
|
43
|
+
} from "../gsd/mcp-filter.js";
|
|
44
|
+
import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
|
|
34
45
|
import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
|
|
35
46
|
import type {
|
|
36
47
|
BetaRawMessageStreamEvent,
|
|
@@ -324,6 +335,33 @@ function extractMessageText(msg: { role: string; content: unknown }): string {
|
|
|
324
335
|
return "";
|
|
325
336
|
}
|
|
326
337
|
|
|
338
|
+
const GSD_PHASE_PATTERNS: Array<[string, RegExp]> = [
|
|
339
|
+
["run-uat", /\b(?:UNIT:\s*Run UAT|run-uat)\b/i],
|
|
340
|
+
["complete-milestone", /\b(?:UNIT:\s*Complete Milestone|complete-milestone)\b/i],
|
|
341
|
+
["validate-milestone", /\b(?:UNIT:\s*Validate Milestone|validate-milestone)\b/i],
|
|
342
|
+
["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
|
|
343
|
+
["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
|
|
344
|
+
["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
|
|
345
|
+
["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
|
|
346
|
+
["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
|
|
347
|
+
["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
|
|
348
|
+
["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
|
|
349
|
+
["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
|
|
350
|
+
["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
|
|
351
|
+
["discuss-milestone", /\b(?:Discuss milestone|discuss-milestone)\b/i],
|
|
352
|
+
];
|
|
353
|
+
|
|
354
|
+
export function inferGsdPhaseFromContext(context: Context): string | undefined {
|
|
355
|
+
const text = [
|
|
356
|
+
context.systemPrompt ?? "",
|
|
357
|
+
...context.messages.map((message) => extractMessageText(message)),
|
|
358
|
+
].join("\n");
|
|
359
|
+
for (const [phase, pattern] of GSD_PHASE_PATTERNS) {
|
|
360
|
+
if (pattern.test(text)) return phase;
|
|
361
|
+
}
|
|
362
|
+
return undefined;
|
|
363
|
+
}
|
|
364
|
+
|
|
327
365
|
/**
|
|
328
366
|
* Build a full conversational prompt from GSD's context messages.
|
|
329
367
|
*
|
|
@@ -1462,19 +1500,113 @@ function mapThinkingLevelToAnthropicEffort(level: ThinkingLevel | undefined, mod
|
|
|
1462
1500
|
}
|
|
1463
1501
|
}
|
|
1464
1502
|
|
|
1465
|
-
function
|
|
1503
|
+
function parseAllowedMcpToolName(toolName: string): { server: string; tool: string } | undefined {
|
|
1504
|
+
const match = /^mcp__(.+)__(\*|[^*]+)$/.exec(toolName);
|
|
1505
|
+
return match?.[1] && match[2] ? { server: match[1], tool: match[2] } : undefined;
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
function browserMcpServerNameFromAllowedTools(allowedTools: unknown): string | undefined {
|
|
1466
1509
|
if (!Array.isArray(allowedTools)) return undefined;
|
|
1467
1510
|
for (const toolName of allowedTools) {
|
|
1468
1511
|
if (typeof toolName !== "string") continue;
|
|
1469
|
-
const
|
|
1470
|
-
if (
|
|
1512
|
+
const parsed = parseAllowedMcpToolName(toolName);
|
|
1513
|
+
if (!parsed) continue;
|
|
1514
|
+
if (parsed.server === "gsd-browser" || parsed.tool.startsWith("browser_")) {
|
|
1515
|
+
return parsed.server;
|
|
1516
|
+
}
|
|
1471
1517
|
}
|
|
1472
1518
|
return undefined;
|
|
1473
1519
|
}
|
|
1474
1520
|
|
|
1475
|
-
function
|
|
1521
|
+
function workflowMcpServerNameFromAllowedTools(allowedTools: unknown): string | undefined {
|
|
1476
1522
|
if (!Array.isArray(allowedTools)) return undefined;
|
|
1477
|
-
|
|
1523
|
+
const browserServerName = browserMcpServerNameFromAllowedTools(allowedTools);
|
|
1524
|
+
for (const toolName of allowedTools) {
|
|
1525
|
+
if (typeof toolName !== "string") continue;
|
|
1526
|
+
const parsed = parseAllowedMcpToolName(toolName);
|
|
1527
|
+
if (!parsed || parsed.server === browserServerName || parsed.tool.startsWith("browser_")) continue;
|
|
1528
|
+
return parsed.server;
|
|
1529
|
+
}
|
|
1530
|
+
return undefined;
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
1534
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
function isStringRecord(value: unknown): value is Record<string, string> {
|
|
1538
|
+
return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
function cloneSdkMcpServerConfig(config: unknown): Record<string, unknown> | undefined {
|
|
1542
|
+
if (!isRecord(config)) return undefined;
|
|
1543
|
+
const cloned: Record<string, unknown> = {};
|
|
1544
|
+
for (const key of ["type", "command", "cwd", "url"] as const) {
|
|
1545
|
+
if (typeof config[key] === "string") cloned[key] = config[key];
|
|
1546
|
+
}
|
|
1547
|
+
if (Array.isArray(config.args)) {
|
|
1548
|
+
cloned.args = config.args.filter((arg): arg is string => typeof arg === "string");
|
|
1549
|
+
}
|
|
1550
|
+
if (isStringRecord(config.env)) cloned.env = { ...config.env };
|
|
1551
|
+
if (isStringRecord(config.headers)) cloned.headers = { ...config.headers };
|
|
1552
|
+
if (isRecord(config.oauth)) cloned.oauth = { ...config.oauth };
|
|
1553
|
+
return Object.keys(cloned).length > 0 ? cloned : undefined;
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
function resolveProjectMcpServerConfig(
|
|
1557
|
+
projectRoot: string,
|
|
1558
|
+
serverName: string | undefined,
|
|
1559
|
+
fallbackServers?: Record<string, unknown>,
|
|
1560
|
+
): Record<string, unknown> | undefined {
|
|
1561
|
+
if (!serverName) return undefined;
|
|
1562
|
+
const projectServer = discoverMcpServers(projectRoot).find((server) => server.name === serverName);
|
|
1563
|
+
return cloneSdkMcpServerConfig(projectServer?.config) ?? cloneSdkMcpServerConfig(fallbackServers?.[serverName]);
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
function resolveProjectMcpServerConfigs(
|
|
1567
|
+
projectRoot: string,
|
|
1568
|
+
serverNames: readonly (string | undefined)[],
|
|
1569
|
+
fallbackServers?: Record<string, unknown>,
|
|
1570
|
+
): Record<string, Record<string, unknown>> | undefined {
|
|
1571
|
+
const resolved: Record<string, Record<string, unknown>> = {};
|
|
1572
|
+
for (const serverName of serverNames) {
|
|
1573
|
+
const serverConfig = resolveProjectMcpServerConfig(projectRoot, serverName, fallbackServers);
|
|
1574
|
+
if (serverName && serverConfig) resolved[serverName] = serverConfig;
|
|
1575
|
+
}
|
|
1576
|
+
return Object.keys(resolved).length > 0 ? resolved : undefined;
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
function resolveExactWorkflowMcpToolsForPhase(
|
|
1580
|
+
gsdPhase: string | undefined,
|
|
1581
|
+
workflowServerName: string | undefined,
|
|
1582
|
+
workflowExplicitlyBlocked: boolean,
|
|
1583
|
+
): string[] {
|
|
1584
|
+
if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked) return [];
|
|
1585
|
+
const requiredTools = gsdPhase === "run-uat"
|
|
1586
|
+
? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
|
|
1587
|
+
: getRequiredWorkflowToolsForAutoUnit(gsdPhase);
|
|
1588
|
+
const supportTools = gsdPhase === "run-uat" ? [] : ["gsd_milestone_status"];
|
|
1589
|
+
const requestedToolNames = [...new Set([...requiredTools, ...supportTools])];
|
|
1590
|
+
if (requestedToolNames.length === 0) return [];
|
|
1591
|
+
return resolveToolPresentationPlan({
|
|
1592
|
+
phase: gsdPhase,
|
|
1593
|
+
surface: "claude-code-sdk",
|
|
1594
|
+
workflowMcpServerName: workflowServerName,
|
|
1595
|
+
requestedToolNames,
|
|
1596
|
+
}).presentedToolNames;
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
export function autoInitClaudeCodeWorkflowMcp(cwd: string): void {
|
|
1600
|
+
const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
|
|
1601
|
+
try {
|
|
1602
|
+
ensureProjectWorkflowMcpConfig(projectRoot);
|
|
1603
|
+
} catch (err) {
|
|
1604
|
+
if (process.env.GSD_DEBUG === "1") {
|
|
1605
|
+
console.warn(
|
|
1606
|
+
`[claude-code] workflow MCP auto-init failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1607
|
+
);
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1478
1610
|
}
|
|
1479
1611
|
|
|
1480
1612
|
/**
|
|
@@ -1492,9 +1624,9 @@ export function buildSdkOptions(
|
|
|
1492
1624
|
modelId: string,
|
|
1493
1625
|
prompt: string,
|
|
1494
1626
|
overrides?: { permissionMode?: "bypassPermissions" | "acceptEdits" | "default" | "plan" },
|
|
1495
|
-
extraOptions: Record<string, unknown> & { reasoning?: ThinkingLevel } = {},
|
|
1627
|
+
extraOptions: Record<string, unknown> & { reasoning?: ThinkingLevel; gsdPhase?: string } = {},
|
|
1496
1628
|
): Record<string, unknown> {
|
|
1497
|
-
const { reasoning, cwd, ...sdkExtraOptions } = extraOptions;
|
|
1629
|
+
const { reasoning, cwd, gsdPhase, ...sdkExtraOptions } = extraOptions;
|
|
1498
1630
|
const sdkCwd = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
|
|
1499
1631
|
// Claude Code runs in the milestone worktree for file/shell work, but workflow MCP
|
|
1500
1632
|
// config (.mcp.json) and server discovery live at the project root.
|
|
@@ -1578,13 +1710,46 @@ export function buildSdkOptions(
|
|
|
1578
1710
|
const browserMcpTools = !browserExplicitlyBlocked && browserServerName
|
|
1579
1711
|
? [`mcp__${browserServerName}__*`]
|
|
1580
1712
|
: [];
|
|
1581
|
-
const
|
|
1713
|
+
const phaseUsesBrowserMcp = !gsdPhase || gsdPhase === "run-uat";
|
|
1714
|
+
const allowedBrowserMcpTools = phaseUsesBrowserMcp ? browserMcpTools : [];
|
|
1715
|
+
const inlinePhaseMcpServers = gsdPhase
|
|
1716
|
+
? resolveProjectMcpServerConfigs(
|
|
1717
|
+
projectRoot,
|
|
1718
|
+
[
|
|
1719
|
+
workflowExplicitlyBlocked ? undefined : workflowServerName,
|
|
1720
|
+
phaseUsesBrowserMcp && !browserExplicitlyBlocked ? browserServerName : undefined,
|
|
1721
|
+
],
|
|
1722
|
+
defaultMcpServers.servers,
|
|
1723
|
+
)
|
|
1724
|
+
: undefined;
|
|
1725
|
+
const sdkMcpServers = inlinePhaseMcpServers ?? filteredMcpServers;
|
|
1726
|
+
const strictMcpConfig = !!inlinePhaseMcpServers;
|
|
1727
|
+
// Strict phase configs inline the exact MCP servers GSD needs. Loading
|
|
1728
|
+
// project/local settings at the same time can duplicate those servers and
|
|
1729
|
+
// leave allowed mcp__... tools with no registered backing tool.
|
|
1730
|
+
const settingSources = strictMcpConfig ? [] : ["project", "local"];
|
|
1731
|
+
const exactWorkflowMcpTools = resolveExactWorkflowMcpToolsForPhase(
|
|
1732
|
+
gsdPhase,
|
|
1733
|
+
workflowServerName,
|
|
1734
|
+
workflowExplicitlyBlocked,
|
|
1735
|
+
);
|
|
1736
|
+
const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
|
|
1737
|
+
? [
|
|
1738
|
+
...RUN_UAT_FORBIDDEN_TOOL_NAMES.filter((toolName) => !toolName.startsWith("mcp__")),
|
|
1739
|
+
"WebFetch",
|
|
1740
|
+
"Agent",
|
|
1741
|
+
`mcp__${workflowServerName}__gsd_exec`,
|
|
1742
|
+
`mcp__${workflowServerName}__gsd_summary_save`,
|
|
1743
|
+
`mcp__${workflowServerName}__gsd_save_gate_result`,
|
|
1744
|
+
]
|
|
1745
|
+
: [];
|
|
1582
1746
|
const disallowedTools: string[] = [...new Set([
|
|
1583
1747
|
"ToolSearch",
|
|
1584
|
-
...(workflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
|
|
1748
|
+
...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
|
|
1749
|
+
...runUatDisallowedTools,
|
|
1585
1750
|
...extraDisallowedTools,
|
|
1586
1751
|
])];
|
|
1587
|
-
const
|
|
1752
|
+
const standardClaudeTools = [
|
|
1588
1753
|
"Read",
|
|
1589
1754
|
"Write",
|
|
1590
1755
|
"Edit",
|
|
@@ -1594,8 +1759,19 @@ export function buildSdkOptions(
|
|
|
1594
1759
|
"Agent",
|
|
1595
1760
|
"WebFetch",
|
|
1596
1761
|
"WebSearch",
|
|
1597
|
-
...(workflowMcpTools.length > 0 ? gsdMcpTools : ["AskUserQuestion", ...browserMcpTools]),
|
|
1598
1762
|
];
|
|
1763
|
+
const allowedTools = gsdPhase === "run-uat"
|
|
1764
|
+
? [
|
|
1765
|
+
...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES,
|
|
1766
|
+
...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
|
|
1767
|
+
...allowedBrowserMcpTools,
|
|
1768
|
+
]
|
|
1769
|
+
: [
|
|
1770
|
+
...standardClaudeTools,
|
|
1771
|
+
...exactWorkflowMcpTools,
|
|
1772
|
+
...(workflowMcpTools.length > 0 ? workflowMcpTools : ["AskUserQuestion"]),
|
|
1773
|
+
...allowedBrowserMcpTools,
|
|
1774
|
+
];
|
|
1599
1775
|
const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
|
|
1600
1776
|
const effort =
|
|
1601
1777
|
reasoning && supportsAdaptive
|
|
@@ -1619,11 +1795,12 @@ export function buildSdkOptions(
|
|
|
1619
1795
|
cwd: sdkCwd,
|
|
1620
1796
|
permissionMode,
|
|
1621
1797
|
allowDangerouslySkipPermissions: permissionMode === "bypassPermissions",
|
|
1622
|
-
settingSources
|
|
1798
|
+
settingSources,
|
|
1623
1799
|
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
1624
1800
|
disallowedTools,
|
|
1625
1801
|
...(allowedTools.length > 0 ? { allowedTools } : {}),
|
|
1626
|
-
...(
|
|
1802
|
+
...(sdkMcpServers ? { mcpServers: sdkMcpServers } : {}),
|
|
1803
|
+
...(strictMcpConfig ? { strictMcpConfig: true } : {}),
|
|
1627
1804
|
betas: (
|
|
1628
1805
|
modelId.includes("sonnet")
|
|
1629
1806
|
|| modelId.includes("opus-4-7")
|
|
@@ -1954,6 +2131,8 @@ async function pumpSdkMessages(
|
|
|
1954
2131
|
const onExternalToolCall = (options as ClaudeCodeStreamOptions | undefined)?.onExternalToolCall;
|
|
1955
2132
|
const onExternalToolResult = (options as ClaudeCodeStreamOptions | undefined)?.onExternalToolResult;
|
|
1956
2133
|
const cwd = resolveClaudeCodeCwd(options);
|
|
2134
|
+
autoInitClaudeCodeWorkflowMcp(cwd);
|
|
2135
|
+
const gsdPhase = inferGsdPhaseFromContext(context);
|
|
1957
2136
|
const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
|
|
1958
2137
|
// When no UI is available (headless / auto-mode), auto-approve all
|
|
1959
2138
|
// tool requests. This replaces the old bypassPermissions workaround.
|
|
@@ -1966,6 +2145,7 @@ async function pumpSdkMessages(
|
|
|
1966
2145
|
{ permissionMode },
|
|
1967
2146
|
{
|
|
1968
2147
|
cwd,
|
|
2148
|
+
gsdPhase,
|
|
1969
2149
|
reasoning: options?.reasoning,
|
|
1970
2150
|
canUseTool: canUseToolFallback,
|
|
1971
2151
|
...(uiContext
|