@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
|
@@ -3,6 +3,7 @@ import { copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkS
|
|
|
3
3
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
4
|
import { minimatch } from "minimatch";
|
|
5
5
|
import { GSD_PHASE_SCOPE_DISPLAY_REASON, shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
6
|
+
import { stripMcpToolPrefix } from "../mcp-tool-name.js";
|
|
6
7
|
import { getIsolationMode } from "../preferences.js";
|
|
7
8
|
import { compileSubagentPermissionContract } from "../unit-context-manifest.js";
|
|
8
9
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -102,10 +103,7 @@ const GATE_SAFE_TOOLS = new Set([
|
|
|
102
103
|
"ask_user_questions",
|
|
103
104
|
]);
|
|
104
105
|
export function canonicalToolName(toolName) {
|
|
105
|
-
|
|
106
|
-
return toolName;
|
|
107
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
108
|
-
return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
|
|
106
|
+
return stripMcpToolPrefix(toolName);
|
|
109
107
|
}
|
|
110
108
|
/**
|
|
111
109
|
* Persistence is ON by default (opt-out).
|
|
@@ -385,6 +383,67 @@ export function isDepthConfirmationAnswer(selected, options) {
|
|
|
385
383
|
// Returning false prevents any free-form string from unlocking the gate.
|
|
386
384
|
return false;
|
|
387
385
|
}
|
|
386
|
+
function findGateQuestion(questions, gateId) {
|
|
387
|
+
return questions.find((question) => question?.id === gateId);
|
|
388
|
+
}
|
|
389
|
+
function readSelectedGateAnswer(details, questionId) {
|
|
390
|
+
return details.response?.answers?.[questionId]?.selected;
|
|
391
|
+
}
|
|
392
|
+
function verifyAnsweredGate(basePath, question, fallbackMilestoneId) {
|
|
393
|
+
const gateId = typeof question.id === "string" ? question.id : "";
|
|
394
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId) ?? fallbackMilestoneId ?? null;
|
|
395
|
+
markApprovalGateVerified(gateId, basePath);
|
|
396
|
+
markDepthVerified(milestoneId, basePath);
|
|
397
|
+
clearPendingGate(basePath);
|
|
398
|
+
return { status: "verified", gateId, milestoneId };
|
|
399
|
+
}
|
|
400
|
+
export function applyAskUserQuestionsGateResult(options) {
|
|
401
|
+
const { basePath, questions, details, fallbackMilestoneId } = options;
|
|
402
|
+
const currentPendingGate = getPendingGate(basePath);
|
|
403
|
+
if (currentPendingGate) {
|
|
404
|
+
if (details.cancelled || !details.response) {
|
|
405
|
+
return {
|
|
406
|
+
status: "waiting",
|
|
407
|
+
pendingGateId: currentPendingGate,
|
|
408
|
+
interrupted: details.interrupted === true,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
const pendingQuestion = findGateQuestion(questions, currentPendingGate);
|
|
412
|
+
if (pendingQuestion) {
|
|
413
|
+
const selected = readSelectedGateAnswer(details, currentPendingGate);
|
|
414
|
+
if (isDepthConfirmationAnswer(selected, pendingQuestion.options)) {
|
|
415
|
+
return verifyAnsweredGate(basePath, pendingQuestion, fallbackMilestoneId);
|
|
416
|
+
}
|
|
417
|
+
return { status: "answered", gateId: currentPendingGate };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (details.cancelled || !details.response)
|
|
421
|
+
return { status: "not-gate" };
|
|
422
|
+
for (const question of questions) {
|
|
423
|
+
if (typeof question.id !== "string" || !isGateQuestionId(question.id))
|
|
424
|
+
continue;
|
|
425
|
+
const selected = readSelectedGateAnswer(details, question.id);
|
|
426
|
+
if (!isDepthConfirmationAnswer(selected, question.options)) {
|
|
427
|
+
return { status: "answered", gateId: question.id };
|
|
428
|
+
}
|
|
429
|
+
if (currentPendingGate && question.id !== currentPendingGate) {
|
|
430
|
+
return { status: "answered", gateId: currentPendingGate };
|
|
431
|
+
}
|
|
432
|
+
return verifyAnsweredGate(basePath, question, fallbackMilestoneId);
|
|
433
|
+
}
|
|
434
|
+
return { status: "not-gate" };
|
|
435
|
+
}
|
|
436
|
+
export function formatPendingAskUserQuestionsGateMessage(pendingGateId, interrupted) {
|
|
437
|
+
return [
|
|
438
|
+
`Waiting for depth confirmation on gate "${pendingGateId}".`,
|
|
439
|
+
interrupted
|
|
440
|
+
? "The confirmation question was interrupted before a response was recorded."
|
|
441
|
+
: "No user response was received for the confirmation question.",
|
|
442
|
+
"Do not infer approval from earlier or prior messages.",
|
|
443
|
+
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
444
|
+
`Re-call ask_user_questions with the same gate question id ("${pendingGateId}") and wait for the user's response.`,
|
|
445
|
+
].join(" ");
|
|
446
|
+
}
|
|
388
447
|
export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queuePhaseActive, basePath = process.cwd()) {
|
|
389
448
|
if (toolName !== "write")
|
|
390
449
|
return { block: false };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared DB-backed guard for milestone closeout finalization.
|
|
3
|
-
import {
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { getLatestAssessmentByScope, getMilestone, getMilestoneSlices, getPendingGates, getSliceTasks, isDbAvailable, } from "./gsd-db.js";
|
|
5
|
+
import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk, } from "./db-workspace.js";
|
|
4
6
|
import { isClosedStatus } from "./status-guards.js";
|
|
7
|
+
import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
|
|
5
8
|
export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
|
|
6
9
|
function blocked(reason, message) {
|
|
7
10
|
return {
|
|
@@ -14,22 +17,30 @@ function blocked(reason, message) {
|
|
|
14
17
|
function isFileBackedDbPath(path) {
|
|
15
18
|
return Boolean(path && path !== ":memory:");
|
|
16
19
|
}
|
|
20
|
+
function artifactBasePathFromDb() {
|
|
21
|
+
const dbPath = getWorkflowDatabasePath();
|
|
22
|
+
if (!isFileBackedDbPath(dbPath))
|
|
23
|
+
return undefined;
|
|
24
|
+
return dirname(dirname(dbPath));
|
|
25
|
+
}
|
|
17
26
|
export function checkCloseoutConsistencyGate(milestoneId, options = {}) {
|
|
18
27
|
if (!isDbAvailable()) {
|
|
19
28
|
return blocked("db-unavailable", `Closeout consistency blocked for ${milestoneId}: canonical DB is unavailable.`);
|
|
20
29
|
}
|
|
21
|
-
if (options.refreshFromDisk && isFileBackedDbPath(
|
|
30
|
+
if (options.refreshFromDisk && isFileBackedDbPath(getWorkflowDatabasePath()) && !refreshWorkflowDatabaseFromDisk()) {
|
|
22
31
|
return blocked("db-refresh-failed", `Closeout consistency blocked for ${milestoneId}: canonical DB refresh failed.`);
|
|
23
32
|
}
|
|
24
33
|
const milestone = getMilestone(milestoneId);
|
|
25
34
|
if (!milestone) {
|
|
26
35
|
return blocked("milestone-missing", `Closeout consistency blocked for ${milestoneId}: milestone is missing from canonical DB.`);
|
|
27
36
|
}
|
|
28
|
-
if (!isClosedStatus(milestone.status)) {
|
|
37
|
+
if (!isClosedStatus(milestone.status) && !options.allowOpenMilestone) {
|
|
29
38
|
return blocked("milestone-open", `Closeout consistency blocked for ${milestoneId}: canonical DB milestone status is "${milestone.status}".`);
|
|
30
39
|
}
|
|
40
|
+
const validation = milestone.status === "skipped"
|
|
41
|
+
? null
|
|
42
|
+
: getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
31
43
|
if (milestone.status !== "skipped") {
|
|
32
|
-
const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
33
44
|
if (validation?.status !== "pass") {
|
|
34
45
|
return blocked("validation-not-pass", `Closeout consistency blocked for ${milestoneId}: latest milestone validation is "${validation?.status ?? "absent"}".`);
|
|
35
46
|
}
|
|
@@ -38,6 +49,12 @@ export function checkCloseoutConsistencyGate(milestoneId, options = {}) {
|
|
|
38
49
|
if (slices.length === 0 && milestone.status !== "skipped") {
|
|
39
50
|
return blocked("slice-missing", `Closeout consistency blocked for ${milestoneId}: no slices exist in canonical DB.`);
|
|
40
51
|
}
|
|
52
|
+
if (milestone.status !== "skipped") {
|
|
53
|
+
closeQualityGatesFromEvidence(milestoneId, {
|
|
54
|
+
artifactBasePath: options.artifactBasePath ?? artifactBasePathFromDb(),
|
|
55
|
+
milestoneValidationPassed: validation?.status === "pass",
|
|
56
|
+
});
|
|
57
|
+
}
|
|
41
58
|
for (const slice of slices) {
|
|
42
59
|
if (!isClosedStatus(slice.status)) {
|
|
43
60
|
return blocked("slice-open", `Closeout consistency blocked for ${milestoneId}: slice ${slice.id} status is "${slice.status}".`);
|
|
@@ -330,15 +330,19 @@ export function ensureCodebaseMapFresh(basePath, options, ensureOptions) {
|
|
|
330
330
|
const ttlMs = ensureOptions?.ttlMs ?? DEFAULT_REFRESH_TTL_MS;
|
|
331
331
|
const force = ensureOptions?.force === true;
|
|
332
332
|
const now = Date.now();
|
|
333
|
+
// Enumerate files and compute fingerprint before the TTL check so that
|
|
334
|
+
// file changes are always detected, even within the TTL window.
|
|
335
|
+
const existing = readCodebaseMap(basePath);
|
|
336
|
+
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
337
|
+
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
338
|
+
// TTL short-circuit: only bypass regeneration when the fingerprint matches,
|
|
339
|
+
// confirming that no tracked files changed since the last check.
|
|
333
340
|
if (!force && ttlMs > 0) {
|
|
334
341
|
const cached = freshnessCache.get(cacheKey);
|
|
335
|
-
if (cached && now - cached.checkedAt < ttlMs) {
|
|
342
|
+
if (cached && now - cached.checkedAt < ttlMs && cached.result.fingerprint === fingerprint) {
|
|
336
343
|
return cached.result;
|
|
337
344
|
}
|
|
338
345
|
}
|
|
339
|
-
const existing = readCodebaseMap(basePath);
|
|
340
|
-
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
341
|
-
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
342
346
|
const cacheAndReturn = (result) => {
|
|
343
347
|
freshnessCache.set(cacheKey, { checkedAt: now, result });
|
|
344
348
|
return result;
|
|
@@ -3,6 +3,7 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { enableDebug } from "../../debug-logger.js";
|
|
4
4
|
import { isAutoActive, isAutoPaused, pauseAuto, startAutoDetached, stopAuto, stopAutoRemote } from "../../auto.js";
|
|
5
5
|
import { handleRate } from "../../commands-rate.js";
|
|
6
|
+
import { notifyPreferenceDiagnostics } from "../../preferences-diagnostics.js";
|
|
6
7
|
import { setSessionModelOverride } from "../../session-model-override.js";
|
|
7
8
|
import { guardRemoteSession, projectRoot } from "../context.js";
|
|
8
9
|
import { findMilestoneIds } from "../../milestone-id-utils.js";
|
|
@@ -82,6 +83,7 @@ export async function handleAutoCommand(trimmed, ctx, pi) {
|
|
|
82
83
|
const basePath = projectRoot();
|
|
83
84
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath))
|
|
84
85
|
return true;
|
|
86
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
85
87
|
// Validate the milestone target exists and is not already complete.
|
|
86
88
|
if (milestoneId) {
|
|
87
89
|
const allIds = findMilestoneIds(basePath);
|
|
@@ -109,6 +111,7 @@ export async function handleAutoCommand(trimmed, ctx, pi) {
|
|
|
109
111
|
const basePath = projectRoot();
|
|
110
112
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath))
|
|
111
113
|
return true;
|
|
114
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
112
115
|
// Validate the milestone target exists and is not already complete.
|
|
113
116
|
if (milestoneId) {
|
|
114
117
|
const allIds = findMilestoneIds(basePath);
|
|
@@ -19,6 +19,7 @@ import { isAutoActive, checkRemoteAutoSession } from "./auto.js";
|
|
|
19
19
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
20
20
|
import { currentDirectoryRoot, projectRoot } from "./commands/context.js";
|
|
21
21
|
import { loadPrompt } from "./prompt-loader.js";
|
|
22
|
+
import { buildClaudeRuntimeFloorAdvisory } from "../../shared/claude-runtime-floor.js";
|
|
22
23
|
import { isPnpmInstall } from "../../shared/package-manager-detection.js";
|
|
23
24
|
import { buildDoctorHealIssuePayload, buildDoctorHealSummary, buildWorkflowDispatchContent, } from "./workflow-protocol.js";
|
|
24
25
|
import { restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch, } from "./bootstrap/register-hooks.js";
|
|
@@ -52,6 +53,21 @@ function resolveInstallCommand(pkg) {
|
|
|
52
53
|
return `pnpm add -g ${pkg}`;
|
|
53
54
|
return `npm install -g ${pkg}`;
|
|
54
55
|
}
|
|
56
|
+
function notifyClaudeRuntimeFloorAdvisory(ctx) {
|
|
57
|
+
let advisory = null;
|
|
58
|
+
try {
|
|
59
|
+
advisory = buildClaudeRuntimeFloorAdvisory({
|
|
60
|
+
agentDir: join(gsdHome(), "agent"),
|
|
61
|
+
cwd: process.cwd(),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (advisory) {
|
|
68
|
+
ctx.ui.notify(advisory, "warning");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
55
71
|
async function fetchLatestVersionForCommand(registryUrl = UPDATE_REGISTRY_URL) {
|
|
56
72
|
const controller = new AbortController();
|
|
57
73
|
const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
|
|
@@ -458,6 +474,8 @@ export async function handleUpdate(ctx, args = "") {
|
|
|
458
474
|
}
|
|
459
475
|
if (current && compareSemverLocal(latest, current) <= 0) {
|
|
460
476
|
ctx.ui.notify(`Already up to date (${formatCommandVersion(current)}).`, "info");
|
|
477
|
+
if (!browserUpdate)
|
|
478
|
+
notifyClaudeRuntimeFloorAdvisory(ctx);
|
|
461
479
|
return;
|
|
462
480
|
}
|
|
463
481
|
ctx.ui.notify(`Updating: ${formatCommandVersion(current)} → v${latest}...`, "info");
|
|
@@ -472,6 +490,8 @@ export async function handleUpdate(ctx, args = "") {
|
|
|
472
490
|
? `Updated gsd-browser to v${latest}. Restart your GSD session to use the new browser automation version.` +
|
|
473
491
|
(pathReady ? "" : "\nNote: Ensure the npm global bin directory is on your PATH so MCP automation uses the updated binary.")
|
|
474
492
|
: `Updated to v${latest}. Restart your GSD session to use the new version.`, "info");
|
|
493
|
+
if (!browserUpdate)
|
|
494
|
+
notifyClaudeRuntimeFloorAdvisory(ctx);
|
|
475
495
|
}
|
|
476
496
|
catch {
|
|
477
497
|
ctx.ui.notify(`Update failed. Try manually: ${installCmd}`, "error");
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Contains: InspectData type, formatInspectOutput, handleInspect
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { gsdRoot } from "./paths.js";
|
|
6
|
+
import { isWorkflowDatabaseOpen, openExistingWorkflowDatabase, } from "./db-workspace.js";
|
|
9
7
|
import { logWarning } from "./workflow-logger.js";
|
|
10
8
|
import { getErrorMessage } from "./error-utils.js";
|
|
11
9
|
export function formatInspectOutput(data) {
|
|
@@ -34,11 +32,9 @@ export function formatInspectOutput(data) {
|
|
|
34
32
|
}
|
|
35
33
|
export async function handleInspect(ctx) {
|
|
36
34
|
try {
|
|
37
|
-
const {
|
|
38
|
-
if (!
|
|
39
|
-
|
|
40
|
-
const dbPath = join(gsdDir, "gsd.db");
|
|
41
|
-
if (!existsSync(gsdDir) || !existsSync(dbPath) || !openDatabase(dbPath)) {
|
|
35
|
+
const { _getAdapter } = await import("./gsd-db.js");
|
|
36
|
+
if (!isWorkflowDatabaseOpen()) {
|
|
37
|
+
if (!openExistingWorkflowDatabase(process.cwd()).ok) {
|
|
42
38
|
ctx.ui.notify("No GSD database available. Run /gsd auto to create one.", "info");
|
|
43
39
|
return;
|
|
44
40
|
}
|
|
@@ -9,6 +9,7 @@ import { deriveState } from "./state.js";
|
|
|
9
9
|
import { gsdProjectionRoot, gsdRoot } from "./paths.js";
|
|
10
10
|
import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
11
11
|
import { logWarning } from "./workflow-logger.js";
|
|
12
|
+
import { backupWorkflowDatabaseSnapshot, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
12
13
|
export async function handleCleanupBranches(ctx, basePath) {
|
|
13
14
|
let branches;
|
|
14
15
|
try {
|
|
@@ -511,7 +512,7 @@ async function confirmRecover(ctx, args, markdown, beforeDb, dataLoss) {
|
|
|
511
512
|
* Prints counts of recovered items and the resulting project phase.
|
|
512
513
|
*/
|
|
513
514
|
export async function handleRecover(ctx, basePath, args = "") {
|
|
514
|
-
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction
|
|
515
|
+
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
|
|
515
516
|
const { migrateHierarchyToDb } = await import("./md-importer.js");
|
|
516
517
|
const { invalidateStateCache } = await import("./state.js");
|
|
517
518
|
const { countDbHierarchy, countMarkdownHierarchy, recoverWouldDeleteDbRows } = await import("./migration-auto-check.js");
|
|
@@ -531,7 +532,7 @@ export async function handleRecover(ctx, basePath, args = "") {
|
|
|
531
532
|
return;
|
|
532
533
|
try {
|
|
533
534
|
// 0. Snapshot the DB before the destructive clear so recover is reversible.
|
|
534
|
-
const backupPath =
|
|
535
|
+
const backupPath = backupWorkflowDatabaseSnapshot("pre-recover");
|
|
535
536
|
// 1. Delete + re-populate inside a single transaction for atomicity.
|
|
536
537
|
// clearEngineHierarchy() uses transaction() internally but transaction()
|
|
537
538
|
// is re-entrant, so wrapping in dbTransaction() keeps the whole
|
|
@@ -655,6 +656,49 @@ function parseRebuildTarget(args) {
|
|
|
655
656
|
return "database";
|
|
656
657
|
return "usage";
|
|
657
658
|
}
|
|
659
|
+
/**
|
|
660
|
+
* Re-render markdown planning projections from the authoritative DB.
|
|
661
|
+
*
|
|
662
|
+
* Quarantines open-unit SUMMARY files that contradict DB status before
|
|
663
|
+
* rendering. Safe to call after milestone merge/transition or during startup
|
|
664
|
+
* self-heal when the DB holds rows markdown lacks.
|
|
665
|
+
*/
|
|
666
|
+
export async function rebuildMarkdownProjectionsFromDb(basePath) {
|
|
667
|
+
const { deleteArtifactByPath } = await import("./gsd-db.js");
|
|
668
|
+
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
669
|
+
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
670
|
+
const { invalidateStateCache } = await import("./state.js");
|
|
671
|
+
invalidateStateCache();
|
|
672
|
+
refreshWorkflowDatabaseFromDisk();
|
|
673
|
+
const state = await deriveState(basePath);
|
|
674
|
+
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
675
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
676
|
+
const quarantined = [];
|
|
677
|
+
const seen = new Set();
|
|
678
|
+
for (const drift of drifts) {
|
|
679
|
+
if (drift.kind !== "artifact-db-status-divergence")
|
|
680
|
+
continue;
|
|
681
|
+
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath)
|
|
682
|
+
continue;
|
|
683
|
+
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
684
|
+
if (seen.has(absPath) || !existsSync(absPath))
|
|
685
|
+
continue;
|
|
686
|
+
seen.add(absPath);
|
|
687
|
+
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
688
|
+
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
689
|
+
deleteArtifactByPath(artifactDbPath);
|
|
690
|
+
quarantined.push(target);
|
|
691
|
+
}
|
|
692
|
+
const rendered = await renderAllFromDb(basePath);
|
|
693
|
+
invalidateStateCache();
|
|
694
|
+
return {
|
|
695
|
+
rendered: rendered.rendered,
|
|
696
|
+
skipped: rendered.skipped,
|
|
697
|
+
errors: rendered.errors,
|
|
698
|
+
quarantined: quarantined.length,
|
|
699
|
+
quarantinedPaths: quarantined,
|
|
700
|
+
};
|
|
701
|
+
}
|
|
658
702
|
/**
|
|
659
703
|
* `gsd rebuild markdown` — Re-render markdown projections from the authoritative DB.
|
|
660
704
|
*
|
|
@@ -663,10 +707,7 @@ function parseRebuildTarget(args) {
|
|
|
663
707
|
* under `.gsd/quarantine/projections/` before DB projections are rendered.
|
|
664
708
|
*/
|
|
665
709
|
export async function handleRebuild(ctx, basePath, args = "") {
|
|
666
|
-
const { isDbAvailable: dbAvailable
|
|
667
|
-
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
668
|
-
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
669
|
-
const { invalidateStateCache } = await import("./state.js");
|
|
710
|
+
const { isDbAvailable: dbAvailable } = await import("./gsd-db.js");
|
|
670
711
|
const target = parseRebuildTarget(args);
|
|
671
712
|
if (target === "usage") {
|
|
672
713
|
ctx.ui.notify([
|
|
@@ -690,53 +731,32 @@ export async function handleRebuild(ctx, basePath, args = "") {
|
|
|
690
731
|
return;
|
|
691
732
|
}
|
|
692
733
|
try {
|
|
693
|
-
|
|
694
|
-
const state = await deriveState(basePath);
|
|
695
|
-
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
696
|
-
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
697
|
-
const quarantined = [];
|
|
698
|
-
const seen = new Set();
|
|
699
|
-
for (const drift of drifts) {
|
|
700
|
-
if (drift.kind !== "artifact-db-status-divergence")
|
|
701
|
-
continue;
|
|
702
|
-
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath)
|
|
703
|
-
continue;
|
|
704
|
-
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
705
|
-
if (seen.has(absPath) || !existsSync(absPath))
|
|
706
|
-
continue;
|
|
707
|
-
seen.add(absPath);
|
|
708
|
-
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
709
|
-
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
710
|
-
deleteArtifactByPath(artifactDbPath);
|
|
711
|
-
quarantined.push(target);
|
|
712
|
-
}
|
|
713
|
-
const rendered = await renderAllFromDb(basePath);
|
|
714
|
-
invalidateStateCache();
|
|
734
|
+
const result = await rebuildMarkdownProjectionsFromDb(basePath);
|
|
715
735
|
const lines = [
|
|
716
736
|
"gsd rebuild markdown: rebuilt markdown projections from the canonical DB",
|
|
717
|
-
` Rendered: ${
|
|
718
|
-
` Skipped: ${
|
|
719
|
-
` Quarantined: ${quarantined
|
|
737
|
+
` Rendered: ${result.rendered}`,
|
|
738
|
+
` Skipped: ${result.skipped}`,
|
|
739
|
+
` Quarantined: ${result.quarantined}`,
|
|
720
740
|
];
|
|
721
|
-
if (
|
|
722
|
-
lines.push(` Errors: ${
|
|
723
|
-
for (const err of
|
|
741
|
+
if (result.errors.length > 0) {
|
|
742
|
+
lines.push(` Errors: ${result.errors.length}`);
|
|
743
|
+
for (const err of result.errors.slice(0, 5)) {
|
|
724
744
|
lines.push(` - ${err}`);
|
|
725
745
|
}
|
|
726
|
-
if (
|
|
727
|
-
lines.push(` - ${
|
|
746
|
+
if (result.errors.length > 5) {
|
|
747
|
+
lines.push(` - ${result.errors.length - 5} more`);
|
|
728
748
|
}
|
|
729
749
|
}
|
|
730
|
-
if (quarantined
|
|
750
|
+
if (result.quarantined > 0) {
|
|
731
751
|
lines.push("", " Quarantine:");
|
|
732
|
-
for (const target of
|
|
752
|
+
for (const target of result.quarantinedPaths.slice(0, 5)) {
|
|
733
753
|
lines.push(` - ${target}`);
|
|
734
754
|
}
|
|
735
|
-
if (quarantined
|
|
736
|
-
lines.push(` - ${quarantined
|
|
755
|
+
if (result.quarantined > 5) {
|
|
756
|
+
lines.push(` - ${result.quarantined - 5} more`);
|
|
737
757
|
}
|
|
738
758
|
}
|
|
739
|
-
ctx.ui.notify(lines.join("\n"),
|
|
759
|
+
ctx.ui.notify(lines.join("\n"), result.errors.length > 0 ? "warning" : "success");
|
|
740
760
|
}
|
|
741
761
|
catch (err) {
|
|
742
762
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -10,7 +10,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
|
|
|
10
10
|
import { formatDuration } from "../shared/format-utils.js";
|
|
11
11
|
import { parseEvalReviewFrontmatter } from "./eval-review-schema.js";
|
|
12
12
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
13
|
-
import {
|
|
13
|
+
import { buildPullRequestEvidence } from "./pull-request-process.js";
|
|
14
14
|
function git(basePath, args) {
|
|
15
15
|
return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
|
|
16
16
|
}
|
|
@@ -140,7 +140,7 @@ function generatePRContent(basePath, milestoneId, milestoneTitle) {
|
|
|
140
140
|
metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
return
|
|
143
|
+
return buildPullRequestEvidence({
|
|
144
144
|
milestoneId,
|
|
145
145
|
milestoneTitle,
|
|
146
146
|
changeType: "feat",
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Handles manual milestone validation verdict overrides.
|
|
3
3
|
import { loadFile } from "./files.js";
|
|
4
|
-
import { resolveMilestoneFile } from "./paths.js";
|
|
4
|
+
import { gsdProjectionRoot, resolveMilestoneFile } from "./paths.js";
|
|
5
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
6
|
+
import { join } from "node:path";
|
|
5
7
|
import { deriveState } from "./state.js";
|
|
6
8
|
import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
|
|
7
9
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
8
10
|
import { getLatestAssessmentByScope } from "./gsd-db.js";
|
|
11
|
+
import { checkpointWorkflowDatabase } from "./db-workspace.js";
|
|
9
12
|
import { VALIDATION_VERDICTS, extractVerdict, isValidMilestoneVerdict, } from "./verdict-parser.js";
|
|
10
13
|
const USAGE = 'Usage: /gsd verdict <pass|needs-attention|needs-remediation> [--milestone Mxxx] [--rationale "..."]';
|
|
11
14
|
function tokenize(raw) {
|
|
@@ -86,8 +89,14 @@ export function parseValidationFile(content) {
|
|
|
86
89
|
};
|
|
87
90
|
}
|
|
88
91
|
async function loadExistingValidation(basePath, milestoneId) {
|
|
92
|
+
const canonicalBase = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
93
|
+
const canonicalValidationPath = join(gsdProjectionRoot(canonicalBase), "milestones", milestoneId, `${milestoneId}-VALIDATION.md`);
|
|
94
|
+
const canonicalContent = await loadFile(canonicalValidationPath);
|
|
95
|
+
if (canonicalContent) {
|
|
96
|
+
return { content: canonicalContent, source: canonicalValidationPath };
|
|
97
|
+
}
|
|
89
98
|
const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
|
|
90
|
-
if (validationPath) {
|
|
99
|
+
if (validationPath && validationPath !== canonicalValidationPath) {
|
|
91
100
|
const content = await loadFile(validationPath);
|
|
92
101
|
if (content)
|
|
93
102
|
return { content, source: validationPath };
|
|
@@ -157,6 +166,7 @@ export async function handleVerdict(rawArgs, ctx, basePath) {
|
|
|
157
166
|
ctx.ui.notify(msg, "error");
|
|
158
167
|
return;
|
|
159
168
|
}
|
|
169
|
+
checkpointWorkflowDatabase();
|
|
160
170
|
const prevVerdict = current.verdict ?? "unknown";
|
|
161
171
|
const effectiveVerdict = extractEffectiveVerdict(result.details, parsed.verdict);
|
|
162
172
|
if (effectiveVerdict !== parsed.verdict) {
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { backupDatabaseSnapshot, checkpointDatabase, closeAllDatabases, closeDatabase, closeDatabaseByWorkspace, getDbPath, getDbStatus, getDbProvider, isDbAvailable, openDatabase, openDatabaseByScope, openDatabaseByWorkspace, refreshOpenDatabaseFromDisk, vacuumDatabase, wasDbOpenAttempted, } from "./gsd-db.js";
|
|
6
|
+
import { resolveGsdPathContract } from "./paths.js";
|
|
7
|
+
import { setLogBasePath } from "./workflow-logger.js";
|
|
8
|
+
export function resolveWorkflowDatabaseLocation(basePath) {
|
|
9
|
+
const contract = resolveGsdPathContract(basePath);
|
|
10
|
+
return {
|
|
11
|
+
projectRoot: dirname(dirname(contract.projectDb)),
|
|
12
|
+
projectGsd: contract.projectGsd,
|
|
13
|
+
projectDb: contract.projectDb,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the correct DB path for the current working directory.
|
|
18
|
+
* If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
|
|
19
|
+
* the project root's `.gsd/gsd.db` (shared WAL — R012). Otherwise returns
|
|
20
|
+
* `<basePath>/.gsd/gsd.db`.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveProjectRootDbPath(basePath) {
|
|
23
|
+
return resolveWorkflowDatabaseLocation(basePath).projectDb;
|
|
24
|
+
}
|
|
25
|
+
export function openWorkflowDatabase(basePath) {
|
|
26
|
+
const location = resolveWorkflowDatabaseLocation(basePath);
|
|
27
|
+
if (!existsSync(location.projectGsd)) {
|
|
28
|
+
return { ok: false, reason: "missing-gsd-dir", location };
|
|
29
|
+
}
|
|
30
|
+
const existed = existsSync(location.projectDb);
|
|
31
|
+
try {
|
|
32
|
+
const opened = openDatabase(location.projectDb);
|
|
33
|
+
if (!opened) {
|
|
34
|
+
return { ok: false, reason: "open-failed", location };
|
|
35
|
+
}
|
|
36
|
+
setLogBasePath(location.projectRoot);
|
|
37
|
+
return {
|
|
38
|
+
ok: true,
|
|
39
|
+
reason: existed ? "opened-existing" : "created-empty",
|
|
40
|
+
location,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
reason: "open-failed",
|
|
47
|
+
location,
|
|
48
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function openExistingWorkflowDatabase(basePath) {
|
|
53
|
+
const location = resolveWorkflowDatabaseLocation(basePath);
|
|
54
|
+
if (!existsSync(location.projectDb)) {
|
|
55
|
+
return { ok: false, reason: "missing-database", location };
|
|
56
|
+
}
|
|
57
|
+
return openWorkflowDatabase(basePath);
|
|
58
|
+
}
|
|
59
|
+
export function openWorkflowDatabasePath(path) {
|
|
60
|
+
return openDatabase(path);
|
|
61
|
+
}
|
|
62
|
+
export function openWorkflowDatabaseByWorkspace(workspace) {
|
|
63
|
+
return openDatabaseByWorkspace(workspace);
|
|
64
|
+
}
|
|
65
|
+
export function openWorkflowDatabaseByScope(scope) {
|
|
66
|
+
return openDatabaseByScope(scope);
|
|
67
|
+
}
|
|
68
|
+
export function closeWorkflowDatabase() {
|
|
69
|
+
closeDatabase();
|
|
70
|
+
}
|
|
71
|
+
export function closeWorkflowDatabaseByWorkspace(workspace) {
|
|
72
|
+
closeDatabaseByWorkspace(workspace);
|
|
73
|
+
}
|
|
74
|
+
export function closeAllWorkflowDatabases() {
|
|
75
|
+
closeAllDatabases();
|
|
76
|
+
}
|
|
77
|
+
export function isWorkflowDatabaseOpen() {
|
|
78
|
+
return isDbAvailable();
|
|
79
|
+
}
|
|
80
|
+
export function wasWorkflowDatabaseOpenAttempted() {
|
|
81
|
+
return wasDbOpenAttempted();
|
|
82
|
+
}
|
|
83
|
+
export function getWorkflowDatabaseStatus() {
|
|
84
|
+
return getDbStatus();
|
|
85
|
+
}
|
|
86
|
+
export function getWorkflowDatabaseProvider() {
|
|
87
|
+
return getDbProvider();
|
|
88
|
+
}
|
|
89
|
+
export function getWorkflowDatabasePath() {
|
|
90
|
+
return getDbPath();
|
|
91
|
+
}
|
|
92
|
+
export function refreshWorkflowDatabaseFromDisk() {
|
|
93
|
+
return refreshOpenDatabaseFromDisk();
|
|
94
|
+
}
|
|
95
|
+
export function checkpointWorkflowDatabase() {
|
|
96
|
+
checkpointDatabase();
|
|
97
|
+
}
|
|
98
|
+
export function vacuumWorkflowDatabase() {
|
|
99
|
+
vacuumDatabase();
|
|
100
|
+
}
|
|
101
|
+
export function backupWorkflowDatabaseSnapshot(label) {
|
|
102
|
+
return backupDatabaseSnapshot(label);
|
|
103
|
+
}
|
|
@@ -21,6 +21,7 @@ const _counters = {
|
|
|
21
21
|
parsePlanTotalMs: 0,
|
|
22
22
|
dispatches: 0,
|
|
23
23
|
renders: 0,
|
|
24
|
+
gitInvocations: 0,
|
|
24
25
|
};
|
|
25
26
|
/** Max debug log files to keep. Older ones are pruned on enable. */
|
|
26
27
|
const MAX_DEBUG_LOGS = 5;
|
|
@@ -118,6 +119,14 @@ export function debugCount(counter, value = 1) {
|
|
|
118
119
|
return;
|
|
119
120
|
_counters[counter] += value;
|
|
120
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Snapshot the current debug counters. Used by the per-dispatch benchmark
|
|
124
|
+
* harness (#442) to read counts without disabling debug (which is what
|
|
125
|
+
* writeDebugSummary does). Returns a copy so callers can't mutate internal state.
|
|
126
|
+
*/
|
|
127
|
+
export function getDebugCounters() {
|
|
128
|
+
return { ..._counters };
|
|
129
|
+
}
|
|
121
130
|
/** Record a peak value (only updates if new value is higher). */
|
|
122
131
|
export function debugPeak(counter, value) {
|
|
123
132
|
if (!_enabled)
|
|
@@ -154,6 +163,7 @@ export function writeDebugSummary() {
|
|
|
154
163
|
avgTtsrCheck_ms,
|
|
155
164
|
ttsrPeakBuffer: _counters.ttsrPeakBuffer,
|
|
156
165
|
renders: _counters.renders,
|
|
166
|
+
gitInvocations: _counters.gitInvocations,
|
|
157
167
|
});
|
|
158
168
|
return disableDebug();
|
|
159
169
|
}
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
// Adding a `unitType` mapping (or a future `unitTypes: string[]`) to an
|
|
35
35
|
// existing entry is the place to lift any of these out of default-deny
|
|
36
36
|
// when the analysis has been done.
|
|
37
|
+
import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
|
|
37
38
|
const POLICY = {
|
|
38
39
|
gsd_plan_slice: {
|
|
39
40
|
toolName: "gsd_plan_slice",
|
|
@@ -96,17 +97,8 @@ const POLICY = {
|
|
|
96
97
|
rationale: "plan-slice prompt explicitly forbids calling gsd_plan_task separately; per-task granularity multiplies manifest writes and projection re-renders with no payoff.",
|
|
97
98
|
},
|
|
98
99
|
};
|
|
99
|
-
// Alias map keyed on the secondary name; resolves to the canonical entry above.
|
|
100
|
-
// Sourced from packages/mcp-server/src/workflow-tools.ts alias registrations
|
|
101
|
-
// (gsd_milestone_validate, gsd_roadmap_reassess, gsd_slice_replan, gsd_task_plan).
|
|
102
|
-
const ALIASES = {
|
|
103
|
-
gsd_milestone_validate: "gsd_validate_milestone",
|
|
104
|
-
gsd_roadmap_reassess: "gsd_reassess_roadmap",
|
|
105
|
-
gsd_slice_replan: "gsd_replan_slice",
|
|
106
|
-
gsd_task_plan: "gsd_plan_task",
|
|
107
|
-
};
|
|
108
100
|
function resolveCanonical(name) {
|
|
109
|
-
return
|
|
101
|
+
return canonicalWorkflowSurfaceToolName(name);
|
|
110
102
|
}
|
|
111
103
|
export function getDelegationVerdict(toolName) {
|
|
112
104
|
return POLICY[resolveCanonical(toolName)] ?? null;
|