@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
|
@@ -60,7 +60,8 @@ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
|
60
60
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
61
61
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
62
62
|
import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
63
|
-
import { isDbAvailable, getMilestoneSlices, getSlice, getTask
|
|
63
|
+
import { isDbAvailable, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
|
|
64
|
+
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
64
65
|
import { isClosedStatus } from "../status-guards.js";
|
|
65
66
|
import { setRuntimeKv } from "../db/runtime-kv.js";
|
|
66
67
|
import { getLatestForUnit } from "../db/unit-dispatches.js";
|
|
@@ -85,7 +86,12 @@ import {
|
|
|
85
86
|
supportsStructuredQuestions,
|
|
86
87
|
} from "../workflow-mcp.js";
|
|
87
88
|
import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
|
|
88
|
-
import {
|
|
89
|
+
import {
|
|
90
|
+
applyThinkingLevelForModel,
|
|
91
|
+
floorThinkingLevelForUnit,
|
|
92
|
+
getRegisteredToolSnapshot,
|
|
93
|
+
getToolBaselineSnapshot,
|
|
94
|
+
} from "../auto-model-selection.js";
|
|
89
95
|
import type { DispatchAction } from "../auto-dispatch.js";
|
|
90
96
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
91
97
|
import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
|
|
@@ -225,7 +231,7 @@ function rememberRetryDispatch(
|
|
|
225
231
|
|
|
226
232
|
function getAlreadyClosedDispatchReason(unitType: string, unitId: string): string | null {
|
|
227
233
|
if (!isDbAvailable()) return null;
|
|
228
|
-
|
|
234
|
+
refreshWorkflowDatabaseFromDisk();
|
|
229
235
|
const { milestone, slice, task } = parseUnitId(unitId);
|
|
230
236
|
if (unitType === "execute-task" && milestone && slice && task) {
|
|
231
237
|
const row = getTask(milestone, slice, task);
|
|
@@ -624,6 +630,16 @@ export async function _runMilestoneMergeWithStashRestore(
|
|
|
624
630
|
);
|
|
625
631
|
if (exitResult.ok) {
|
|
626
632
|
s.milestoneMergedInPhases = true;
|
|
633
|
+
try {
|
|
634
|
+
const projectRoot = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
635
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
636
|
+
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
637
|
+
} catch (err) {
|
|
638
|
+
logWarning(
|
|
639
|
+
"engine",
|
|
640
|
+
`markdown projection rebuild after milestone merge failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
641
|
+
);
|
|
642
|
+
}
|
|
627
643
|
} else {
|
|
628
644
|
mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
|
|
629
645
|
}
|
|
@@ -1232,6 +1248,19 @@ export async function runPreDispatch(
|
|
|
1232
1248
|
} catch (e) {
|
|
1233
1249
|
logWarning("engine", "STATE.md rebuild failed after milestone transition", { error: String(e) });
|
|
1234
1250
|
}
|
|
1251
|
+
|
|
1252
|
+
// Re-project ROADMAP/PLAN markdown from the authoritative DB. Worktree DB
|
|
1253
|
+
// reconciliation during merge can leave main-branch markdown stale relative
|
|
1254
|
+
// to gsd.db (the 3M/3S/10T vs 3M/5S/16T drift class at /gsd startup).
|
|
1255
|
+
try {
|
|
1256
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
1257
|
+
await rebuildMarkdownProjectionsFromDb(s.canonicalProjectRoot);
|
|
1258
|
+
if (s.basePath !== s.canonicalProjectRoot) {
|
|
1259
|
+
await rebuildMarkdownProjectionsFromDb(s.basePath);
|
|
1260
|
+
}
|
|
1261
|
+
} catch (e) {
|
|
1262
|
+
logWarning("engine", "markdown projection rebuild failed after milestone transition", { error: String(e) });
|
|
1263
|
+
}
|
|
1235
1264
|
}
|
|
1236
1265
|
|
|
1237
1266
|
if (mid) {
|
|
@@ -1458,6 +1487,7 @@ export async function runDispatch(
|
|
|
1458
1487
|
// Checking a stale-narrowed set causes false transport-preflight warnings
|
|
1459
1488
|
// that repeat on every /gsd auto resume (#477 follow-up).
|
|
1460
1489
|
const activeTools = getToolBaselineSnapshot(pi);
|
|
1490
|
+
const registeredTools = getRegisteredToolSnapshot(pi);
|
|
1461
1491
|
// Deep planning intentionally keeps human checkpoints in plain chat. In
|
|
1462
1492
|
// Claude Code/local MCP transports, structured question requests can be
|
|
1463
1493
|
// cancelled outside the normal chat flow, which made approval gates easy to
|
|
@@ -1482,6 +1512,7 @@ export async function runDispatch(
|
|
|
1482
1512
|
sessionProvider: ctx.model?.provider,
|
|
1483
1513
|
modelRegistry: ctx.modelRegistry as MinimalModelRegistry | undefined,
|
|
1484
1514
|
activeTools,
|
|
1515
|
+
registeredTools,
|
|
1485
1516
|
sessionBaseUrl: ctx.model?.baseUrl,
|
|
1486
1517
|
sessionAuthMode: authMode,
|
|
1487
1518
|
});
|
|
@@ -1508,6 +1539,7 @@ export async function runDispatch(
|
|
|
1508
1539
|
sessionProvider: ctx.model?.provider,
|
|
1509
1540
|
modelRegistry: ctx.modelRegistry as MinimalModelRegistry | undefined,
|
|
1510
1541
|
activeTools,
|
|
1542
|
+
registeredTools,
|
|
1511
1543
|
sessionBaseUrl: ctx.model?.baseUrl,
|
|
1512
1544
|
sessionAuthMode: authMode,
|
|
1513
1545
|
});
|
|
@@ -130,7 +130,8 @@ export async function runUnit(
|
|
|
130
130
|
unitId,
|
|
131
131
|
error: msg,
|
|
132
132
|
});
|
|
133
|
-
|
|
133
|
+
const isStructural = sessionErr instanceof TypeError || /is not a function/i.test(msg);
|
|
134
|
+
return { status: "cancelled", errorContext: { message: `Session creation failed: ${msg}`, category: "session-failed", isTransient: !isStructural } };
|
|
134
135
|
}
|
|
135
136
|
if (sessionTimeoutHandle) clearTimeout(sessionTimeoutHandle);
|
|
136
137
|
|
|
@@ -29,6 +29,7 @@ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
|
29
29
|
import { normalizeRealPath } from "../paths.js";
|
|
30
30
|
import type { MilestoneScope } from "../workspace.js";
|
|
31
31
|
import type { RootDirtySnapshot } from "../root-write-leak-guard.js";
|
|
32
|
+
import type { MilestoneSettlementOutcome } from "../milestone-settlement.js";
|
|
32
33
|
|
|
33
34
|
// ─── Exported Types ──────────────────────────────────────────────────────────
|
|
34
35
|
|
|
@@ -230,6 +231,8 @@ export class AutoSession {
|
|
|
230
231
|
/** Set to true after phases.ts successfully calls mergeAndExit, so that
|
|
231
232
|
* stopAuto does not attempt the same merge a second time (#2645). */
|
|
232
233
|
milestoneMergedInPhases = false;
|
|
234
|
+
/** Last milestone settlement result observed by Auto Orchestration. */
|
|
235
|
+
milestoneSettlement: MilestoneSettlementOutcome | null = null;
|
|
233
236
|
|
|
234
237
|
// #4765 — slice-cadence collapse: main-branch SHAs at the moment each
|
|
235
238
|
// milestone's first slice merge began. Used by resquashMilestoneOnMain at
|
|
@@ -410,6 +413,7 @@ export class AutoSession {
|
|
|
410
413
|
this.strandedRecoveryIsolationMode = null;
|
|
411
414
|
this.rootWriteBaseline = null;
|
|
412
415
|
this.milestoneMergedInPhases = false;
|
|
416
|
+
this.milestoneSettlement = null;
|
|
413
417
|
this.milestoneStartShas = new Map();
|
|
414
418
|
this.checkpointSha = null;
|
|
415
419
|
|
|
@@ -44,6 +44,8 @@ import {
|
|
|
44
44
|
import { logWarning } from "./workflow-logger.js";
|
|
45
45
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
46
46
|
import { readUnitRuntimeRecord, type AutoUnitRuntimeRecord } from "./unit-runtime.js";
|
|
47
|
+
import { describeMilestoneReadinessPhase } from "./milestone-readiness.js";
|
|
48
|
+
import type { ToolSurfaceSnapshot } from "./tool-surface-snapshot.js";
|
|
47
49
|
|
|
48
50
|
const ACTIVE_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] as const;
|
|
49
51
|
|
|
@@ -85,6 +87,8 @@ export interface AutoDashboardData {
|
|
|
85
87
|
rtkEnabled?: boolean;
|
|
86
88
|
/** Cross-process: another auto-mode session detected via auto.lock (PID, startedAt) */
|
|
87
89
|
remoteSession?: { pid: number; startedAt: string; unitType: string; unitId: string };
|
|
90
|
+
/** Last typed tool-surface snapshot for active auto-mode scoping/debugging. */
|
|
91
|
+
toolSurface?: ToolSurfaceSnapshot | null;
|
|
88
92
|
}
|
|
89
93
|
|
|
90
94
|
export interface CompletionDashboardSnapshot {
|
|
@@ -189,6 +193,18 @@ export function unitPhaseLabel(unitType: string): string {
|
|
|
189
193
|
}
|
|
190
194
|
}
|
|
191
195
|
|
|
196
|
+
export function formatToolSurfaceSnapshot(snapshot: ToolSurfaceSnapshot | null | undefined): string | null {
|
|
197
|
+
if (!snapshot) return null;
|
|
198
|
+
const counts = [
|
|
199
|
+
`model ${snapshot.modelFacingToolNames.length}`,
|
|
200
|
+
`registered ${snapshot.registeredToolNames.length}`,
|
|
201
|
+
`scoped ${snapshot.scopedToolNames.length}`,
|
|
202
|
+
`presented ${snapshot.presentedToolNames.length}`,
|
|
203
|
+
];
|
|
204
|
+
const label = snapshot.unitType ?? snapshot.phase ?? snapshot.source;
|
|
205
|
+
return `${label}: ${counts.join(" / ")}`;
|
|
206
|
+
}
|
|
207
|
+
|
|
192
208
|
function peekNext(unitType: string, state: GSDState): string {
|
|
193
209
|
// Show active hook info in progress display
|
|
194
210
|
const activeHookState = getActiveHook();
|
|
@@ -224,12 +240,10 @@ export function describeNextUnit(state: GSDState): { label: string; description:
|
|
|
224
240
|
const sTitle = state.activeSlice?.title;
|
|
225
241
|
const tid = state.activeTask?.id;
|
|
226
242
|
const tTitle = state.activeTask?.title;
|
|
243
|
+
const readinessDescription = describeMilestoneReadinessPhase(state.phase);
|
|
244
|
+
if (readinessDescription) return readinessDescription;
|
|
227
245
|
|
|
228
246
|
switch (state.phase) {
|
|
229
|
-
case "needs-discussion":
|
|
230
|
-
return { label: "Discuss milestone draft", description: "Milestone has a draft context — needs discussion before planning." };
|
|
231
|
-
case "pre-planning":
|
|
232
|
-
return { label: "Research & plan milestone", description: "Scout the landscape and create the roadmap." };
|
|
233
247
|
case "planning":
|
|
234
248
|
return { label: `Plan ${sid}: ${sTitle}`, description: "Research and decompose into tasks." };
|
|
235
249
|
case "executing":
|
|
@@ -112,9 +112,9 @@ import { runTurnGitAction } from "./git-service.js";
|
|
|
112
112
|
import { parseUnitId } from "./unit-id.js";
|
|
113
113
|
import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
114
114
|
import {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
} from "./closeout-
|
|
115
|
+
formatCloseoutProofBlock,
|
|
116
|
+
proveMilestoneCloseout,
|
|
117
|
+
} from "./milestone-closeout-proof.js";
|
|
118
118
|
|
|
119
119
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
120
120
|
|
|
@@ -153,6 +153,8 @@ export interface DispatchContext {
|
|
|
153
153
|
sessionProvider?: string;
|
|
154
154
|
/** Active tools in the current session, used for transport preflight checks. */
|
|
155
155
|
activeTools?: string[];
|
|
156
|
+
/** Registered tools in the current session, used for run-uat tools re-scoped at dispatch. */
|
|
157
|
+
registeredTools?: string[];
|
|
156
158
|
/** Session model base URL, used for transport preflight checks. */
|
|
157
159
|
sessionBaseUrl?: string;
|
|
158
160
|
/** Session model auth mode, used for transport preflight checks. */
|
|
@@ -734,7 +736,17 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
734
736
|
},
|
|
735
737
|
{
|
|
736
738
|
name: "run-uat (post-completion)",
|
|
737
|
-
match: async ({
|
|
739
|
+
match: async ({
|
|
740
|
+
state,
|
|
741
|
+
mid,
|
|
742
|
+
basePath,
|
|
743
|
+
prefs,
|
|
744
|
+
sessionProvider,
|
|
745
|
+
sessionAuthMode,
|
|
746
|
+
activeTools,
|
|
747
|
+
registeredTools,
|
|
748
|
+
sessionBaseUrl,
|
|
749
|
+
}) => {
|
|
738
750
|
const needsRunUat = await checkNeedsRunUat(basePath, mid, state, prefs);
|
|
739
751
|
if (!needsRunUat) return null;
|
|
740
752
|
const { sliceId, uatType } = needsRunUat;
|
|
@@ -753,6 +765,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
753
765
|
const browserToolError = getUatBrowserToolSupportError({
|
|
754
766
|
uatType,
|
|
755
767
|
activeTools,
|
|
768
|
+
registeredTools,
|
|
756
769
|
milestoneId: mid,
|
|
757
770
|
sliceId,
|
|
758
771
|
});
|
|
@@ -1745,11 +1758,11 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1745
1758
|
};
|
|
1746
1759
|
}
|
|
1747
1760
|
if (milestone) {
|
|
1748
|
-
const
|
|
1749
|
-
if (!
|
|
1761
|
+
const closeoutProof = proveMilestoneCloseout(mid, { refreshFromDisk: true });
|
|
1762
|
+
if (!closeoutProof.ok) {
|
|
1750
1763
|
return {
|
|
1751
1764
|
action: "stop",
|
|
1752
|
-
reason:
|
|
1765
|
+
reason: formatCloseoutProofBlock(closeoutProof),
|
|
1753
1766
|
level: "warning",
|
|
1754
1767
|
};
|
|
1755
1768
|
}
|
|
@@ -122,6 +122,14 @@ export function getToolBaselineSnapshot(pi: ExtensionAPI): string[] {
|
|
|
122
122
|
return [...new Set([...baseline, ...live])];
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
export function getRegisteredToolSnapshot(pi: ExtensionAPI): string[] {
|
|
126
|
+
if (typeof pi.getAllTools !== "function") return getToolBaselineSnapshot(pi);
|
|
127
|
+
const names = pi.getAllTools()
|
|
128
|
+
.map((tool) => tool.name)
|
|
129
|
+
.filter((name): name is string => typeof name === "string" && name.length > 0);
|
|
130
|
+
return [...new Set(names)];
|
|
131
|
+
}
|
|
132
|
+
|
|
125
133
|
/**
|
|
126
134
|
* Models eligible for the pre-dispatch policy gate. Prefer registry-available
|
|
127
135
|
* models; when that list is empty (common after worktree resume before registry
|
|
@@ -49,7 +49,8 @@ import { regenerateIfMissing } from "./workflow-projections.js";
|
|
|
49
49
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
50
50
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
51
51
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
52
|
-
import { isDbAvailable,
|
|
52
|
+
import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
53
|
+
import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
53
54
|
import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
54
55
|
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
55
56
|
import { consumeSignal } from "./session-status-io.js";
|
|
@@ -1273,9 +1274,9 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1273
1274
|
await new Promise(r => setTimeout(r, 100));
|
|
1274
1275
|
}
|
|
1275
1276
|
|
|
1276
|
-
const dbPath =
|
|
1277
|
+
const dbPath = getWorkflowDatabasePath();
|
|
1277
1278
|
if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
|
|
1278
|
-
const refreshed =
|
|
1279
|
+
const refreshed = refreshWorkflowDatabaseFromDisk();
|
|
1279
1280
|
if (!refreshed) {
|
|
1280
1281
|
logWarning("db", "post-unit database refresh failed; derived state may be stale");
|
|
1281
1282
|
}
|
|
@@ -36,7 +36,18 @@ import {
|
|
|
36
36
|
} from "./gate-registry.js";
|
|
37
37
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
38
38
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
39
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
composeContextModeInstructions,
|
|
41
|
+
composeContractedUnitContext,
|
|
42
|
+
composeInlinedContext,
|
|
43
|
+
composeUnitContext,
|
|
44
|
+
type ArtifactResolver,
|
|
45
|
+
type ComposedUnitContextBlock,
|
|
46
|
+
type ContextModeRenderMode,
|
|
47
|
+
type ExcerptResolver,
|
|
48
|
+
} from "./unit-context-composer.js";
|
|
49
|
+
import { resolveManifest, type ArtifactKey } from "./unit-context-manifest.js";
|
|
50
|
+
import { compileUnitContextContract, type UnitPromptContextContract } from "./tool-contract.js";
|
|
40
51
|
import { readCompactionSnapshot } from "./compaction-snapshot.js";
|
|
41
52
|
import { logWarning } from "./workflow-logger.js";
|
|
42
53
|
import { inlineGraphSubgraph } from "./graph-context.js";
|
|
@@ -47,6 +58,7 @@ import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-acti
|
|
|
47
58
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
48
59
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
49
60
|
import { resolveEffectiveUatType, shouldDispatchUatForContent, type UatType } from "./uat-policy.js";
|
|
61
|
+
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
50
62
|
|
|
51
63
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
52
64
|
|
|
@@ -286,6 +298,39 @@ function prependContextModeToBlock(
|
|
|
286
298
|
return `${contextMode}\n\n${block}`;
|
|
287
299
|
}
|
|
288
300
|
|
|
301
|
+
function requireUnitPromptContextContract(unitType: string): UnitPromptContextContract {
|
|
302
|
+
const result = compileUnitContextContract(unitType);
|
|
303
|
+
if (result.ok) return result.contract;
|
|
304
|
+
throw new Error(result.detail);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function requireComposedArtifactBlock(
|
|
308
|
+
blocks: readonly ComposedUnitContextBlock[],
|
|
309
|
+
unitType: string,
|
|
310
|
+
key: ArtifactKey,
|
|
311
|
+
): string {
|
|
312
|
+
const block = blocks.find((item) => item.key === key);
|
|
313
|
+
if (!block) {
|
|
314
|
+
throw new Error(`Unit Context Contract for ${unitType} did not compose required artifact ${key}`);
|
|
315
|
+
}
|
|
316
|
+
return block.body;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function renderExecuteTaskOnDemandContext(
|
|
320
|
+
base: string,
|
|
321
|
+
mid: string,
|
|
322
|
+
sid: string,
|
|
323
|
+
artifacts: readonly ArtifactKey[],
|
|
324
|
+
): string {
|
|
325
|
+
if (!artifacts.includes("slice-research")) return "";
|
|
326
|
+
const researchPath = relSliceFile(base, mid, sid, "RESEARCH");
|
|
327
|
+
return [
|
|
328
|
+
"## On-demand Context",
|
|
329
|
+
"",
|
|
330
|
+
`Slice research is available at \`${researchPath}\`. Read it only if the inlined task plan, slice plan excerpt, and carry-forward context do not explain a required implementation detail.`,
|
|
331
|
+
].join("\n");
|
|
332
|
+
}
|
|
333
|
+
|
|
289
334
|
// ─── Executor Constraints ─────────────────────────────────────────────────────
|
|
290
335
|
|
|
291
336
|
/**
|
|
@@ -1674,6 +1719,70 @@ export async function buildDiscussRequirementsPrompt(
|
|
|
1674
1719
|
}));
|
|
1675
1720
|
}
|
|
1676
1721
|
|
|
1722
|
+
/**
|
|
1723
|
+
* Bounded codebase snapshot for research-milestone grounding (ADR-029).
|
|
1724
|
+
*
|
|
1725
|
+
* Reuses the in-process, ~millisecond `analyzeCodebase` / `formatCodebaseBrief`
|
|
1726
|
+
* machinery that powers the guided-discuss Preparation Snapshot, so research
|
|
1727
|
+
* grounds on current code reality instead of running an open-ended `rg`/`find`/
|
|
1728
|
+
* `scout` survey on every dispatch (the auto-mode counterpart to ADR-028).
|
|
1729
|
+
*
|
|
1730
|
+
* Gated on the manifest's `codebaseMap` flag (previously a dead policy flag)
|
|
1731
|
+
* and the `discuss_preparation` opt-out. Failures degrade silently — research
|
|
1732
|
+
* still runs, it just falls back to on-demand reads.
|
|
1733
|
+
*/
|
|
1734
|
+
async function buildResearchCodebaseSnapshot(base: string): Promise<string | null> {
|
|
1735
|
+
const manifest = resolveManifest("research-milestone");
|
|
1736
|
+
if (!manifest?.codebaseMap) return null;
|
|
1737
|
+
const prefs = loadEffectiveGSDPreferences(base)?.preferences;
|
|
1738
|
+
if (prefs?.discuss_preparation === false) return null;
|
|
1739
|
+
try {
|
|
1740
|
+
const { analyzeCodebase, formatCodebaseBrief } = await import("./preparation.js");
|
|
1741
|
+
const brief = await analyzeCodebase(base);
|
|
1742
|
+
const formatted = formatCodebaseBrief(brief).trim();
|
|
1743
|
+
if (!formatted) return null;
|
|
1744
|
+
return [
|
|
1745
|
+
"### Codebase Snapshot (current code reality)",
|
|
1746
|
+
"Source: in-process bounded scan of the working tree.",
|
|
1747
|
+
"",
|
|
1748
|
+
"This snapshot describes what already exists. Treat it as authoritative for current code reality and do NOT re-survey the tree to rediscover it. Read a specific file only when a research question hinges on its exact contents.",
|
|
1749
|
+
"",
|
|
1750
|
+
formatted,
|
|
1751
|
+
].join("\n");
|
|
1752
|
+
} catch (err) {
|
|
1753
|
+
logWarning("prompt", `buildResearchCodebaseSnapshot failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1754
|
+
return null;
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1758
|
+
/**
|
|
1759
|
+
* Lightweight research resume block (ADR-029).
|
|
1760
|
+
*
|
|
1761
|
+
* When a prior attempt for this milestone left durable output — a partial
|
|
1762
|
+
* RESEARCH artifact and/or a research phase anchor — inline it under a
|
|
1763
|
+
* "continue, do not redo" banner so a re-dispatched research unit extends
|
|
1764
|
+
* prior work instead of re-running every command from scratch (the
|
|
1765
|
+
* restart-from-scratch pattern observed in the 789 run trace). No new state
|
|
1766
|
+
* machine: the partial RESEARCH file and the existing phase anchor are the
|
|
1767
|
+
* durable signals. Returns null when there is nothing to resume.
|
|
1768
|
+
*/
|
|
1769
|
+
async function buildResearchResumeBlock(base: string, mid: string): Promise<string | null> {
|
|
1770
|
+
const researchPath = resolveMilestoneFile(base, mid, "RESEARCH");
|
|
1771
|
+
const researchRel = relMilestoneFile(base, mid, "RESEARCH");
|
|
1772
|
+
const partial = await inlineFileOptional(researchPath, researchRel, "Prior Partial Research");
|
|
1773
|
+
const anchor = readPhaseAnchor(base, mid, "research-milestone");
|
|
1774
|
+
if (!partial && !anchor) return null;
|
|
1775
|
+
const lines: string[] = [
|
|
1776
|
+
"### Resume — Prior Partial Research (continue, do not redo)",
|
|
1777
|
+
"",
|
|
1778
|
+
"A previous research attempt for this milestone left the durable output below. **Build on it — do not restart from scratch.** Re-run a command only when its prior result is missing or stale, and persist progress incrementally with `gsd_summary_save` so any interruption keeps your findings.",
|
|
1779
|
+
"",
|
|
1780
|
+
];
|
|
1781
|
+
if (anchor) lines.push(formatAnchorForPrompt(anchor), "");
|
|
1782
|
+
if (partial) lines.push(partial);
|
|
1783
|
+
return lines.join("\n").trimEnd();
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1677
1786
|
export async function buildResearchMilestonePrompt(mid: string, midTitle: string, base: string): Promise<string> {
|
|
1678
1787
|
const contextTelemetry: PromptContextTelemetryEntry[] = [];
|
|
1679
1788
|
|
|
@@ -1715,6 +1824,34 @@ export async function buildResearchMilestonePrompt(mid: string, midTitle: string
|
|
|
1715
1824
|
const knowledgeInlineRM = await inlineKnowledgeBudgeted(base, extractKeywords(midTitle));
|
|
1716
1825
|
const parts: string[] = [];
|
|
1717
1826
|
if (composed.prepend) parts.push(composed.prepend);
|
|
1827
|
+
|
|
1828
|
+
// Resume grounding (ADR-029): if a prior attempt left partial research or a
|
|
1829
|
+
// phase anchor, inline it prominently so a re-dispatched unit continues
|
|
1830
|
+
// rather than re-running every command from scratch.
|
|
1831
|
+
const resumeBlock = await buildResearchResumeBlock(base, mid);
|
|
1832
|
+
if (resumeBlock) {
|
|
1833
|
+
parts.push(resumeBlock);
|
|
1834
|
+
trackPromptContext(contextTelemetry, "research-resume", "inline", resumeBlock);
|
|
1835
|
+
} else {
|
|
1836
|
+
trackPromptContext(contextTelemetry, "research-resume", "skipped", null, "no prior partial research");
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
// Project-size signal (ADR-029): same classification plan-milestone gets, so
|
|
1840
|
+
// research right-sizes effort on tiny projects instead of over-researching.
|
|
1841
|
+
const classificationBlock = formatProjectClassificationForPlanning(classifyProject(base));
|
|
1842
|
+
parts.push(classificationBlock);
|
|
1843
|
+
trackPromptContext(contextTelemetry, "project-classification", "inline", classificationBlock);
|
|
1844
|
+
|
|
1845
|
+
// Codebase snapshot (ADR-029): bounded, in-process code-reality grounding so
|
|
1846
|
+
// research does not open-endedly survey the tree (auto-mode ADR-028).
|
|
1847
|
+
const codebaseSnapshot = await buildResearchCodebaseSnapshot(base);
|
|
1848
|
+
if (codebaseSnapshot) {
|
|
1849
|
+
parts.push(codebaseSnapshot);
|
|
1850
|
+
trackPromptContext(contextTelemetry, "codebase-snapshot", "inline", codebaseSnapshot);
|
|
1851
|
+
} else {
|
|
1852
|
+
trackPromptContext(contextTelemetry, "codebase-snapshot", "skipped", null, "disabled, empty, or scan failed");
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1718
1855
|
if (knowledgeInlineRM && composed.inline) {
|
|
1719
1856
|
const idx = composed.inline.lastIndexOf("### Output Template:");
|
|
1720
1857
|
if (idx > 0) {
|
|
@@ -1883,6 +2020,12 @@ export async function buildPlanMilestonePrompt(mid: string, midTitle: string, ba
|
|
|
1883
2020
|
} else {
|
|
1884
2021
|
trackPromptContext(contextTelemetry, "knowledge", "skipped", null, "missing");
|
|
1885
2022
|
}
|
|
2023
|
+
const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
|
|
2024
|
+
if (webAppUatGuidance) {
|
|
2025
|
+
pushTracked("web-app-uat", webAppUatGuidance);
|
|
2026
|
+
} else {
|
|
2027
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, "not a web app");
|
|
2028
|
+
}
|
|
1886
2029
|
pushTracked("templates", inlineTemplate("roadmap", "Roadmap"));
|
|
1887
2030
|
if (inlineLevel === "full") {
|
|
1888
2031
|
pushTracked("templates", inlineTemplate("decisions", "Decisions"));
|
|
@@ -2213,6 +2356,14 @@ async function renderSlicePrompt(options: {
|
|
|
2213
2356
|
trackPromptContext(contextTelemetry, "graph-subgraph", "skipped", null, "missing");
|
|
2214
2357
|
}
|
|
2215
2358
|
|
|
2359
|
+
const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
|
|
2360
|
+
if (webAppUatGuidance) {
|
|
2361
|
+
inlined.push(webAppUatGuidance);
|
|
2362
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "inline", webAppUatGuidance);
|
|
2363
|
+
} else {
|
|
2364
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, "not a web app");
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2216
2367
|
const planTemplateInline = level === "minimal" ? inlineCompactTemplate("plan", "Slice Plan") : inlineTemplate("plan", "Slice Plan");
|
|
2217
2368
|
inlined.push(planTemplateInline);
|
|
2218
2369
|
trackPromptContext(contextTelemetry, "templates", "inline", planTemplateInline);
|
|
@@ -2417,7 +2568,7 @@ export async function buildExecuteTaskPrompt(
|
|
|
2417
2568
|
const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
|
|
2418
2569
|
const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
|
|
2419
2570
|
const taskPlanRelPath = relSlicePath(base, mid, sid) + `/tasks/${tid}-PLAN.md`;
|
|
2420
|
-
const
|
|
2571
|
+
const taskPlanContext = taskPlanContent
|
|
2421
2572
|
? [
|
|
2422
2573
|
"## Inlined Task Plan (authoritative local execution contract)",
|
|
2423
2574
|
`Source: \`${taskPlanRelPath}\``,
|
|
@@ -2428,12 +2579,12 @@ export async function buildExecuteTaskPrompt(
|
|
|
2428
2579
|
"## Inlined Task Plan (authoritative local execution contract)",
|
|
2429
2580
|
`Task plan not found at dispatch time. Read \`${taskPlanRelPath}\` before executing.`,
|
|
2430
2581
|
].join("\n");
|
|
2431
|
-
trackPromptContext(contextTelemetry, "task-plan", taskPlanContent ? "inline" : "on-demand",
|
|
2582
|
+
trackPromptContext(contextTelemetry, "task-plan", taskPlanContent ? "inline" : "on-demand", taskPlanContext, taskPlanContent ? undefined : "missing at dispatch");
|
|
2432
2583
|
|
|
2433
2584
|
const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
|
|
2434
2585
|
const slicePlanContent = slicePlanPath ? await loadFile(slicePlanPath) : null;
|
|
2435
|
-
const
|
|
2436
|
-
trackPromptContext(contextTelemetry, "slice-plan",
|
|
2586
|
+
const slicePlanContext = extractSliceExecutionExcerpt(slicePlanContent, relSliceFile(base, mid, sid, "PLAN"));
|
|
2587
|
+
trackPromptContext(contextTelemetry, "slice-plan", slicePlanContext ? "excerpt" : "skipped", slicePlanContext, slicePlanContext ? undefined : "missing");
|
|
2437
2588
|
|
|
2438
2589
|
// Check for continue file (new naming or legacy)
|
|
2439
2590
|
const continueFile = resolveSliceFile(base, mid, sid, "CONTINUE");
|
|
@@ -2564,6 +2715,37 @@ export async function buildExecuteTaskPrompt(
|
|
|
2564
2715
|
}
|
|
2565
2716
|
trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates, inlineLevel);
|
|
2566
2717
|
|
|
2718
|
+
const contextContract = requireUnitPromptContextContract("execute-task");
|
|
2719
|
+
const contractedContext = await composeContractedUnitContext(contextContract, {
|
|
2720
|
+
base: { unitType: "execute-task", basePath: base, milestoneId: mid, sliceId: sid, taskId: tid },
|
|
2721
|
+
resolveArtifact: async (key) => {
|
|
2722
|
+
switch (key) {
|
|
2723
|
+
case "task-plan":
|
|
2724
|
+
return taskPlanContext;
|
|
2725
|
+
case "slice-plan":
|
|
2726
|
+
return slicePlanContext;
|
|
2727
|
+
case "prior-task-summaries":
|
|
2728
|
+
return finalCarryForward;
|
|
2729
|
+
case "templates":
|
|
2730
|
+
return inlinedTemplates;
|
|
2731
|
+
default:
|
|
2732
|
+
return null;
|
|
2733
|
+
}
|
|
2734
|
+
},
|
|
2735
|
+
});
|
|
2736
|
+
const taskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
|
|
2737
|
+
const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
|
|
2738
|
+
const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
|
|
2739
|
+
const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
|
|
2740
|
+
const onDemandContext = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
|
|
2741
|
+
trackPromptContext(
|
|
2742
|
+
contextTelemetry,
|
|
2743
|
+
"slice-research",
|
|
2744
|
+
onDemandContext ? "on-demand" : "skipped",
|
|
2745
|
+
onDemandContext,
|
|
2746
|
+
onDemandContext ? undefined : "not declared by contract",
|
|
2747
|
+
);
|
|
2748
|
+
|
|
2567
2749
|
const prompt = loadPrompt("execute-task", {
|
|
2568
2750
|
overridesSection,
|
|
2569
2751
|
runtimeContext,
|
|
@@ -2575,11 +2757,12 @@ export async function buildExecuteTaskPrompt(
|
|
|
2575
2757
|
taskPlanPath: taskPlanRelPath,
|
|
2576
2758
|
taskPlanInline,
|
|
2577
2759
|
slicePlanExcerpt,
|
|
2578
|
-
carryForwardSection:
|
|
2760
|
+
carryForwardSection: contractedCarryForward,
|
|
2579
2761
|
resumeSection,
|
|
2580
2762
|
priorTaskLines: priorLines,
|
|
2763
|
+
onDemandContext,
|
|
2581
2764
|
taskSummaryPath,
|
|
2582
|
-
inlinedTemplates,
|
|
2765
|
+
inlinedTemplates: contractedTemplates,
|
|
2583
2766
|
verificationBudget,
|
|
2584
2767
|
gatesToClose,
|
|
2585
2768
|
skillActivation: buildSkillActivationBlock({
|
|
@@ -2590,7 +2773,7 @@ export async function buildExecuteTaskPrompt(
|
|
|
2590
2773
|
taskId: tid,
|
|
2591
2774
|
taskTitle: tTitle,
|
|
2592
2775
|
taskPlanContent,
|
|
2593
|
-
extraContext: [taskPlanInline, slicePlanExcerpt,
|
|
2776
|
+
extraContext: [taskPlanInline, slicePlanExcerpt, contractedCarryForward, resumeSection],
|
|
2594
2777
|
unitType: "execute-task",
|
|
2595
2778
|
}),
|
|
2596
2779
|
});
|
|
@@ -2710,6 +2893,14 @@ export async function buildCompleteSlicePrompt(
|
|
|
2710
2893
|
}
|
|
2711
2894
|
}
|
|
2712
2895
|
|
|
2896
|
+
const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
|
|
2897
|
+
if (webAppUatGuidance && body) {
|
|
2898
|
+
body = `${webAppUatGuidance}\n\n---\n\n${body}`;
|
|
2899
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "inline", webAppUatGuidance);
|
|
2900
|
+
} else {
|
|
2901
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, webAppUatGuidance ? "missing composed body" : "not a web app");
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2713
2904
|
// Overrides section prepends to the top of the inlined context —
|
|
2714
2905
|
// standard pattern for slice-level builders (until composer v2 lands
|
|
2715
2906
|
// the prepend contract).
|
|
@@ -3679,6 +3870,22 @@ export async function buildReactiveExecutePrompt(
|
|
|
3679
3870
|
// derivation, and tool handlers all consult the same source of truth.
|
|
3680
3871
|
// See gate-registry.ts for the full ownership map.
|
|
3681
3872
|
|
|
3873
|
+
/**
|
|
3874
|
+
* Adapt gate-registry guidance for section-close phases.
|
|
3875
|
+
*
|
|
3876
|
+
* Gate-registry text is shared with the gate-evaluate subagent, where
|
|
3877
|
+
* "Return verdict ..." is literal. Section-close units write artifact sections
|
|
3878
|
+
* instead, so translate that wording at render time without mutating the
|
|
3879
|
+
* canonical guidance.
|
|
3880
|
+
*/
|
|
3881
|
+
function sectionModeGuidance(guidance: string): string {
|
|
3882
|
+
return guidance.replace(
|
|
3883
|
+
/Return verdict '([^']+)'/g,
|
|
3884
|
+
(_match, verdict: string) =>
|
|
3885
|
+
verdict === "omitted" ? "Leave the section empty" : `Record a \`${verdict}\``,
|
|
3886
|
+
);
|
|
3887
|
+
}
|
|
3888
|
+
|
|
3682
3889
|
/**
|
|
3683
3890
|
* Render a "Gates to Close" block for turns like `complete-slice` and
|
|
3684
3891
|
* `validate-milestone` that own gates which are closed as a side-effect
|
|
@@ -3702,12 +3909,16 @@ function renderGatesToCloseBlock(
|
|
|
3702
3909
|
"These quality gates are still pending for this unit. You MUST address every one before calling the closing tool — the handler closes the DB row based on whether the corresponding artifact section is present.",
|
|
3703
3910
|
);
|
|
3704
3911
|
lines.push("");
|
|
3912
|
+
lines.push(
|
|
3913
|
+
"**Do NOT call `gsd_save_gate_result` (or any gate-result tool) for these gates** — that tool belongs to a different phase and the call will be blocked. You close each gate purely by writing its named section: a populated section records `pass`, an empty section records `omitted`, and the completion handler persists the verdict for you. Treat any \"return verdict\" wording in the guidance below as describing that section outcome, not as an instruction to call a tool.",
|
|
3914
|
+
);
|
|
3915
|
+
lines.push("");
|
|
3705
3916
|
for (const def of applicable) {
|
|
3706
3917
|
lines.push(`### ${def.id} — ${def.promptSection}`);
|
|
3707
3918
|
lines.push("");
|
|
3708
3919
|
lines.push(`**Question:** ${def.question}`);
|
|
3709
3920
|
lines.push("");
|
|
3710
|
-
lines.push(def.guidance);
|
|
3921
|
+
lines.push(sectionModeGuidance(def.guidance));
|
|
3711
3922
|
if (opts.allowOmit) {
|
|
3712
3923
|
lines.push("");
|
|
3713
3924
|
lines.push(
|