@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
|
@@ -189,9 +189,15 @@ export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
|
|
|
189
189
|
const risk = (riskMatch ? riskMatch[1] : "low") as RiskLevel;
|
|
190
190
|
|
|
191
191
|
const depsMatch = rest.match(/`depends:\[([^\]]*)\]`/);
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
// Recovery fallback: double-bracket form `[[id]]` from serialized bracket-wrapped IDs
|
|
193
|
+
const fallbackDepsMatch = depsMatch ? null : rest.match(/`depends:\[(\[(?:[^\]]*)\](?:,\[(?:[^\]]*)\])*)\]`/);
|
|
194
|
+
const rawDepContent = (depsMatch ?? fallbackDepsMatch)?.[1] ?? "";
|
|
195
|
+
const SLICE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
|
|
196
|
+
const RANGE_RE = /^[A-Za-z]+\d+(?:-|\.\.)[A-Za-z]+\d+$/;
|
|
197
|
+
const rawDepParts = rawDepContent.trim()
|
|
198
|
+
? rawDepContent.replace(/\[|\]/g, "").split(",").map(s => s.trim()).filter(s => SLICE_ID_RE.test(s) || RANGE_RE.test(s))
|
|
194
199
|
: [];
|
|
200
|
+
const depends = expandDependencies(rawDepParts);
|
|
195
201
|
|
|
196
202
|
// ADR-011: the renderer writes a `[sketch]` badge for sketch slices.
|
|
197
203
|
// Parse it back so the is_sketch flag survives a markdown → DB re-import
|
|
@@ -67,7 +67,12 @@ export interface ParsedRoadmap {
|
|
|
67
67
|
const TEMPLATE_TOKEN_RE = /\{\{[^}]+\}\}/;
|
|
68
68
|
const H2_RE = /^##\s+(.+)$/gm;
|
|
69
69
|
const H3_RE = /^###\s+(.+)$/gm;
|
|
70
|
-
|
|
70
|
+
// A milestone line is single-line by construction. Every inter-token gap uses
|
|
71
|
+
// horizontal-whitespace classes (`[^\S\n]`) rather than `\s`, because `\s`
|
|
72
|
+
// matches newlines: a line missing a valid separator would otherwise let the
|
|
73
|
+
// `\s+(?:—|--|-)\s+` clause "bridge" onto the NEXT bullet's `- `, consuming it
|
|
74
|
+
// as the separator and silently swallowing the following well-formed milestone.
|
|
75
|
+
const MILESTONE_LINE_RE = /^-[^\S\n]+\[([ x])\][^\S\n]+(M\d{3}):[^\S\n]+(.+?)[^\S\n]+(?:—|--|-)[^\S\n]+(.+)$/gm;
|
|
71
76
|
const SLICE_HEADER_RE = /^###\s+(S\d{2})\s*(?:—|--|-)\s+(.+)$/m;
|
|
72
77
|
const REQUIREMENT_HEADER_RE = /^###\s+(R\d{3})\s*(?:—|--|-)\s+(.+)$/m;
|
|
73
78
|
|
|
@@ -30,7 +30,8 @@ import { isAbsolute, join, dirname, resolve } from "node:path";
|
|
|
30
30
|
import { fileURLToPath } from "node:url";
|
|
31
31
|
import { gsdRoot } from "./paths.js";
|
|
32
32
|
import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
|
|
33
|
-
import { autoWorktreeBranch, runWorktreePostCreateHook,
|
|
33
|
+
import { autoWorktreeBranch, runWorktreePostCreateHook, syncGsdStateToWorktreeByScope } from "./auto-worktree.js";
|
|
34
|
+
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
34
35
|
import {
|
|
35
36
|
writeSessionStatus,
|
|
36
37
|
removeSessionStatus,
|
|
@@ -163,7 +164,10 @@ function createSliceWorktree(basePath: string, milestoneId: string, sliceId: str
|
|
|
163
164
|
if (hookError) {
|
|
164
165
|
throw new Error(`slice worktree post-create hook failed (${wtName}): ${hookError}`);
|
|
165
166
|
}
|
|
166
|
-
|
|
167
|
+
syncGsdStateToWorktreeByScope(
|
|
168
|
+
scopeMilestone(createWorkspace(basePath), milestoneId),
|
|
169
|
+
scopeMilestone(createWorkspace(wtPath), milestoneId),
|
|
170
|
+
);
|
|
167
171
|
|
|
168
172
|
if (!existsSync(join(wtPath, ".gsd"))) {
|
|
169
173
|
throw new Error(`slice worktree preflight failed (${wtName}): missing .gsd in worktree`);
|
|
@@ -335,21 +335,42 @@ function detectDiskSliceIdDivergenceForMilestone(
|
|
|
335
335
|
return drifts;
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
+
type ArtifactDbDrift =
|
|
339
|
+
| DiskSliceIdDivergenceDrift
|
|
340
|
+
| ArtifactDbStatusDivergenceDrift
|
|
341
|
+
| CompletedMilestoneReopenedDrift;
|
|
342
|
+
|
|
343
|
+
// #442 Phase 1.6: the three artifact/DB drift handlers (disk-slice-id,
|
|
344
|
+
// artifact-db-status, completed-milestone-reopened) each call
|
|
345
|
+
// detectArtifactDbDrift and then filter for their own kind — so the full
|
|
346
|
+
// milestone→slice→task walk + artifact SQL + disk scan would run THREE times
|
|
347
|
+
// per detection pass and discard 2/3 of the work. Memoize the result per
|
|
348
|
+
// DriftContext so the three handlers share one computation. The key is the
|
|
349
|
+
// ctx object, which detectAllDrift rebuilds for every pass (and which is
|
|
350
|
+
// unreferenced once the pass ends, so the WeakMap entry is GC'd) — DB/disk
|
|
351
|
+
// state is immutable within a single pass (repairs run only after detection),
|
|
352
|
+
// so this is behavior-preserving. A fresh ctx (e.g. the maintenance command's
|
|
353
|
+
// inline { basePath, state }) always recomputes.
|
|
354
|
+
const _artifactDbDriftMemo = new WeakMap<DriftContext, ArtifactDbDrift[]>();
|
|
355
|
+
|
|
338
356
|
export function detectArtifactDbDrift(
|
|
357
|
+
state: GSDState,
|
|
358
|
+
ctx: DriftContext,
|
|
359
|
+
): ArtifactDbDrift[] {
|
|
360
|
+
const cached = _artifactDbDriftMemo.get(ctx);
|
|
361
|
+
if (cached) return cached;
|
|
362
|
+
const computed = computeArtifactDbDrift(state, ctx);
|
|
363
|
+
_artifactDbDriftMemo.set(ctx, computed);
|
|
364
|
+
return computed;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function computeArtifactDbDrift(
|
|
339
368
|
_state: GSDState,
|
|
340
369
|
ctx: DriftContext,
|
|
341
|
-
):
|
|
342
|
-
| DiskSliceIdDivergenceDrift
|
|
343
|
-
| ArtifactDbStatusDivergenceDrift
|
|
344
|
-
| CompletedMilestoneReopenedDrift
|
|
345
|
-
> {
|
|
370
|
+
): ArtifactDbDrift[] {
|
|
346
371
|
if (!isDbAvailable()) return [];
|
|
347
372
|
|
|
348
|
-
const drifts:
|
|
349
|
-
| DiskSliceIdDivergenceDrift
|
|
350
|
-
| ArtifactDbStatusDivergenceDrift
|
|
351
|
-
| CompletedMilestoneReopenedDrift
|
|
352
|
-
> = [];
|
|
373
|
+
const drifts: ArtifactDbDrift[] = [];
|
|
353
374
|
|
|
354
375
|
for (const milestone of getAllMilestones()) {
|
|
355
376
|
if (isClosedStatus(milestone.status)) continue;
|
|
@@ -52,7 +52,6 @@ import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifie
|
|
|
52
52
|
|
|
53
53
|
import {
|
|
54
54
|
isDbAvailable,
|
|
55
|
-
wasDbOpenAttempted,
|
|
56
55
|
getAllMilestones,
|
|
57
56
|
getMilestone,
|
|
58
57
|
getMilestoneSlices,
|
|
@@ -63,9 +62,14 @@ import {
|
|
|
63
62
|
getLatestAssessmentByScope,
|
|
64
63
|
getPendingGateCountForTurn,
|
|
65
64
|
} from './gsd-db.js';
|
|
65
|
+
import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
|
|
66
66
|
import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
|
|
67
67
|
import type { MilestoneRow } from './db-milestone-artifact-rows.js';
|
|
68
68
|
import type { SliceRow, TaskRow } from './db-task-slice-rows.js';
|
|
69
|
+
import {
|
|
70
|
+
classifyMilestoneReadiness,
|
|
71
|
+
readinessNeedsDiscussion,
|
|
72
|
+
} from './milestone-readiness.js';
|
|
69
73
|
|
|
70
74
|
function formatNeedsAttentionBlocker(milestoneId: string): string {
|
|
71
75
|
return [
|
|
@@ -395,7 +399,7 @@ export async function deriveState(
|
|
|
395
399
|
stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
396
400
|
_telemetry.dbDeriveCount++;
|
|
397
401
|
} else {
|
|
398
|
-
if (
|
|
402
|
+
if (wasWorkflowDatabaseOpenAttempted()) {
|
|
399
403
|
logWarning("state", "DB unavailable — refusing implicit markdown state derivation");
|
|
400
404
|
}
|
|
401
405
|
result = {
|
|
@@ -507,6 +511,12 @@ async function buildRegistryAndFindActive(
|
|
|
507
511
|
const title = stripMilestonePrefix(m.title) || m.id;
|
|
508
512
|
const hasContext = !!resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
509
513
|
const hasDraftContext = !hasContext && !!resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
514
|
+
const readiness = classifyMilestoneReadiness({
|
|
515
|
+
status: m.status,
|
|
516
|
+
hasContext,
|
|
517
|
+
hasDraftContext,
|
|
518
|
+
sliceCount: slices.length,
|
|
519
|
+
});
|
|
510
520
|
|
|
511
521
|
if (!activeMilestoneFound) {
|
|
512
522
|
const deps = m.depends_on;
|
|
@@ -517,9 +527,9 @@ async function buildRegistryAndFindActive(
|
|
|
517
527
|
continue;
|
|
518
528
|
}
|
|
519
529
|
|
|
520
|
-
if (
|
|
530
|
+
if (readiness.kind === 'queued-shell') {
|
|
521
531
|
if (!firstDeferredQueuedShell) {
|
|
522
|
-
firstDeferredQueuedShell = { id: m.id, title, deps, hasDraftContext };
|
|
532
|
+
firstDeferredQueuedShell = { id: m.id, title, deps, hasDraftContext: readiness.hasDraftContext };
|
|
523
533
|
}
|
|
524
534
|
registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
525
535
|
continue;
|
|
@@ -533,7 +543,7 @@ async function buildRegistryAndFindActive(
|
|
|
533
543
|
continue;
|
|
534
544
|
}
|
|
535
545
|
|
|
536
|
-
if ((
|
|
546
|
+
if (readinessNeedsDiscussion(readiness)) activeMilestoneHasDraft = true;
|
|
537
547
|
|
|
538
548
|
activeMilestone = { id: m.id, title };
|
|
539
549
|
activeMilestoneSlices = slices;
|
|
@@ -46,6 +46,13 @@
|
|
|
46
46
|
For simple projects or scripts:
|
|
47
47
|
- Executable verification commands (bash assertions, curl checks, etc.) are sufficient
|
|
48
48
|
|
|
49
|
+
For browser-facing web apps (React, Next, Vue, Vite, static HTML, etc.):
|
|
50
|
+
- Prefer `npx playwright test <spec>` in Verification when `@playwright/test` exists
|
|
51
|
+
- If Playwright is not set up yet, the first UI slice should add `playwright.config.ts`,
|
|
52
|
+
a minimal smoke spec (for example `e2e/smoke.spec.ts`), and a safe verify command
|
|
53
|
+
- Slice closeout UAT must declare `browser-executable` or `runtime-executable` — not
|
|
54
|
+
`artifact-driven` — when checks navigate to localhost or exercise the live UI
|
|
55
|
+
|
|
49
56
|
If the project has no test framework and the work is non-trivial,
|
|
50
57
|
the first task should set one up. A test runner costs 2 minutes
|
|
51
58
|
and pays for itself immediately.
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
- **Complexity:** {{simple | complex}}
|
|
22
22
|
- **Why:** {{one-line rationale citing the signals that decided it}}
|
|
23
|
+
- **Web stack:** {{browser-facing framework or "not a web UI" — e.g. Next.js + Playwright, static HTML, N/A for CLI/API-only}}
|
|
23
24
|
|
|
24
25
|
## Current State
|
|
25
26
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
- Contract verification: {{tests / shell verifiers / fixtures / artifact checks}}
|
|
43
43
|
- Integration verification: {{real subsystem interaction that must be exercised, or none}}
|
|
44
44
|
- Operational verification: {{service lifecycle / restart / reconnect / supervision / deploy-install behavior, or none}}
|
|
45
|
-
- UAT / human verification: {{what needs real human judgment, or none}}
|
|
45
|
+
- UAT / human verification: {{what needs real human judgment, or none — for web apps prefer browser-executable / runtime-executable Playwright checks over deferring UI proof to humans}}
|
|
46
46
|
|
|
47
47
|
## Milestone Definition of Done
|
|
48
48
|
|
|
@@ -5,9 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
## UAT Type
|
|
7
7
|
|
|
8
|
-
- UAT mode: {{artifact-driven | live-runtime | human-experience | mixed}}
|
|
8
|
+
- UAT mode: {{artifact-driven | browser-executable | runtime-executable | live-runtime | human-experience | mixed}}
|
|
9
9
|
- Why this mode is sufficient: {{reason}}
|
|
10
10
|
|
|
11
|
+
<!-- Web apps: never use artifact-driven when steps open a browser, navigate to localhost,
|
|
12
|
+
or capture screenshots. Use browser-executable (browser_* tools) or runtime-executable
|
|
13
|
+
(npx playwright test). Name dev-server preconditions below. -->
|
|
14
|
+
|
|
11
15
|
## Preconditions
|
|
12
16
|
|
|
13
17
|
{{whatMustBeTrueBeforeTesting — server running, data seeded, etc.}}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: #442 Phase 1.6 — detectArtifactDbDrift is memoized per
|
|
3
|
+
// DriftContext so the three artifact/DB drift handlers share one
|
|
4
|
+
// milestone→slice→task walk per detection pass instead of recomputing it
|
|
5
|
+
// three times. Asserts external behavior: same ctx returns the same result
|
|
6
|
+
// (shared within a pass); a fresh ctx recomputes identical content (no
|
|
7
|
+
// cross-pass leakage).
|
|
8
|
+
|
|
9
|
+
import test from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
|
|
15
|
+
import { openDatabase, closeDatabase, insertMilestone, insertSlice } from "../gsd-db.ts";
|
|
16
|
+
import { detectArtifactDbDrift } from "../state-reconciliation/drift/artifact-db.ts";
|
|
17
|
+
import type { DriftContext } from "../state-reconciliation/types.ts";
|
|
18
|
+
import type { GSDState } from "../types.ts";
|
|
19
|
+
|
|
20
|
+
function stubState(): GSDState {
|
|
21
|
+
return {
|
|
22
|
+
activeMilestone: { id: "M001", title: "M" },
|
|
23
|
+
activeSlice: null,
|
|
24
|
+
activeTask: null,
|
|
25
|
+
phase: "executing",
|
|
26
|
+
recentDecisions: [],
|
|
27
|
+
blockers: [],
|
|
28
|
+
nextAction: "",
|
|
29
|
+
registry: [],
|
|
30
|
+
requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
|
|
31
|
+
progress: { milestones: { done: 0, total: 1 } },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
test("#442: detectArtifactDbDrift is memoized per DriftContext", (t) => {
|
|
36
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-artifact-memo-"));
|
|
37
|
+
const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
|
|
38
|
+
mkdirSync(sliceDir, { recursive: true });
|
|
39
|
+
t.after(() => {
|
|
40
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
41
|
+
rmSync(base, { recursive: true, force: true });
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
45
|
+
insertMilestone({ id: "M001", title: "M", status: "active" });
|
|
46
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "pending", risk: "low", depends: [], sequence: 1 });
|
|
47
|
+
// A SUMMARY on disk while the slice is still pending = artifact/DB divergence.
|
|
48
|
+
writeFileSync(join(sliceDir, "S01-SUMMARY.md"), "# S01 Summary\n");
|
|
49
|
+
|
|
50
|
+
const state = stubState();
|
|
51
|
+
|
|
52
|
+
const ctx1: DriftContext = { basePath: base, state };
|
|
53
|
+
const first = detectArtifactDbDrift(state, ctx1);
|
|
54
|
+
const firstAgain = detectArtifactDbDrift(state, ctx1);
|
|
55
|
+
|
|
56
|
+
// Same ctx → cache hit → identical array reference (the 3 handlers in one
|
|
57
|
+
// pass share this exact result).
|
|
58
|
+
assert.strictEqual(firstAgain, first, "same ctx must return the memoized result");
|
|
59
|
+
assert.ok(first.length > 0, "fixture should produce at least one drift record");
|
|
60
|
+
|
|
61
|
+
// Fresh ctx → recomputed (distinct instance) but identical content.
|
|
62
|
+
const ctx2: DriftContext = { basePath: base, state };
|
|
63
|
+
const second = detectArtifactDbDrift(state, ctx2);
|
|
64
|
+
assert.notStrictEqual(second, first, "a fresh ctx must recompute, not reuse the prior pass");
|
|
65
|
+
assert.deepEqual(second, first, "recomputed result must be identical content");
|
|
66
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for ask_user_questions renderResult when Claude Code MCP
|
|
3
|
+
* omits structuredContent and the chat controller passes details as undefined
|
|
4
|
+
* or an empty object.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
import { test } from "node:test";
|
|
9
|
+
import askUserQuestionsExtension from "../../ask-user-questions.ts";
|
|
10
|
+
|
|
11
|
+
const fakeTheme = {
|
|
12
|
+
fg: (_color: string, text: string) => text,
|
|
13
|
+
bold: (text: string) => text,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function getAskUserQuestionsTool() {
|
|
17
|
+
const tools: any[] = [];
|
|
18
|
+
askUserQuestionsExtension({ registerTool: (tool: any) => tools.push(tool) } as any);
|
|
19
|
+
const tool = tools.find((t) => t.name === "ask_user_questions");
|
|
20
|
+
assert.ok(tool, "ask_user_questions should be registered");
|
|
21
|
+
return tool;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function renderText(tool: any, result: unknown, args?: unknown): string {
|
|
25
|
+
const rendered = tool.renderResult(result, {}, fakeTheme, { args });
|
|
26
|
+
return String((rendered as any).content ?? (rendered as any).text ?? rendered);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const depthQuestion = {
|
|
30
|
+
id: "depth_check",
|
|
31
|
+
header: "Depth Check",
|
|
32
|
+
question: "Did I capture the depth right?",
|
|
33
|
+
options: [
|
|
34
|
+
{ label: "Yes, you got it", description: "Proceed" },
|
|
35
|
+
{ label: "Not quite - let me clarify", description: "Clarify" },
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
test("ask_user_questions renderResult shows answers when details is undefined (MCP text-only wire)", () => {
|
|
40
|
+
const tool = getAskUserQuestionsTool();
|
|
41
|
+
const contentText = JSON.stringify({
|
|
42
|
+
answers: { depth_check: { answers: ["Yes, you got it"] } },
|
|
43
|
+
});
|
|
44
|
+
const text = renderText(
|
|
45
|
+
tool,
|
|
46
|
+
{
|
|
47
|
+
content: [{ type: "text", text: contentText }],
|
|
48
|
+
details: undefined,
|
|
49
|
+
isError: false,
|
|
50
|
+
},
|
|
51
|
+
{ questions: [depthQuestion] },
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
assert.match(text, /✓/);
|
|
55
|
+
assert.match(text, /Depth Check/);
|
|
56
|
+
assert.match(text, /Yes, you got it/);
|
|
57
|
+
assert.doesNotMatch(text, /Cancelled/i);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("ask_user_questions renderResult shows answers when details is empty object (#cc-elicitation)", () => {
|
|
61
|
+
const tool = getAskUserQuestionsTool();
|
|
62
|
+
const contentText = JSON.stringify({
|
|
63
|
+
answers: { depth_check: { answers: ["Yes, you got it"] } },
|
|
64
|
+
});
|
|
65
|
+
const text = renderText(
|
|
66
|
+
tool,
|
|
67
|
+
{
|
|
68
|
+
content: [{ type: "text", text: contentText }],
|
|
69
|
+
details: {},
|
|
70
|
+
isError: false,
|
|
71
|
+
},
|
|
72
|
+
{ questions: [depthQuestion] },
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
assert.match(text, /Yes, you got it/);
|
|
76
|
+
assert.doesNotMatch(text, /Cancelled/i);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("ask_user_questions renderResult still shows Cancelled for explicit cancel payload", () => {
|
|
80
|
+
const tool = getAskUserQuestionsTool();
|
|
81
|
+
const text = renderText(
|
|
82
|
+
tool,
|
|
83
|
+
{
|
|
84
|
+
content: [{ type: "text", text: "ask_user_questions was cancelled before receiving a response" }],
|
|
85
|
+
details: { questions: [depthQuestion], response: null, cancelled: true },
|
|
86
|
+
isError: false,
|
|
87
|
+
},
|
|
88
|
+
{ questions: [depthQuestion] },
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
assert.match(text, /Cancelled/i);
|
|
92
|
+
});
|
|
@@ -29,11 +29,16 @@ import {
|
|
|
29
29
|
_refreshLastCommitForTests,
|
|
30
30
|
_getLastCommitForTests,
|
|
31
31
|
_getLastCommitFetchedAtForTests,
|
|
32
|
+
formatToolSurfaceSnapshot,
|
|
32
33
|
formatRuntimeHealthSignal,
|
|
33
34
|
shouldRenderRoadmapProgress,
|
|
34
35
|
} from "../auto-dashboard.ts";
|
|
35
36
|
import { getAutoDashboardData } from "../auto.ts";
|
|
36
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
autoSession,
|
|
39
|
+
clearAutoToolSurfaceSnapshot,
|
|
40
|
+
recordAutoToolSurfaceSnapshot,
|
|
41
|
+
} from "../auto-runtime-state.ts";
|
|
37
42
|
import { formatRtkSavingsLabel } from "../../shared/rtk-session-stats.ts";
|
|
38
43
|
import {
|
|
39
44
|
openDatabase,
|
|
@@ -530,6 +535,29 @@ test("getAutoDashboardData returns RTK savings in the dashboard payload", () =>
|
|
|
530
535
|
}
|
|
531
536
|
});
|
|
532
537
|
|
|
538
|
+
test("getAutoDashboardData exposes typed tool-surface snapshots", () => {
|
|
539
|
+
autoSession.reset();
|
|
540
|
+
clearAutoToolSurfaceSnapshot();
|
|
541
|
+
autoSession.active = true;
|
|
542
|
+
recordAutoToolSurfaceSnapshot({
|
|
543
|
+
source: "provider-adjustment",
|
|
544
|
+
unitType: "run-uat",
|
|
545
|
+
modelFacingToolNames: ["read"],
|
|
546
|
+
registeredToolNames: ["read", "browser_navigate"],
|
|
547
|
+
scopedToolNames: ["read", "browser_navigate"],
|
|
548
|
+
presentedToolNames: ["browser_navigate"],
|
|
549
|
+
capturedAt: 456,
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
const data = getAutoDashboardData();
|
|
553
|
+
|
|
554
|
+
assert.equal(data.toolSurface?.source, "provider-adjustment");
|
|
555
|
+
assert.equal(formatToolSurfaceSnapshot(data.toolSurface), "run-uat: model 1 / registered 2 / scoped 2 / presented 1");
|
|
556
|
+
|
|
557
|
+
autoSession.reset();
|
|
558
|
+
clearAutoToolSurfaceSnapshot();
|
|
559
|
+
});
|
|
560
|
+
|
|
533
561
|
test("RTK savings label formats the dashboard footer text", () => {
|
|
534
562
|
assert.equal(formatRtkSavingsLabel(null), null);
|
|
535
563
|
assert.equal(
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Cover the getDebugCounters() snapshot getter added for the
|
|
3
|
+
// per-dispatch benchmark harness (issue #442, Phase 0.3). The harness itself
|
|
4
|
+
// (scripts/auto-dispatch-baseline.mjs) reads counters via this getter without
|
|
5
|
+
// disabling debug (which is what writeDebugSummary does).
|
|
6
|
+
|
|
7
|
+
import { test } from 'node:test';
|
|
8
|
+
import assert from 'node:assert';
|
|
9
|
+
import { mkdtempSync, mkdirSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
enableDebug,
|
|
15
|
+
disableDebug,
|
|
16
|
+
debugCount,
|
|
17
|
+
getDebugCounters,
|
|
18
|
+
} from '../debug-logger.ts';
|
|
19
|
+
|
|
20
|
+
function tmpGsd(): string {
|
|
21
|
+
const tmp = mkdtempSync(join(tmpdir(), 'gsd-baseline-harness-'));
|
|
22
|
+
mkdirSync(join(tmp, '.gsd'), { recursive: true });
|
|
23
|
+
return tmp;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
test('getDebugCounters returns a live snapshot of the hot-path counters', () => {
|
|
27
|
+
enableDebug(tmpGsd());
|
|
28
|
+
|
|
29
|
+
debugCount('deriveStateCalls', 3);
|
|
30
|
+
debugCount('parseRoadmapCalls');
|
|
31
|
+
debugCount('parsePlanCalls', 2);
|
|
32
|
+
debugCount('gitInvocations', 7);
|
|
33
|
+
|
|
34
|
+
const snap = getDebugCounters();
|
|
35
|
+
assert.strictEqual(snap.deriveStateCalls, 3);
|
|
36
|
+
assert.strictEqual(snap.parseRoadmapCalls, 1);
|
|
37
|
+
assert.strictEqual(snap.parsePlanCalls, 2);
|
|
38
|
+
assert.strictEqual(snap.gitInvocations, 7);
|
|
39
|
+
|
|
40
|
+
disableDebug();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('getDebugCounters returns a copy — callers cannot mutate internal state', () => {
|
|
44
|
+
enableDebug(tmpGsd());
|
|
45
|
+
debugCount('gitInvocations', 5);
|
|
46
|
+
|
|
47
|
+
const snap = getDebugCounters() as Record<string, number>;
|
|
48
|
+
snap.gitInvocations = 999;
|
|
49
|
+
|
|
50
|
+
assert.strictEqual(getDebugCounters().gitInvocations, 5, 'internal counter must be unaffected by mutating the snapshot');
|
|
51
|
+
|
|
52
|
+
disableDebug();
|
|
53
|
+
});
|