@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/project-sessions.js +4 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
- package/dist/resources/extensions/gsd/auto.js +73 -471
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +36 -470
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-cmd.js +20 -0
- 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 +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- 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/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +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/5047.js +2 -0
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-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/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- 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 +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- 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 +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- 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/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -127
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +47 -166
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
- package/src/resources/extensions/gsd/auto.ts +96 -508
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +49 -560
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
|
@@ -5,6 +5,7 @@ import { existsSync } from "node:fs";
|
|
|
5
5
|
|
|
6
6
|
import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
7
7
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
8
|
+
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
8
9
|
import { getIsolationMode } from "./preferences.js";
|
|
9
10
|
import { deriveState } from "./state.js";
|
|
10
11
|
import type { GSDState } from "./types.js";
|
|
@@ -91,6 +92,7 @@ export async function getValidationBlockMessageForBase(
|
|
|
91
92
|
attemptedCommand = "",
|
|
92
93
|
): Promise<string | null> {
|
|
93
94
|
await ensureDbOpen(base);
|
|
95
|
+
refreshWorkflowDatabaseFromDisk();
|
|
94
96
|
let state = await deriveState(base);
|
|
95
97
|
|
|
96
98
|
if (
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Web-app detection and Playwright/UAT guidance for planning and slice closeout.
|
|
3
|
+
|
|
4
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
|
|
7
|
+
import { detectWebApp } from "../browser-tools/web-app-detect.js";
|
|
8
|
+
|
|
9
|
+
export { detectWebApp };
|
|
10
|
+
|
|
11
|
+
interface MinimalPackageJson {
|
|
12
|
+
dependencies?: Record<string, unknown>;
|
|
13
|
+
devDependencies?: Record<string, unknown>;
|
|
14
|
+
scripts?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function readPackageJson(projectRoot: string): MinimalPackageJson | null {
|
|
18
|
+
const packageJsonPath = resolve(projectRoot, "package.json");
|
|
19
|
+
if (!existsSync(packageJsonPath)) return null;
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, "utf-8")) as unknown;
|
|
22
|
+
return parsed && typeof parsed === "object" ? (parsed as MinimalPackageJson) : null;
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function hasPlaywrightTestDependency(projectRoot: string): boolean {
|
|
29
|
+
const pkg = readPackageJson(projectRoot);
|
|
30
|
+
if (!pkg) return false;
|
|
31
|
+
const names = [
|
|
32
|
+
...Object.keys(pkg.dependencies ?? {}),
|
|
33
|
+
...Object.keys(pkg.devDependencies ?? {}),
|
|
34
|
+
];
|
|
35
|
+
return names.some((name) => name === "playwright" || name === "@playwright/test");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function findPlaywrightTestScript(projectRoot: string): string | null {
|
|
39
|
+
const pkg = readPackageJson(projectRoot);
|
|
40
|
+
if (!pkg?.scripts) return null;
|
|
41
|
+
for (const [name, value] of Object.entries(pkg.scripts)) {
|
|
42
|
+
if (typeof value !== "string") continue;
|
|
43
|
+
if (/\bplaywright\s+test\b/.test(value)) {
|
|
44
|
+
return `npm run ${name}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Markdown block injected into plan/complete-slice prompts when the project
|
|
52
|
+
* looks browser-facing. Returns null for CLI/library-only repos.
|
|
53
|
+
*/
|
|
54
|
+
export function buildWebAppUatGuidanceBlock(projectRoot: string): string | null {
|
|
55
|
+
if (!detectWebApp(projectRoot)) return null;
|
|
56
|
+
|
|
57
|
+
const playwrightScript = findPlaywrightTestScript(projectRoot);
|
|
58
|
+
const hasPlaywright = hasPlaywrightTestDependency(projectRoot) || playwrightScript !== null;
|
|
59
|
+
const lines = [
|
|
60
|
+
"### Web App UAT (detected)",
|
|
61
|
+
"",
|
|
62
|
+
"This project looks browser-facing. GSD exposes Playwright-backed `browser_*` tools by default for run-uat.",
|
|
63
|
+
"",
|
|
64
|
+
"**UAT modes (pick one per slice — do not use `artifact-driven` for browser steps):**",
|
|
65
|
+
"- `browser-executable` — navigate to `http://localhost:…`, click, screenshot, assert via `browser_*` tools during run-uat",
|
|
66
|
+
"- `runtime-executable` — run an automated browser test command via `gsd_uat_exec` (for example `npx playwright test`)",
|
|
67
|
+
"- `mixed` / `live-runtime` — combine runtime startup checks with interactive browser verification",
|
|
68
|
+
"",
|
|
69
|
+
"**Planning / closeout rules:**",
|
|
70
|
+
"- Preconditions must name the dev-server command and URL (for example `npm run dev` → `http://localhost:3000`)",
|
|
71
|
+
"- Slice Verification and UAT test cases must not say \"open in browser\" under `artifact-driven` — complete-slice rejects that",
|
|
72
|
+
"- Milestone `Verification Classes` → UAT row must describe browser-observable acceptance, not \"manual spot check\" alone",
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
if (hasPlaywright) {
|
|
76
|
+
lines.push(
|
|
77
|
+
"",
|
|
78
|
+
"**Playwright:** dependency detected.",
|
|
79
|
+
);
|
|
80
|
+
if (playwrightScript) {
|
|
81
|
+
lines.push(
|
|
82
|
+
`- Prefer slice verification and runtime-executable UAT referencing \`${playwrightScript}\` or a focused \`npx playwright test <spec>\` command`,
|
|
83
|
+
);
|
|
84
|
+
} else {
|
|
85
|
+
lines.push(
|
|
86
|
+
"- Prefer runtime-executable UAT with `npx playwright test` (or a focused spec path) when UI behavior is covered by specs",
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
lines.push("- Name concrete spec paths in slice Verification (for example `e2e/smoke.spec.ts`)");
|
|
90
|
+
} else {
|
|
91
|
+
lines.push(
|
|
92
|
+
"",
|
|
93
|
+
"**Playwright scaffolding (first UI slice):** no `playwright` / `@playwright/test` dependency yet.",
|
|
94
|
+
"- Add a planning task that installs Playwright, adds `playwright.config.ts`, and creates a minimal smoke spec (for example `e2e/smoke.spec.ts`)",
|
|
95
|
+
"- Task `verify` should run `npx playwright test` (or the focused spec) with a safe, simple command",
|
|
96
|
+
"- Until specs exist, use `browser-executable` UAT with localhost preconditions and interactive `browser_*` checks at slice closeout",
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return lines.join("\n");
|
|
101
|
+
}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { existsSync, realpathSync } from "node:fs";
|
|
3
|
-
import { dirname, resolve, sep } from "node:path";
|
|
3
|
+
import { basename, dirname, resolve, sep } from "node:path";
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
5
|
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
6
|
+
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
7
|
+
import {
|
|
8
|
+
supportsStructuredQuestions,
|
|
9
|
+
usesWorkflowMcpTransport,
|
|
10
|
+
} from "./question-transport.js";
|
|
11
|
+
import {
|
|
12
|
+
WORKFLOW_TOOL_SURFACE_NAMES,
|
|
13
|
+
isWorkflowToolSurfaceName,
|
|
14
|
+
} from "./workflow-tool-surface.js";
|
|
15
|
+
|
|
16
|
+
export { supportsStructuredQuestions, usesWorkflowMcpTransport };
|
|
6
17
|
|
|
7
18
|
type WorkflowExecutorsModule = typeof import("./tools/workflow-tool-executors.js");
|
|
8
19
|
|
|
@@ -42,73 +53,9 @@ export function resolveWorkflowMcpProjectRoot(sessionCwd: string): string {
|
|
|
42
53
|
return resolved;
|
|
43
54
|
}
|
|
44
55
|
|
|
45
|
-
const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
46
|
-
"gsd_cancel",
|
|
47
|
-
"gsd_captures",
|
|
48
|
-
"ask_user_questions",
|
|
49
|
-
"gsd_capture_thought",
|
|
50
|
-
"gsd_doctor",
|
|
51
|
-
"gsd_execute",
|
|
52
|
-
"gsd_memory_query",
|
|
53
|
-
"gsd_memory_graph",
|
|
54
|
-
"gsd_decision_save",
|
|
55
|
-
"gsd_exec",
|
|
56
|
-
"gsd_exec_search",
|
|
57
|
-
"gsd_graph",
|
|
58
|
-
"gsd_history",
|
|
59
|
-
"gsd_knowledge",
|
|
60
|
-
"gsd_progress",
|
|
61
|
-
"gsd_query",
|
|
62
|
-
"gsd_resume",
|
|
63
|
-
"gsd_result",
|
|
64
|
-
"gsd_resolve_blocker",
|
|
65
|
-
"gsd_roadmap",
|
|
66
|
-
"gsd_status",
|
|
67
|
-
"gsd_complete_milestone",
|
|
68
|
-
"gsd_complete_task",
|
|
69
|
-
"gsd_complete_slice",
|
|
70
|
-
"gsd_generate_milestone_id",
|
|
71
|
-
"gsd_journal_query",
|
|
72
|
-
"gsd_milestone_complete",
|
|
73
|
-
"gsd_milestone_generate_id",
|
|
74
|
-
"gsd_milestone_reopen",
|
|
75
|
-
"gsd_checkpoint_db",
|
|
76
|
-
"gsd_milestone_plan",
|
|
77
|
-
"gsd_milestone_status",
|
|
78
|
-
"gsd_milestone_validate",
|
|
79
|
-
"gsd_plan_task",
|
|
80
|
-
"gsd_plan_milestone",
|
|
81
|
-
"gsd_plan_slice",
|
|
82
|
-
"gsd_replan_slice",
|
|
83
|
-
"gsd_reassess_roadmap",
|
|
84
|
-
"gsd_reopen_milestone",
|
|
85
|
-
"gsd_reopen_slice",
|
|
86
|
-
"gsd_reopen_task",
|
|
87
|
-
"gsd_requirement_save",
|
|
88
|
-
"gsd_requirement_update",
|
|
89
|
-
"gsd_roadmap_reassess",
|
|
90
|
-
"gsd_save_decision",
|
|
91
|
-
"gsd_save_gate_result",
|
|
92
|
-
"gsd_save_requirement",
|
|
93
|
-
"gsd_save_summary",
|
|
94
|
-
"gsd_skip_slice",
|
|
95
|
-
"gsd_slice_plan",
|
|
96
|
-
"gsd_slice_replan",
|
|
97
|
-
"gsd_slice_complete",
|
|
98
|
-
"gsd_slice_reopen",
|
|
99
|
-
"gsd_summary_save",
|
|
100
|
-
"gsd_task_plan",
|
|
101
|
-
"gsd_task_complete",
|
|
102
|
-
"gsd_task_reopen",
|
|
103
|
-
"gsd_update_requirement",
|
|
104
|
-
"gsd_uat_exec",
|
|
105
|
-
"gsd_uat_result_save",
|
|
106
|
-
"gsd_validate_milestone",
|
|
107
|
-
]);
|
|
108
|
-
|
|
109
56
|
/** Workflow MCP tools are validated by transport compatibility, not pi tool-compat profiles. */
|
|
110
57
|
export function isWorkflowMcpSurfaceTool(toolName: string): boolean {
|
|
111
|
-
return
|
|
58
|
+
return isWorkflowToolSurfaceName(toolName);
|
|
112
59
|
}
|
|
113
60
|
|
|
114
61
|
function parseLookupOutput(output: Buffer | string): string {
|
|
@@ -276,8 +223,12 @@ function getBundledWorkflowWriteGateModulePath(): string | null {
|
|
|
276
223
|
|
|
277
224
|
function getResolveTsHookPath(): string | null {
|
|
278
225
|
const repoRoot = findGsdPiRepoRoot(dirname(fileURLToPath(import.meta.url)));
|
|
226
|
+
const sourceRepoRoot = repoRoot && basename(repoRoot) === "dist-test" ? dirname(repoRoot) : repoRoot;
|
|
279
227
|
return firstExistingPath([
|
|
280
|
-
...(
|
|
228
|
+
...(sourceRepoRoot
|
|
229
|
+
? [resolve(sourceRepoRoot, "src", "resources", "extensions", "gsd", "tests", "resolve-ts.mjs")]
|
|
230
|
+
: []),
|
|
231
|
+
...(repoRoot && repoRoot !== sourceRepoRoot
|
|
281
232
|
? [resolve(repoRoot, "src", "resources", "extensions", "gsd", "tests", "resolve-ts.mjs")]
|
|
282
233
|
: []),
|
|
283
234
|
resolve(fileURLToPath(new URL("./tests/resolve-ts.mjs", import.meta.url))),
|
|
@@ -421,52 +372,13 @@ export function getRequiredWorkflowToolsForAutoUnit(unitType: string): string[]
|
|
|
421
372
|
return getRequiredWorkflowToolsForUnit(unitType);
|
|
422
373
|
}
|
|
423
374
|
|
|
424
|
-
export function usesWorkflowMcpTransport(
|
|
425
|
-
authMode: WorkflowCapabilityOptions["authMode"],
|
|
426
|
-
baseUrl: string | undefined,
|
|
427
|
-
): boolean {
|
|
428
|
-
return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
function hasAskUserQuestionsTool(activeTools: string[]): boolean {
|
|
432
|
-
return activeTools.some((toolName) => {
|
|
433
|
-
if (toolName === "ask_user_questions") return true;
|
|
434
|
-
if (!toolName.startsWith("mcp__")) return false;
|
|
435
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
436
|
-
return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === "ask_user_questions";
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
|
|
440
375
|
function hasRequiredTool(requiredTool: string, activeTools: string[]): boolean {
|
|
441
376
|
return activeTools.some((toolName) => {
|
|
442
377
|
if (toolName === requiredTool) return true;
|
|
443
|
-
|
|
444
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
445
|
-
return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === requiredTool;
|
|
378
|
+
return mcpToolMatchesBaseName(toolName, requiredTool);
|
|
446
379
|
});
|
|
447
380
|
}
|
|
448
381
|
|
|
449
|
-
function workflowMcpStructuredQuestionsOptIn(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
450
|
-
const value = env.GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS;
|
|
451
|
-
return value === "1" || value === "true";
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
export function supportsStructuredQuestions(
|
|
455
|
-
activeTools: string[],
|
|
456
|
-
options: Pick<WorkflowCapabilityOptions, "authMode" | "baseUrl" | "env"> = {},
|
|
457
|
-
): boolean {
|
|
458
|
-
if (!hasAskUserQuestionsTool(activeTools)) return false;
|
|
459
|
-
if (usesWorkflowMcpTransport(options.authMode, options.baseUrl)) {
|
|
460
|
-
// Claude Code local workflow-MCP exposes ask_user_questions, but form
|
|
461
|
-
// elicitation can return an immediate cancel outside GSD's chat turn. Keep
|
|
462
|
-
// checkpoints in plain chat unless a caller deliberately opts into testing
|
|
463
|
-
// that transport.
|
|
464
|
-
return workflowMcpStructuredQuestionsOptIn(options.env);
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
return true;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
382
|
export function getWorkflowTransportSupportError(
|
|
471
383
|
provider: string | undefined,
|
|
472
384
|
requiredTools: string[],
|
|
@@ -488,13 +400,13 @@ export function getWorkflowTransportSupportError(
|
|
|
488
400
|
|
|
489
401
|
const uniqueRequired = [...new Set(requiredTools)];
|
|
490
402
|
const missing = (options.activeTools && options.activeTools.length > 0)
|
|
491
|
-
? uniqueRequired.filter((tool) => !hasRequiredTool(tool, options.activeTools!))
|
|
492
|
-
: uniqueRequired.filter((tool) => !
|
|
403
|
+
? uniqueRequired.filter((tool) => !isWorkflowToolSurfaceName(tool) && !hasRequiredTool(tool, options.activeTools!))
|
|
404
|
+
: uniqueRequired.filter((tool) => !isWorkflowToolSurfaceName(tool));
|
|
493
405
|
if (missing.length === 0) return null;
|
|
494
406
|
|
|
495
407
|
if (options.activeTools && options.activeTools.length > 0) {
|
|
496
408
|
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the active runtime toolset currently exposes only ${options.activeTools.slice().sort().join(", ")}.`;
|
|
497
409
|
}
|
|
498
410
|
|
|
499
|
-
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${
|
|
411
|
+
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${[...WORKFLOW_TOOL_SURFACE_NAMES].sort().join(", ")}.`;
|
|
500
412
|
}
|
|
@@ -13,11 +13,11 @@ import {
|
|
|
13
13
|
getMilestoneSlices,
|
|
14
14
|
insertVerificationEvidence,
|
|
15
15
|
upsertDecision,
|
|
16
|
-
openDatabase,
|
|
17
16
|
setTaskBlockerDiscovered,
|
|
18
17
|
insertOrIgnoreSlice,
|
|
19
18
|
insertOrIgnoreTask,
|
|
20
19
|
} from "./gsd-db.js";
|
|
20
|
+
import { openWorkflowDatabasePath } from "./db-workspace.js";
|
|
21
21
|
import { isClosedStatus } from "./status-guards.js";
|
|
22
22
|
import { invalidateStateCache } from "./state.js";
|
|
23
23
|
import { clearPathCache, resolveGsdPathContract } from "./paths.js";
|
|
@@ -500,7 +500,7 @@ function _reconcileWorktreeLogsInner(
|
|
|
500
500
|
atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
|
|
501
501
|
|
|
502
502
|
// Step 8: Replay into DB (wrapped in a transaction by replayEvents)
|
|
503
|
-
|
|
503
|
+
openWorkflowDatabasePath(resolveGsdPathContract(mainBasePath).projectDb);
|
|
504
504
|
replayEvents(merged);
|
|
505
505
|
|
|
506
506
|
// Step 9: Write manifest
|
|
@@ -655,7 +655,7 @@ export function resolveConflict(
|
|
|
655
655
|
writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
656
656
|
|
|
657
657
|
// Replay resolved events through the DB (updates DB state)
|
|
658
|
-
|
|
658
|
+
openWorkflowDatabasePath(resolveGsdPathContract(basePath).projectDb);
|
|
659
659
|
replayEvents(eventsToReplay);
|
|
660
660
|
invalidateStateCache();
|
|
661
661
|
clearPathCache();
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Adapts shared workflow tool contracts into the extension runtime surface.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
CANONICAL_WORKFLOW_TOOL_NAMES as CONTRACT_CANONICAL_WORKFLOW_TOOL_NAMES,
|
|
6
|
+
WORKFLOW_TOOL_ALIAS_NAMES as CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES,
|
|
7
|
+
WORKFLOW_TOOL_CONTRACTS as CONTRACT_WORKFLOW_TOOL_CONTRACTS,
|
|
8
|
+
WORKFLOW_TOOL_NAMES as CONTRACT_WORKFLOW_TOOL_NAMES,
|
|
9
|
+
} from "@opengsd/contracts";
|
|
10
|
+
import { stripMcpToolPrefix } from "./mcp-tool-name.js";
|
|
11
|
+
|
|
12
|
+
export interface WorkflowToolAliasPair {
|
|
13
|
+
canonical: string;
|
|
14
|
+
alias: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const WORKFLOW_TOOL_CONTRACTS = CONTRACT_WORKFLOW_TOOL_CONTRACTS;
|
|
18
|
+
|
|
19
|
+
export const CANONICAL_WORKFLOW_TOOL_NAMES = CONTRACT_CANONICAL_WORKFLOW_TOOL_NAMES;
|
|
20
|
+
export const WORKFLOW_TOOL_ALIAS_NAMES = CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES;
|
|
21
|
+
export const DB_WORKFLOW_TOOL_NAMES = CONTRACT_WORKFLOW_TOOL_NAMES;
|
|
22
|
+
|
|
23
|
+
export const WORKFLOW_TOOL_ALIAS_PAIRS: readonly WorkflowToolAliasPair[] =
|
|
24
|
+
WORKFLOW_TOOL_CONTRACTS.flatMap((tool) =>
|
|
25
|
+
tool.aliases.map((alias) => ({ canonical: tool.canonicalName, alias })),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
export const WORKFLOW_TOOL_ALIAS_TO_CANONICAL: Readonly<Record<string, string>> =
|
|
29
|
+
Object.fromEntries(WORKFLOW_TOOL_ALIAS_PAIRS.map(({ alias, canonical }) => [alias, canonical]));
|
|
30
|
+
|
|
31
|
+
const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
|
|
32
|
+
"gsd_cancel",
|
|
33
|
+
"gsd_captures",
|
|
34
|
+
"ask_user_questions",
|
|
35
|
+
"gsd_doctor",
|
|
36
|
+
"gsd_execute",
|
|
37
|
+
"gsd_graph",
|
|
38
|
+
"gsd_history",
|
|
39
|
+
"gsd_knowledge",
|
|
40
|
+
"gsd_progress",
|
|
41
|
+
"gsd_query",
|
|
42
|
+
"gsd_result",
|
|
43
|
+
"gsd_resolve_blocker",
|
|
44
|
+
"gsd_roadmap",
|
|
45
|
+
"gsd_status",
|
|
46
|
+
] as const;
|
|
47
|
+
|
|
48
|
+
export const WORKFLOW_TOOL_SURFACE_NAMES = [
|
|
49
|
+
...WORKFLOW_MCP_ADAPTER_TOOL_NAMES,
|
|
50
|
+
...DB_WORKFLOW_TOOL_NAMES,
|
|
51
|
+
] as readonly string[];
|
|
52
|
+
|
|
53
|
+
const WORKFLOW_TOOL_SURFACE_NAME_SET = new Set(WORKFLOW_TOOL_SURFACE_NAMES);
|
|
54
|
+
|
|
55
|
+
export { stripMcpToolPrefix } from "./mcp-tool-name.js";
|
|
56
|
+
|
|
57
|
+
export function canonicalWorkflowSurfaceToolName(toolName: string): string {
|
|
58
|
+
const baseName = stripMcpToolPrefix(toolName);
|
|
59
|
+
return WORKFLOW_TOOL_ALIAS_TO_CANONICAL[baseName] ?? baseName;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function isWorkflowSurfaceAliasTool(toolName: string): boolean {
|
|
63
|
+
const baseName = stripMcpToolPrefix(toolName);
|
|
64
|
+
return WORKFLOW_TOOL_ALIAS_TO_CANONICAL[baseName] !== undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function isWorkflowToolSurfaceName(toolName: string): boolean {
|
|
68
|
+
return WORKFLOW_TOOL_SURFACE_NAME_SET.has(stripMcpToolPrefix(toolName));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function aliasesForWorkflowTool(canonicalName: string): readonly string[] {
|
|
72
|
+
return WORKFLOW_TOOL_CONTRACTS.find((tool) => tool.canonicalName === canonicalName)?.aliases ?? [];
|
|
73
|
+
}
|
|
@@ -14,6 +14,7 @@ export function isWorkspaceGitAllowedCommand(trimmed: string): boolean {
|
|
|
14
14
|
|
|
15
15
|
const [name, subcommand] = command.split(/\s+/, 2);
|
|
16
16
|
if (name === "doctor") return true;
|
|
17
|
+
if (name === "forensics") return true;
|
|
17
18
|
if (name === "closeout" || command.startsWith("closeout")) return true;
|
|
18
19
|
if (name === "dispatch") {
|
|
19
20
|
return subcommand === "complete" || subcommand === "complete-milestone";
|
|
@@ -79,6 +79,7 @@ import {
|
|
|
79
79
|
teardownAutoWorktree,
|
|
80
80
|
} from "./auto-worktree.js";
|
|
81
81
|
import { resolveRoadmapForMilestoneMerge } from "./milestone-merge-roadmap.js";
|
|
82
|
+
import type { MilestoneMergeTransactionRunner } from "./milestone-merge-transaction.js";
|
|
82
83
|
|
|
83
84
|
const recentWorktreeMergeFailures = new Map<string, number>();
|
|
84
85
|
const MERGE_FAILURE_DEDUPE_MS = 60_000;
|
|
@@ -147,25 +148,15 @@ export interface WorktreeLifecycleDeps {
|
|
|
147
148
|
*/
|
|
148
149
|
worktreeProjection: WorktreeStateProjection;
|
|
149
150
|
|
|
150
|
-
// ── Merge
|
|
151
|
+
// ── Merge transaction ────────────────────────────────────────────────
|
|
151
152
|
/**
|
|
152
|
-
*
|
|
153
|
+
* Milestone Merge Transaction Module runner.
|
|
153
154
|
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* merge body through `WorktreeLifecycle.exitMilestone({ merge: true })`,
|
|
158
|
-
* never by calling this dep directly.
|
|
155
|
+
* The field name is preserved for existing test fixtures, but production
|
|
156
|
+
* wiring now supplies the named transaction wrapper rather than the raw
|
|
157
|
+
* squash-merge primitive directly.
|
|
159
158
|
*/
|
|
160
|
-
mergeMilestoneToMain:
|
|
161
|
-
basePath: string,
|
|
162
|
-
milestoneId: string,
|
|
163
|
-
roadmapContent: string,
|
|
164
|
-
) => {
|
|
165
|
-
pushed: boolean;
|
|
166
|
-
codeFilesChanged: boolean;
|
|
167
|
-
commitMessage?: string;
|
|
168
|
-
};
|
|
159
|
+
mergeMilestoneToMain: MilestoneMergeTransactionRunner;
|
|
169
160
|
|
|
170
161
|
// ADR-016 phase 2 / C1 + C2 + C3 + C4 inlined the following fields as
|
|
171
162
|
// direct imports — leaf primitives that did not vary across callers:
|
|
@@ -74,6 +74,30 @@ const VERDICT_RE = /verdict:\s*[\w-]+/i;
|
|
|
74
74
|
* Only overwrites when the source has a verdict — never clobbers a
|
|
75
75
|
* worktree ASSESSMENT with a verdictless project-root copy.
|
|
76
76
|
*/
|
|
77
|
+
function forceOverwriteValidationWithVerdict(
|
|
78
|
+
srcMilestoneDir: string,
|
|
79
|
+
dstMilestoneDir: string,
|
|
80
|
+
milestoneId: string,
|
|
81
|
+
): void {
|
|
82
|
+
if (!existsSync(srcMilestoneDir) || !milestoneId) return;
|
|
83
|
+
|
|
84
|
+
const srcFile = join(srcMilestoneDir, `${milestoneId}-VALIDATION.md`);
|
|
85
|
+
if (!existsSync(srcFile)) return;
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const srcContent = readFileSync(srcFile, "utf-8");
|
|
89
|
+
if (!VERDICT_RE.test(srcContent)) return;
|
|
90
|
+
|
|
91
|
+
mkdirSync(dstMilestoneDir, { recursive: true });
|
|
92
|
+
safeCopy(srcFile, join(dstMilestoneDir, `${milestoneId}-VALIDATION.md`), { force: true });
|
|
93
|
+
} catch (err) {
|
|
94
|
+
logWarning(
|
|
95
|
+
"worktree",
|
|
96
|
+
`validation force-copy failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
77
101
|
function forceOverwriteAssessmentsWithVerdict(
|
|
78
102
|
srcMilestoneDir: string,
|
|
79
103
|
dstMilestoneDir: string,
|
|
@@ -260,10 +284,10 @@ export function _projectRootToWorktreeImpl(
|
|
|
260
284
|
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
261
285
|
// persists, checkNeedsRunUat finds no passing verdict → re-dispatches
|
|
262
286
|
// run-uat indefinitely (stuck-loop ×9).
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
);
|
|
287
|
+
const prMilestoneDir = join(prGsd, "milestones", milestoneId);
|
|
288
|
+
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
289
|
+
forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
|
|
290
|
+
forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
|
|
267
291
|
|
|
268
292
|
// Forward-sync completed-units.json from project root to worktree.
|
|
269
293
|
// Project root is authoritative for completion state after crash recovery;
|
|
@@ -442,25 +466,41 @@ export class WorktreeStateProjection {
|
|
|
442
466
|
* any Unit dispatches.
|
|
443
467
|
*/
|
|
444
468
|
projectRootToWorktree(scope: MilestoneScope): void {
|
|
445
|
-
|
|
469
|
+
this.projectRootToWorktreePaths(
|
|
446
470
|
scope.workspace.projectRoot,
|
|
447
471
|
scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
|
|
448
472
|
scope.milestoneId,
|
|
449
473
|
);
|
|
450
474
|
}
|
|
451
475
|
|
|
476
|
+
projectRootToWorktreePaths(
|
|
477
|
+
projectRoot: string,
|
|
478
|
+
worktreePath: string,
|
|
479
|
+
milestoneId: string | null,
|
|
480
|
+
): void {
|
|
481
|
+
_projectRootToWorktreeImpl(projectRoot, worktreePath, milestoneId);
|
|
482
|
+
}
|
|
483
|
+
|
|
452
484
|
/**
|
|
453
485
|
* Project state from the auto-worktree back onto the project root for `scope`.
|
|
454
486
|
* Called by the post-unit pipeline between Units.
|
|
455
487
|
*/
|
|
456
488
|
projectWorktreeToRoot(scope: MilestoneScope): void {
|
|
457
|
-
|
|
489
|
+
this.projectWorktreeToRootPaths(
|
|
458
490
|
scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
|
|
459
491
|
scope.workspace.projectRoot,
|
|
460
492
|
scope.milestoneId,
|
|
461
493
|
);
|
|
462
494
|
}
|
|
463
495
|
|
|
496
|
+
projectWorktreeToRootPaths(
|
|
497
|
+
worktreePath: string,
|
|
498
|
+
projectRoot: string,
|
|
499
|
+
milestoneId: string | null,
|
|
500
|
+
): void {
|
|
501
|
+
_projectWorktreeToRootImpl(worktreePath, projectRoot, milestoneId);
|
|
502
|
+
}
|
|
503
|
+
|
|
464
504
|
/**
|
|
465
505
|
* Final projection from the auto-worktree to the project root before
|
|
466
506
|
* teardown. Called by Lifecycle's exit path after a successful merge,
|
|
@@ -471,10 +511,18 @@ export class WorktreeStateProjection {
|
|
|
471
511
|
* telemetry on what crossed the boundary.
|
|
472
512
|
*/
|
|
473
513
|
finalizeProjectionForMerge(scope: MilestoneScope): { synced: string[] } {
|
|
474
|
-
return
|
|
514
|
+
return this.finalizeProjectionForMergePaths(
|
|
475
515
|
scope.workspace.projectRoot,
|
|
476
516
|
scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
|
|
477
517
|
scope.milestoneId,
|
|
478
518
|
);
|
|
479
519
|
}
|
|
520
|
+
|
|
521
|
+
finalizeProjectionForMergePaths(
|
|
522
|
+
projectRoot: string,
|
|
523
|
+
worktreePath: string,
|
|
524
|
+
milestoneId: string,
|
|
525
|
+
): { synced: string[] } {
|
|
526
|
+
return _finalizeProjectionForMergeImpl(projectRoot, worktreePath, milestoneId);
|
|
527
|
+
}
|
|
480
528
|
}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import { randomUUID } from "node:crypto";
|
|
23
23
|
import { emitJournalEvent, queryJournal } from "./journal.js";
|
|
24
24
|
import type { JournalEntry } from "./journal.js";
|
|
25
|
+
import type { AutoTerminalOutcome } from "./auto/contracts.js";
|
|
25
26
|
|
|
26
27
|
function now(): string {
|
|
27
28
|
return new Date().toISOString();
|
|
@@ -91,6 +92,21 @@ export function normalizeAutoExitReason(rawReason?: string): AutoExitReason {
|
|
|
91
92
|
: "other";
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
export function autoExitReasonForTerminalOutcome(
|
|
96
|
+
outcome: AutoTerminalOutcome | undefined,
|
|
97
|
+
): AutoExitReason | null {
|
|
98
|
+
switch (outcome?.code) {
|
|
99
|
+
case "all-complete":
|
|
100
|
+
return "all-complete";
|
|
101
|
+
case "settlement-blocked":
|
|
102
|
+
return "blocked";
|
|
103
|
+
case "no-remaining-units":
|
|
104
|
+
return "stop";
|
|
105
|
+
default:
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
94
110
|
// ─── Emitters ────────────────────────────────────────────────────────────
|
|
95
111
|
|
|
96
112
|
export function emitWorktreeCreated(
|
|
@@ -62,6 +62,13 @@ export interface RoundResult {
|
|
|
62
62
|
/** Always false — end is handled by showWrapUpScreen, not per-question */
|
|
63
63
|
endInterview: false;
|
|
64
64
|
answers: Record<string, { selected: string | string[]; notes: string }>;
|
|
65
|
+
/**
|
|
66
|
+
* Set to true only when the round ended because the external AbortSignal
|
|
67
|
+
* fired (e.g. a system/host teardown), as distinct from a deliberate user
|
|
68
|
+
* dismissal. Consumers use this to avoid laundering a system teardown into a
|
|
69
|
+
* clean user-declined cancel. Additive/optional — native consumers ignore it.
|
|
70
|
+
*/
|
|
71
|
+
interrupted?: boolean;
|
|
65
72
|
}
|
|
66
73
|
|
|
67
74
|
export interface WrapUpResult {
|
|
@@ -97,6 +104,12 @@ export interface InterviewRoundOptions {
|
|
|
97
104
|
* Defaults to "end interview".
|
|
98
105
|
*/
|
|
99
106
|
exitLabel?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Render as a floating overlay instead of replacing the editor. Use when the
|
|
109
|
+
* interview must stay visible during an in-flight agent stream (e.g. claude-code-cli
|
|
110
|
+
* MCP elicitation).
|
|
111
|
+
*/
|
|
112
|
+
overlay?: boolean;
|
|
100
113
|
}
|
|
101
114
|
|
|
102
115
|
export interface WrapUpOptions {
|
|
@@ -240,7 +253,7 @@ export async function showInterviewRound(
|
|
|
240
253
|
|
|
241
254
|
// External cancellation (e.g. remote channel won the race)
|
|
242
255
|
if (opts.signal) {
|
|
243
|
-
const onAbort = () => finish({ endInterview: false, answers: {} });
|
|
256
|
+
const onAbort = () => finish({ endInterview: false, answers: {}, interrupted: true });
|
|
244
257
|
if (opts.signal.aborted) { onAbort(); }
|
|
245
258
|
else {
|
|
246
259
|
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
@@ -845,5 +858,5 @@ export async function showInterviewRound(
|
|
|
845
858
|
invalidate: () => { cachedLines = undefined; },
|
|
846
859
|
handleInput,
|
|
847
860
|
};
|
|
848
|
-
});
|
|
861
|
+
}, opts.overlay ? { overlay: true } : undefined);
|
|
849
862
|
}
|