@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
|
@@ -1558,6 +1558,14 @@ test("verifyExpectedArtifact complete-milestone passes when DB milestone is comp
|
|
|
1558
1558
|
|
|
1559
1559
|
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
1560
1560
|
insertMilestone({ id: "M001", title: "Milestone One", status: "complete" });
|
|
1561
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Done Slice", status: "complete" });
|
|
1562
|
+
insertAssessment({
|
|
1563
|
+
path: "milestones/M001/M001-VALIDATION.md",
|
|
1564
|
+
milestoneId: "M001",
|
|
1565
|
+
status: "pass",
|
|
1566
|
+
scope: "milestone-validation",
|
|
1567
|
+
fullContent: "verdict: pass",
|
|
1568
|
+
});
|
|
1561
1569
|
|
|
1562
1570
|
const result = verifyExpectedArtifact("complete-milestone", "M001", base);
|
|
1563
1571
|
assert.equal(result, true, "complete-milestone should pass when DB status is complete");
|
|
@@ -1566,7 +1574,7 @@ test("verifyExpectedArtifact complete-milestone passes when DB milestone is comp
|
|
|
1566
1574
|
}
|
|
1567
1575
|
});
|
|
1568
1576
|
|
|
1569
|
-
test("verifyExpectedArtifact complete-milestone
|
|
1577
|
+
test("verifyExpectedArtifact complete-milestone rejects success SUMMARY when DB milestone is still open (#4658)", () => {
|
|
1570
1578
|
const base = makeGitBase();
|
|
1571
1579
|
try {
|
|
1572
1580
|
execFileSync("git", ["checkout", "-b", "feat/ms-db-lag-success"], { cwd: base, stdio: "ignore" });
|
|
@@ -1591,7 +1599,7 @@ test("verifyExpectedArtifact complete-milestone tolerates transient DB lag when
|
|
|
1591
1599
|
insertMilestone({ id: "M001", title: "Milestone One", status: "active" });
|
|
1592
1600
|
|
|
1593
1601
|
const result = verifyExpectedArtifact("complete-milestone", "M001", base);
|
|
1594
|
-
assert.equal(result,
|
|
1602
|
+
assert.equal(result, false, "success SUMMARY must not overrule an open DB milestone");
|
|
1595
1603
|
} finally {
|
|
1596
1604
|
cleanup(base);
|
|
1597
1605
|
}
|
|
@@ -30,6 +30,7 @@ test("checkAutoStartAfterDiscuss waits until discussion artifacts exist before r
|
|
|
30
30
|
setPendingAutoStart(base, {
|
|
31
31
|
basePath: base,
|
|
32
32
|
milestoneId: "M001",
|
|
33
|
+
startAuto: false,
|
|
33
34
|
ctx: { ui: { notify: (message: string) => notifications.push(message) } } as any,
|
|
34
35
|
pi: { sendMessage: () => {} } as any,
|
|
35
36
|
});
|
|
@@ -41,5 +42,7 @@ test("checkAutoStartAfterDiscuss waits until discussion artifacts exist before r
|
|
|
41
42
|
writeFileSync(join(base, ".gsd", "STATE.md"), "# State\n", "utf-8");
|
|
42
43
|
|
|
43
44
|
assert.equal(checkAutoStartAfterDiscuss(), true);
|
|
44
|
-
assert.deepEqual(notifications, [
|
|
45
|
+
assert.deepEqual(notifications, [
|
|
46
|
+
"Milestone M001 context captured. Continuing the planning pipeline.",
|
|
47
|
+
]);
|
|
45
48
|
});
|
|
@@ -118,6 +118,37 @@ function makeRepoWithMultipleStrandedMilestones(): string {
|
|
|
118
118
|
return base;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
function makeRepoWithActiveMismatchAndStrandedTarget(): string {
|
|
122
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-targeted-stranded-bootstrap-"));
|
|
123
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
124
|
+
mkdirSync(join(base, ".gsd", "milestones", "M002"), { recursive: true });
|
|
125
|
+
writeFileSync(
|
|
126
|
+
join(base, ".gsd", "PREFERENCES.md"),
|
|
127
|
+
"---\ngit:\n isolation: \"worktree\"\n---\n",
|
|
128
|
+
);
|
|
129
|
+
runGit(base, ["init"]);
|
|
130
|
+
runGit(base, ["config", "user.email", "test@test.com"]);
|
|
131
|
+
runGit(base, ["config", "user.name", "Test"]);
|
|
132
|
+
writeFileSync(join(base, "README.md"), "# test\n");
|
|
133
|
+
runGit(base, ["add", "-A"]);
|
|
134
|
+
runGit(base, ["commit", "-m", "init"]);
|
|
135
|
+
runGit(base, ["branch", "-M", "main"]);
|
|
136
|
+
|
|
137
|
+
runGit(base, ["checkout", "-b", "milestone/M002"]);
|
|
138
|
+
writeFileSync(join(base, "m002.txt"), "target stranded work\n");
|
|
139
|
+
runGit(base, ["add", "-A"]);
|
|
140
|
+
runGit(base, ["commit", "-m", "feat: M002 in progress"]);
|
|
141
|
+
runGit(base, ["checkout", "main"]);
|
|
142
|
+
runGit(base, ["worktree", "add", ".gsd/worktrees/M002", "milestone/M002"]);
|
|
143
|
+
|
|
144
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
145
|
+
insertMilestone({ id: "M001", title: "Incorrect active milestone", status: "active" });
|
|
146
|
+
insertMilestone({ id: "M002", title: "Target stranded milestone", status: "active" });
|
|
147
|
+
closeDatabase();
|
|
148
|
+
|
|
149
|
+
return base;
|
|
150
|
+
}
|
|
151
|
+
|
|
121
152
|
function makeRepoWithRecoveredCleanupAndStrandedMismatch(): string {
|
|
122
153
|
const base = mkdtempSync(join(tmpdir(), "gsd-headless-stranded-bootstrap-"));
|
|
123
154
|
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
@@ -321,6 +352,9 @@ test("headless bootstrap checks stranded work before recovered-complete shortcut
|
|
|
321
352
|
const messages = notifications.map((entry) => entry.message).join("\n");
|
|
322
353
|
assert.equal(ready, false);
|
|
323
354
|
assert.match(messages, /Stranded work for M002 blocks auto-mode/);
|
|
355
|
+
assert.match(messages, /\/gsd auto M002/);
|
|
356
|
+
assert.match(messages, /\/gsd park M002 "reason"/);
|
|
357
|
+
assert.match(messages, /\/gsd rethink/);
|
|
324
358
|
assert.doesNotMatch(messages, /all milestones complete/);
|
|
325
359
|
} finally {
|
|
326
360
|
if (previousHeadless === undefined) {
|
|
@@ -409,6 +443,9 @@ test("bootstrap blocks active stranded recovery when another open milestone also
|
|
|
409
443
|
assert.equal(ready, false);
|
|
410
444
|
assert.deepEqual(adoptCalls, []);
|
|
411
445
|
assert.match(messages, /Stranded work for M002 blocks auto-mode before M001/);
|
|
446
|
+
assert.match(messages, /\/gsd auto M002/);
|
|
447
|
+
assert.match(messages, /\/gsd park M002 "reason"/);
|
|
448
|
+
assert.match(messages, /explicitly discard M002/);
|
|
412
449
|
} finally {
|
|
413
450
|
try {
|
|
414
451
|
closeDatabase();
|
|
@@ -418,6 +455,102 @@ test("bootstrap blocks active stranded recovery when another open milestone also
|
|
|
418
455
|
}
|
|
419
456
|
});
|
|
420
457
|
|
|
458
|
+
test("bootstrap honors explicit solo milestone lock when recovering stranded target worktree", async () => {
|
|
459
|
+
const base = makeRepoWithActiveMismatchAndStrandedTarget();
|
|
460
|
+
const previousCwd = process.cwd();
|
|
461
|
+
const previousLock = process.env.GSD_MILESTONE_LOCK;
|
|
462
|
+
const previousWorker = process.env.GSD_PARALLEL_WORKER;
|
|
463
|
+
const s = new AutoSession();
|
|
464
|
+
const adoptCalls: Array<{ milestoneId: string; mode: string }> = [];
|
|
465
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
466
|
+
|
|
467
|
+
try {
|
|
468
|
+
delete process.env.GSD_PARALLEL_WORKER;
|
|
469
|
+
process.env.GSD_MILESTONE_LOCK = "M002";
|
|
470
|
+
|
|
471
|
+
const ready = await bootstrapAutoSession(
|
|
472
|
+
s,
|
|
473
|
+
makeCtx(notifications) as any,
|
|
474
|
+
{
|
|
475
|
+
getThinkingLevel: () => "medium",
|
|
476
|
+
getActiveTools: () => [],
|
|
477
|
+
events: { emit: () => {} },
|
|
478
|
+
} as any,
|
|
479
|
+
base,
|
|
480
|
+
false,
|
|
481
|
+
false,
|
|
482
|
+
{
|
|
483
|
+
shouldUseWorktreeIsolation: () => false,
|
|
484
|
+
registerSigtermHandler: () => {},
|
|
485
|
+
registerAutoWorkerForSession: () => {},
|
|
486
|
+
lockBase: () => base,
|
|
487
|
+
buildLifecycle: () => ({
|
|
488
|
+
adoptSessionRoot: (sessionBase: string, originalBase?: string) => {
|
|
489
|
+
s.basePath = sessionBase;
|
|
490
|
+
if (originalBase !== undefined) {
|
|
491
|
+
s.originalBasePath = originalBase;
|
|
492
|
+
} else if (!s.originalBasePath) {
|
|
493
|
+
s.originalBasePath = sessionBase;
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
enterMilestone: () => ({ ok: true, mode: "worktree", path: base }),
|
|
497
|
+
adoptStrandedMilestone: (
|
|
498
|
+
milestoneId: string,
|
|
499
|
+
sessionBase: string,
|
|
500
|
+
_ctx: unknown,
|
|
501
|
+
opts: { mode: "worktree" | "branch" },
|
|
502
|
+
) => {
|
|
503
|
+
adoptCalls.push({ milestoneId, mode: opts.mode });
|
|
504
|
+
s.basePath = sessionBase;
|
|
505
|
+
s.originalBasePath = sessionBase;
|
|
506
|
+
s.strandedRecoveryIsolationMode = opts.mode;
|
|
507
|
+
return { ok: true, mode: opts.mode, path: sessionBase };
|
|
508
|
+
},
|
|
509
|
+
adoptOrphanWorktree: <T extends { merged: boolean }>(
|
|
510
|
+
_mid: string,
|
|
511
|
+
_base: string,
|
|
512
|
+
run: () => T,
|
|
513
|
+
): T => run(),
|
|
514
|
+
}) as any,
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
classification: "none",
|
|
518
|
+
lock: null,
|
|
519
|
+
pausedSession: null,
|
|
520
|
+
state: null,
|
|
521
|
+
recovery: null,
|
|
522
|
+
recoveryPrompt: null,
|
|
523
|
+
recoveryToolCallCount: 0,
|
|
524
|
+
artifactSatisfied: false,
|
|
525
|
+
hasResumableDiskState: false,
|
|
526
|
+
isBootstrapCrash: false,
|
|
527
|
+
},
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
const messages = notifications.map((entry) => entry.message).join("\n");
|
|
531
|
+
assert.equal(ready, true);
|
|
532
|
+
assert.deepEqual(adoptCalls, [{ milestoneId: "M002", mode: "worktree" }]);
|
|
533
|
+
assert.equal(s.currentMilestoneId, "M002");
|
|
534
|
+
assert.match(messages, /Resuming saved milestone work for M002/);
|
|
535
|
+
assert.doesNotMatch(messages, /blocks auto-mode before M001/);
|
|
536
|
+
assert.doesNotMatch(messages, /Stranded work for in-progress milestone M002/);
|
|
537
|
+
assert.ok(
|
|
538
|
+
notifications.some((entry) => entry.level === "info" && entry.message.includes("Resuming saved milestone work for M002")),
|
|
539
|
+
"active recovery should be presented as an info-level resume",
|
|
540
|
+
);
|
|
541
|
+
} finally {
|
|
542
|
+
if (previousLock === undefined) delete process.env.GSD_MILESTONE_LOCK;
|
|
543
|
+
else process.env.GSD_MILESTONE_LOCK = previousLock;
|
|
544
|
+
if (previousWorker === undefined) delete process.env.GSD_PARALLEL_WORKER;
|
|
545
|
+
else process.env.GSD_PARALLEL_WORKER = previousWorker;
|
|
546
|
+
try {
|
|
547
|
+
closeDatabase();
|
|
548
|
+
} catch {}
|
|
549
|
+
process.chdir(previousCwd);
|
|
550
|
+
rmSync(base, { recursive: true, force: true });
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
|
|
421
554
|
test("bootstrap adopts stranded active branch even when isolation is none", async () => {
|
|
422
555
|
const base = makeRepoWithStrandedActiveMilestone();
|
|
423
556
|
const previousCwd = process.cwd();
|
|
@@ -496,7 +629,11 @@ test("bootstrap adopts stranded active branch even when isolation is none", asyn
|
|
|
496
629
|
assert.equal(s.strandedRecoveryIsolationMode, "branch");
|
|
497
630
|
assert.match(
|
|
498
631
|
notifications.map((entry) => entry.message).join("\n"),
|
|
499
|
-
/
|
|
632
|
+
/Resuming saved milestone work for M001/,
|
|
633
|
+
);
|
|
634
|
+
assert.ok(
|
|
635
|
+
notifications.every((entry) => entry.level !== "warning" || !entry.message.includes("Stranded work for in-progress milestone M001")),
|
|
636
|
+
"adopting the active milestone should not emit a scary stranded-work warning",
|
|
500
637
|
);
|
|
501
638
|
} finally {
|
|
502
639
|
try {
|
|
@@ -585,7 +722,11 @@ test("bootstrap adopts stranded active branch before deep project setup", async
|
|
|
585
722
|
assert.equal(s.strandedRecoveryIsolationMode, "branch");
|
|
586
723
|
assert.match(
|
|
587
724
|
notifications.map((entry) => entry.message).join("\n"),
|
|
588
|
-
/
|
|
725
|
+
/Resuming saved milestone work for M001/,
|
|
726
|
+
);
|
|
727
|
+
assert.ok(
|
|
728
|
+
notifications.every((entry) => entry.level !== "warning" || !entry.message.includes("Stranded work for in-progress milestone M001")),
|
|
729
|
+
"adopting the active milestone should not emit a scary stranded-work warning",
|
|
589
730
|
);
|
|
590
731
|
} finally {
|
|
591
732
|
try {
|
|
@@ -4,13 +4,35 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
|
|
7
|
-
import { closeDatabase, getAllMilestones, insertMilestone, isDbAvailable, openDatabase } from "../gsd-db.ts";
|
|
8
|
-
import { reconcileProjectMilestonesFromDisk } from "../auto-start.ts";
|
|
7
|
+
import { closeDatabase, getAllMilestones, getMilestone, insertMilestone, isDbAvailable, openDatabase } from "../gsd-db.ts";
|
|
8
|
+
import { reconcileMergedMilestonesFromJournal, reconcileProjectMilestonesFromDisk } from "../auto-start.ts";
|
|
9
|
+
import { emitWorktreeMerged } from "../worktree-telemetry.ts";
|
|
9
10
|
|
|
10
11
|
test.afterEach(() => {
|
|
11
12
|
if (isDbAvailable()) closeDatabase();
|
|
12
13
|
});
|
|
13
14
|
|
|
15
|
+
test("bootstrap reconciliation treats a successful worktree merge as milestone closed", () => {
|
|
16
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-merged-reconcile-"));
|
|
17
|
+
try {
|
|
18
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
19
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
20
|
+
insertMilestone({ id: "M001", title: "Merged Milestone", status: "active" });
|
|
21
|
+
|
|
22
|
+
emitWorktreeMerged(base, "M001", { reason: "milestone-complete", conflict: false });
|
|
23
|
+
|
|
24
|
+
const closed = reconcileMergedMilestonesFromJournal(base);
|
|
25
|
+
const row = getMilestone("M001");
|
|
26
|
+
|
|
27
|
+
assert.equal(closed, 1);
|
|
28
|
+
assert.equal(row?.status, "complete");
|
|
29
|
+
assert.ok(row?.completed_at);
|
|
30
|
+
} finally {
|
|
31
|
+
if (isDbAvailable()) closeDatabase();
|
|
32
|
+
rmSync(base, { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
14
36
|
test("#5389: bootstrap reconciles PROJECT.md milestones that are missing from DB", () => {
|
|
15
37
|
const base = mkdtempSync(join(tmpdir(), "gsd-project-reconcile-"));
|
|
16
38
|
try {
|
|
@@ -92,13 +92,23 @@ test("checkAutoStartAfterDiscuss completes when discussion manifest is absent",
|
|
|
92
92
|
setPendingAutoStart(base, {
|
|
93
93
|
basePath: base,
|
|
94
94
|
milestoneId: "M001",
|
|
95
|
-
|
|
95
|
+
startAuto: false,
|
|
96
|
+
ctx: {
|
|
97
|
+
ui: {
|
|
98
|
+
notify: (message: string, level: string) => notifications.push({ message, level }),
|
|
99
|
+
},
|
|
100
|
+
} as any,
|
|
96
101
|
pi: { sendMessage: () => { scheduled = true; } } as any,
|
|
97
102
|
});
|
|
98
103
|
|
|
99
104
|
assert.equal(checkAutoStartAfterDiscuss(), true);
|
|
100
105
|
assert.equal(scheduled, false);
|
|
101
|
-
assert.deepEqual(notifications, [
|
|
106
|
+
assert.deepEqual(notifications, [
|
|
107
|
+
{
|
|
108
|
+
message: "Milestone M001 context captured. Continuing the planning pipeline.",
|
|
109
|
+
level: "success",
|
|
110
|
+
},
|
|
111
|
+
]);
|
|
102
112
|
} finally {
|
|
103
113
|
clearPendingAutoStart(base);
|
|
104
114
|
rmSync(base, { recursive: true, force: true });
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Unit tests for hasBrowserRequiredText heading-depth section guard.
|
|
3
|
+
|
|
4
|
+
import { describe, test } from 'node:test';
|
|
5
|
+
import assert from 'node:assert/strict';
|
|
6
|
+
|
|
7
|
+
import { hasBrowserRequiredText } from '../browser-evidence.ts';
|
|
8
|
+
|
|
9
|
+
describe('hasBrowserRequiredText', () => {
|
|
10
|
+
test('detects browser requirement in a plain test-cases section', () => {
|
|
11
|
+
const text = [
|
|
12
|
+
'## Test Cases',
|
|
13
|
+
'',
|
|
14
|
+
'1. Open index.html in a browser and navigate to /dashboard.',
|
|
15
|
+
'',
|
|
16
|
+
].join('\n');
|
|
17
|
+
assert.ok(hasBrowserRequiredText(text), 'plain browser step should be detected');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('ignores browser mention under a top-level non-requirement heading', () => {
|
|
21
|
+
const text = [
|
|
22
|
+
'## Not Proven',
|
|
23
|
+
'',
|
|
24
|
+
'- Keyboard usability through a real browser.',
|
|
25
|
+
'- Browser console cleanliness.',
|
|
26
|
+
'',
|
|
27
|
+
].join('\n');
|
|
28
|
+
assert.ok(!hasBrowserRequiredText(text), 'browser mention under "Not Proven" should be ignored');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('sub-heading inside a non-requirement section does not re-enable detection', () => {
|
|
32
|
+
// BUG (pre-fix): ### sub-heading under ## Not Proven resets inNonRequirementSection
|
|
33
|
+
// to false, causing subsequent lines to be detected as browser requirements.
|
|
34
|
+
const text = [
|
|
35
|
+
'## Not Proven By This UAT',
|
|
36
|
+
'',
|
|
37
|
+
'- No live browser session was used.',
|
|
38
|
+
'',
|
|
39
|
+
'### Visual Checks',
|
|
40
|
+
'',
|
|
41
|
+
'- Browser visual polish deferred to next slice.',
|
|
42
|
+
'- Keyboard interaction in a real browser is not proven here.',
|
|
43
|
+
'',
|
|
44
|
+
].join('\n');
|
|
45
|
+
assert.ok(
|
|
46
|
+
!hasBrowserRequiredText(text),
|
|
47
|
+
'sub-heading under a non-requirement section must not re-enable browser detection',
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('requirement-level heading after non-requirement section re-enables detection', () => {
|
|
52
|
+
const text = [
|
|
53
|
+
'## Not Proven',
|
|
54
|
+
'',
|
|
55
|
+
'- Browser polish deferred.',
|
|
56
|
+
'',
|
|
57
|
+
'## Test Cases',
|
|
58
|
+
'',
|
|
59
|
+
'1. Launch browser and open localhost.',
|
|
60
|
+
'',
|
|
61
|
+
].join('\n');
|
|
62
|
+
assert.ok(
|
|
63
|
+
hasBrowserRequiredText(text),
|
|
64
|
+
'browser step under "Test Cases" (same depth as "Not Proven") must still be detected',
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('deferred sub-heading inside a requirement section scopes exclusion to its own block', () => {
|
|
69
|
+
const text = [
|
|
70
|
+
'## Test Cases',
|
|
71
|
+
'',
|
|
72
|
+
'1. Open browser at localhost.',
|
|
73
|
+
'',
|
|
74
|
+
'### Deferred: keyboard check',
|
|
75
|
+
'',
|
|
76
|
+
'- Keyboard UAT deferred to next slice.',
|
|
77
|
+
'',
|
|
78
|
+
'### Step 2: Verify DOM',
|
|
79
|
+
'',
|
|
80
|
+
'1. Navigate to /dashboard in the browser.',
|
|
81
|
+
'',
|
|
82
|
+
].join('\n');
|
|
83
|
+
assert.ok(
|
|
84
|
+
hasBrowserRequiredText(text),
|
|
85
|
+
'browser step under "Step 2" sub-heading must be detected after a sibling "Deferred" sub-heading',
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('deferred sub-heading at same depth as test cases does not escape to parent', () => {
|
|
90
|
+
const text = [
|
|
91
|
+
'## Test Cases',
|
|
92
|
+
'',
|
|
93
|
+
'### Deferred: responsive layout',
|
|
94
|
+
'',
|
|
95
|
+
'- Responsive layout check is deferred to S02.',
|
|
96
|
+
'',
|
|
97
|
+
].join('\n');
|
|
98
|
+
assert.ok(
|
|
99
|
+
!hasBrowserRequiredText(text),
|
|
100
|
+
'content under a "Deferred" sub-heading should be excluded from detection',
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('detects browser requirement written only in a heading', () => {
|
|
105
|
+
// Regression: the line-by-line scan previously skip-continued past headings,
|
|
106
|
+
// missing browser obligations expressed only in heading text.
|
|
107
|
+
const text = '## Open browser session at localhost\n';
|
|
108
|
+
assert.ok(hasBrowserRequiredText(text), 'browser requirement in heading text must be detected');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('heading that opens a non-requirement section is not itself detected as a requirement', () => {
|
|
112
|
+
const text = '## Not Proven\n\n- Some note.\n';
|
|
113
|
+
assert.ok(
|
|
114
|
+
!hasBrowserRequiredText(text),
|
|
115
|
+
'a non-requirement section heading should not trigger browser detection',
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('returns false for empty text', () => {
|
|
120
|
+
assert.ok(!hasBrowserRequiredText(''), 'empty string returns false');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('notes-for-tester heading with sub-headings stays non-requirement', () => {
|
|
124
|
+
const text = [
|
|
125
|
+
'## Notes for Tester',
|
|
126
|
+
'',
|
|
127
|
+
'### Browser Setup',
|
|
128
|
+
'',
|
|
129
|
+
'- Run this spec without a browser; a DOM harness is sufficient.',
|
|
130
|
+
'- Browser-based visual checks are deferred.',
|
|
131
|
+
'',
|
|
132
|
+
'### Follow-up Items',
|
|
133
|
+
'',
|
|
134
|
+
'- Track browser session evidence in S02.',
|
|
135
|
+
'',
|
|
136
|
+
].join('\n');
|
|
137
|
+
assert.ok(
|
|
138
|
+
!hasBrowserRequiredText(text),
|
|
139
|
+
'sub-headings under "Notes for Tester" should not re-enable browser detection',
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
@@ -164,17 +164,13 @@ describe("checkAutoStartAfterDiscuss Gate 1a (pending depth-verification gate)",
|
|
|
164
164
|
test("Gate 1a does NOT trip when the pending gate is for a DIFFERENT milestone", () => {
|
|
165
165
|
base = mkBase();
|
|
166
166
|
openDatabase(":memory:");
|
|
167
|
-
// status: "queued" so that Gate 1b downstream of Gate 1a fires its
|
|
168
|
-
// recovery notify ("context file exists but milestone is still queued") —
|
|
169
|
-
// observing that notify proves we advanced past Gate 1a. If Gate 1a
|
|
170
|
-
// wrongly tripped on the M999 gate it would `return false` immediately
|
|
171
|
-
// and Gate 1b would never run, so the notify would be absent.
|
|
172
167
|
insertMilestone({ id: "M001", title: "Pending Gate Test", status: "queued" });
|
|
173
168
|
|
|
174
169
|
cap = mkCapture();
|
|
175
170
|
setPendingAutoStart(base, {
|
|
176
171
|
basePath: base,
|
|
177
172
|
milestoneId: "M001",
|
|
173
|
+
startAuto: false,
|
|
178
174
|
ctx: mkCtx(cap),
|
|
179
175
|
pi: mkPi(cap),
|
|
180
176
|
});
|
|
@@ -182,21 +178,19 @@ describe("checkAutoStartAfterDiscuss Gate 1a (pending depth-verification gate)",
|
|
|
182
178
|
setPendingGate("depth_verification_M999_confirm", base);
|
|
183
179
|
|
|
184
180
|
const result = checkAutoStartAfterDiscuss();
|
|
185
|
-
assert.equal(result,
|
|
181
|
+
assert.equal(result, true, "different milestone gate must not block this handoff");
|
|
186
182
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const gate1bNotify = cap.notifies.find(n =>
|
|
190
|
-
n.level === "warning" && /M001.*context file exists but milestone is still queued/i.test(n.msg)
|
|
183
|
+
const successNotify = cap.notifies.find(n =>
|
|
184
|
+
n.level === "success" && /M001 context captured/i.test(n.msg)
|
|
191
185
|
);
|
|
192
186
|
assert.ok(
|
|
193
|
-
|
|
194
|
-
`expected
|
|
187
|
+
successNotify,
|
|
188
|
+
`expected context-captured success notify about M001; got: ${JSON.stringify(cap.notifies)}`,
|
|
195
189
|
);
|
|
196
190
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
191
|
+
const retryNotify = cap.notifies.find(n => /queued|gsd_plan_milestone/i.test(n.msg));
|
|
192
|
+
assert.equal(retryNotify, undefined, "handoff must not mention queued state or internal plan retry");
|
|
193
|
+
|
|
200
194
|
const m999Notify = cap.notifies.find(n => /M999/i.test(n.msg));
|
|
201
195
|
assert.equal(m999Notify, undefined, "no notify should reference M999 (the pending-gate milestone)");
|
|
202
196
|
});
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
// gsd-pi + Regression tests for checkAutoStartAfterDiscuss
|
|
1
|
+
// gsd-pi + Regression tests for checkAutoStartAfterDiscuss handoff copy (R3b)
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// is absent. Otherwise the user sees "ready" and then /gsd reports
|
|
6
|
-
// "No Active Milestone" because the milestone was never registered.
|
|
3
|
+
// Missing-row repair may accept a context handoff, but "Milestone X ready."
|
|
4
|
+
// is reserved for executable plans with persisted slices in DB mode.
|
|
7
5
|
|
|
8
6
|
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
9
7
|
import assert from "node:assert/strict";
|
|
@@ -21,6 +19,7 @@ import {
|
|
|
21
19
|
openDatabase,
|
|
22
20
|
closeDatabase,
|
|
23
21
|
insertMilestone,
|
|
22
|
+
insertSlice,
|
|
24
23
|
getMilestone,
|
|
25
24
|
} from "../gsd-db.ts";
|
|
26
25
|
import {
|
|
@@ -92,49 +91,60 @@ describe("checkAutoStartAfterDiscuss ready-notify DB guard (R3b)", () => {
|
|
|
92
91
|
}
|
|
93
92
|
});
|
|
94
93
|
|
|
95
|
-
test("
|
|
94
|
+
test("repairs a missing milestone DB row and accepts context-captured handoff", () => {
|
|
96
95
|
base = mkBase();
|
|
97
|
-
// Open a fresh in-memory DB but DO NOT insertMilestone for M001.
|
|
98
96
|
openDatabase(":memory:");
|
|
99
97
|
|
|
100
98
|
cap = mkCapture();
|
|
101
99
|
setPendingAutoStart(base, {
|
|
102
100
|
basePath: base,
|
|
103
101
|
milestoneId: "M001",
|
|
102
|
+
startAuto: false,
|
|
104
103
|
ctx: mkCtx(cap),
|
|
105
104
|
pi: mkPi(cap),
|
|
106
105
|
});
|
|
107
106
|
|
|
108
107
|
const result = checkAutoStartAfterDiscuss();
|
|
109
|
-
assert.equal(result,
|
|
108
|
+
assert.equal(result, true, "missing row with pinned context should repair and accept handoff");
|
|
110
109
|
|
|
111
|
-
// No success "ready" notify
|
|
112
110
|
const successReady = cap.notifies.find(
|
|
113
111
|
(n) => n.level === "success" && /ready\.?$/i.test(n.msg),
|
|
114
112
|
);
|
|
115
113
|
assert.equal(successReady, undefined, "must not announce 'ready' when DB row missing");
|
|
116
114
|
|
|
117
|
-
// When CONTEXT.md is on disk the R3b path recovers: it inserts a placeholder
|
|
118
|
-
// "queued" row (so Gate 1b can retry gsd_plan_milestone) and emits a warning.
|
|
119
115
|
const recovered = getMilestone("M001");
|
|
120
116
|
assert.ok(recovered, "R3b recovery must insert a placeholder 'queued' DB row");
|
|
121
117
|
assert.equal(recovered!.status, "queued", "placeholder row must have status 'queued'");
|
|
122
118
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
119
|
+
assert.equal(
|
|
120
|
+
cap.notifies.some(n => n.level === "warning"),
|
|
121
|
+
false,
|
|
122
|
+
"successful missing-row repair must not warn the user",
|
|
123
|
+
);
|
|
124
|
+
assert.deepEqual(cap.notifies, [
|
|
125
|
+
{
|
|
126
|
+
msg: "Milestone M001 context captured. Continuing the planning pipeline.",
|
|
127
|
+
level: "success",
|
|
128
|
+
},
|
|
129
|
+
]);
|
|
127
130
|
});
|
|
128
131
|
|
|
129
|
-
test("announces 'ready' when DB row
|
|
132
|
+
test("announces 'ready' when DB row has executable slices", () => {
|
|
130
133
|
base = mkBase();
|
|
131
134
|
openDatabase(":memory:");
|
|
132
135
|
insertMilestone({ id: "M001", title: "Ready Guard Test", status: "active" });
|
|
136
|
+
insertSlice({
|
|
137
|
+
id: "S01",
|
|
138
|
+
milestoneId: "M001",
|
|
139
|
+
title: "Executable Slice",
|
|
140
|
+
status: "pending",
|
|
141
|
+
});
|
|
133
142
|
|
|
134
143
|
cap = mkCapture();
|
|
135
144
|
setPendingAutoStart(base, {
|
|
136
145
|
basePath: base,
|
|
137
146
|
milestoneId: "M001",
|
|
147
|
+
startAuto: false,
|
|
138
148
|
ctx: mkCtx(cap),
|
|
139
149
|
pi: mkPi(cap),
|
|
140
150
|
});
|
|
@@ -9,6 +9,7 @@ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
9
9
|
import { handleGSDCommand } from "../commands/dispatcher.ts";
|
|
10
10
|
import {
|
|
11
11
|
closeDatabase,
|
|
12
|
+
insertAssessment,
|
|
12
13
|
insertMilestone,
|
|
13
14
|
insertSlice,
|
|
14
15
|
openDatabase,
|
|
@@ -106,6 +107,13 @@ function seedRegisteredCompletedWorktreeWithoutRoadmap(base: string): void {
|
|
|
106
107
|
title: "Live Text Search",
|
|
107
108
|
status: "complete",
|
|
108
109
|
});
|
|
110
|
+
insertAssessment({
|
|
111
|
+
path: "milestones/M008/M008-VALIDATION.md",
|
|
112
|
+
milestoneId: "M008",
|
|
113
|
+
status: "pass",
|
|
114
|
+
scope: "milestone-validation",
|
|
115
|
+
fullContent: "verdict: pass",
|
|
116
|
+
});
|
|
109
117
|
writeFileSync(
|
|
110
118
|
join(base, ".gsd", "PREFERENCES.md"),
|
|
111
119
|
"---\ngit:\n isolation: worktree\n---\n",
|
|
@@ -124,6 +132,19 @@ function seedRegisteredCompletedWorktree(base: string): void {
|
|
|
124
132
|
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
125
133
|
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
126
134
|
insertMilestone({ id: "M008", title: "Live Text Search", status: "complete" });
|
|
135
|
+
insertSlice({
|
|
136
|
+
id: "S01",
|
|
137
|
+
milestoneId: "M008",
|
|
138
|
+
title: "Live Text Search",
|
|
139
|
+
status: "complete",
|
|
140
|
+
});
|
|
141
|
+
insertAssessment({
|
|
142
|
+
path: "milestones/M008/M008-VALIDATION.md",
|
|
143
|
+
milestoneId: "M008",
|
|
144
|
+
status: "pass",
|
|
145
|
+
scope: "milestone-validation",
|
|
146
|
+
fullContent: "verdict: pass",
|
|
147
|
+
});
|
|
127
148
|
writeWorktreePreferencesAndRoadmap(base);
|
|
128
149
|
|
|
129
150
|
const worktreePath = join(base, ".gsd", "worktrees", "M008");
|