@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
|
@@ -33,7 +33,8 @@ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
|
33
33
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
34
34
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
35
35
|
import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
36
|
-
import { isDbAvailable, getMilestoneSlices, getSlice, getTask
|
|
36
|
+
import { isDbAvailable, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
|
|
37
|
+
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
37
38
|
import { isClosedStatus } from "../status-guards.js";
|
|
38
39
|
import { setRuntimeKv } from "../db/runtime-kv.js";
|
|
39
40
|
import { getLatestForUnit } from "../db/unit-dispatches.js";
|
|
@@ -49,7 +50,7 @@ import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
|
49
50
|
import { getContextPauseAction } from "../auto-budget.js";
|
|
50
51
|
import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, supportsStructuredQuestions, } from "../workflow-mcp.js";
|
|
51
52
|
import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
|
|
52
|
-
import {
|
|
53
|
+
import { applyThinkingLevelForModel, floorThinkingLevelForUnit, getRegisteredToolSnapshot, getToolBaselineSnapshot, } from "../auto-model-selection.js";
|
|
53
54
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
54
55
|
import { createWorktreeSafetyModule } from "../worktree-safety.js";
|
|
55
56
|
import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
|
|
@@ -156,7 +157,7 @@ function rememberRetryDispatch(s, unit, iterData) {
|
|
|
156
157
|
function getAlreadyClosedDispatchReason(unitType, unitId) {
|
|
157
158
|
if (!isDbAvailable())
|
|
158
159
|
return null;
|
|
159
|
-
|
|
160
|
+
refreshWorkflowDatabaseFromDisk();
|
|
160
161
|
const { milestone, slice, task } = parseUnitId(unitId);
|
|
161
162
|
if (unitType === "execute-task" && milestone && slice && task) {
|
|
162
163
|
const row = getTask(milestone, slice, task);
|
|
@@ -447,6 +448,14 @@ export async function _runMilestoneMergeWithStashRestore(ic, milestoneId, option
|
|
|
447
448
|
const exitResult = deps.lifecycle.exitMilestone(milestoneId, { merge: true }, ctx.ui);
|
|
448
449
|
if (exitResult.ok) {
|
|
449
450
|
s.milestoneMergedInPhases = true;
|
|
451
|
+
try {
|
|
452
|
+
const projectRoot = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
453
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
454
|
+
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
455
|
+
}
|
|
456
|
+
catch (err) {
|
|
457
|
+
logWarning("engine", `markdown projection rebuild after milestone merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
458
|
+
}
|
|
450
459
|
}
|
|
451
460
|
else {
|
|
452
461
|
mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
|
|
@@ -929,6 +938,19 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
929
938
|
catch (e) {
|
|
930
939
|
logWarning("engine", "STATE.md rebuild failed after milestone transition", { error: String(e) });
|
|
931
940
|
}
|
|
941
|
+
// Re-project ROADMAP/PLAN markdown from the authoritative DB. Worktree DB
|
|
942
|
+
// reconciliation during merge can leave main-branch markdown stale relative
|
|
943
|
+
// to gsd.db (the 3M/3S/10T vs 3M/5S/16T drift class at /gsd startup).
|
|
944
|
+
try {
|
|
945
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
946
|
+
await rebuildMarkdownProjectionsFromDb(s.canonicalProjectRoot);
|
|
947
|
+
if (s.basePath !== s.canonicalProjectRoot) {
|
|
948
|
+
await rebuildMarkdownProjectionsFromDb(s.basePath);
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
catch (e) {
|
|
952
|
+
logWarning("engine", "markdown projection rebuild failed after milestone transition", { error: String(e) });
|
|
953
|
+
}
|
|
932
954
|
}
|
|
933
955
|
if (mid) {
|
|
934
956
|
s.currentMilestoneId = mid;
|
|
@@ -1082,6 +1104,7 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
1082
1104
|
// Checking a stale-narrowed set causes false transport-preflight warnings
|
|
1083
1105
|
// that repeat on every /gsd auto resume (#477 follow-up).
|
|
1084
1106
|
const activeTools = getToolBaselineSnapshot(pi);
|
|
1107
|
+
const registeredTools = getRegisteredToolSnapshot(pi);
|
|
1085
1108
|
// Deep planning intentionally keeps human checkpoints in plain chat. In
|
|
1086
1109
|
// Claude Code/local MCP transports, structured question requests can be
|
|
1087
1110
|
// cancelled outside the normal chat flow, which made approval gates easy to
|
|
@@ -1105,6 +1128,7 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
1105
1128
|
sessionProvider: ctx.model?.provider,
|
|
1106
1129
|
modelRegistry: ctx.modelRegistry,
|
|
1107
1130
|
activeTools,
|
|
1131
|
+
registeredTools,
|
|
1108
1132
|
sessionBaseUrl: ctx.model?.baseUrl,
|
|
1109
1133
|
sessionAuthMode: authMode,
|
|
1110
1134
|
});
|
|
@@ -1131,6 +1155,7 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
1131
1155
|
sessionProvider: ctx.model?.provider,
|
|
1132
1156
|
modelRegistry: ctx.modelRegistry,
|
|
1133
1157
|
activeTools,
|
|
1158
|
+
registeredTools,
|
|
1134
1159
|
sessionBaseUrl: ctx.model?.baseUrl,
|
|
1135
1160
|
sessionAuthMode: authMode,
|
|
1136
1161
|
});
|
|
@@ -95,7 +95,8 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
95
95
|
unitId,
|
|
96
96
|
error: msg,
|
|
97
97
|
});
|
|
98
|
-
|
|
98
|
+
const isStructural = sessionErr instanceof TypeError || /is not a function/i.test(msg);
|
|
99
|
+
return { status: "cancelled", errorContext: { message: `Session creation failed: ${msg}`, category: "session-failed", isTransient: !isStructural } };
|
|
99
100
|
}
|
|
100
101
|
if (sessionTimeoutHandle)
|
|
101
102
|
clearTimeout(sessionTimeoutHandle);
|
|
@@ -143,6 +143,8 @@ export class AutoSession {
|
|
|
143
143
|
/** Set to true after phases.ts successfully calls mergeAndExit, so that
|
|
144
144
|
* stopAuto does not attempt the same merge a second time (#2645). */
|
|
145
145
|
milestoneMergedInPhases = false;
|
|
146
|
+
/** Last milestone settlement result observed by Auto Orchestration. */
|
|
147
|
+
milestoneSettlement = null;
|
|
146
148
|
// #4765 — slice-cadence collapse: main-branch SHAs at the moment each
|
|
147
149
|
// milestone's first slice merge began. Used by resquashMilestoneOnMain at
|
|
148
150
|
// milestone completion to collapse N slice commits into one. Cleared when
|
|
@@ -311,6 +313,7 @@ export class AutoSession {
|
|
|
311
313
|
this.strandedRecoveryIsolationMode = null;
|
|
312
314
|
this.rootWriteBaseline = null;
|
|
313
315
|
this.milestoneMergedInPhases = false;
|
|
316
|
+
this.milestoneSettlement = null;
|
|
314
317
|
this.milestoneStartShas = new Map();
|
|
315
318
|
this.checkpointSha = null;
|
|
316
319
|
// Signal handler
|
|
@@ -16,6 +16,7 @@ import { parseUnitId } from "./unit-id.js";
|
|
|
16
16
|
import { logWarning } from "./workflow-logger.js";
|
|
17
17
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
18
18
|
import { readUnitRuntimeRecord } from "./unit-runtime.js";
|
|
19
|
+
import { describeMilestoneReadinessPhase } from "./milestone-readiness.js";
|
|
19
20
|
const ACTIVE_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
20
21
|
// ─── UAT Slice Extraction ─────────────────────────────────────────────────────
|
|
21
22
|
/**
|
|
@@ -84,6 +85,18 @@ export function unitPhaseLabel(unitType) {
|
|
|
84
85
|
default: return unitType.toUpperCase();
|
|
85
86
|
}
|
|
86
87
|
}
|
|
88
|
+
export function formatToolSurfaceSnapshot(snapshot) {
|
|
89
|
+
if (!snapshot)
|
|
90
|
+
return null;
|
|
91
|
+
const counts = [
|
|
92
|
+
`model ${snapshot.modelFacingToolNames.length}`,
|
|
93
|
+
`registered ${snapshot.registeredToolNames.length}`,
|
|
94
|
+
`scoped ${snapshot.scopedToolNames.length}`,
|
|
95
|
+
`presented ${snapshot.presentedToolNames.length}`,
|
|
96
|
+
];
|
|
97
|
+
const label = snapshot.unitType ?? snapshot.phase ?? snapshot.source;
|
|
98
|
+
return `${label}: ${counts.join(" / ")}`;
|
|
99
|
+
}
|
|
87
100
|
function peekNext(unitType, state) {
|
|
88
101
|
// Show active hook info in progress display
|
|
89
102
|
const activeHookState = getActiveHook();
|
|
@@ -118,11 +131,10 @@ export function describeNextUnit(state) {
|
|
|
118
131
|
const sTitle = state.activeSlice?.title;
|
|
119
132
|
const tid = state.activeTask?.id;
|
|
120
133
|
const tTitle = state.activeTask?.title;
|
|
134
|
+
const readinessDescription = describeMilestoneReadinessPhase(state.phase);
|
|
135
|
+
if (readinessDescription)
|
|
136
|
+
return readinessDescription;
|
|
121
137
|
switch (state.phase) {
|
|
122
|
-
case "needs-discussion":
|
|
123
|
-
return { label: "Discuss milestone draft", description: "Milestone has a draft context — needs discussion before planning." };
|
|
124
|
-
case "pre-planning":
|
|
125
|
-
return { label: "Research & plan milestone", description: "Scout the landscape and create the roadmap." };
|
|
126
138
|
case "planning":
|
|
127
139
|
return { label: `Plan ${sid}: ${sTitle}`, description: "Research and decompose into tasks." };
|
|
128
140
|
case "executing":
|
|
@@ -37,7 +37,7 @@ import { probeGitConflictState } from "./git-conflict-state.js";
|
|
|
37
37
|
import { runTurnGitAction } from "./git-service.js";
|
|
38
38
|
import { parseUnitId } from "./unit-id.js";
|
|
39
39
|
import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
40
|
-
import {
|
|
40
|
+
import { formatCloseoutProofBlock, proveMilestoneCloseout, } from "./milestone-closeout-proof.js";
|
|
41
41
|
function resolveExistingExpectedArtifact(unitType, unitId, basePath) {
|
|
42
42
|
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
43
43
|
return artifactPath && existsSync(artifactPath) ? artifactPath : null;
|
|
@@ -518,7 +518,7 @@ export const DISPATCH_RULES = [
|
|
|
518
518
|
},
|
|
519
519
|
{
|
|
520
520
|
name: "run-uat (post-completion)",
|
|
521
|
-
match: async ({ state, mid, basePath, prefs, sessionProvider, sessionAuthMode, activeTools, sessionBaseUrl }) => {
|
|
521
|
+
match: async ({ state, mid, basePath, prefs, sessionProvider, sessionAuthMode, activeTools, registeredTools, sessionBaseUrl, }) => {
|
|
522
522
|
const needsRunUat = await checkNeedsRunUat(basePath, mid, state, prefs);
|
|
523
523
|
if (!needsRunUat)
|
|
524
524
|
return null;
|
|
@@ -533,6 +533,7 @@ export const DISPATCH_RULES = [
|
|
|
533
533
|
const browserToolError = getUatBrowserToolSupportError({
|
|
534
534
|
uatType,
|
|
535
535
|
activeTools,
|
|
536
|
+
registeredTools,
|
|
536
537
|
milestoneId: mid,
|
|
537
538
|
sliceId,
|
|
538
539
|
});
|
|
@@ -1425,11 +1426,11 @@ export const DISPATCH_RULES = [
|
|
|
1425
1426
|
};
|
|
1426
1427
|
}
|
|
1427
1428
|
if (milestone) {
|
|
1428
|
-
const
|
|
1429
|
-
if (!
|
|
1429
|
+
const closeoutProof = proveMilestoneCloseout(mid, { refreshFromDisk: true });
|
|
1430
|
+
if (!closeoutProof.ok) {
|
|
1430
1431
|
return {
|
|
1431
1432
|
action: "stop",
|
|
1432
|
-
reason:
|
|
1433
|
+
reason: formatCloseoutProofBlock(closeoutProof),
|
|
1433
1434
|
level: "warning",
|
|
1434
1435
|
};
|
|
1435
1436
|
}
|
|
@@ -90,6 +90,14 @@ export function getToolBaselineSnapshot(pi) {
|
|
|
90
90
|
return live;
|
|
91
91
|
return [...new Set([...baseline, ...live])];
|
|
92
92
|
}
|
|
93
|
+
export function getRegisteredToolSnapshot(pi) {
|
|
94
|
+
if (typeof pi.getAllTools !== "function")
|
|
95
|
+
return getToolBaselineSnapshot(pi);
|
|
96
|
+
const names = pi.getAllTools()
|
|
97
|
+
.map((tool) => tool.name)
|
|
98
|
+
.filter((name) => typeof name === "string" && name.length > 0);
|
|
99
|
+
return [...new Set(names)];
|
|
100
|
+
}
|
|
93
101
|
/**
|
|
94
102
|
* Models eligible for the pre-dispatch policy gate. Prefer registry-available
|
|
95
103
|
* models; when that list is empty (common after worktree resume before registry
|
|
@@ -28,7 +28,8 @@ import { regenerateIfMissing } from "./workflow-projections.js";
|
|
|
28
28
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
29
29
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
30
30
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
31
|
-
import { isDbAvailable,
|
|
31
|
+
import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
32
|
+
import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
32
33
|
import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
33
34
|
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
34
35
|
import { consumeSignal } from "./session-status-io.js";
|
|
@@ -1052,9 +1053,9 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
1052
1053
|
if (!opts?.skipSettleDelay) {
|
|
1053
1054
|
await new Promise(r => setTimeout(r, 100));
|
|
1054
1055
|
}
|
|
1055
|
-
const dbPath =
|
|
1056
|
+
const dbPath = getWorkflowDatabasePath();
|
|
1056
1057
|
if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
|
|
1057
|
-
const refreshed =
|
|
1058
|
+
const refreshed = refreshWorkflowDatabaseFromDisk();
|
|
1058
1059
|
if (!refreshed) {
|
|
1059
1060
|
logWarning("db", "post-unit database refresh failed; derived state may be stale");
|
|
1060
1061
|
}
|
|
@@ -21,7 +21,9 @@ import { getPendingGatesForTurn } from "./gsd-db.js";
|
|
|
21
21
|
import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
|
|
22
22
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
23
23
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
24
|
-
import { composeContextModeInstructions, composeInlinedContext, composeUnitContext } from "./unit-context-composer.js";
|
|
24
|
+
import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeUnitContext, } from "./unit-context-composer.js";
|
|
25
|
+
import { resolveManifest } from "./unit-context-manifest.js";
|
|
26
|
+
import { compileUnitContextContract } from "./tool-contract.js";
|
|
25
27
|
import { readCompactionSnapshot } from "./compaction-snapshot.js";
|
|
26
28
|
import { logWarning } from "./workflow-logger.js";
|
|
27
29
|
import { inlineGraphSubgraph } from "./graph-context.js";
|
|
@@ -32,6 +34,7 @@ import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-acti
|
|
|
32
34
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
33
35
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
34
36
|
import { resolveEffectiveUatType, shouldDispatchUatForContent } from "./uat-policy.js";
|
|
37
|
+
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
35
38
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
36
39
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
37
40
|
/**
|
|
@@ -228,6 +231,29 @@ function prependContextModeToBlock(unitType, base, block, renderMode = "standalo
|
|
|
228
231
|
return contextMode;
|
|
229
232
|
return `${contextMode}\n\n${block}`;
|
|
230
233
|
}
|
|
234
|
+
function requireUnitPromptContextContract(unitType) {
|
|
235
|
+
const result = compileUnitContextContract(unitType);
|
|
236
|
+
if (result.ok)
|
|
237
|
+
return result.contract;
|
|
238
|
+
throw new Error(result.detail);
|
|
239
|
+
}
|
|
240
|
+
function requireComposedArtifactBlock(blocks, unitType, key) {
|
|
241
|
+
const block = blocks.find((item) => item.key === key);
|
|
242
|
+
if (!block) {
|
|
243
|
+
throw new Error(`Unit Context Contract for ${unitType} did not compose required artifact ${key}`);
|
|
244
|
+
}
|
|
245
|
+
return block.body;
|
|
246
|
+
}
|
|
247
|
+
function renderExecuteTaskOnDemandContext(base, mid, sid, artifacts) {
|
|
248
|
+
if (!artifacts.includes("slice-research"))
|
|
249
|
+
return "";
|
|
250
|
+
const researchPath = relSliceFile(base, mid, sid, "RESEARCH");
|
|
251
|
+
return [
|
|
252
|
+
"## On-demand Context",
|
|
253
|
+
"",
|
|
254
|
+
`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.`,
|
|
255
|
+
].join("\n");
|
|
256
|
+
}
|
|
231
257
|
// ─── Executor Constraints ─────────────────────────────────────────────────────
|
|
232
258
|
/**
|
|
233
259
|
* Format executor context constraints for injection into the plan-slice prompt.
|
|
@@ -1451,6 +1477,75 @@ export async function buildDiscussRequirementsPrompt(base, structuredQuestionsAv
|
|
|
1451
1477
|
commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
|
|
1452
1478
|
}));
|
|
1453
1479
|
}
|
|
1480
|
+
/**
|
|
1481
|
+
* Bounded codebase snapshot for research-milestone grounding (ADR-029).
|
|
1482
|
+
*
|
|
1483
|
+
* Reuses the in-process, ~millisecond `analyzeCodebase` / `formatCodebaseBrief`
|
|
1484
|
+
* machinery that powers the guided-discuss Preparation Snapshot, so research
|
|
1485
|
+
* grounds on current code reality instead of running an open-ended `rg`/`find`/
|
|
1486
|
+
* `scout` survey on every dispatch (the auto-mode counterpart to ADR-028).
|
|
1487
|
+
*
|
|
1488
|
+
* Gated on the manifest's `codebaseMap` flag (previously a dead policy flag)
|
|
1489
|
+
* and the `discuss_preparation` opt-out. Failures degrade silently — research
|
|
1490
|
+
* still runs, it just falls back to on-demand reads.
|
|
1491
|
+
*/
|
|
1492
|
+
async function buildResearchCodebaseSnapshot(base) {
|
|
1493
|
+
const manifest = resolveManifest("research-milestone");
|
|
1494
|
+
if (!manifest?.codebaseMap)
|
|
1495
|
+
return null;
|
|
1496
|
+
const prefs = loadEffectiveGSDPreferences(base)?.preferences;
|
|
1497
|
+
if (prefs?.discuss_preparation === false)
|
|
1498
|
+
return null;
|
|
1499
|
+
try {
|
|
1500
|
+
const { analyzeCodebase, formatCodebaseBrief } = await import("./preparation.js");
|
|
1501
|
+
const brief = await analyzeCodebase(base);
|
|
1502
|
+
const formatted = formatCodebaseBrief(brief).trim();
|
|
1503
|
+
if (!formatted)
|
|
1504
|
+
return null;
|
|
1505
|
+
return [
|
|
1506
|
+
"### Codebase Snapshot (current code reality)",
|
|
1507
|
+
"Source: in-process bounded scan of the working tree.",
|
|
1508
|
+
"",
|
|
1509
|
+
"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.",
|
|
1510
|
+
"",
|
|
1511
|
+
formatted,
|
|
1512
|
+
].join("\n");
|
|
1513
|
+
}
|
|
1514
|
+
catch (err) {
|
|
1515
|
+
logWarning("prompt", `buildResearchCodebaseSnapshot failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1516
|
+
return null;
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
/**
|
|
1520
|
+
* Lightweight research resume block (ADR-029).
|
|
1521
|
+
*
|
|
1522
|
+
* When a prior attempt for this milestone left durable output — a partial
|
|
1523
|
+
* RESEARCH artifact and/or a research phase anchor — inline it under a
|
|
1524
|
+
* "continue, do not redo" banner so a re-dispatched research unit extends
|
|
1525
|
+
* prior work instead of re-running every command from scratch (the
|
|
1526
|
+
* restart-from-scratch pattern observed in the 789 run trace). No new state
|
|
1527
|
+
* machine: the partial RESEARCH file and the existing phase anchor are the
|
|
1528
|
+
* durable signals. Returns null when there is nothing to resume.
|
|
1529
|
+
*/
|
|
1530
|
+
async function buildResearchResumeBlock(base, mid) {
|
|
1531
|
+
const researchPath = resolveMilestoneFile(base, mid, "RESEARCH");
|
|
1532
|
+
const researchRel = relMilestoneFile(base, mid, "RESEARCH");
|
|
1533
|
+
const partial = await inlineFileOptional(researchPath, researchRel, "Prior Partial Research");
|
|
1534
|
+
const anchor = readPhaseAnchor(base, mid, "research-milestone");
|
|
1535
|
+
if (!partial && !anchor)
|
|
1536
|
+
return null;
|
|
1537
|
+
const lines = [
|
|
1538
|
+
"### Resume — Prior Partial Research (continue, do not redo)",
|
|
1539
|
+
"",
|
|
1540
|
+
"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.",
|
|
1541
|
+
"",
|
|
1542
|
+
];
|
|
1543
|
+
if (anchor)
|
|
1544
|
+
lines.push(formatAnchorForPrompt(anchor), "");
|
|
1545
|
+
if (partial)
|
|
1546
|
+
lines.push(partial);
|
|
1547
|
+
return lines.join("\n").trimEnd();
|
|
1548
|
+
}
|
|
1454
1549
|
export async function buildResearchMilestonePrompt(mid, midTitle, base) {
|
|
1455
1550
|
const contextTelemetry = [];
|
|
1456
1551
|
// Keep research milestone prompts focused on the milestone brief and
|
|
@@ -1490,6 +1585,32 @@ export async function buildResearchMilestonePrompt(mid, midTitle, base) {
|
|
|
1490
1585
|
const parts = [];
|
|
1491
1586
|
if (composed.prepend)
|
|
1492
1587
|
parts.push(composed.prepend);
|
|
1588
|
+
// Resume grounding (ADR-029): if a prior attempt left partial research or a
|
|
1589
|
+
// phase anchor, inline it prominently so a re-dispatched unit continues
|
|
1590
|
+
// rather than re-running every command from scratch.
|
|
1591
|
+
const resumeBlock = await buildResearchResumeBlock(base, mid);
|
|
1592
|
+
if (resumeBlock) {
|
|
1593
|
+
parts.push(resumeBlock);
|
|
1594
|
+
trackPromptContext(contextTelemetry, "research-resume", "inline", resumeBlock);
|
|
1595
|
+
}
|
|
1596
|
+
else {
|
|
1597
|
+
trackPromptContext(contextTelemetry, "research-resume", "skipped", null, "no prior partial research");
|
|
1598
|
+
}
|
|
1599
|
+
// Project-size signal (ADR-029): same classification plan-milestone gets, so
|
|
1600
|
+
// research right-sizes effort on tiny projects instead of over-researching.
|
|
1601
|
+
const classificationBlock = formatProjectClassificationForPlanning(classifyProject(base));
|
|
1602
|
+
parts.push(classificationBlock);
|
|
1603
|
+
trackPromptContext(contextTelemetry, "project-classification", "inline", classificationBlock);
|
|
1604
|
+
// Codebase snapshot (ADR-029): bounded, in-process code-reality grounding so
|
|
1605
|
+
// research does not open-endedly survey the tree (auto-mode ADR-028).
|
|
1606
|
+
const codebaseSnapshot = await buildResearchCodebaseSnapshot(base);
|
|
1607
|
+
if (codebaseSnapshot) {
|
|
1608
|
+
parts.push(codebaseSnapshot);
|
|
1609
|
+
trackPromptContext(contextTelemetry, "codebase-snapshot", "inline", codebaseSnapshot);
|
|
1610
|
+
}
|
|
1611
|
+
else {
|
|
1612
|
+
trackPromptContext(contextTelemetry, "codebase-snapshot", "skipped", null, "disabled, empty, or scan failed");
|
|
1613
|
+
}
|
|
1493
1614
|
if (knowledgeInlineRM && composed.inline) {
|
|
1494
1615
|
const idx = composed.inline.lastIndexOf("### Output Template:");
|
|
1495
1616
|
if (idx > 0) {
|
|
@@ -1649,6 +1770,13 @@ export async function buildPlanMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1649
1770
|
else {
|
|
1650
1771
|
trackPromptContext(contextTelemetry, "knowledge", "skipped", null, "missing");
|
|
1651
1772
|
}
|
|
1773
|
+
const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
|
|
1774
|
+
if (webAppUatGuidance) {
|
|
1775
|
+
pushTracked("web-app-uat", webAppUatGuidance);
|
|
1776
|
+
}
|
|
1777
|
+
else {
|
|
1778
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, "not a web app");
|
|
1779
|
+
}
|
|
1652
1780
|
pushTracked("templates", inlineTemplate("roadmap", "Roadmap"));
|
|
1653
1781
|
if (inlineLevel === "full") {
|
|
1654
1782
|
pushTracked("templates", inlineTemplate("decisions", "Decisions"));
|
|
@@ -1936,6 +2064,14 @@ async function renderSlicePrompt(options) {
|
|
|
1936
2064
|
else {
|
|
1937
2065
|
trackPromptContext(contextTelemetry, "graph-subgraph", "skipped", null, "missing");
|
|
1938
2066
|
}
|
|
2067
|
+
const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
|
|
2068
|
+
if (webAppUatGuidance) {
|
|
2069
|
+
inlined.push(webAppUatGuidance);
|
|
2070
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "inline", webAppUatGuidance);
|
|
2071
|
+
}
|
|
2072
|
+
else {
|
|
2073
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, "not a web app");
|
|
2074
|
+
}
|
|
1939
2075
|
const planTemplateInline = level === "minimal" ? inlineCompactTemplate("plan", "Slice Plan") : inlineTemplate("plan", "Slice Plan");
|
|
1940
2076
|
inlined.push(planTemplateInline);
|
|
1941
2077
|
trackPromptContext(contextTelemetry, "templates", "inline", planTemplateInline);
|
|
@@ -2077,7 +2213,7 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2077
2213
|
const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
|
|
2078
2214
|
const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
|
|
2079
2215
|
const taskPlanRelPath = relSlicePath(base, mid, sid) + `/tasks/${tid}-PLAN.md`;
|
|
2080
|
-
const
|
|
2216
|
+
const taskPlanContext = taskPlanContent
|
|
2081
2217
|
? [
|
|
2082
2218
|
"## Inlined Task Plan (authoritative local execution contract)",
|
|
2083
2219
|
`Source: \`${taskPlanRelPath}\``,
|
|
@@ -2088,11 +2224,11 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2088
2224
|
"## Inlined Task Plan (authoritative local execution contract)",
|
|
2089
2225
|
`Task plan not found at dispatch time. Read \`${taskPlanRelPath}\` before executing.`,
|
|
2090
2226
|
].join("\n");
|
|
2091
|
-
trackPromptContext(contextTelemetry, "task-plan", taskPlanContent ? "inline" : "on-demand",
|
|
2227
|
+
trackPromptContext(contextTelemetry, "task-plan", taskPlanContent ? "inline" : "on-demand", taskPlanContext, taskPlanContent ? undefined : "missing at dispatch");
|
|
2092
2228
|
const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
|
|
2093
2229
|
const slicePlanContent = slicePlanPath ? await loadFile(slicePlanPath) : null;
|
|
2094
|
-
const
|
|
2095
|
-
trackPromptContext(contextTelemetry, "slice-plan",
|
|
2230
|
+
const slicePlanContext = extractSliceExecutionExcerpt(slicePlanContent, relSliceFile(base, mid, sid, "PLAN"));
|
|
2231
|
+
trackPromptContext(contextTelemetry, "slice-plan", slicePlanContext ? "excerpt" : "skipped", slicePlanContext, slicePlanContext ? undefined : "missing");
|
|
2096
2232
|
// Check for continue file (new naming or legacy)
|
|
2097
2233
|
const continueFile = resolveSliceFile(base, mid, sid, "CONTINUE");
|
|
2098
2234
|
const legacyContinueDir = resolveSlicePath(base, mid, sid);
|
|
@@ -2191,6 +2327,30 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2191
2327
|
trackPromptContext(contextTelemetry, "decisions-template", "on-demand", decisionsOnDemandET);
|
|
2192
2328
|
}
|
|
2193
2329
|
trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates, inlineLevel);
|
|
2330
|
+
const contextContract = requireUnitPromptContextContract("execute-task");
|
|
2331
|
+
const contractedContext = await composeContractedUnitContext(contextContract, {
|
|
2332
|
+
base: { unitType: "execute-task", basePath: base, milestoneId: mid, sliceId: sid, taskId: tid },
|
|
2333
|
+
resolveArtifact: async (key) => {
|
|
2334
|
+
switch (key) {
|
|
2335
|
+
case "task-plan":
|
|
2336
|
+
return taskPlanContext;
|
|
2337
|
+
case "slice-plan":
|
|
2338
|
+
return slicePlanContext;
|
|
2339
|
+
case "prior-task-summaries":
|
|
2340
|
+
return finalCarryForward;
|
|
2341
|
+
case "templates":
|
|
2342
|
+
return inlinedTemplates;
|
|
2343
|
+
default:
|
|
2344
|
+
return null;
|
|
2345
|
+
}
|
|
2346
|
+
},
|
|
2347
|
+
});
|
|
2348
|
+
const taskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
|
|
2349
|
+
const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
|
|
2350
|
+
const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
|
|
2351
|
+
const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
|
|
2352
|
+
const onDemandContext = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
|
|
2353
|
+
trackPromptContext(contextTelemetry, "slice-research", onDemandContext ? "on-demand" : "skipped", onDemandContext, onDemandContext ? undefined : "not declared by contract");
|
|
2194
2354
|
const prompt = loadPrompt("execute-task", {
|
|
2195
2355
|
overridesSection,
|
|
2196
2356
|
runtimeContext,
|
|
@@ -2202,11 +2362,12 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2202
2362
|
taskPlanPath: taskPlanRelPath,
|
|
2203
2363
|
taskPlanInline,
|
|
2204
2364
|
slicePlanExcerpt,
|
|
2205
|
-
carryForwardSection:
|
|
2365
|
+
carryForwardSection: contractedCarryForward,
|
|
2206
2366
|
resumeSection,
|
|
2207
2367
|
priorTaskLines: priorLines,
|
|
2368
|
+
onDemandContext,
|
|
2208
2369
|
taskSummaryPath,
|
|
2209
|
-
inlinedTemplates,
|
|
2370
|
+
inlinedTemplates: contractedTemplates,
|
|
2210
2371
|
verificationBudget,
|
|
2211
2372
|
gatesToClose,
|
|
2212
2373
|
skillActivation: buildSkillActivationBlock({
|
|
@@ -2217,7 +2378,7 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2217
2378
|
taskId: tid,
|
|
2218
2379
|
taskTitle: tTitle,
|
|
2219
2380
|
taskPlanContent,
|
|
2220
|
-
extraContext: [taskPlanInline, slicePlanExcerpt,
|
|
2381
|
+
extraContext: [taskPlanInline, slicePlanExcerpt, contractedCarryForward, resumeSection],
|
|
2221
2382
|
unitType: "execute-task",
|
|
2222
2383
|
}),
|
|
2223
2384
|
});
|
|
@@ -2328,6 +2489,14 @@ export async function buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, base,
|
|
|
2328
2489
|
body = `${body}\n\n---\n\n${knowledgeInlineCS}`;
|
|
2329
2490
|
}
|
|
2330
2491
|
}
|
|
2492
|
+
const webAppUatGuidance = buildWebAppUatGuidanceBlock(base);
|
|
2493
|
+
if (webAppUatGuidance && body) {
|
|
2494
|
+
body = `${webAppUatGuidance}\n\n---\n\n${body}`;
|
|
2495
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "inline", webAppUatGuidance);
|
|
2496
|
+
}
|
|
2497
|
+
else {
|
|
2498
|
+
trackPromptContext(contextTelemetry, "web-app-uat", "skipped", null, webAppUatGuidance ? "missing composed body" : "not a web app");
|
|
2499
|
+
}
|
|
2331
2500
|
// Overrides section prepends to the top of the inlined context —
|
|
2332
2501
|
// standard pattern for slice-level builders (until composer v2 lands
|
|
2333
2502
|
// the prepend contract).
|
|
@@ -3190,6 +3359,17 @@ opts) {
|
|
|
3190
3359
|
// gate-registry.ts so that prompt builders, dispatch rules, state
|
|
3191
3360
|
// derivation, and tool handlers all consult the same source of truth.
|
|
3192
3361
|
// See gate-registry.ts for the full ownership map.
|
|
3362
|
+
/**
|
|
3363
|
+
* Adapt gate-registry guidance for section-close phases.
|
|
3364
|
+
*
|
|
3365
|
+
* Gate-registry text is shared with the gate-evaluate subagent, where
|
|
3366
|
+
* "Return verdict ..." is literal. Section-close units write artifact sections
|
|
3367
|
+
* instead, so translate that wording at render time without mutating the
|
|
3368
|
+
* canonical guidance.
|
|
3369
|
+
*/
|
|
3370
|
+
function sectionModeGuidance(guidance) {
|
|
3371
|
+
return guidance.replace(/Return verdict '([^']+)'/g, (_match, verdict) => verdict === "omitted" ? "Leave the section empty" : `Record a \`${verdict}\``);
|
|
3372
|
+
}
|
|
3193
3373
|
/**
|
|
3194
3374
|
* Render a "Gates to Close" block for turns like `complete-slice` and
|
|
3195
3375
|
* `validate-milestone` that own gates which are closed as a side-effect
|
|
@@ -3208,12 +3388,14 @@ function renderGatesToCloseBlock(gates, opts) {
|
|
|
3208
3388
|
lines.push("");
|
|
3209
3389
|
lines.push("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.");
|
|
3210
3390
|
lines.push("");
|
|
3391
|
+
lines.push("**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.");
|
|
3392
|
+
lines.push("");
|
|
3211
3393
|
for (const def of applicable) {
|
|
3212
3394
|
lines.push(`### ${def.id} — ${def.promptSection}`);
|
|
3213
3395
|
lines.push("");
|
|
3214
3396
|
lines.push(`**Question:** ${def.question}`);
|
|
3215
3397
|
lines.push("");
|
|
3216
|
-
lines.push(def.guidance);
|
|
3398
|
+
lines.push(sectionModeGuidance(def.guidance));
|
|
3217
3399
|
if (opts.allowOmit) {
|
|
3218
3400
|
lines.push("");
|
|
3219
3401
|
lines.push(`If this gate genuinely does not apply to this unit, leave the **${def.promptSection}** section empty and the handler will record it as \`omitted\`. Otherwise, fill the section with concrete evidence.`);
|