@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.75048e7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +3 -2
- package/dist/help-text.js +10 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
- package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
- package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/dist/resources/extensions/browser-tools/index.js +57 -9
- package/dist/resources/extensions/browser-tools/package.json +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
- package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
- package/dist/resources/extensions/gsd/auto/phases.js +4 -3
- package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
- package/dist/resources/extensions/gsd/auto-dispatch.js +55 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +72 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +7 -8
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +94 -15
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +18 -65
- package/dist/resources/extensions/gsd/auto-worktree.js +18 -5
- package/dist/resources/extensions/gsd/auto.js +31 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -4
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +56 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +33 -38
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +61 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
- package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
- package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
- package/dist/resources/extensions/gsd/config-overlay.js +2 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
- package/dist/resources/extensions/gsd/error-classifier.js +2 -1
- package/dist/resources/extensions/gsd/escalation.js +4 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
- package/dist/resources/extensions/gsd/forensics.js +74 -2
- package/dist/resources/extensions/gsd/gsd-db.js +42 -6
- package/dist/resources/extensions/gsd/guided-flow.js +119 -176
- package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
- package/dist/resources/extensions/gsd/memory-store.js +4 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
- package/dist/resources/extensions/gsd/milestone-closeout.js +3 -1
- package/dist/resources/extensions/gsd/pending-auto-start.js +0 -1
- package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/dist/resources/extensions/gsd/prompts/system.md +3 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/dist/resources/extensions/gsd/recovery-classification.js +20 -0
- package/dist/resources/extensions/gsd/rule-registry.js +428 -52
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
- package/dist/resources/extensions/gsd/skill-activation.js +20 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
- package/dist/resources/extensions/gsd/state.js +17 -14
- package/dist/resources/extensions/gsd/templates/plan.md +3 -1
- package/dist/resources/extensions/gsd/tool-contract.js +5 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +143 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +483 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +169 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
- package/dist/resources/extensions/gsd/verification-gate.js +72 -1
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
- package/dist/resources/extensions/gsd/workflow-mcp.js +5 -73
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
- package/dist/resources/extensions/mcp-client/manager.js +31 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
- package/dist/rtk.d.ts +7 -1
- package/dist/rtk.js +27 -11
- package/dist/update-check.d.ts +15 -1
- package/dist/update-check.js +87 -12
- package/dist/update-cmd.d.ts +1 -0
- package/dist/update-cmd.js +53 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +5 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +32 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/index.d.ts +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +1 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
- package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
- package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
- package/packages/gsd-agent-core/package.json +6 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
- package/packages/mcp-server/dist/remote-questions.js +23 -9
- package/packages/mcp-server/dist/remote-questions.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +84 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +42 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js +3 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +6 -1
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/api-registry.d.ts +2 -0
- package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
- package/packages/pi-ai/dist/api-registry.js +23 -0
- package/packages/pi-ai/dist/api-registry.js.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +15 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +411 -39
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +504 -153
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/stream.js +6 -6
- package/packages/pi-ai/dist/stream.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +2 -2
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js +6 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/terminal.d.ts +1 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +8 -4
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
- package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/src/resources/extensions/browser-tools/index.ts +60 -9
- package/src/resources/extensions/browser-tools/package.json +5 -1
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
- package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +5 -3
- package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
- package/src/resources/extensions/gsd/auto-dispatch.ts +67 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +106 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -7
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
- package/src/resources/extensions/gsd/auto-start.ts +112 -17
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -73
- package/src/resources/extensions/gsd/auto-worktree.ts +23 -5
- package/src/resources/extensions/gsd/auto.ts +47 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +96 -4
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +81 -25
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +70 -63
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +137 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
- package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
- package/src/resources/extensions/gsd/config-overlay.ts +3 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
- package/src/resources/extensions/gsd/error-classifier.ts +2 -1
- package/src/resources/extensions/gsd/escalation.ts +4 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
- package/src/resources/extensions/gsd/forensics.ts +99 -5
- package/src/resources/extensions/gsd/gsd-db.ts +46 -8
- package/src/resources/extensions/gsd/guided-flow.ts +215 -217
- package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
- package/src/resources/extensions/gsd/memory-store.ts +4 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +3 -1
- package/src/resources/extensions/gsd/pending-auto-start.ts +0 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/src/resources/extensions/gsd/prompts/system.md +3 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/src/resources/extensions/gsd/recovery-classification.ts +20 -0
- package/src/resources/extensions/gsd/rule-registry.ts +558 -58
- package/src/resources/extensions/gsd/rule-types.ts +2 -0
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
- package/src/resources/extensions/gsd/skill-activation.ts +20 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
- package/src/resources/extensions/gsd/state.ts +18 -14
- package/src/resources/extensions/gsd/templates/plan.md +3 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +9 -15
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +26 -16
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +31 -79
- package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +40 -4
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +72 -10
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +83 -1
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +493 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
- package/src/resources/extensions/gsd/tool-contract.ts +6 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +589 -8
- package/src/resources/extensions/gsd/types.ts +69 -5
- package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +186 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
- package/src/resources/extensions/gsd/verification-gate.ts +87 -1
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
- package/src/resources/extensions/gsd/workflow-mcp.ts +5 -73
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
- package/src/resources/extensions/mcp-client/manager.ts +33 -1
- package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +0 -246
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +0 -218
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_ssgManifest.js +0 -0
|
@@ -4,8 +4,11 @@
|
|
|
4
4
|
import assert from "node:assert/strict";
|
|
5
5
|
import test from "node:test";
|
|
6
6
|
|
|
7
|
+
import { registerToolCompatibility } from "@gsd/pi-coding-agent";
|
|
8
|
+
|
|
7
9
|
import { DISCUSS_TOOLS_ALLOWLIST } from "../constants.ts";
|
|
8
10
|
import { buildMinimalAutoGsdToolSet, buildMinimalGsdToolSet, buildMinimalGsdWorkflowToolSet, buildRequestScopedGsdToolSet, MINIMAL_AUTO_BASE_TOOL_NAMES, MINIMAL_GSD_TOOL_NAMES, requestHasGsdCustomType, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "../bootstrap/register-hooks.ts";
|
|
11
|
+
import { filterToolsForProvider } from "../model-router.ts";
|
|
9
12
|
import { applyUnitSkillVisibility } from "../skill-scope.ts";
|
|
10
13
|
|
|
11
14
|
test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surface", () => {
|
|
@@ -31,7 +34,7 @@ test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surf
|
|
|
31
34
|
for (const toolName of MINIMAL_GSD_TOOL_NAMES) {
|
|
32
35
|
assert.ok(result.includes(toolName), `expected ${toolName}`);
|
|
33
36
|
}
|
|
34
|
-
assert.ok(
|
|
37
|
+
assert.ok(result.includes("gsd_plan_milestone"));
|
|
35
38
|
assert.ok(!result.includes("gsd_task_complete"));
|
|
36
39
|
assert.ok(!result.includes("gsd_graph"));
|
|
37
40
|
});
|
|
@@ -98,22 +101,39 @@ test("buildMinimalAutoGsdToolSet keeps unit-specific completion tools without al
|
|
|
98
101
|
assert.ok(!result.includes("gsd_complete_slice"));
|
|
99
102
|
});
|
|
100
103
|
|
|
101
|
-
test("buildMinimalAutoGsdToolSet
|
|
102
|
-
|
|
103
|
-
// tools stay registered. run-uat must still get them: resolution reads the
|
|
104
|
-
// full registry, not just the (browser-stripped) active set.
|
|
105
|
-
const active = ["ask_user_questions", "bash", "read", "gsd_summary_save"];
|
|
104
|
+
test("buildMinimalAutoGsdToolSet scopes run-uat to UAT-specific and read-only tools", () => {
|
|
105
|
+
const active = ["ask_user_questions", "bash", "read", "edit", "write", "gsd_summary_save"];
|
|
106
106
|
const registered = [
|
|
107
107
|
...active,
|
|
108
|
+
"gsd_uat_exec",
|
|
109
|
+
"gsd_uat_result_save",
|
|
110
|
+
"gsd_resume",
|
|
111
|
+
"gsd_milestone_status",
|
|
112
|
+
"gsd_journal_query",
|
|
113
|
+
"gsd_exec",
|
|
114
|
+
"gsd_save_gate_result",
|
|
115
|
+
"search-the-web",
|
|
108
116
|
"browser_navigate",
|
|
109
117
|
"browser_click",
|
|
110
118
|
"browser_snapshot_refs",
|
|
111
|
-
"gsd_exec",
|
|
112
119
|
];
|
|
113
120
|
const result = buildMinimalAutoGsdToolSet(active, "run-uat", registered);
|
|
121
|
+
assert.ok(result.includes("gsd_uat_exec"));
|
|
122
|
+
assert.ok(result.includes("gsd_uat_result_save"));
|
|
123
|
+
assert.ok(result.includes("gsd_resume"));
|
|
124
|
+
assert.ok(result.includes("gsd_milestone_status"));
|
|
125
|
+
assert.ok(result.includes("gsd_journal_query"));
|
|
126
|
+
assert.ok(result.includes("read"));
|
|
114
127
|
assert.ok(result.includes("browser_navigate"), "run-uat needs browser_navigate");
|
|
115
128
|
assert.ok(result.includes("browser_click"), "run-uat needs browser_click");
|
|
116
|
-
assert.ok(result.includes("
|
|
129
|
+
assert.ok(!result.includes("ToolSearch"));
|
|
130
|
+
assert.ok(!result.includes("bash"));
|
|
131
|
+
assert.ok(!result.includes("edit"));
|
|
132
|
+
assert.ok(!result.includes("write"));
|
|
133
|
+
assert.ok(!result.includes("gsd_exec"));
|
|
134
|
+
assert.ok(!result.includes("gsd_summary_save"));
|
|
135
|
+
assert.ok(!result.includes("gsd_save_gate_result"));
|
|
136
|
+
assert.ok(!result.includes("search-the-web"));
|
|
117
137
|
});
|
|
118
138
|
|
|
119
139
|
test("buildMinimalAutoGsdToolSet keeps only the auto base non-GSD tools", () => {
|
|
@@ -175,17 +195,27 @@ test("buildMinimalAutoGsdToolSet re-injects registered base tools filtered from
|
|
|
175
195
|
assert.ok(result.includes("search-the-web"));
|
|
176
196
|
});
|
|
177
197
|
|
|
178
|
-
test("buildMinimalAutoGsdToolSet preserves browser
|
|
198
|
+
test("buildMinimalAutoGsdToolSet preserves compatible browser add-ons for run-uat", () => {
|
|
179
199
|
const result = buildMinimalAutoGsdToolSet([
|
|
180
200
|
"bash",
|
|
181
201
|
"read",
|
|
202
|
+
"edit",
|
|
203
|
+
"write",
|
|
182
204
|
"browser_navigate",
|
|
183
205
|
"browser_click",
|
|
184
206
|
"browser_type",
|
|
185
207
|
"browser_assert",
|
|
186
208
|
"browser_screenshot",
|
|
187
209
|
"browser_wait_for",
|
|
210
|
+
"gsd_uat_exec",
|
|
211
|
+
"gsd_uat_result_save",
|
|
212
|
+
"gsd_resume",
|
|
213
|
+
"gsd_milestone_status",
|
|
214
|
+
"gsd_journal_query",
|
|
215
|
+
"subagent",
|
|
188
216
|
"gsd_summary_save",
|
|
217
|
+
"gsd_exec",
|
|
218
|
+
"gsd_save_gate_result",
|
|
189
219
|
"gsd_task_complete",
|
|
190
220
|
"memory_query",
|
|
191
221
|
"capture_thought",
|
|
@@ -197,7 +227,17 @@ test("buildMinimalAutoGsdToolSet preserves browser tools for run-uat", () => {
|
|
|
197
227
|
assert.ok(result.includes("browser_assert"));
|
|
198
228
|
assert.ok(result.includes("browser_screenshot"));
|
|
199
229
|
assert.ok(result.includes("browser_wait_for"));
|
|
200
|
-
assert.ok(result.includes("
|
|
230
|
+
assert.ok(result.includes("gsd_uat_exec"));
|
|
231
|
+
assert.ok(result.includes("gsd_uat_result_save"));
|
|
232
|
+
assert.ok(result.includes("subagent"));
|
|
233
|
+
assert.ok(result.includes("read"));
|
|
234
|
+
assert.ok(!result.includes("ToolSearch"));
|
|
235
|
+
assert.ok(!result.includes("bash"));
|
|
236
|
+
assert.ok(!result.includes("edit"));
|
|
237
|
+
assert.ok(!result.includes("write"));
|
|
238
|
+
assert.ok(!result.includes("gsd_exec"));
|
|
239
|
+
assert.ok(!result.includes("gsd_summary_save"));
|
|
240
|
+
assert.ok(!result.includes("gsd_save_gate_result"));
|
|
201
241
|
assert.ok(!result.includes("gsd_task_complete"));
|
|
202
242
|
});
|
|
203
243
|
|
|
@@ -218,6 +258,40 @@ test("buildMinimalAutoGsdToolSet prefers MCP browser tools for run-uat when avai
|
|
|
218
258
|
assert.ok(!result.includes("browser_click"));
|
|
219
259
|
});
|
|
220
260
|
|
|
261
|
+
test("buildMinimalAutoGsdToolSet honors provider-compatible registered tools for run-uat", () => {
|
|
262
|
+
registerToolCompatibility("browser_screenshot", { producesImages: true });
|
|
263
|
+
const registered = [
|
|
264
|
+
"bash",
|
|
265
|
+
"read",
|
|
266
|
+
"ToolSearch",
|
|
267
|
+
"browser_navigate",
|
|
268
|
+
"browser_click",
|
|
269
|
+
"browser_screenshot",
|
|
270
|
+
"gsd_uat_exec",
|
|
271
|
+
"gsd_uat_result_save",
|
|
272
|
+
"gsd_resume",
|
|
273
|
+
"gsd_milestone_status",
|
|
274
|
+
"gsd_journal_query",
|
|
275
|
+
"gsd_exec",
|
|
276
|
+
"gsd_summary_save",
|
|
277
|
+
"gsd_save_gate_result",
|
|
278
|
+
];
|
|
279
|
+
const providerCompatible = filterToolsForProvider(registered, "openai-responses").compatible;
|
|
280
|
+
const result = buildMinimalAutoGsdToolSet(["gsd_uat_exec"], "run-uat", providerCompatible);
|
|
281
|
+
|
|
282
|
+
assert.ok(result.includes("gsd_uat_exec"));
|
|
283
|
+
assert.ok(result.includes("gsd_uat_result_save"));
|
|
284
|
+
assert.ok(result.includes("read"));
|
|
285
|
+
assert.ok(result.includes("browser_navigate"));
|
|
286
|
+
assert.ok(result.includes("browser_click"));
|
|
287
|
+
assert.ok(!result.includes("browser_screenshot"), "provider-filtered screenshot tool must stay filtered");
|
|
288
|
+
assert.ok(!result.includes("ToolSearch"));
|
|
289
|
+
assert.ok(!result.includes("bash"));
|
|
290
|
+
assert.ok(!result.includes("gsd_exec"));
|
|
291
|
+
assert.ok(!result.includes("gsd_summary_save"));
|
|
292
|
+
assert.ok(!result.includes("gsd_save_gate_result"));
|
|
293
|
+
});
|
|
294
|
+
|
|
221
295
|
test("buildMinimalAutoGsdToolSet includes discuss-slice persistence tools", () => {
|
|
222
296
|
const result = buildMinimalAutoGsdToolSet([
|
|
223
297
|
"bash",
|
|
@@ -102,6 +102,25 @@ describe("#2883: isToolInvocationError classification", () => {
|
|
|
102
102
|
);
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
+
test("detects MCP -32602 Input validation error (wire format)", () => {
|
|
106
|
+
assert.equal(
|
|
107
|
+
isToolInvocationError("MCP error -32602: Input validation error: Invalid arguments for tool gsd_slice_complete [path: verification, expected string, invalid_type]"),
|
|
108
|
+
true,
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("detects standalone 'Input validation error' prefix", () => {
|
|
113
|
+
assert.equal(isToolInvocationError("Input validation error: expected string"), true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("detects 'Invalid arguments for tool' prefix", () => {
|
|
117
|
+
assert.equal(isToolInvocationError("Invalid arguments for tool gsd_slice_complete"), true);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("detects 'No such tool available' error", () => {
|
|
121
|
+
assert.equal(isToolInvocationError("No such tool available: mcp__gsd-workflow__memory_query"), true);
|
|
122
|
+
});
|
|
123
|
+
|
|
105
124
|
test("detects ESM export-link errors", () => {
|
|
106
125
|
assert.equal(
|
|
107
126
|
isToolInvocationError("The requested module '../paths.js' does not provide an export named 'gsdProjectionRoot'"),
|
|
@@ -39,6 +39,12 @@ const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
|
|
|
39
39
|
{ canonical: "gsd_milestone_reopen", alias: "gsd_reopen_milestone" },
|
|
40
40
|
];
|
|
41
41
|
|
|
42
|
+
const STANDALONE_TOOLS = [
|
|
43
|
+
"gsd_save_gate_result",
|
|
44
|
+
"gsd_skip_slice",
|
|
45
|
+
"gsd_uat_result_save",
|
|
46
|
+
];
|
|
47
|
+
|
|
42
48
|
// ─── Registration count ──────────────────────────────────────────────────────
|
|
43
49
|
|
|
44
50
|
console.log('\n── Tool naming: registration count ──');
|
|
@@ -48,10 +54,14 @@ registerDbTools(pi);
|
|
|
48
54
|
|
|
49
55
|
assert.deepStrictEqual(
|
|
50
56
|
pi.tools.length,
|
|
51
|
-
RENAME_MAP.length * 2 +
|
|
52
|
-
'Should register canonical/alias tool pairs plus
|
|
57
|
+
RENAME_MAP.length * 2 + STANDALONE_TOOLS.length,
|
|
58
|
+
'Should register canonical/alias tool pairs plus standalone DB tools',
|
|
53
59
|
);
|
|
54
60
|
|
|
61
|
+
for (const name of STANDALONE_TOOLS) {
|
|
62
|
+
assert.ok(pi.tools.some((t: any) => t.name === name), `Standalone tool "${name}" should be registered`);
|
|
63
|
+
}
|
|
64
|
+
|
|
55
65
|
// ─── Both names exist for each pair ──────────────────────────────────────────
|
|
56
66
|
|
|
57
67
|
console.log('\n── Tool naming: canonical and alias names exist ──');
|
|
@@ -101,13 +101,19 @@ test("gsd_slice_complete — enrichment arrays are optional", () => {
|
|
|
101
101
|
"sliceTitle",
|
|
102
102
|
"oneLiner",
|
|
103
103
|
"narrative",
|
|
104
|
-
"verification",
|
|
105
104
|
"uatContent",
|
|
106
105
|
];
|
|
107
106
|
for (const field of coreRequired) {
|
|
108
107
|
assert.ok(required.has(field), `core field "${field}" must be required`);
|
|
109
108
|
}
|
|
110
109
|
|
|
110
|
+
// verification is intentionally optional — models that omit it avoid -32602;
|
|
111
|
+
// the summary records verification as passed without detail in that case.
|
|
112
|
+
assert.ok(
|
|
113
|
+
!required.has("verification"),
|
|
114
|
+
"verification must be optional — omitting it avoids -32602; summary records verification as passed without detail",
|
|
115
|
+
);
|
|
116
|
+
|
|
111
117
|
// Enrichment/metadata arrays MUST be optional
|
|
112
118
|
const enrichmentFields = [
|
|
113
119
|
"keyFiles",
|
|
@@ -7,12 +7,17 @@
|
|
|
7
7
|
|
|
8
8
|
import test from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
-
import { mkdirSync, rmSync } from "node:fs";
|
|
10
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
13
|
import { visibleWidth } from "@gsd/pi-tui";
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
_resetWidgetModeForTests,
|
|
17
|
+
setCompletionProgressWidget,
|
|
18
|
+
setWidgetMode,
|
|
19
|
+
updateProgressWidget,
|
|
20
|
+
} from "../auto-dashboard.ts";
|
|
16
21
|
import type { GSDState } from "../types.ts";
|
|
17
22
|
|
|
18
23
|
interface CapturedSetHeader {
|
|
@@ -143,10 +148,18 @@ test("updateProgressWidget gracefully no-ops when ctx.ui lacks setHeader/setStat
|
|
|
143
148
|
|
|
144
149
|
// ── NEXT-mode footer guidance ───────────────────────────────────────────
|
|
145
150
|
|
|
146
|
-
test("auto-dashboard widget render output includes /gsd next guidance when isStepMode is true", (t) => {
|
|
151
|
+
test("auto-dashboard full widget render output includes /gsd next guidance when isStepMode is true", (t) => {
|
|
147
152
|
const dir = makeTempDir("step-hint");
|
|
148
153
|
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
149
|
-
|
|
154
|
+
const projectPrefsPath = join(dir, ".gsd", "preferences.md");
|
|
155
|
+
const globalPrefsPath = join(dir, ".gsd", "global-preferences.md");
|
|
156
|
+
writeFileSync(projectPrefsPath, "---\nversion: 1\n---\n", "utf-8");
|
|
157
|
+
_resetWidgetModeForTests();
|
|
158
|
+
setWidgetMode("full", projectPrefsPath, globalPrefsPath);
|
|
159
|
+
t.after(() => {
|
|
160
|
+
_resetWidgetModeForTests();
|
|
161
|
+
cleanup(dir);
|
|
162
|
+
});
|
|
150
163
|
|
|
151
164
|
let widgetFactory: ((tui: unknown, theme: unknown) => any) | undefined;
|
|
152
165
|
|
|
@@ -173,6 +186,7 @@ test("auto-dashboard widget render output includes /gsd next guidance when isSte
|
|
|
173
186
|
bold: (text: string) => text,
|
|
174
187
|
};
|
|
175
188
|
const component = widgetFactory!(fakeTui, fakeTheme);
|
|
189
|
+
t.after(() => component.dispose?.());
|
|
176
190
|
const lines = component.render(120);
|
|
177
191
|
|
|
178
192
|
const hasStepHint = lines.some((line: string) => line.includes("/gsd next to advance one step"));
|
|
@@ -181,10 +195,18 @@ test("auto-dashboard widget render output includes /gsd next guidance when isSte
|
|
|
181
195
|
if (component.dispose) component.dispose();
|
|
182
196
|
});
|
|
183
197
|
|
|
184
|
-
test("auto-dashboard widget render output omits /gsd next guidance when isStepMode is false", (t) => {
|
|
198
|
+
test("auto-dashboard full widget render output omits /gsd next guidance when isStepMode is false", (t) => {
|
|
185
199
|
const dir = makeTempDir("no-step-hint");
|
|
186
200
|
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
187
|
-
|
|
201
|
+
const projectPrefsPath = join(dir, ".gsd", "preferences.md");
|
|
202
|
+
const globalPrefsPath = join(dir, ".gsd", "global-preferences.md");
|
|
203
|
+
writeFileSync(projectPrefsPath, "---\nversion: 1\n---\n", "utf-8");
|
|
204
|
+
_resetWidgetModeForTests();
|
|
205
|
+
setWidgetMode("full", projectPrefsPath, globalPrefsPath);
|
|
206
|
+
t.after(() => {
|
|
207
|
+
_resetWidgetModeForTests();
|
|
208
|
+
cleanup(dir);
|
|
209
|
+
});
|
|
188
210
|
|
|
189
211
|
let widgetFactory: ((tui: unknown, theme: unknown) => any) | undefined;
|
|
190
212
|
|
|
@@ -211,6 +233,7 @@ test("auto-dashboard widget render output omits /gsd next guidance when isStepMo
|
|
|
211
233
|
bold: (text: string) => text,
|
|
212
234
|
};
|
|
213
235
|
const component = widgetFactory!(fakeTui, fakeTheme);
|
|
236
|
+
t.after(() => component.dispose?.());
|
|
214
237
|
const lines = component.render(120);
|
|
215
238
|
|
|
216
239
|
const hasStepHint = lines.some((line: string) => line.includes("/gsd next to advance one step"));
|
|
@@ -344,6 +344,7 @@ test("#5843: run-uat uses verification tools policy so build/test commands can r
|
|
|
344
344
|
const manifest = UNIT_MANIFESTS["run-uat"];
|
|
345
345
|
|
|
346
346
|
assert.strictEqual(manifest.tools.mode, "verification");
|
|
347
|
+
assert.deepEqual(manifest.tools.allowedSubagents, ["mnemo", "scout", "reviewer", "tester"]);
|
|
347
348
|
|
|
348
349
|
const buildResult = shouldBlockPlanningUnit(
|
|
349
350
|
"bash",
|
|
@@ -367,6 +368,20 @@ test("#5843: run-uat uses verification tools policy so build/test commands can r
|
|
|
367
368
|
);
|
|
368
369
|
assert.strictEqual(sourceWriteResult.block, true);
|
|
369
370
|
assert.match(sourceWriteResult.reason!, /tools-policy "verification"/);
|
|
371
|
+
|
|
372
|
+
const subagentResult = shouldBlockPlanningUnit(
|
|
373
|
+
"subagent",
|
|
374
|
+
"",
|
|
375
|
+
process.cwd(),
|
|
376
|
+
"run-uat",
|
|
377
|
+
manifest.tools,
|
|
378
|
+
["mnemo"],
|
|
379
|
+
);
|
|
380
|
+
assert.strictEqual(
|
|
381
|
+
subagentResult.block,
|
|
382
|
+
false,
|
|
383
|
+
`run-uat must allow listed verification subagents: ${subagentResult.reason}`,
|
|
384
|
+
);
|
|
370
385
|
});
|
|
371
386
|
|
|
372
387
|
test("planning-dispatch hard block message omits internal tracker references", () => {
|
|
@@ -420,6 +435,11 @@ test('Unit Tool Contract exposes subagent dispatch permissions', () => {
|
|
|
420
435
|
allowedSubagents: ["reviewer", "security", "tester"],
|
|
421
436
|
toolsMode: "planning-dispatch",
|
|
422
437
|
});
|
|
438
|
+
assert.deepEqual(resolveSubagentPermissionContract("run-uat"), {
|
|
439
|
+
allowed: true,
|
|
440
|
+
allowedSubagents: ["mnemo", "scout", "reviewer", "tester"],
|
|
441
|
+
toolsMode: "verification",
|
|
442
|
+
});
|
|
423
443
|
assert.deepEqual(resolveSubagentPermissionContract("discuss-milestone"), {
|
|
424
444
|
allowed: false,
|
|
425
445
|
allowedSubagents: [],
|
|
@@ -427,21 +447,24 @@ test('Unit Tool Contract exposes subagent dispatch permissions', () => {
|
|
|
427
447
|
});
|
|
428
448
|
});
|
|
429
449
|
|
|
430
|
-
test('
|
|
450
|
+
test('dispatch-capable manifests declare globally allowed subagents', () => {
|
|
431
451
|
for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
|
|
432
|
-
|
|
452
|
+
const allowedSubagents = "allowedSubagents" in manifest.tools
|
|
453
|
+
? manifest.tools.allowedSubagents
|
|
454
|
+
: undefined;
|
|
455
|
+
if (!allowedSubagents) continue;
|
|
433
456
|
assert.ok(
|
|
434
|
-
Array.isArray(
|
|
435
|
-
`manifest "${unitType}"
|
|
457
|
+
Array.isArray(allowedSubagents) && allowedSubagents.length > 0,
|
|
458
|
+
`manifest "${unitType}" enables subagent dispatch but has no allowedSubagents — explicit allowlist is required for runtime dispatch gating`,
|
|
436
459
|
);
|
|
437
|
-
for (const agent of
|
|
460
|
+
for (const agent of allowedSubagents) {
|
|
438
461
|
assert.ok(
|
|
439
462
|
typeof agent === "string" && agent.length > 0,
|
|
440
463
|
`manifest "${unitType}" has empty/invalid allowedSubagents entry: ${JSON.stringify(agent)}`,
|
|
441
464
|
);
|
|
442
465
|
assert.ok(
|
|
443
466
|
ALLOWED_PLANNING_DISPATCH_AGENTS.has(agent),
|
|
444
|
-
`manifest "${unitType}" allows "${agent}", but the runtime
|
|
467
|
+
`manifest "${unitType}" allows "${agent}", but the runtime controlled-dispatch registry will hard-block it`,
|
|
445
468
|
);
|
|
446
469
|
}
|
|
447
470
|
}
|
package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts
CHANGED
|
@@ -11,11 +11,14 @@ const prompt = readFileSync(promptPath, "utf-8");
|
|
|
11
11
|
|
|
12
12
|
test("validate-milestone reviewer C requires canonical verification class names", () => {
|
|
13
13
|
assert.match(prompt, /\*\*Reviewer C[\s\S]*Verification Classes/i);
|
|
14
|
-
assert.match(prompt, /
|
|
14
|
+
assert.match(prompt, /must be exactly `Contract`, `Integration`, `Operational`, or `UAT`/i);
|
|
15
|
+
assert.match(prompt, /Preserve every planned non-empty class row/i);
|
|
16
|
+
assert.match(prompt, /first cell of each row must be exactly `Contract`, `Integration`, `Operational`, or `UAT`/i);
|
|
15
17
|
assert.match(prompt, /If no verification classes were planned, say that explicitly/i);
|
|
16
18
|
});
|
|
17
19
|
|
|
18
20
|
test("validate-milestone prompt routes verification class analysis into verificationClasses", () => {
|
|
19
|
-
assert.match(prompt, /pass
|
|
20
|
-
assert.match(prompt, /
|
|
21
|
+
assert.match(prompt, /pass a complete canonical table in `verificationClasses`/i);
|
|
22
|
+
assert.match(prompt, /If Reviewer C omitted a planned class, reconstruct the missing row/i);
|
|
23
|
+
assert.match(prompt, /Do not call `gsd_validate_milestone` with a partial `verificationClasses` table/i);
|
|
21
24
|
});
|
|
@@ -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");
|