@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
|
@@ -180,6 +180,35 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
|
|
|
180
180
|
assert.equal(row, undefined, "assessment row should not be written when verification classes are invalid");
|
|
181
181
|
});
|
|
182
182
|
|
|
183
|
+
it("reports all missing planned verification class rows at once", async () => {
|
|
184
|
+
base = makeTmpBase();
|
|
185
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
186
|
+
openDatabase(dbPath);
|
|
187
|
+
insertMilestone({
|
|
188
|
+
id: "M001",
|
|
189
|
+
planning: {
|
|
190
|
+
verificationContract: "Contract command exits 0",
|
|
191
|
+
verificationOperational: "Process lifecycle proof",
|
|
192
|
+
verificationUat: "Browser-observable UAT proof",
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
196
|
+
|
|
197
|
+
const result = await handleValidateMilestone(
|
|
198
|
+
{ ...VALID_PARAMS, verificationClasses: "| Check | Result |\n| --- | --- |\n| Generic verification | PASS |" },
|
|
199
|
+
base,
|
|
200
|
+
);
|
|
201
|
+
assert.ok("error" in result, "expected validation to fail");
|
|
202
|
+
assert.match(result.error, /canonical rows "Contract", "Operational", "UAT"/);
|
|
203
|
+
assert.match(result.error, /planned contract, operational, uat verification/);
|
|
204
|
+
|
|
205
|
+
const adapter = _getAdapter()!;
|
|
206
|
+
const row = adapter.prepare(
|
|
207
|
+
`SELECT status FROM assessments WHERE milestone_id = 'M001' AND scope = 'milestone-validation'`,
|
|
208
|
+
).get() as { status: string } | undefined;
|
|
209
|
+
assert.equal(row, undefined, "assessment row should not be written when verification classes are invalid");
|
|
210
|
+
});
|
|
211
|
+
|
|
183
212
|
it("accepts verificationClasses when planned Operational class is present", async () => {
|
|
184
213
|
base = makeTmpBase();
|
|
185
214
|
const dbPath = join(base, ".gsd", "gsd.db");
|
|
@@ -406,6 +435,110 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
|
|
|
406
435
|
assert.equal(result.verdict, "pass");
|
|
407
436
|
});
|
|
408
437
|
|
|
438
|
+
it("keeps pass when browser-like criteria are verified by runtime-executable UAT", async () => {
|
|
439
|
+
base = makeTmpBase();
|
|
440
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
441
|
+
openDatabase(dbPath);
|
|
442
|
+
insertMilestone({
|
|
443
|
+
id: "M001",
|
|
444
|
+
planning: {
|
|
445
|
+
successCriteria: [
|
|
446
|
+
"Clicking Mark All Complete sets all todos completed",
|
|
447
|
+
"Reload keeps completed state",
|
|
448
|
+
],
|
|
449
|
+
verificationUat: "Run the Node.js DOM-state script against the static app source.",
|
|
450
|
+
},
|
|
451
|
+
});
|
|
452
|
+
insertSlice({
|
|
453
|
+
id: "S01",
|
|
454
|
+
milestoneId: "M001",
|
|
455
|
+
// Uses localhost so hasBrowserRequiredText returns true and the gate is
|
|
456
|
+
// actually triggered before the runtime evidence bypasses it.
|
|
457
|
+
demo: "Visit localhost:3000 to verify DOM state after clicking Mark All Complete.",
|
|
458
|
+
});
|
|
459
|
+
const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
|
|
460
|
+
mkdirSync(sliceDir, { recursive: true });
|
|
461
|
+
writeFileSync(
|
|
462
|
+
join(sliceDir, "S01-ASSESSMENT.md"),
|
|
463
|
+
[
|
|
464
|
+
"---",
|
|
465
|
+
"sliceId: S01",
|
|
466
|
+
"uatType: runtime-executable",
|
|
467
|
+
"verdict: PASS",
|
|
468
|
+
"attempt: 1",
|
|
469
|
+
"---",
|
|
470
|
+
"# UAT Result - S01",
|
|
471
|
+
"",
|
|
472
|
+
"## Checks",
|
|
473
|
+
"",
|
|
474
|
+
"| Check | Mode | Result | Evidence | Notes |",
|
|
475
|
+
"|-------|------|--------|----------|-------|",
|
|
476
|
+
"| DOM-state script | runtime | PASS | gsd_uat_exec:.gsd/evidence/uat/M001/S01/dom-state.json | Runtime assertion verified completed state and reload persistence. |",
|
|
477
|
+
"",
|
|
478
|
+
].join("\n"),
|
|
479
|
+
"utf-8",
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
const result = await handleValidateMilestone(
|
|
483
|
+
{
|
|
484
|
+
...VALID_PARAMS,
|
|
485
|
+
verificationClasses:
|
|
486
|
+
`${VALID_PARAMS.verificationClasses}\n| UAT | Runtime executable UAT verified static-app behavior. |`,
|
|
487
|
+
},
|
|
488
|
+
base,
|
|
489
|
+
);
|
|
490
|
+
|
|
491
|
+
assert.ok(!("error" in result), `unexpected error: ${"error" in result ? result.error : ""}`);
|
|
492
|
+
assert.equal(result.verdict, "pass");
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
it("downgrades to needs-attention when only one of two browser-requiring slices has runtime evidence", async () => {
|
|
496
|
+
base = makeTmpBase();
|
|
497
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
498
|
+
openDatabase(dbPath);
|
|
499
|
+
insertMilestone({ id: "M001" });
|
|
500
|
+
insertSlice({
|
|
501
|
+
id: "S01",
|
|
502
|
+
milestoneId: "M001",
|
|
503
|
+
demo: "Visit localhost:3000 to verify DOM state.",
|
|
504
|
+
});
|
|
505
|
+
insertSlice({
|
|
506
|
+
id: "S02",
|
|
507
|
+
milestoneId: "M001",
|
|
508
|
+
demo: "Visit localhost:3000 to confirm persistence after reload.",
|
|
509
|
+
});
|
|
510
|
+
// S01 has runtime-executable evidence; S02 has none.
|
|
511
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
512
|
+
writeFileSync(
|
|
513
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-ASSESSMENT.md"),
|
|
514
|
+
[
|
|
515
|
+
"---",
|
|
516
|
+
"sliceId: S01",
|
|
517
|
+
"uatType: runtime-executable",
|
|
518
|
+
"verdict: PASS",
|
|
519
|
+
"---",
|
|
520
|
+
"| DOM check | runtime | PASS | gsd_uat_exec:.gsd/evidence/uat/M001/S01/dom.json | Verified. |",
|
|
521
|
+
"",
|
|
522
|
+
].join("\n"),
|
|
523
|
+
"utf-8",
|
|
524
|
+
);
|
|
525
|
+
|
|
526
|
+
const result = await handleValidateMilestone(
|
|
527
|
+
{
|
|
528
|
+
...VALID_PARAMS,
|
|
529
|
+
verificationClasses: `${VALID_PARAMS.verificationClasses}\n| UAT | S01 runtime verified; S02 still needs evidence. |`,
|
|
530
|
+
},
|
|
531
|
+
base,
|
|
532
|
+
);
|
|
533
|
+
|
|
534
|
+
assert.ok(!("error" in result), `unexpected error: ${"error" in result ? result.error : ""}`);
|
|
535
|
+
assert.equal(
|
|
536
|
+
result.verdict,
|
|
537
|
+
"needs-attention",
|
|
538
|
+
"S01 runtime evidence must not bypass the gate for S02 which has browser requirements but no evidence",
|
|
539
|
+
);
|
|
540
|
+
});
|
|
541
|
+
|
|
409
542
|
it("ignores slice full_uat_md planning text for browser requirement detection", async () => {
|
|
410
543
|
base = makeTmpBase();
|
|
411
544
|
const dbPath = join(base, ".gsd", "gsd.db");
|
|
@@ -54,6 +54,8 @@ test("validation block allows recovery, diagnostics, and unrelated commands", ()
|
|
|
54
54
|
"status",
|
|
55
55
|
"verdict pass --rationale ok",
|
|
56
56
|
"validate-milestone",
|
|
57
|
+
"dispatch reassess",
|
|
58
|
+
"dispatch reassess-roadmap",
|
|
57
59
|
"dispatch validate",
|
|
58
60
|
"dispatch validate-milestone",
|
|
59
61
|
"park M006",
|
|
@@ -122,3 +124,22 @@ test("validation block message includes attempted command and recovery options",
|
|
|
122
124
|
assert.match(message, /\/gsd verdict pass --rationale/);
|
|
123
125
|
assert.match(message, /\/gsd park M006/);
|
|
124
126
|
});
|
|
127
|
+
|
|
128
|
+
test("validation block message can guide remediation through dispatch reassess", () => {
|
|
129
|
+
const message = formatValidationBlockedMessage({
|
|
130
|
+
...blockedState(),
|
|
131
|
+
blockers: [
|
|
132
|
+
[
|
|
133
|
+
"Milestone M006 is blocked because milestone validation returned needs-remediation, but all slices are complete.",
|
|
134
|
+
"Fix options:",
|
|
135
|
+
"1. Run `/gsd dispatch reassess` to add remediation slices, then run `/gsd auto`",
|
|
136
|
+
"2. If the finding is acceptable, override it: `/gsd verdict pass --rationale \"why this is okay\"`",
|
|
137
|
+
"3. If this should wait, defer it explicitly: `/gsd park M006`",
|
|
138
|
+
].join("\n"),
|
|
139
|
+
],
|
|
140
|
+
}, "auto");
|
|
141
|
+
|
|
142
|
+
assert.ok(message);
|
|
143
|
+
assert.match(message, /\/gsd dispatch reassess/);
|
|
144
|
+
assert.doesNotMatch(message, /gsd_reassess_roadmap/);
|
|
145
|
+
});
|
|
@@ -35,6 +35,20 @@ function makeTempDir(prefix: string): string {
|
|
|
35
35
|
return dir;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
function withRtkDisabled<T>(callback: () => T): T {
|
|
39
|
+
const previous = process.env.GSD_RTK_DISABLED;
|
|
40
|
+
process.env.GSD_RTK_DISABLED = "1";
|
|
41
|
+
try {
|
|
42
|
+
return callback();
|
|
43
|
+
} finally {
|
|
44
|
+
if (previous === undefined) {
|
|
45
|
+
delete process.env.GSD_RTK_DISABLED;
|
|
46
|
+
} else {
|
|
47
|
+
process.env.GSD_RTK_DISABLED = previous;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
38
52
|
// ─── Discovery Tests ─────────────────────────────────────────────────────────
|
|
39
53
|
|
|
40
54
|
describe("verification-gate: discovery", () => {
|
|
@@ -430,6 +444,38 @@ describe("verification-gate: execution", () => {
|
|
|
430
444
|
assert.ok(result.checks[1].stderr.includes("err"));
|
|
431
445
|
});
|
|
432
446
|
|
|
447
|
+
test("grep -c zero-match failure includes absence-check warning", () => {
|
|
448
|
+
writeFileSync(join(tmp, "sample.txt"), "present\n");
|
|
449
|
+
|
|
450
|
+
const result = withRtkDisabled(() => runVerificationGate({
|
|
451
|
+
cwd: tmp,
|
|
452
|
+
preferenceCommands: ["grep -c missing sample.txt"],
|
|
453
|
+
}));
|
|
454
|
+
|
|
455
|
+
assert.equal(result.passed, false);
|
|
456
|
+
assert.equal(result.checks.length, 1);
|
|
457
|
+
assert.equal(result.checks[0].exitCode, 1);
|
|
458
|
+
assert.equal(result.checks[0].stdout.trim(), "0");
|
|
459
|
+
assert.match(result.checks[0].stderr, /grep -c/);
|
|
460
|
+
assert.match(result.checks[0].stderr, /count=0/);
|
|
461
|
+
assert.match(result.checks[0].stderr, /! grep -q/);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
test("grep -c matching count does not warn", () => {
|
|
465
|
+
writeFileSync(join(tmp, "sample.txt"), "present\n");
|
|
466
|
+
|
|
467
|
+
const result = withRtkDisabled(() => runVerificationGate({
|
|
468
|
+
cwd: tmp,
|
|
469
|
+
preferenceCommands: ["grep -c present sample.txt"],
|
|
470
|
+
}));
|
|
471
|
+
|
|
472
|
+
assert.equal(result.passed, true);
|
|
473
|
+
assert.equal(result.checks.length, 1);
|
|
474
|
+
assert.equal(result.checks[0].exitCode, 0);
|
|
475
|
+
assert.equal(result.checks[0].stdout.trim(), "1");
|
|
476
|
+
assert.equal(result.checks[0].stderr, "");
|
|
477
|
+
});
|
|
478
|
+
|
|
433
479
|
test("no commands discovered → gate passes with 0 checks", () => {
|
|
434
480
|
const result = runVerificationGate({
|
|
435
481
|
cwd: tmp,
|
|
@@ -686,6 +732,11 @@ test("isLikelyCommand: bash negation with known command is accepted", () => {
|
|
|
686
732
|
assert.equal(isLikelyCommand("! grep needle file.txt"), true);
|
|
687
733
|
});
|
|
688
734
|
|
|
735
|
+
test("validateVerificationCommand accepts negated quiet absence checks", () => {
|
|
736
|
+
assert.equal(validateVerificationCommand("! grep -q needle file.txt").ok, true);
|
|
737
|
+
assert.equal(validateVerificationCommand("! rg -q needle file.txt").ok, true);
|
|
738
|
+
});
|
|
739
|
+
|
|
689
740
|
test("validateVerificationCommand allows shell pipelines", () => {
|
|
690
741
|
assert.deepEqual(validateVerificationCommand("python3 -m pytest tests/ -q --tb=short").ok, true);
|
|
691
742
|
const result = validateVerificationCommand("python3 -m pytest tests/ -q --tb=short | tail -5");
|
|
@@ -19,6 +19,14 @@ test("shouldAutoPrepareWorkflowMcp enables prep for externalCli local transport"
|
|
|
19
19
|
assert.equal(result, true);
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
+
test("shouldAutoPrepareWorkflowMcp enables prep when Claude Code provider is known before auth mode settles", () => {
|
|
23
|
+
const result = shouldAutoPrepareWorkflowMcp({
|
|
24
|
+
model: { provider: "claude-code", baseUrl: "local://claude-code" },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
assert.equal(result, true);
|
|
28
|
+
});
|
|
29
|
+
|
|
22
30
|
test("prepareWorkflowMcpForProject uses the selected unit model when session provider differs", (t) => {
|
|
23
31
|
const projectRoot = mkdtempSync(join(tmpdir(), "gsd-mcp-unit-model-"));
|
|
24
32
|
const notifications: Array<{ message: string; level: "info" | "warning" | "error" | "success" }> = [];
|
|
@@ -46,7 +54,7 @@ test("prepareWorkflowMcpForProject uses the selected unit model when session pro
|
|
|
46
54
|
|
|
47
55
|
assert.equal(result?.status, "created");
|
|
48
56
|
assert.equal(existsSync(join(projectRoot, ".mcp.json")), true);
|
|
49
|
-
assert.match(notifications.map((entry) => entry.message).join("\n"), /
|
|
57
|
+
assert.match(notifications.map((entry) => entry.message).join("\n"), /GSD MCP Server Prepared/);
|
|
50
58
|
});
|
|
51
59
|
|
|
52
60
|
test("shouldAutoPrepareWorkflowMcp stays disabled for non-Claude active provider even when claude-code is ready", () => {
|
|
@@ -163,7 +171,14 @@ test("before_agent_start auto-prepares project workflow MCP for Claude Code CLI"
|
|
|
163
171
|
};
|
|
164
172
|
assert.ok(parsed.mcpServers?.[GSD_WORKFLOW_MCP_SERVER_NAME]);
|
|
165
173
|
assert.ok(parsed.mcpServers?.[GSD_BROWSER_MCP_SERVER_NAME]);
|
|
166
|
-
|
|
174
|
+
const settings = JSON.parse(readFileSync(join(projectRoot, ".claude", "settings.local.json"), "utf-8")) as {
|
|
175
|
+
enabledMcpjsonServers?: string[];
|
|
176
|
+
};
|
|
177
|
+
assert.deepEqual(settings.enabledMcpjsonServers, [
|
|
178
|
+
GSD_WORKFLOW_MCP_SERVER_NAME,
|
|
179
|
+
GSD_BROWSER_MCP_SERVER_NAME,
|
|
180
|
+
]);
|
|
181
|
+
assert.match(notifications.join("\n"), /GSD MCP Server Prepared/);
|
|
167
182
|
});
|
|
168
183
|
|
|
169
184
|
test("before_agent_start returns discovered skill fallback without project .gsd", async (t) => {
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
executeSliceComplete,
|
|
31
31
|
executeSliceReopen,
|
|
32
32
|
executeValidateMilestone,
|
|
33
|
+
executeUatResultSave,
|
|
33
34
|
} from "../tools/workflow-tool-executors.ts";
|
|
34
35
|
|
|
35
36
|
function makeTmpBase(): string {
|
|
@@ -234,6 +235,62 @@ test("executeTaskComplete derives missing verification from evidence", async ()
|
|
|
234
235
|
}
|
|
235
236
|
});
|
|
236
237
|
|
|
238
|
+
test("executeTaskComplete surfaces escalation questions and metadata", async () => {
|
|
239
|
+
const base = makeTmpBase();
|
|
240
|
+
try {
|
|
241
|
+
openTestDb(base);
|
|
242
|
+
writeFileSync(join(base, ".gsd", "PREFERENCES.md"), [
|
|
243
|
+
"---",
|
|
244
|
+
"version: 1",
|
|
245
|
+
"phases:",
|
|
246
|
+
" mid_execution_escalation: true",
|
|
247
|
+
"---",
|
|
248
|
+
].join("\n"));
|
|
249
|
+
const planDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
|
|
250
|
+
mkdirSync(planDir, { recursive: true });
|
|
251
|
+
writeFileSync(join(planDir, "S01-PLAN.md"), "# S01\n\n- [ ] **T01: Demo** `est:5m`\n");
|
|
252
|
+
|
|
253
|
+
const result = await inProjectDir(base, () => executeTaskComplete({
|
|
254
|
+
milestoneId: "M001",
|
|
255
|
+
sliceId: "S01",
|
|
256
|
+
taskId: "T01",
|
|
257
|
+
oneLiner: "Completed task",
|
|
258
|
+
narrative: "Did the work but found an ambiguity.",
|
|
259
|
+
verification: "npm test",
|
|
260
|
+
escalation: {
|
|
261
|
+
question: "Should the cache use write-through or write-back?",
|
|
262
|
+
options: [
|
|
263
|
+
{ id: "A", label: "Write-through", tradeoffs: "Simpler reads; slower writes." },
|
|
264
|
+
{ id: "B", label: "Write-back", tradeoffs: "Faster writes; more flush complexity." },
|
|
265
|
+
],
|
|
266
|
+
recommendation: "A",
|
|
267
|
+
recommendationRationale: "Current usage favors correctness over write latency.",
|
|
268
|
+
continueWithDefault: true,
|
|
269
|
+
},
|
|
270
|
+
}, base));
|
|
271
|
+
|
|
272
|
+
assert.equal(result.details.operation, "complete_task");
|
|
273
|
+
assert.match(
|
|
274
|
+
String(result.content[0]?.text),
|
|
275
|
+
/Task completed with escalation decision required: Should the cache use write-through or write-back\?/,
|
|
276
|
+
);
|
|
277
|
+
assert.match(String(result.content[0]?.text), /Resolve with: \/gsd escalate resolve T01/);
|
|
278
|
+
assert.equal((result.details.escalation as { question?: string }).question, "Should the cache use write-through or write-back?");
|
|
279
|
+
|
|
280
|
+
const db = _getAdapter();
|
|
281
|
+
assert.ok(db, "DB should be open");
|
|
282
|
+
const row = db!.prepare(
|
|
283
|
+
"SELECT escalation_pending, escalation_awaiting_review, escalation_artifact_path FROM tasks WHERE milestone_id = ? AND slice_id = ? AND id = ?",
|
|
284
|
+
).get("M001", "S01", "T01") as Record<string, unknown> | undefined;
|
|
285
|
+
assert.equal(row?.escalation_pending, 0);
|
|
286
|
+
assert.equal(row?.escalation_awaiting_review, 1);
|
|
287
|
+
assert.ok(String(row?.escalation_artifact_path ?? "").endsWith("T01-ESCALATION.json"));
|
|
288
|
+
} finally {
|
|
289
|
+
closeDatabase();
|
|
290
|
+
cleanup(base);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
|
|
237
294
|
test("executeTaskComplete returns a tool error when verification cannot be derived", async () => {
|
|
238
295
|
const base = makeTmpBase();
|
|
239
296
|
try {
|
|
@@ -504,6 +561,162 @@ test("executePlanSlice marks validation failures with isError", async () => {
|
|
|
504
561
|
}
|
|
505
562
|
});
|
|
506
563
|
|
|
564
|
+
test("executeUatResultSave accepts gsd_uat_exec evidence written in a milestone worktree", async () => {
|
|
565
|
+
const base = makeTmpBase();
|
|
566
|
+
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
567
|
+
const worktreeExecDir = join(worktree, ".gsd", "exec");
|
|
568
|
+
const browserTimelineDir = join(base, ".artifacts", "browser", "session");
|
|
569
|
+
const evidenceId = "worktree-uat-evidence";
|
|
570
|
+
const browserTimelinePath = join(browserTimelineDir, "s02-uat-browser-timeline.json");
|
|
571
|
+
try {
|
|
572
|
+
openTestDb(base);
|
|
573
|
+
seedMilestone("M001", "Milestone One");
|
|
574
|
+
seedSlice("M001", "S02", "complete");
|
|
575
|
+
mkdirSync(worktreeExecDir, { recursive: true });
|
|
576
|
+
mkdirSync(browserTimelineDir, { recursive: true });
|
|
577
|
+
writeFileSync(browserTimelinePath, JSON.stringify({ summary: "browser timeline evidence" }), "utf-8");
|
|
578
|
+
writeFileSync(
|
|
579
|
+
join(worktreeExecDir, `${evidenceId}.meta.json`),
|
|
580
|
+
JSON.stringify({
|
|
581
|
+
id: evidenceId,
|
|
582
|
+
metadata: {
|
|
583
|
+
kind: "uat_exec",
|
|
584
|
+
milestoneId: "M001",
|
|
585
|
+
sliceId: "S02",
|
|
586
|
+
checkId: "UAT-01",
|
|
587
|
+
intent: "uat-runtime-check",
|
|
588
|
+
},
|
|
589
|
+
}),
|
|
590
|
+
"utf-8",
|
|
591
|
+
);
|
|
592
|
+
|
|
593
|
+
const result = await inProjectDir(worktree, () => executeUatResultSave({
|
|
594
|
+
milestoneId: "M001",
|
|
595
|
+
sliceId: "S02",
|
|
596
|
+
uatType: "runtime-executable",
|
|
597
|
+
verdict: "PASS",
|
|
598
|
+
checks: [{
|
|
599
|
+
id: "UAT-01",
|
|
600
|
+
description: "Runtime path C:\\tmp|uat evidence was captured in the active worktree",
|
|
601
|
+
mode: "runtime",
|
|
602
|
+
result: "PASS",
|
|
603
|
+
evidence: [
|
|
604
|
+
{ kind: "gsd_uat_exec", ref: evidenceId },
|
|
605
|
+
{ kind: "browser", ref: browserTimelinePath },
|
|
606
|
+
],
|
|
607
|
+
notes: "Worktree-local gsd_uat_exec metadata should resolve with backslash \\ and pipe |.",
|
|
608
|
+
}],
|
|
609
|
+
presentation: {
|
|
610
|
+
surface: "mcp",
|
|
611
|
+
presentedTools: [
|
|
612
|
+
"gsd_uat_exec",
|
|
613
|
+
"gsd_uat_result_save",
|
|
614
|
+
"gsd_resume",
|
|
615
|
+
"gsd_milestone_status",
|
|
616
|
+
"gsd_journal_query",
|
|
617
|
+
],
|
|
618
|
+
blockedTools: [
|
|
619
|
+
{ name: "gsd_exec", reason: "forbidden during run-uat" },
|
|
620
|
+
{ name: "gsd_summary_save", reason: "forbidden during run-uat" },
|
|
621
|
+
{ name: "gsd_save_gate_result", reason: "forbidden during run-uat" },
|
|
622
|
+
],
|
|
623
|
+
},
|
|
624
|
+
notes: "UAT passed with worktree-local evidence.",
|
|
625
|
+
}, worktree));
|
|
626
|
+
|
|
627
|
+
assert.equal(result.isError, undefined);
|
|
628
|
+
assert.equal(result.details.operation, "save_uat_result");
|
|
629
|
+
assert.equal(result.details.verdict, "PASS");
|
|
630
|
+
assert.ok(
|
|
631
|
+
existsSync(join(base, ".gsd", "uat", "M001", "S02", "attempt-1.json")),
|
|
632
|
+
"attempt JSON should be persisted under the authoritative project .gsd",
|
|
633
|
+
);
|
|
634
|
+
const assessment = readFileSync(
|
|
635
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S02", "S02-ASSESSMENT.md"),
|
|
636
|
+
"utf-8",
|
|
637
|
+
);
|
|
638
|
+
assert.match(assessment, /Runtime path C:\\\\tmp\\\|uat evidence/);
|
|
639
|
+
assert.match(assessment, /backslash \\\\ and pipe \\\|/);
|
|
640
|
+
} finally {
|
|
641
|
+
closeDatabase();
|
|
642
|
+
cleanup(base);
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
test("executeUatResultSave rejects artifact-driven PASS with human follow-up checks", async () => {
|
|
647
|
+
const base = makeTmpBase();
|
|
648
|
+
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
649
|
+
const evidenceId = "uat-artifact-nonautomatable";
|
|
650
|
+
const worktreeExecDir = join(worktree, ".gsd", "exec");
|
|
651
|
+
try {
|
|
652
|
+
openTestDb(base);
|
|
653
|
+
seedMilestone("M001", "Milestone One");
|
|
654
|
+
seedSlice("M001", "S01", "complete");
|
|
655
|
+
mkdirSync(worktreeExecDir, { recursive: true });
|
|
656
|
+
writeFileSync(
|
|
657
|
+
join(worktreeExecDir, `${evidenceId}.meta.json`),
|
|
658
|
+
JSON.stringify({
|
|
659
|
+
id: evidenceId,
|
|
660
|
+
metadata: {
|
|
661
|
+
kind: "uat_exec",
|
|
662
|
+
milestoneId: "M001",
|
|
663
|
+
sliceId: "S01",
|
|
664
|
+
checkId: "UAT-01",
|
|
665
|
+
intent: "uat-artifact-check",
|
|
666
|
+
},
|
|
667
|
+
}),
|
|
668
|
+
"utf-8",
|
|
669
|
+
);
|
|
670
|
+
|
|
671
|
+
const result = await inProjectDir(worktree, () => executeUatResultSave({
|
|
672
|
+
milestoneId: "M001",
|
|
673
|
+
sliceId: "S01",
|
|
674
|
+
uatType: "artifact-driven",
|
|
675
|
+
verdict: "PASS",
|
|
676
|
+
checks: [
|
|
677
|
+
{
|
|
678
|
+
id: "UAT-01",
|
|
679
|
+
description: "Static contract passes",
|
|
680
|
+
mode: "artifact",
|
|
681
|
+
result: "PASS",
|
|
682
|
+
evidence: [{ kind: "gsd_uat_exec", ref: evidenceId }],
|
|
683
|
+
notes: "Artifact check passed.",
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
id: "UAT-02",
|
|
687
|
+
description: "Browser polish is deferred to the next slice",
|
|
688
|
+
mode: "human-follow-up",
|
|
689
|
+
result: "NEEDS-HUMAN",
|
|
690
|
+
notes: "Out of scope for this artifact-driven UAT.",
|
|
691
|
+
nonAutomatable: true,
|
|
692
|
+
},
|
|
693
|
+
],
|
|
694
|
+
presentation: {
|
|
695
|
+
surface: "mcp",
|
|
696
|
+
presentedTools: [
|
|
697
|
+
"gsd_uat_exec",
|
|
698
|
+
"gsd_uat_result_save",
|
|
699
|
+
"gsd_resume",
|
|
700
|
+
"gsd_milestone_status",
|
|
701
|
+
"gsd_journal_query",
|
|
702
|
+
],
|
|
703
|
+
blockedTools: [
|
|
704
|
+
{ name: "gsd_exec", reason: "forbidden during run-uat" },
|
|
705
|
+
{ name: "gsd_summary_save", reason: "forbidden during run-uat" },
|
|
706
|
+
{ name: "gsd_save_gate_result", reason: "forbidden during run-uat" },
|
|
707
|
+
],
|
|
708
|
+
},
|
|
709
|
+
notes: "UAT passed; non-automatable browser polish is deferred.",
|
|
710
|
+
}, worktree));
|
|
711
|
+
|
|
712
|
+
assert.equal(result.isError, true);
|
|
713
|
+
assert.match(String(result.content[0]?.text), /artifact-driven UAT cannot PASS with human-only checks/);
|
|
714
|
+
} finally {
|
|
715
|
+
closeDatabase();
|
|
716
|
+
cleanup(base);
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
|
|
507
720
|
test("executeSliceComplete coerces string enrichment entries and writes summary/UAT artifacts", async () => {
|
|
508
721
|
const base = makeTmpBase();
|
|
509
722
|
try {
|
|
@@ -27,6 +27,10 @@ const PLANNING_DISPATCH_REVIEW: ToolsPolicy = {
|
|
|
27
27
|
const READ_ONLY: ToolsPolicy = { mode: 'read-only' };
|
|
28
28
|
const ALL: ToolsPolicy = { mode: 'all' };
|
|
29
29
|
const VERIFICATION: ToolsPolicy = { mode: 'verification' };
|
|
30
|
+
const VERIFICATION_UAT: ToolsPolicy = {
|
|
31
|
+
mode: 'verification',
|
|
32
|
+
allowedSubagents: ['mnemo', 'scout', 'reviewer', 'tester'],
|
|
33
|
+
};
|
|
30
34
|
const DOCS: ToolsPolicy = {
|
|
31
35
|
mode: 'docs',
|
|
32
36
|
allowedPathGlobs: ['docs/**', 'README.md', 'README.*.md', 'CHANGELOG.md', '*.md'],
|
|
@@ -469,6 +473,27 @@ test('verification-mode: run-uat still blocks subagent dispatch', () => {
|
|
|
469
473
|
assert.match(r.reason!, /subagent dispatch is not permitted/);
|
|
470
474
|
});
|
|
471
475
|
|
|
476
|
+
test('verification-mode: run-uat allows explicit UAT specialist subagents', () => {
|
|
477
|
+
for (const agent of ['mnemo', 'scout', 'reviewer', 'tester']) {
|
|
478
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'run-uat', VERIFICATION_UAT, [agent]);
|
|
479
|
+
assert.strictEqual(r.block, false, `expected ${agent} to be allowed: ${r.reason}`);
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
test('verification-mode: run-uat blocks implementation-tier subagents', () => {
|
|
484
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'run-uat', VERIFICATION_UAT, ['worker']);
|
|
485
|
+
assert.strictEqual(r.block, true);
|
|
486
|
+
assert.match(r.reason!, /"worker"/);
|
|
487
|
+
assert.match(r.reason!, /read-only specialists/);
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
test('verification-mode: run-uat blocks read-only specialists not listed by policy', () => {
|
|
491
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'run-uat', VERIFICATION_UAT, ['security']);
|
|
492
|
+
assert.strictEqual(r.block, true);
|
|
493
|
+
assert.match(r.reason!, /"security"/);
|
|
494
|
+
assert.match(r.reason!, /ToolsPolicy\.allowedSubagents|permitted agents for this unit/);
|
|
495
|
+
});
|
|
496
|
+
|
|
472
497
|
// ─── read-only mode ───────────────────────────────────────────────────────
|
|
473
498
|
|
|
474
499
|
test('read-only: blocks any edit even to .gsd/', () => {
|