@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
|
@@ -107,7 +107,7 @@ import {
|
|
|
107
107
|
} from "./auto-tool-tracking.js";
|
|
108
108
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
109
109
|
import { recoverTimedOutUnit } from "./auto-timeout-recovery.js";
|
|
110
|
-
import { selectAndApplyModel, resolveModelId, clearToolBaseline
|
|
110
|
+
import { selectAndApplyModel, resolveModelId, clearToolBaseline } from "./auto-model-selection.js";
|
|
111
111
|
import { resetRoutingHistory, recordOutcome } from "./routing-history.js";
|
|
112
112
|
import {
|
|
113
113
|
checkPostUnitHooks,
|
|
@@ -185,6 +185,7 @@ import {
|
|
|
185
185
|
} from "./auto-worktree.js";
|
|
186
186
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
187
187
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
188
|
+
import { createMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
|
|
188
189
|
|
|
189
190
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
190
191
|
import {
|
|
@@ -225,8 +226,8 @@ import {
|
|
|
225
226
|
getMilestoneSlices,
|
|
226
227
|
getSlice,
|
|
227
228
|
getTask,
|
|
228
|
-
refreshOpenDatabaseFromDisk,
|
|
229
229
|
} from "./gsd-db.js";
|
|
230
|
+
import { closeWorkflowDatabase } from "./db-workspace.js";
|
|
230
231
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
231
232
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
232
233
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -270,18 +271,11 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
|
270
271
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
271
272
|
import { validateDirectory } from "./validate-directory.js";
|
|
272
273
|
import { createAutoOrchestrator } from "./auto/orchestrator.js";
|
|
273
|
-
import type { AutoAdvanceResult, AutoOrchestrationModule
|
|
274
|
-
import { reconcileBeforeDispatch } from "./state-reconciliation.js";
|
|
275
|
-
import { compileUnitToolContract } from "./tool-contract.js";
|
|
276
|
-
import { createWorktreeSafetyModule } from "./worktree-safety.js";
|
|
274
|
+
import type { AutoAdvanceResult, AutoOrchestrationModule } from "./auto/contracts.js";
|
|
277
275
|
import {
|
|
278
276
|
repairAutoWorktreeSafetyFailure,
|
|
279
277
|
resolvePausedAutoWorktreePath,
|
|
280
278
|
} from "./auto-worktree-repair.js";
|
|
281
|
-
import { resolveManifest } from "./unit-context-manifest.js";
|
|
282
|
-
import { classifyFailure } from "./recovery-classification.js";
|
|
283
|
-
import { supportsStructuredQuestions } from "./workflow-mcp.js";
|
|
284
|
-
import type { MinimalModelRegistry } from "./context-budget.js";
|
|
285
279
|
// Slice-level parallelism (#2340)
|
|
286
280
|
import { getEligibleSlices } from "./slice-parallel-eligibility.js";
|
|
287
281
|
import { startSliceParallel } from "./slice-parallel-orchestrator.js";
|
|
@@ -317,7 +311,6 @@ import type {
|
|
|
317
311
|
UnitRouting,
|
|
318
312
|
StartModel,
|
|
319
313
|
AutoSession,
|
|
320
|
-
PendingOrchestrationDispatch,
|
|
321
314
|
} from "./auto/session.js";
|
|
322
315
|
export {
|
|
323
316
|
STUB_RECOVERY_THRESHOLD,
|
|
@@ -328,7 +321,7 @@ export type {
|
|
|
328
321
|
UnitRouting,
|
|
329
322
|
StartModel,
|
|
330
323
|
} from "./auto/session.js";
|
|
331
|
-
import { autoSession as s } from "./auto-runtime-state.js";
|
|
324
|
+
import { autoSession as s, getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
|
|
332
325
|
import { gsdHome } from "./gsd-home.js";
|
|
333
326
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
334
327
|
import {
|
|
@@ -639,6 +632,26 @@ export function shouldUseWorktreeIsolation(basePath?: string): boolean {
|
|
|
639
632
|
return getIsolationMode(basePath) === "worktree";
|
|
640
633
|
}
|
|
641
634
|
|
|
635
|
+
type AutoIsolationMode = ReturnType<typeof getIsolationMode>;
|
|
636
|
+
|
|
637
|
+
function resolveEffectiveUnitIsolationMode(
|
|
638
|
+
configuredMode: AutoIsolationMode,
|
|
639
|
+
isolationDegraded: boolean,
|
|
640
|
+
): AutoIsolationMode {
|
|
641
|
+
return configuredMode === "worktree" && isolationDegraded ? "branch" : configuredMode;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
export function _resolveEffectiveUnitIsolationModeForTest(
|
|
645
|
+
configuredMode: AutoIsolationMode,
|
|
646
|
+
isolationDegraded: boolean,
|
|
647
|
+
): AutoIsolationMode {
|
|
648
|
+
return resolveEffectiveUnitIsolationMode(configuredMode, isolationDegraded);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
function getEffectiveUnitIsolationMode(basePath: string): AutoIsolationMode {
|
|
652
|
+
return resolveEffectiveUnitIsolationMode(getIsolationMode(basePath), s.isolationDegraded);
|
|
653
|
+
}
|
|
654
|
+
|
|
642
655
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
643
656
|
|
|
644
657
|
/** Pending verification retry — set when gate fails with retries remaining, consumed by autoLoop */
|
|
@@ -779,6 +792,7 @@ export { type AutoDashboardData } from "./auto-dashboard.js";
|
|
|
779
792
|
|
|
780
793
|
export function getAutoDashboardData(): AutoDashboardData {
|
|
781
794
|
const ledger = getLedger();
|
|
795
|
+
const runtimeSnapshot = getAutoRuntimeSnapshot();
|
|
782
796
|
const totals = ledger ? getProjectTotals(ledger.units) : null;
|
|
783
797
|
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
|
|
784
798
|
const rtkSavings = sessionId && s.basePath
|
|
@@ -810,6 +824,7 @@ export function getAutoDashboardData(): AutoDashboardData {
|
|
|
810
824
|
pendingCaptureCount,
|
|
811
825
|
rtkSavings,
|
|
812
826
|
rtkEnabled,
|
|
827
|
+
toolSurface: runtimeSnapshot.toolSurface,
|
|
813
828
|
};
|
|
814
829
|
}
|
|
815
830
|
|
|
@@ -1126,6 +1141,48 @@ function setLifecycleOutcome(
|
|
|
1126
1141
|
});
|
|
1127
1142
|
}
|
|
1128
1143
|
|
|
1144
|
+
const TERMINAL_CLOSEOUT_COMMANDS = [
|
|
1145
|
+
"/gsd status for overview",
|
|
1146
|
+
"/gsd visualize to inspect",
|
|
1147
|
+
"/gsd notifications for history",
|
|
1148
|
+
"/gsd start for new work",
|
|
1149
|
+
];
|
|
1150
|
+
|
|
1151
|
+
function setTerminalCloseoutOutcome(
|
|
1152
|
+
ctx: ExtensionContext | undefined,
|
|
1153
|
+
input: {
|
|
1154
|
+
milestoneId?: string | null;
|
|
1155
|
+
milestoneTitle?: string | null;
|
|
1156
|
+
allMilestonesComplete?: boolean;
|
|
1157
|
+
reason?: string;
|
|
1158
|
+
},
|
|
1159
|
+
): void {
|
|
1160
|
+
if (!ctx?.hasUI) return;
|
|
1161
|
+
const milestoneLabel = input.milestoneId ? `Milestone ${input.milestoneId}` : "Milestone";
|
|
1162
|
+
const title = input.allMilestonesComplete ? "All milestones complete" : `${milestoneLabel} complete`;
|
|
1163
|
+
const titleLine = input.milestoneTitle && input.milestoneId
|
|
1164
|
+
? `${input.milestoneTitle}. `
|
|
1165
|
+
: "";
|
|
1166
|
+
const nextAction = input.allMilestonesComplete
|
|
1167
|
+
? "Review the closeout, then start new work when ready."
|
|
1168
|
+
: "Review the closeout, then start the next milestone when ready.";
|
|
1169
|
+
|
|
1170
|
+
ctx.ui.setHeader?.(() => ({
|
|
1171
|
+
render(): string[] { return []; },
|
|
1172
|
+
invalidate(): void {},
|
|
1173
|
+
}));
|
|
1174
|
+
ctx.ui.setStatus?.("gsd-step", undefined);
|
|
1175
|
+
ctx.ui.setWidget?.("gsd-progress", undefined);
|
|
1176
|
+
setLifecycleOutcome(ctx, {
|
|
1177
|
+
status: "complete",
|
|
1178
|
+
title,
|
|
1179
|
+
detail: `${titleLine}${input.reason ?? "Milestone closeout finished."}`,
|
|
1180
|
+
nextAction,
|
|
1181
|
+
commands: TERMINAL_CLOSEOUT_COMMANDS,
|
|
1182
|
+
unitLabel: input.milestoneId ? `complete-milestone ${input.milestoneId}` : null,
|
|
1183
|
+
});
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1129
1186
|
function handleLostSessionLock(
|
|
1130
1187
|
ctx?: ExtensionContext,
|
|
1131
1188
|
lockStatus?: SessionLockStatus,
|
|
@@ -1271,7 +1328,6 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
|
|
|
1271
1328
|
if (!s.paused) {
|
|
1272
1329
|
if (preserveCompletionSurface) {
|
|
1273
1330
|
ctx.ui.setStatus("gsd-auto", undefined);
|
|
1274
|
-
s.completionStopInProgress = false;
|
|
1275
1331
|
if (preserveStepSurface) {
|
|
1276
1332
|
s.preserveStepSurfaceAfterLoopExit = false;
|
|
1277
1333
|
}
|
|
@@ -1414,6 +1470,7 @@ export async function stopAuto(
|
|
|
1414
1470
|
options.preserveCloseoutTranscript ?? completionStopRequested
|
|
1415
1471
|
);
|
|
1416
1472
|
const installCompletionWidget = completionStopRequested && !preserveCloseoutTranscript;
|
|
1473
|
+
const installTerminalCloseoutOutcome = completionStopRequested && preserveCloseoutTranscript;
|
|
1417
1474
|
const preserveCompletionSurface = completionStopRequested || preserveCloseoutTranscript;
|
|
1418
1475
|
s.completionStopInProgress = preserveCompletionSurface;
|
|
1419
1476
|
playNotificationBell("stop", loadedPreferences?.notifications);
|
|
@@ -1422,12 +1479,17 @@ export async function stopAuto(
|
|
|
1422
1479
|
// worktree was active, and whether the current milestone was merged before
|
|
1423
1480
|
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
1424
1481
|
try {
|
|
1425
|
-
const {
|
|
1482
|
+
const {
|
|
1483
|
+
autoExitReasonForTerminalOutcome,
|
|
1484
|
+
emitAutoExit,
|
|
1485
|
+
normalizeAutoExitReason,
|
|
1486
|
+
} = await import("./worktree-telemetry.js");
|
|
1426
1487
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
1427
1488
|
// aggregator buckets stably. Raw detail is preserved in the phases.ts
|
|
1428
1489
|
// notification and the notify'd error string.
|
|
1429
1490
|
const rawReason = reason ?? "stop";
|
|
1430
|
-
const normalizedReason =
|
|
1491
|
+
const normalizedReason = autoExitReasonForTerminalOutcome(options.terminalOutcome)
|
|
1492
|
+
?? normalizeAutoExitReason(rawReason);
|
|
1431
1493
|
const telemetryBase = s.originalBasePath || s.basePath;
|
|
1432
1494
|
emitAutoExit(telemetryBase, {
|
|
1433
1495
|
reason: normalizedReason,
|
|
@@ -1620,8 +1682,7 @@ export async function stopAuto(
|
|
|
1620
1682
|
// ── Step 6: DB cleanup ──
|
|
1621
1683
|
if (isDbAvailable()) {
|
|
1622
1684
|
try {
|
|
1623
|
-
|
|
1624
|
-
closeDatabase();
|
|
1685
|
+
closeWorkflowDatabase();
|
|
1625
1686
|
} catch (e) {
|
|
1626
1687
|
debugLog("db-close-failed", {
|
|
1627
1688
|
error: e instanceof Error ? e.message : String(e),
|
|
@@ -1747,6 +1808,15 @@ export async function stopAuto(
|
|
|
1747
1808
|
}
|
|
1748
1809
|
}
|
|
1749
1810
|
|
|
1811
|
+
if (installTerminalCloseoutOutcome && ctx && options.completionWidget) {
|
|
1812
|
+
setTerminalCloseoutOutcome(ctx, {
|
|
1813
|
+
milestoneId: completionMilestoneId,
|
|
1814
|
+
milestoneTitle: options.completionWidget.milestoneTitle ?? null,
|
|
1815
|
+
allMilestonesComplete: options.completionWidget.allMilestonesComplete,
|
|
1816
|
+
reason: reason ?? "Milestone closeout finished.",
|
|
1817
|
+
});
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1750
1820
|
// ── Step 9: Cmux sidebar / event log ──
|
|
1751
1821
|
try {
|
|
1752
1822
|
pi?.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "clear" as const, preferences: loadedPreferences });
|
|
@@ -2080,7 +2150,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2080
2150
|
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
2081
2151
|
//
|
|
2082
2152
|
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
2083
|
-
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
2153
|
+
// worktreeProjection, mergeMilestoneToMain transaction runner). Down from 18 at slice-7
|
|
2084
2154
|
// closure.
|
|
2085
2155
|
return {
|
|
2086
2156
|
gitServiceFactory: (basePath: string) => {
|
|
@@ -2089,7 +2159,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2089
2159
|
return new GitServiceImpl(basePath, gitConfig);
|
|
2090
2160
|
},
|
|
2091
2161
|
worktreeProjection: new WorktreeStateProjection(),
|
|
2092
|
-
mergeMilestoneToMain,
|
|
2162
|
+
mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
|
|
2093
2163
|
};
|
|
2094
2164
|
}
|
|
2095
2165
|
|
|
@@ -2097,494 +2167,6 @@ function buildLifecycle(): WorktreeLifecycle {
|
|
|
2097
2167
|
return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
|
|
2098
2168
|
}
|
|
2099
2169
|
|
|
2100
|
-
/**
|
|
2101
|
-
* Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
|
|
2102
|
-
*
|
|
2103
|
-
* Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
|
|
2104
|
-
* the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
|
|
2105
|
-
* `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
|
|
2106
|
-
*/
|
|
2107
|
-
export function createWiredDispatchAdapter(
|
|
2108
|
-
ctx: ExtensionContext,
|
|
2109
|
-
pi: ExtensionAPI,
|
|
2110
|
-
dispatchBasePath: string,
|
|
2111
|
-
session?: AutoSession,
|
|
2112
|
-
): DispatchAdapter {
|
|
2113
|
-
function getAlreadyClosedDispatchReason(unitType: string, unitId: string): string | null {
|
|
2114
|
-
if (!isDbAvailable()) return null;
|
|
2115
|
-
refreshOpenDatabaseFromDisk();
|
|
2116
|
-
const { milestone, slice, task } = parseUnitId(unitId);
|
|
2117
|
-
if (unitType === "execute-task" && milestone && slice && task) {
|
|
2118
|
-
const row = getTask(milestone, slice, task);
|
|
2119
|
-
return row && isClosedStatus(row.status)
|
|
2120
|
-
? `execute-task ${unitId} is already ${row.status}`
|
|
2121
|
-
: null;
|
|
2122
|
-
}
|
|
2123
|
-
if (unitType === "complete-slice" && milestone && slice) {
|
|
2124
|
-
const row = getSlice(milestone, slice);
|
|
2125
|
-
return row && isClosedStatus(row.status)
|
|
2126
|
-
? `complete-slice ${unitId} is already ${row.status}`
|
|
2127
|
-
: null;
|
|
2128
|
-
}
|
|
2129
|
-
return null;
|
|
2130
|
-
}
|
|
2131
|
-
|
|
2132
|
-
function shouldAdoptActiveMilestone(
|
|
2133
|
-
state: GSDState,
|
|
2134
|
-
activeSession: AutoSession | undefined,
|
|
2135
|
-
activeDispatchBasePath: string,
|
|
2136
|
-
): boolean {
|
|
2137
|
-
const activeMilestoneId = state.activeMilestone?.id;
|
|
2138
|
-
const currentMilestoneId = activeSession?.currentMilestoneId;
|
|
2139
|
-
if (!activeSession || !activeMilestoneId || !currentMilestoneId || activeMilestoneId === currentMilestoneId) {
|
|
2140
|
-
return false;
|
|
2141
|
-
}
|
|
2142
|
-
|
|
2143
|
-
const scopedWorktreeMilestone =
|
|
2144
|
-
(activeSession.basePath ? detectWorktreeName(activeSession.basePath) : null) ??
|
|
2145
|
-
detectWorktreeName(activeDispatchBasePath);
|
|
2146
|
-
if (scopedWorktreeMilestone && scopedWorktreeMilestone !== activeMilestoneId) {
|
|
2147
|
-
return false;
|
|
2148
|
-
}
|
|
2149
|
-
|
|
2150
|
-
const currentMilestone = state.registry.find((milestone) => milestone.id === currentMilestoneId);
|
|
2151
|
-
return !!currentMilestone && isClosedStatus(currentMilestone.status);
|
|
2152
|
-
}
|
|
2153
|
-
|
|
2154
|
-
return {
|
|
2155
|
-
async decideNextUnit(input) {
|
|
2156
|
-
const state = input.stateSnapshot;
|
|
2157
|
-
const active = state.activeMilestone;
|
|
2158
|
-
if (!active) return null;
|
|
2159
|
-
|
|
2160
|
-
const activeSession = input.session ?? session;
|
|
2161
|
-
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
2162
|
-
if (activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
2163
|
-
activeSession.currentMilestoneId = active.id;
|
|
2164
|
-
}
|
|
2165
|
-
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
2166
|
-
|
|
2167
|
-
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
2168
|
-
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
2169
|
-
// alternative wirings can inject deterministic snapshots; otherwise pull from
|
|
2170
|
-
// the captured pi/ctx references.
|
|
2171
|
-
const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
|
|
2172
|
-
const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
|
|
2173
|
-
const modelRegistry = input.modelRegistry ?? (ctx.modelRegistry as MinimalModelRegistry | undefined);
|
|
2174
|
-
const authMode =
|
|
2175
|
-
sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
|
|
2176
|
-
? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
|
|
2177
|
-
: undefined;
|
|
2178
|
-
// Use baseline snapshot — same reason as phases.ts:runDispatch: the live
|
|
2179
|
-
// active set may be narrowed by the prior unit before selectAndApplyModel
|
|
2180
|
-
// restores it, causing false transport-preflight failures (#477 follow-up).
|
|
2181
|
-
const activeTools = getToolBaselineSnapshot(pi);
|
|
2182
|
-
// Mirrors runDispatch: deep-planning keeps approval gates in plain chat
|
|
2183
|
-
// because structured questions can be cancelled outside the chat turn on
|
|
2184
|
-
// some transports.
|
|
2185
|
-
const structuredQuestionsAvailable =
|
|
2186
|
-
input.structuredQuestionsAvailable ??
|
|
2187
|
-
(prefs?.planning_depth === "deep"
|
|
2188
|
-
? "false"
|
|
2189
|
-
: supportsStructuredQuestions(activeTools, {
|
|
2190
|
-
authMode,
|
|
2191
|
-
baseUrl: ctx.model?.baseUrl,
|
|
2192
|
-
})
|
|
2193
|
-
? "true"
|
|
2194
|
-
: "false");
|
|
2195
|
-
|
|
2196
|
-
const pendingRetry = session?.pendingVerificationRetryDispatch;
|
|
2197
|
-
if (session && pendingRetry) {
|
|
2198
|
-
session.pendingVerificationRetryDispatch = null;
|
|
2199
|
-
const alreadyClosedReason = getAlreadyClosedDispatchReason(
|
|
2200
|
-
pendingRetry.unitType,
|
|
2201
|
-
pendingRetry.unitId,
|
|
2202
|
-
);
|
|
2203
|
-
if (alreadyClosedReason) {
|
|
2204
|
-
session.pendingOrchestrationDispatch = null;
|
|
2205
|
-
session.pendingVerificationRetry = null;
|
|
2206
|
-
return { kind: "skipped", reason: alreadyClosedReason };
|
|
2207
|
-
}
|
|
2208
|
-
session.pendingOrchestrationDispatch = pendingRetry;
|
|
2209
|
-
return {
|
|
2210
|
-
unitType: pendingRetry.unitType,
|
|
2211
|
-
unitId: pendingRetry.unitId,
|
|
2212
|
-
reason: "verification-retry",
|
|
2213
|
-
preconditions: [],
|
|
2214
|
-
};
|
|
2215
|
-
}
|
|
2216
|
-
|
|
2217
|
-
const action = await resolveDispatch({
|
|
2218
|
-
basePath: activeDispatchBasePath,
|
|
2219
|
-
mid: active.id,
|
|
2220
|
-
midTitle: active.title,
|
|
2221
|
-
state,
|
|
2222
|
-
prefs,
|
|
2223
|
-
session: activeSession,
|
|
2224
|
-
structuredQuestionsAvailable,
|
|
2225
|
-
sessionContextWindow,
|
|
2226
|
-
sessionProvider,
|
|
2227
|
-
modelRegistry,
|
|
2228
|
-
activeTools,
|
|
2229
|
-
sessionAuthMode: authMode,
|
|
2230
|
-
sessionBaseUrl: ctx.model?.baseUrl,
|
|
2231
|
-
});
|
|
2232
|
-
|
|
2233
|
-
if (action.action === "stop") {
|
|
2234
|
-
if (session) session.pendingOrchestrationDispatch = null;
|
|
2235
|
-
return {
|
|
2236
|
-
kind: "blocked",
|
|
2237
|
-
reason: action.reason,
|
|
2238
|
-
action: action.level === "warning" ? "pause" : "stop",
|
|
2239
|
-
};
|
|
2240
|
-
}
|
|
2241
|
-
if (action.action !== "dispatch") {
|
|
2242
|
-
if (session) session.pendingOrchestrationDispatch = null;
|
|
2243
|
-
return {
|
|
2244
|
-
kind: "skipped",
|
|
2245
|
-
reason: action.matchedRule ?? "dispatch-skip",
|
|
2246
|
-
};
|
|
2247
|
-
}
|
|
2248
|
-
const alreadyClosedReason = getAlreadyClosedDispatchReason(action.unitType, action.unitId);
|
|
2249
|
-
if (alreadyClosedReason) {
|
|
2250
|
-
if (session) {
|
|
2251
|
-
session.pendingOrchestrationDispatch = null;
|
|
2252
|
-
session.pendingVerificationRetry = null;
|
|
2253
|
-
}
|
|
2254
|
-
return { kind: "skipped", reason: alreadyClosedReason };
|
|
2255
|
-
}
|
|
2256
|
-
if (session) {
|
|
2257
|
-
const pending: PendingOrchestrationDispatch = {
|
|
2258
|
-
unitType: action.unitType,
|
|
2259
|
-
unitId: action.unitId,
|
|
2260
|
-
prompt: action.prompt,
|
|
2261
|
-
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
2262
|
-
state,
|
|
2263
|
-
mid: active.id,
|
|
2264
|
-
midTitle: active.title,
|
|
2265
|
-
};
|
|
2266
|
-
session.pendingOrchestrationDispatch = pending;
|
|
2267
|
-
}
|
|
2268
|
-
return {
|
|
2269
|
-
unitType: action.unitType,
|
|
2270
|
-
unitId: action.unitId,
|
|
2271
|
-
reason: action.matchedRule ?? "dispatch",
|
|
2272
|
-
preconditions: [],
|
|
2273
|
-
};
|
|
2274
|
-
},
|
|
2275
|
-
};
|
|
2276
|
-
}
|
|
2277
|
-
|
|
2278
|
-
function isUsableLiveOrchestratorBasePath(basePath: string): boolean {
|
|
2279
|
-
if (!basePath || !existsSync(basePath)) return false;
|
|
2280
|
-
if (!detectWorktreeName(basePath)) return true;
|
|
2281
|
-
|
|
2282
|
-
try {
|
|
2283
|
-
return readFileSync(join(basePath, ".git"), "utf8").trim().startsWith("gitdir: ");
|
|
2284
|
-
} catch {
|
|
2285
|
-
return false;
|
|
2286
|
-
}
|
|
2287
|
-
}
|
|
2288
|
-
|
|
2289
|
-
export function resolveLiveOrchestratorBasePath(input: {
|
|
2290
|
-
capturedBasePath: string;
|
|
2291
|
-
runtimeBasePath: string;
|
|
2292
|
-
sessionBasePath?: string | null;
|
|
2293
|
-
originalBasePath?: string | null;
|
|
2294
|
-
}): string {
|
|
2295
|
-
const primary = input.sessionBasePath || input.capturedBasePath;
|
|
2296
|
-
if (isUsableLiveOrchestratorBasePath(primary)) return primary;
|
|
2297
|
-
|
|
2298
|
-
const fallbacks = [
|
|
2299
|
-
input.originalBasePath,
|
|
2300
|
-
input.runtimeBasePath,
|
|
2301
|
-
resolveProjectRoot(input.capturedBasePath),
|
|
2302
|
-
];
|
|
2303
|
-
|
|
2304
|
-
for (const candidate of fallbacks) {
|
|
2305
|
-
if (candidate && isUsableLiveOrchestratorBasePath(candidate)) {
|
|
2306
|
-
return candidate;
|
|
2307
|
-
}
|
|
2308
|
-
}
|
|
2309
|
-
|
|
2310
|
-
return input.runtimeBasePath || input.capturedBasePath;
|
|
2311
|
-
}
|
|
2312
|
-
|
|
2313
|
-
/**
|
|
2314
|
-
* Thin entry glue for the new Auto Orchestration module.
|
|
2315
|
-
*
|
|
2316
|
-
* This intentionally wires only dispatch + error notification today, with
|
|
2317
|
-
* no behavior changes to the existing auto loop. It provides a concrete seam
|
|
2318
|
-
* the next refactor steps can adopt incrementally.
|
|
2319
|
-
*/
|
|
2320
|
-
export function createWiredAutoOrchestrationModule(
|
|
2321
|
-
ctx: ExtensionContext,
|
|
2322
|
-
pi: ExtensionAPI,
|
|
2323
|
-
dispatchBasePath: string,
|
|
2324
|
-
runtimeBasePath = resolveProjectRoot(dispatchBasePath),
|
|
2325
|
-
): AutoOrchestrationModule {
|
|
2326
|
-
const flowId = `auto-orchestrator-${Date.now()}`;
|
|
2327
|
-
let seq = 0;
|
|
2328
|
-
const getLiveDispatchBasePath = () =>
|
|
2329
|
-
resolveLiveOrchestratorBasePath({
|
|
2330
|
-
capturedBasePath: dispatchBasePath,
|
|
2331
|
-
runtimeBasePath,
|
|
2332
|
-
sessionBasePath: s.basePath,
|
|
2333
|
-
originalBasePath: s.originalBasePath,
|
|
2334
|
-
});
|
|
2335
|
-
|
|
2336
|
-
const deps: AutoOrchestratorDeps = {
|
|
2337
|
-
stateReconciliation: {
|
|
2338
|
-
async reconcileBeforeDispatch() {
|
|
2339
|
-
const activeBasePath = getLiveDispatchBasePath();
|
|
2340
|
-
const result = await reconcileBeforeDispatch(activeBasePath);
|
|
2341
|
-
// Failure-path summaries written by gsd_summary_save create
|
|
2342
|
-
// artifact-db-status-divergence blockers for tasks that are still
|
|
2343
|
-
// pending (gsd_task_complete never ran). These tasks can still be
|
|
2344
|
-
// dispatched and the drift self-heals once they complete successfully.
|
|
2345
|
-
const hardBlockers = result.blockers.filter(
|
|
2346
|
-
(b) =>
|
|
2347
|
-
!b.includes("has SUMMARY artifact while DB status is") &&
|
|
2348
|
-
!b.includes("has SUMMARY on disk while DB status is") &&
|
|
2349
|
-
!b.includes("has task SUMMARY artifacts but no DB tasks"),
|
|
2350
|
-
);
|
|
2351
|
-
if (hardBlockers.length > 0) {
|
|
2352
|
-
return {
|
|
2353
|
-
ok: false,
|
|
2354
|
-
reason: hardBlockers[0],
|
|
2355
|
-
stateSnapshot: result.stateSnapshot,
|
|
2356
|
-
};
|
|
2357
|
-
}
|
|
2358
|
-
const repairedKinds = result.repaired.map((d) => d.kind);
|
|
2359
|
-
return {
|
|
2360
|
-
ok: true,
|
|
2361
|
-
reason:
|
|
2362
|
-
repairedKinds.length > 0
|
|
2363
|
-
? `repaired: ${repairedKinds.join(", ")}`
|
|
2364
|
-
: "clean",
|
|
2365
|
-
stateSnapshot: result.stateSnapshot,
|
|
2366
|
-
};
|
|
2367
|
-
},
|
|
2368
|
-
},
|
|
2369
|
-
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath, s),
|
|
2370
|
-
recovery: {
|
|
2371
|
-
async classifyAndRecover(input) {
|
|
2372
|
-
const recovery = classifyFailure(input);
|
|
2373
|
-
return { action: recovery.action, reason: recovery.reason };
|
|
2374
|
-
},
|
|
2375
|
-
},
|
|
2376
|
-
toolContract: {
|
|
2377
|
-
async compileUnitToolContract(unitType) {
|
|
2378
|
-
const result = compileUnitToolContract(unitType);
|
|
2379
|
-
if (!result.ok) return { ok: false, reason: result.detail };
|
|
2380
|
-
return { ok: true, reason: result.contract.validationRules.join(", ") };
|
|
2381
|
-
},
|
|
2382
|
-
},
|
|
2383
|
-
worktree: {
|
|
2384
|
-
async prepareForUnit(unitType, unitId) {
|
|
2385
|
-
const manifest = resolveManifest(unitType);
|
|
2386
|
-
if (!manifest) {
|
|
2387
|
-
return {
|
|
2388
|
-
ok: false,
|
|
2389
|
-
reason: `No Unit manifest is registered for ${unitType}`,
|
|
2390
|
-
};
|
|
2391
|
-
}
|
|
2392
|
-
if (getIsolationMode(runtimeBasePath) !== "worktree") {
|
|
2393
|
-
return { ok: true, reason: "not-required" };
|
|
2394
|
-
}
|
|
2395
|
-
const writeScope =
|
|
2396
|
-
manifest.tools.mode === "all" || manifest.tools.mode === "docs"
|
|
2397
|
-
? "source-writing"
|
|
2398
|
-
: "planning-only";
|
|
2399
|
-
if (getIsolationMode(runtimeBasePath) !== "worktree") {
|
|
2400
|
-
return { ok: true, reason: "isolation-not-worktree" };
|
|
2401
|
-
}
|
|
2402
|
-
const safety = createWorktreeSafetyModule();
|
|
2403
|
-
const activeBasePath = getLiveDispatchBasePath();
|
|
2404
|
-
const snapshot = await deriveState(activeBasePath);
|
|
2405
|
-
const milestoneId = snapshot.activeMilestone?.id ?? null;
|
|
2406
|
-
const expectedBranch = milestoneId ? autoWorktreeBranch(milestoneId) : null;
|
|
2407
|
-
let result = safety.validateUnitRoot({
|
|
2408
|
-
unitType,
|
|
2409
|
-
unitId,
|
|
2410
|
-
writeScope,
|
|
2411
|
-
projectRoot: runtimeBasePath,
|
|
2412
|
-
unitRoot: activeBasePath,
|
|
2413
|
-
milestoneId,
|
|
2414
|
-
isolationMode: getIsolationMode(runtimeBasePath),
|
|
2415
|
-
expectedBranch,
|
|
2416
|
-
});
|
|
2417
|
-
if (!result.ok) {
|
|
2418
|
-
const repaired = await repairAutoWorktreeSafetyFailure({
|
|
2419
|
-
safetyResult: result,
|
|
2420
|
-
projectRoot: runtimeBasePath,
|
|
2421
|
-
activeRoot: activeBasePath,
|
|
2422
|
-
milestoneId,
|
|
2423
|
-
enterMilestone: async (id) => {
|
|
2424
|
-
buildLifecycle().adoptSessionRoot(runtimeBasePath, s.originalBasePath || runtimeBasePath);
|
|
2425
|
-
const enterResult = buildLifecycle().enterMilestone(id, {
|
|
2426
|
-
notify: ctx.ui.notify.bind(ctx.ui),
|
|
2427
|
-
});
|
|
2428
|
-
if (!enterResult.ok) return { ok: false, reason: enterResult.reason };
|
|
2429
|
-
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2430
|
-
return { ok: true };
|
|
2431
|
-
},
|
|
2432
|
-
revalidate: () => safety.validateUnitRoot({
|
|
2433
|
-
unitType,
|
|
2434
|
-
unitId,
|
|
2435
|
-
writeScope,
|
|
2436
|
-
projectRoot: runtimeBasePath,
|
|
2437
|
-
unitRoot: getLiveDispatchBasePath(),
|
|
2438
|
-
milestoneId,
|
|
2439
|
-
isolationMode: getIsolationMode(runtimeBasePath),
|
|
2440
|
-
expectedBranch,
|
|
2441
|
-
}),
|
|
2442
|
-
});
|
|
2443
|
-
result = repaired.result;
|
|
2444
|
-
if (result.ok) {
|
|
2445
|
-
return { ok: true, reason: repaired.repaired ? `repaired-${result.kind}` : result.kind };
|
|
2446
|
-
}
|
|
2447
|
-
const repairDetail = repaired.repairReason
|
|
2448
|
-
? ` (repair skipped: ${repaired.repairReason})`
|
|
2449
|
-
: "";
|
|
2450
|
-
return { ok: false, reason: `${result.kind}: ${result.reason}${repairDetail}` };
|
|
2451
|
-
}
|
|
2452
|
-
return { ok: true, reason: result.kind };
|
|
2453
|
-
},
|
|
2454
|
-
async syncAfterUnit() {},
|
|
2455
|
-
async cleanupOnStop() {},
|
|
2456
|
-
},
|
|
2457
|
-
health: {
|
|
2458
|
-
checkResourcesStale() {
|
|
2459
|
-
return checkResourcesStale(s.resourceVersionOnStart);
|
|
2460
|
-
},
|
|
2461
|
-
async preAdvanceGate() {
|
|
2462
|
-
try {
|
|
2463
|
-
const gate = await preDispatchHealthGate(getLiveDispatchBasePath());
|
|
2464
|
-
if (gate.proceed) {
|
|
2465
|
-
return {
|
|
2466
|
-
kind: "pass",
|
|
2467
|
-
fixesApplied: gate.fixesApplied,
|
|
2468
|
-
};
|
|
2469
|
-
}
|
|
2470
|
-
return {
|
|
2471
|
-
kind: "fail",
|
|
2472
|
-
reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
|
|
2473
|
-
action: gate.severity ?? "pause",
|
|
2474
|
-
};
|
|
2475
|
-
} catch (error) {
|
|
2476
|
-
return { kind: "threw", error };
|
|
2477
|
-
}
|
|
2478
|
-
},
|
|
2479
|
-
async postAdvanceRecord(result) {
|
|
2480
|
-
if (result.kind === "error") {
|
|
2481
|
-
recordHealthSnapshot(1, 0, 0, [{
|
|
2482
|
-
code: "orchestration-error",
|
|
2483
|
-
message: result.reason ?? "orchestration error",
|
|
2484
|
-
severity: "error",
|
|
2485
|
-
unitId: "orchestration",
|
|
2486
|
-
}], [], "orchestration");
|
|
2487
|
-
} else if (result.kind === "blocked") {
|
|
2488
|
-
recordHealthSnapshot(0, 1, 0, [{
|
|
2489
|
-
code: "orchestration-blocked",
|
|
2490
|
-
message: result.reason ?? "orchestration blocked",
|
|
2491
|
-
severity: "warning",
|
|
2492
|
-
unitId: "orchestration",
|
|
2493
|
-
}], [], "orchestration");
|
|
2494
|
-
}
|
|
2495
|
-
},
|
|
2496
|
-
},
|
|
2497
|
-
runtime: {
|
|
2498
|
-
async ensureLockOwnership() {
|
|
2499
|
-
const status = getSessionLockStatus(runtimeBasePath);
|
|
2500
|
-
if (!status.valid || status.failureReason === "pid-mismatch") {
|
|
2501
|
-
throw new Error("session lock held by another process");
|
|
2502
|
-
}
|
|
2503
|
-
},
|
|
2504
|
-
async journalTransition(event) {
|
|
2505
|
-
const eventType = event.name === "start"
|
|
2506
|
-
? "orchestrator-iteration-start"
|
|
2507
|
-
: event.name === "resume"
|
|
2508
|
-
? "orchestrator-iteration-start"
|
|
2509
|
-
: event.name === "advance"
|
|
2510
|
-
? "orchestrator-dispatch-match"
|
|
2511
|
-
: event.name === "advance-blocked"
|
|
2512
|
-
? "orchestrator-guard-block"
|
|
2513
|
-
: event.name === "advance-stopped"
|
|
2514
|
-
? "orchestrator-dispatch-stop"
|
|
2515
|
-
: event.name === "advance-error"
|
|
2516
|
-
? "orchestrator-iteration-end"
|
|
2517
|
-
: event.name === "advance-paused" || event.name === "advance-retry"
|
|
2518
|
-
? "orchestrator-guard-block"
|
|
2519
|
-
: event.name === "stop"
|
|
2520
|
-
? "orchestrator-terminal"
|
|
2521
|
-
: "orchestrator-iteration-end";
|
|
2522
|
-
|
|
2523
|
-
_emitJournalEvent(runtimeBasePath, {
|
|
2524
|
-
ts: new Date().toISOString(),
|
|
2525
|
-
flowId,
|
|
2526
|
-
seq: ++seq,
|
|
2527
|
-
eventType,
|
|
2528
|
-
data: {
|
|
2529
|
-
source: "auto-orchestrator",
|
|
2530
|
-
name: event.name,
|
|
2531
|
-
reason: event.reason,
|
|
2532
|
-
unitType: event.unitType,
|
|
2533
|
-
unitId: event.unitId,
|
|
2534
|
-
},
|
|
2535
|
-
});
|
|
2536
|
-
},
|
|
2537
|
-
},
|
|
2538
|
-
notifications: {
|
|
2539
|
-
async notifyLifecycle(event) {
|
|
2540
|
-
if (event.name === "error") {
|
|
2541
|
-
ctx.ui.notify(event.detail ?? "auto orchestration error", "error");
|
|
2542
|
-
}
|
|
2543
|
-
},
|
|
2544
|
-
},
|
|
2545
|
-
uokGate: {
|
|
2546
|
-
async emit(input) {
|
|
2547
|
-
const activeBasePath = getLiveDispatchBasePath();
|
|
2548
|
-
const prefs = loadEffectiveGSDPreferences(activeBasePath)?.preferences;
|
|
2549
|
-
const uokFlags = resolveUokFlags(prefs);
|
|
2550
|
-
if (!uokFlags.gates) return;
|
|
2551
|
-
const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
|
|
2552
|
-
try {
|
|
2553
|
-
const { UokGateRunner } = await import("./uok/gate-runner.js");
|
|
2554
|
-
const runner = new UokGateRunner();
|
|
2555
|
-
runner.register({
|
|
2556
|
-
id: input.gateId,
|
|
2557
|
-
type: input.gateType,
|
|
2558
|
-
execute: async () => ({
|
|
2559
|
-
outcome: input.outcome,
|
|
2560
|
-
failureClass: input.failureClass,
|
|
2561
|
-
rationale: input.rationale,
|
|
2562
|
-
findings: input.findings ?? "",
|
|
2563
|
-
}),
|
|
2564
|
-
});
|
|
2565
|
-
await runner.run(input.gateId, {
|
|
2566
|
-
basePath: activeBasePath,
|
|
2567
|
-
traceId: `pre-dispatch:${flowId}`,
|
|
2568
|
-
turnId: `orch-${seq}`,
|
|
2569
|
-
milestoneId,
|
|
2570
|
-
unitType: "pre-dispatch",
|
|
2571
|
-
unitId: `orch-${seq}`,
|
|
2572
|
-
});
|
|
2573
|
-
} catch (err) {
|
|
2574
|
-
logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
|
|
2575
|
-
file: "auto.ts",
|
|
2576
|
-
gateId: input.gateId,
|
|
2577
|
-
gateType: input.gateType,
|
|
2578
|
-
...(milestoneId ? { milestoneId } : {}),
|
|
2579
|
-
});
|
|
2580
|
-
}
|
|
2581
|
-
},
|
|
2582
|
-
},
|
|
2583
|
-
};
|
|
2584
|
-
|
|
2585
|
-
return createAutoOrchestrator(deps);
|
|
2586
|
-
}
|
|
2587
|
-
|
|
2588
2170
|
function notifyResumeBlocked(ctx: ExtensionContext, result: Extract<AutoAdvanceResult, { kind: "blocked" }>): void {
|
|
2589
2171
|
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
2590
2172
|
ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
|
|
@@ -2598,7 +2180,13 @@ function notifyResumeBlocked(ctx: ExtensionContext, result: Extract<AutoAdvanceR
|
|
|
2598
2180
|
}
|
|
2599
2181
|
|
|
2600
2182
|
function ensureOrchestrationModule(ctx: ExtensionContext, pi: ExtensionAPI, basePath: string): void {
|
|
2601
|
-
s.orchestration =
|
|
2183
|
+
s.orchestration = createAutoOrchestrator({
|
|
2184
|
+
ctx,
|
|
2185
|
+
pi,
|
|
2186
|
+
dispatchBasePath: basePath,
|
|
2187
|
+
runtimeBasePath: lockBase(),
|
|
2188
|
+
session: s,
|
|
2189
|
+
});
|
|
2602
2190
|
}
|
|
2603
2191
|
|
|
2604
2192
|
/**
|