@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.955e4da0
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/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/bg-shell/utilities.js +2 -2
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +92 -230
- 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/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- 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 +12 -9
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +20 -36
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +34 -289
- package/dist/resources/extensions/gsd/auto.js +15 -14
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +131 -140
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +89 -8
- package/dist/resources/extensions/gsd/captures.js +5 -13
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- 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/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -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-environment.js +8 -10
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +9 -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/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
- package/dist/resources/extensions/gsd/guided-flow.js +68 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -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 +19 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- 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/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +7 -5
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/paths.js +10 -24
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- 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/recovery-classification.js +12 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- 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/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -5
- 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/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- 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/undo.js +8 -7
- 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 +23 -0
- 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-git-recovery.js +287 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +17 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -10
- 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/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- 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 +12 -12
- 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.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 +12 -12
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- 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/node-pty/build/Makefile +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-status-banner.js +7 -3
- package/package.json +2 -1
- 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/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 +32 -22
- 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 +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +295 -98
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +309 -154
- 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/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.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/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/bg-shell/utilities.ts +2 -2
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +114 -281
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- 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 +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- 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 +16 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +25 -34
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +53 -306
- package/src/resources/extensions/gsd/auto.ts +27 -17
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +147 -153
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +132 -6
- package/src/resources/extensions/gsd/captures.ts +5 -14
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- 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/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -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-environment.ts +8 -11
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -3
- 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/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
- package/src/resources/extensions/gsd/guided-flow.ts +81 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -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 +17 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- 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/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/paths.ts +9 -22
- 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 +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- 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/recovery-classification.ts +14 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- 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/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-loop.test.ts +444 -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 +133 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -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/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/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- 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/auto-worktree-milestone-merge.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- 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/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- 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 +46 -0
- 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/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +185 -1
- 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/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.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 +86 -1
- 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-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -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/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -5
- 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/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- 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/undo.ts +9 -8
- 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 +18 -0
- 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-git-recovery.ts +308 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +17 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +12 -10
- 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/src/resources/skills/gsd-browser/SKILL.md +1 -1
- 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/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_ssgManifest.js +0 -0
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// File Purpose: Post-unit verification gate for GSD auto-mode units.
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { gsdProjectionRoot, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
|
|
5
|
+
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
5
6
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
6
7
|
import { parseUnitId } from "./unit-id.js";
|
|
7
8
|
import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd-db.js";
|
|
8
9
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
9
|
-
import { extractVerdict } from "./verdict-parser.js";
|
|
10
10
|
import { isClosedStatus } from "./status-guards.js";
|
|
11
11
|
import { loadFile } from "./files.js";
|
|
12
12
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
@@ -214,22 +214,22 @@ async function runValidateMilestonePostCheck(vctx, pauseAuto) {
|
|
|
214
214
|
};
|
|
215
215
|
const validationBasePath = resolveCanonicalMilestoneRoot(s.basePath, mid);
|
|
216
216
|
const validationFile = join(gsdProjectionRoot(validationBasePath), "milestones", mid, `${mid}-VALIDATION.md`);
|
|
217
|
-
|
|
217
|
+
const validationContent = await loadFile(validationFile);
|
|
218
|
+
if (validationContent !== null && validationContent.trim() === "") {
|
|
218
219
|
if (await reassessmentInvalidatedValidation()) {
|
|
219
220
|
clearValidationRetry();
|
|
220
221
|
return "continue";
|
|
221
222
|
}
|
|
222
|
-
return setToolFailureRetry("You must call gsd_validate_milestone to persist the validation results.
|
|
223
|
+
return setToolFailureRetry("You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.");
|
|
223
224
|
}
|
|
224
|
-
const
|
|
225
|
-
if (!
|
|
225
|
+
const verdict = await resolveMilestoneValidationVerdict(s.basePath, mid);
|
|
226
|
+
if (!verdict) {
|
|
226
227
|
if (await reassessmentInvalidatedValidation()) {
|
|
227
228
|
clearValidationRetry();
|
|
228
229
|
return "continue";
|
|
229
230
|
}
|
|
230
|
-
return setToolFailureRetry("You must call gsd_validate_milestone to persist the validation results. VALIDATION.md
|
|
231
|
+
return setToolFailureRetry("You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.");
|
|
231
232
|
}
|
|
232
|
-
const verdict = extractVerdict(validationContent);
|
|
233
233
|
if (verdict === "needs-attention") {
|
|
234
234
|
ctx.ui.notify(`Milestone ${mid} validation returned verdict=needs-attention. Pausing for human review.`, "error");
|
|
235
235
|
process.stderr.write([
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { existsSync, lstatSync, readdirSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { worktreePath } from "./worktree-manager.js";
|
|
6
|
+
import { worktreesDirs } from "./worktree-placement.js";
|
|
6
7
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
7
8
|
const defaultFs = {
|
|
8
9
|
existsSync,
|
|
@@ -22,6 +23,13 @@ export function expectedAutoWorktreePath(projectRoot, milestoneId) {
|
|
|
22
23
|
return null;
|
|
23
24
|
return worktreePath(projectRoot, id);
|
|
24
25
|
}
|
|
26
|
+
/** Every path the milestone worktree may legitimately live at (canonical + legacy). */
|
|
27
|
+
function candidateAutoWorktreePaths(projectRoot, milestoneId) {
|
|
28
|
+
const id = milestoneId?.trim();
|
|
29
|
+
if (!id || !isValidMilestoneId(id))
|
|
30
|
+
return [];
|
|
31
|
+
return worktreesDirs(projectRoot).map((dir) => join(dir, id));
|
|
32
|
+
}
|
|
25
33
|
export function resolvePausedAutoWorktreePath(input) {
|
|
26
34
|
if (input.baseIsAutoWorktree)
|
|
27
35
|
return input.basePath;
|
|
@@ -43,8 +51,8 @@ export function assessAutoWorktreeRepairTarget(input) {
|
|
|
43
51
|
if (!expectedPath) {
|
|
44
52
|
return { ok: false, reason: "missing expected worktree path" };
|
|
45
53
|
}
|
|
46
|
-
const
|
|
47
|
-
if (
|
|
54
|
+
const candidatePaths = candidateAutoWorktreePaths(input.projectRoot, input.milestoneId);
|
|
55
|
+
if (candidatePaths.length === 0 || !candidatePaths.some((candidate) => samePath(expectedPath, candidate))) {
|
|
48
56
|
return { ok: false, reason: "expected worktree path does not match milestone" };
|
|
49
57
|
}
|
|
50
58
|
if (!samePath(input.activeRoot, input.projectRoot) && !samePath(input.activeRoot, expectedPath)) {
|
|
@@ -8,28 +8,33 @@
|
|
|
8
8
|
* manages create, enter, detect, and teardown for auto-mode worktrees.
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, cpSync, readFileSync, readdirSync, mkdirSync, realpathSync, rmSync, unlinkSync, lstatSync as lstatSyncFn, } from "node:fs";
|
|
11
|
-
import { dirname, isAbsolute, join, relative
|
|
11
|
+
import { dirname, isAbsolute, join, relative } from "node:path";
|
|
12
12
|
import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
|
|
13
|
-
import { reconcileWorktreeDb, isDbAvailable, getMilestone, getMilestoneSlices, getSliceTasks,
|
|
13
|
+
import { reconcileWorktreeDb, isDbAvailable, getMilestone, getMilestoneSlices, getSliceTasks, } from "./gsd-db.js";
|
|
14
|
+
import { closeWorkflowDatabase, getWorkflowDatabasePath, openWorkflowDatabasePath, } from "./db-workspace.js";
|
|
14
15
|
import { execFileSync } from "node:child_process";
|
|
15
16
|
import { gsdRoot, resolveGsdPathContract } from "./paths.js";
|
|
16
|
-
import { createWorktree, removeWorktree,
|
|
17
|
+
import { createWorktree, removeWorktree, worktreePath, isInsideWorktreesDir, } from "./worktree-manager.js";
|
|
17
18
|
import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
|
|
18
|
-
import { isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
|
|
19
|
+
import { findWorktreeSegment, isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
|
|
19
20
|
import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
|
|
20
|
-
import { MergeConflictError,
|
|
21
|
-
import {
|
|
21
|
+
import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
22
|
+
import { buildPullRequestEvidence, createDraftPullRequestFromEvidence, } from "./pull-request-process.js";
|
|
22
23
|
import { debugLog } from "./debug-logger.js";
|
|
23
24
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
25
|
+
import { checkoutBranchWithStashGuard, cleanupConflictState, gsdJsonlFilesWithConflictMarkers, hasConflictMarkers, popStashByRef, removeMergeStateFiles, stashAlreadyExistsFilesFromError, stashRefFromError, } from "./worktree-git-recovery.js";
|
|
26
|
+
// Re-export for existing callers/tests (auto-start.ts, checkout-branch-stash-guard.test.ts).
|
|
27
|
+
export { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
24
28
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
25
29
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
26
30
|
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
27
31
|
import { classifyProject } from "./detection.js";
|
|
28
|
-
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeMergeRegular, nativeConflictFiles, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchForceReset, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor,
|
|
29
|
-
import { CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
|
|
32
|
+
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeMergeRegular, nativeConflictFiles, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchForceReset, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, nativeWorktreeList, nativeLsFiles, } from "./native-git-bridge.js";
|
|
33
|
+
import { CLOSEOUT_CONSISTENCY_BLOCKED_REASON, } from "./closeout-consistency-gate.js";
|
|
34
|
+
import { formatCloseoutProofBlock, proveMilestoneCloseout, } from "./milestone-closeout-proof.js";
|
|
30
35
|
import { gsdHome } from "./gsd-home.js";
|
|
31
36
|
import { createWorkspace } from "./workspace.js";
|
|
32
|
-
import {
|
|
37
|
+
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
33
38
|
const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
|
|
34
39
|
const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
|
|
35
40
|
const LEGACY_DEEP_SETUP_RUNTIME_UNIT_FILES = new Set([
|
|
@@ -59,111 +64,6 @@ const ROOT_STATE_FILES = [
|
|
|
59
64
|
// Back-sync (worktree → main) must NEVER overwrite the project root's copy
|
|
60
65
|
// because the project root is authoritative for preferences (#2684).
|
|
61
66
|
];
|
|
62
|
-
/**
|
|
63
|
-
* Pop a stash entry by tracking the unique marker embedded in its message so
|
|
64
|
-
* concurrent stash operations against the same project root cannot cause us to
|
|
65
|
-
* pop the wrong entry.
|
|
66
|
-
*
|
|
67
|
-
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
68
|
-
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
69
|
-
* returns null.
|
|
70
|
-
*
|
|
71
|
-
* Throws on pop failure so callers can handle conflict cases the same way
|
|
72
|
-
* they would with the prior `git stash pop` form. When throwing after a
|
|
73
|
-
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
74
|
-
*
|
|
75
|
-
* (Issue #4980 HIGH-6)
|
|
76
|
-
*/
|
|
77
|
-
function popStashByRef(basePath, stashMarker) {
|
|
78
|
-
let popArg = null;
|
|
79
|
-
if (stashMarker) {
|
|
80
|
-
try {
|
|
81
|
-
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
82
|
-
cwd: basePath,
|
|
83
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
84
|
-
encoding: "utf-8",
|
|
85
|
-
}).trim().split("\n").filter(Boolean);
|
|
86
|
-
for (const entry of list) {
|
|
87
|
-
const [ref, subject] = entry.split("\0");
|
|
88
|
-
if (ref && subject?.includes(stashMarker)) {
|
|
89
|
-
popArg = ref;
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (!popArg) {
|
|
99
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
try {
|
|
103
|
-
execFileSync("git", ["stash", "pop", popArg], {
|
|
104
|
-
cwd: basePath,
|
|
105
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
106
|
-
encoding: "utf-8",
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
if (err && typeof err === "object") {
|
|
111
|
-
err.stashRef = popArg;
|
|
112
|
-
}
|
|
113
|
-
throw err;
|
|
114
|
-
}
|
|
115
|
-
return popArg;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
119
|
-
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
120
|
-
*/
|
|
121
|
-
function stashRefFromError(err) {
|
|
122
|
-
if (!err || typeof err !== "object")
|
|
123
|
-
return null;
|
|
124
|
-
const stashRef = err.stashRef;
|
|
125
|
-
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
126
|
-
}
|
|
127
|
-
function stashAlreadyExistsFilesFromError(err) {
|
|
128
|
-
if (!err || typeof err !== "object")
|
|
129
|
-
return [];
|
|
130
|
-
const stderr = err.stderr;
|
|
131
|
-
const stderrText = typeof stderr === "string"
|
|
132
|
-
? stderr
|
|
133
|
-
: stderr instanceof Uint8Array
|
|
134
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
135
|
-
: "";
|
|
136
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
137
|
-
const text = `${stderrText}\n${message}`;
|
|
138
|
-
const files = new Set();
|
|
139
|
-
for (const line of text.split("\n")) {
|
|
140
|
-
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
141
|
-
if (!m)
|
|
142
|
-
continue;
|
|
143
|
-
const filePath = m[1]?.trim();
|
|
144
|
-
if (filePath)
|
|
145
|
-
files.add(filePath);
|
|
146
|
-
}
|
|
147
|
-
return [...files];
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
151
|
-
* markers from a failed stash-pop or merge attempt.
|
|
152
|
-
*
|
|
153
|
-
* Returns false when the file cannot be read.
|
|
154
|
-
*/
|
|
155
|
-
function hasConflictMarkers(filePath) {
|
|
156
|
-
try {
|
|
157
|
-
const content = readFileSync(filePath, "utf-8");
|
|
158
|
-
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
function gsdJsonlFilesWithConflictMarkers(basePath) {
|
|
165
|
-
return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) => hasConflictMarkers(join(basePath, f)));
|
|
166
|
-
}
|
|
167
67
|
/**
|
|
168
68
|
* Check if two filesystem paths resolve to the same real location.
|
|
169
69
|
* Returns false if either path cannot be resolved (e.g. doesn't exist).
|
|
@@ -419,51 +319,6 @@ export const SAFE_AUTO_RESOLVE_PATTERNS = [
|
|
|
419
319
|
* Covers `.gsd/` state files and common build artifacts. */
|
|
420
320
|
export const isSafeToAutoResolve = (filePath) => filePath.startsWith(".gsd/") ||
|
|
421
321
|
SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
|
|
422
|
-
function removeMergeStateFiles(basePath, contextLabel) {
|
|
423
|
-
try {
|
|
424
|
-
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
425
|
-
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
426
|
-
cwd: basePath,
|
|
427
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
428
|
-
encoding: "utf-8",
|
|
429
|
-
}).trim();
|
|
430
|
-
const p = rawPath.length > 0
|
|
431
|
-
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
432
|
-
: join(resolveGitDir(basePath), f);
|
|
433
|
-
if (existsSync(p))
|
|
434
|
-
unlinkSync(p);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
catch (err) {
|
|
438
|
-
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
function cleanupConflictState(basePath) {
|
|
442
|
-
// Merge conflicts can leave unmerged index entries; merge-abort alone is not
|
|
443
|
-
// enough for squash merges (MERGE_HEAD is never written). Reset the merge
|
|
444
|
-
// index, then remove merge message files that native/libgit2 paths may have
|
|
445
|
-
// created.
|
|
446
|
-
try {
|
|
447
|
-
nativeMergeAbort(basePath);
|
|
448
|
-
}
|
|
449
|
-
catch (err) {
|
|
450
|
-
// MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
|
|
451
|
-
debugLog("conflict-cleanup:merge-abort-skipped", {
|
|
452
|
-
error: err instanceof Error ? err.message : String(err),
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
try {
|
|
456
|
-
execFileSync("git", ["reset", "--merge"], {
|
|
457
|
-
cwd: basePath,
|
|
458
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
459
|
-
encoding: "utf-8",
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
catch (err) {
|
|
463
|
-
logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
464
|
-
}
|
|
465
|
-
removeMergeStateFiles(basePath, "conflict");
|
|
466
|
-
}
|
|
467
322
|
// ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
|
|
468
323
|
/**
|
|
469
324
|
* Sync milestone artifacts from project root INTO worktree before deriveState.
|
|
@@ -479,7 +334,7 @@ function cleanupConflictState(basePath) {
|
|
|
479
334
|
* the bodies with raw paths.
|
|
480
335
|
*/
|
|
481
336
|
export function syncProjectRootToWorktree(projectRoot, worktreePath_, milestoneId) {
|
|
482
|
-
|
|
337
|
+
new WorktreeStateProjection().projectRootToWorktreePaths(projectRoot, worktreePath_, milestoneId);
|
|
483
338
|
}
|
|
484
339
|
/**
|
|
485
340
|
* Path-string entry point to WorktreeStateProjection.projectWorktreeToRoot.
|
|
@@ -487,7 +342,7 @@ export function syncProjectRootToWorktree(projectRoot, worktreePath_, milestoneI
|
|
|
487
342
|
* the projection-invariant tests can exercise the body with raw paths.
|
|
488
343
|
*/
|
|
489
344
|
export function syncStateToProjectRoot(worktreePath_, projectRoot, milestoneId) {
|
|
490
|
-
|
|
345
|
+
new WorktreeStateProjection().projectWorktreeToRootPaths(worktreePath_, projectRoot, milestoneId);
|
|
491
346
|
}
|
|
492
347
|
// ─── Resource Staleness ───────────────────────────────────────────────────
|
|
493
348
|
/**
|
|
@@ -537,19 +392,12 @@ export function checkResourcesStale(versionOnStart) {
|
|
|
537
392
|
* Returns the corrected base path.
|
|
538
393
|
*/
|
|
539
394
|
export function escapeStaleWorktree(base) {
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
const match = base.match(symlinkRe);
|
|
547
|
-
if (!match || match.index === undefined)
|
|
548
|
-
return base;
|
|
549
|
-
idx = match.index;
|
|
550
|
-
}
|
|
551
|
-
// base is inside .gsd/worktrees/<something> — extract the project root
|
|
552
|
-
const projectRoot = base.slice(0, idx);
|
|
395
|
+
const segment = findWorktreeSegment(base.replaceAll("\\", "/"));
|
|
396
|
+
if (!segment)
|
|
397
|
+
return base;
|
|
398
|
+
// base is inside .gsd/worktrees/<something> — extract the project root.
|
|
399
|
+
// Normalization is 1:1 on characters, so the segment index is valid in `base`.
|
|
400
|
+
const projectRoot = base.slice(0, segment.gsdIdx);
|
|
553
401
|
// Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
|
|
554
402
|
// the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
|
|
555
403
|
// when .gsd is a symlink into ~/.gsd/projects/<hash> and process.cwd()
|
|
@@ -829,7 +677,7 @@ export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
|
|
|
829
677
|
* the shared project DB or the pre-upgrade DB reconciliation path above.
|
|
830
678
|
*/
|
|
831
679
|
export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
|
|
832
|
-
return
|
|
680
|
+
return new WorktreeStateProjection().finalizeProjectionForMergePaths(mainBasePath, worktreePath, milestoneId);
|
|
833
681
|
}
|
|
834
682
|
export { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
835
683
|
// ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
|
|
@@ -906,109 +754,6 @@ export function enterBranchModeForMilestone(basePath, milestoneId) {
|
|
|
906
754
|
}
|
|
907
755
|
checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
|
|
908
756
|
}
|
|
909
|
-
export function checkoutBranchWithStashGuard(basePath, branch, reason) {
|
|
910
|
-
let stashMarker = null;
|
|
911
|
-
let stashed = false;
|
|
912
|
-
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
913
|
-
if (status.length > 0) {
|
|
914
|
-
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
915
|
-
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
916
|
-
cwd: basePath,
|
|
917
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
918
|
-
encoding: "utf-8",
|
|
919
|
-
});
|
|
920
|
-
execFileSync("git", ["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`], {
|
|
921
|
-
cwd: basePath,
|
|
922
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
923
|
-
encoding: "utf-8",
|
|
924
|
-
});
|
|
925
|
-
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
926
|
-
cwd: basePath,
|
|
927
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
928
|
-
encoding: "utf-8",
|
|
929
|
-
});
|
|
930
|
-
stashed = stashListAfter !== stashListBefore;
|
|
931
|
-
}
|
|
932
|
-
// Checkout and stash-restore are split so we can distinguish two failure
|
|
933
|
-
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
934
|
-
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
935
|
-
// the working-tree changes remain in the stash list. We surface a distinct
|
|
936
|
-
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
937
|
-
try {
|
|
938
|
-
nativeCheckoutBranch(basePath, branch);
|
|
939
|
-
}
|
|
940
|
-
catch (checkoutErr) {
|
|
941
|
-
if (stashed) {
|
|
942
|
-
try {
|
|
943
|
-
popStashByRef(basePath, stashMarker);
|
|
944
|
-
}
|
|
945
|
-
catch (restoreErr) {
|
|
946
|
-
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
throw checkoutErr;
|
|
950
|
-
}
|
|
951
|
-
if (stashed) {
|
|
952
|
-
try {
|
|
953
|
-
popStashByRef(basePath, stashMarker);
|
|
954
|
-
}
|
|
955
|
-
catch (popErr) {
|
|
956
|
-
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
957
|
-
const stderr = popErr && typeof popErr === "object"
|
|
958
|
-
? popErr.stderr
|
|
959
|
-
: undefined;
|
|
960
|
-
const stderrText = typeof stderr === "string"
|
|
961
|
-
? stderr
|
|
962
|
-
: stderr instanceof Uint8Array
|
|
963
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
964
|
-
: "";
|
|
965
|
-
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
966
|
-
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
967
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
968
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
969
|
-
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
970
|
-
const stashRefForDrop = stashRefFromError(popErr);
|
|
971
|
-
const nonGsdUnmerged = nativeConflictFiles(basePath).filter((f) => !f.startsWith(".gsd/"));
|
|
972
|
-
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
973
|
-
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
974
|
-
: [];
|
|
975
|
-
const gsdConflictFiles = [...new Set([...gsdAlreadyExists, ...gsdContentConflicts])];
|
|
976
|
-
if (isUntrackedRestoreFailure &&
|
|
977
|
-
gsdConflictFiles.length > 0 &&
|
|
978
|
-
nonGsdAlreadyExists.length === 0 &&
|
|
979
|
-
nonGsdUnmerged.length === 0) {
|
|
980
|
-
for (const f of gsdConflictFiles) {
|
|
981
|
-
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
982
|
-
cwd: basePath,
|
|
983
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
984
|
-
encoding: "utf-8",
|
|
985
|
-
});
|
|
986
|
-
nativeAddPaths(basePath, [f]);
|
|
987
|
-
}
|
|
988
|
-
if (stashRefForDrop) {
|
|
989
|
-
try {
|
|
990
|
-
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
991
|
-
cwd: basePath,
|
|
992
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
993
|
-
encoding: "utf-8",
|
|
994
|
-
});
|
|
995
|
-
}
|
|
996
|
-
catch (err) { /* stash may already be consumed */
|
|
997
|
-
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
998
|
-
}
|
|
999
|
-
}
|
|
1000
|
-
else {
|
|
1001
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
1002
|
-
}
|
|
1003
|
-
return;
|
|
1004
|
-
}
|
|
1005
|
-
const wrapped = new Error(`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`);
|
|
1006
|
-
if (stashRefForDrop)
|
|
1007
|
-
wrapped.stashRef = stashRefForDrop;
|
|
1008
|
-
throw wrapped;
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
757
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
1013
758
|
/**
|
|
1014
759
|
* Create a new auto-worktree for a milestone, chdir into it, and store
|
|
@@ -1519,10 +1264,10 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1519
1264
|
const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
|
|
1520
1265
|
const mainDbPath = contract.projectDb;
|
|
1521
1266
|
try {
|
|
1522
|
-
const activeDbPath =
|
|
1267
|
+
const activeDbPath = getWorkflowDatabasePath();
|
|
1523
1268
|
if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
|
|
1524
|
-
|
|
1525
|
-
if (!
|
|
1269
|
+
closeWorkflowDatabase();
|
|
1270
|
+
if (!openWorkflowDatabasePath(mainDbPath)) {
|
|
1526
1271
|
throw new Error(`cannot open project DB at ${mainDbPath}`);
|
|
1527
1272
|
}
|
|
1528
1273
|
}
|
|
@@ -1535,9 +1280,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1535
1280
|
logError("worktree", message);
|
|
1536
1281
|
throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
|
|
1537
1282
|
}
|
|
1538
|
-
const
|
|
1539
|
-
if (!
|
|
1540
|
-
throw new GSDError(GSD_GIT_ERROR,
|
|
1283
|
+
const closeoutProof = proveMilestoneCloseout(milestoneId);
|
|
1284
|
+
if (!closeoutProof.ok) {
|
|
1285
|
+
throw new GSDError(GSD_GIT_ERROR, formatCloseoutProofBlock(closeoutProof));
|
|
1541
1286
|
}
|
|
1542
1287
|
}
|
|
1543
1288
|
// 2. Get completed slices for commit message
|
|
@@ -1840,10 +1585,10 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1840
1585
|
// stashing so Windows releases the handles; reopen after. No-op on
|
|
1841
1586
|
// POSIX, where advisory locks don't block git.
|
|
1842
1587
|
const needsDbCycle = process.platform === "win32" && isDbAvailable();
|
|
1843
|
-
const dbPathToReopen = needsDbCycle ?
|
|
1588
|
+
const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
|
|
1844
1589
|
if (needsDbCycle) {
|
|
1845
1590
|
try {
|
|
1846
|
-
|
|
1591
|
+
closeWorkflowDatabase();
|
|
1847
1592
|
}
|
|
1848
1593
|
catch (err) {
|
|
1849
1594
|
logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1888,7 +1633,7 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1888
1633
|
: nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
1889
1634
|
if (needsDbCycle && dbPathToReopen) {
|
|
1890
1635
|
try {
|
|
1891
|
-
|
|
1636
|
+
openWorkflowDatabasePath(dbPathToReopen);
|
|
1892
1637
|
}
|
|
1893
1638
|
catch (err) {
|
|
1894
1639
|
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -2213,7 +1958,7 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
2213
1958
|
stdio: ["ignore", "pipe", "pipe"],
|
|
2214
1959
|
encoding: "utf-8",
|
|
2215
1960
|
});
|
|
2216
|
-
const prEvidence =
|
|
1961
|
+
const prEvidence = buildPullRequestEvidence({
|
|
2217
1962
|
milestoneId,
|
|
2218
1963
|
milestoneTitle,
|
|
2219
1964
|
changeType: "feat",
|
|
@@ -2222,7 +1967,7 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
2222
1967
|
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
2223
1968
|
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
2224
1969
|
});
|
|
2225
|
-
const prUrl =
|
|
1970
|
+
const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
|
|
2226
1971
|
head: milestoneBranch,
|
|
2227
1972
|
base: prTarget,
|
|
2228
1973
|
});
|
|
@@ -25,7 +25,7 @@ import { clearActivityLogState } from "./activity-log.js";
|
|
|
25
25
|
import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
|
|
26
26
|
import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
27
27
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
28
|
-
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
|
|
28
|
+
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
|
|
29
29
|
import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
|
|
30
30
|
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
|
|
31
31
|
import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, isToolInvocationError, isQueuedUserMessageSkip, isDeterministicPolicyError, } from "./auto-tool-tracking.js";
|
|
@@ -54,6 +54,7 @@ import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
|
54
54
|
import { createAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
|
|
55
55
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
56
56
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
57
|
+
import { createMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
|
|
57
58
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
58
59
|
import { reconcileMergeState, verifyExpectedArtifact, } from "./auto-recovery.js";
|
|
59
60
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
@@ -67,6 +68,7 @@ import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
|
67
68
|
import { updateProgressWidget as _updateProgressWidget, setCompletionProgressWidget, setAutoOutcomeWidget, setAutoActiveStatus, updateSliceProgressCache, clearSliceProgressCache, unitVerb, } from "./auto-dashboard.js";
|
|
68
69
|
import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
|
|
69
70
|
import { isDbAvailable, getMilestone, getMilestoneSlices, } from "./gsd-db.js";
|
|
71
|
+
import { closeWorkflowDatabase } from "./db-workspace.js";
|
|
70
72
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
71
73
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
72
74
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -109,7 +111,7 @@ void initTokenCounter().catch((err) => {
|
|
|
109
111
|
logWarning("engine", `token counter warm-up failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
110
112
|
});
|
|
111
113
|
export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
|
|
112
|
-
import { autoSession as s } from "./auto-runtime-state.js";
|
|
114
|
+
import { autoSession as s, getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
|
|
113
115
|
import { gsdHome } from "./gsd-home.js";
|
|
114
116
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
115
117
|
import { registerAutoWorker, markWorkerStopping, } from "./db/auto-workers.js";
|
|
@@ -344,14 +346,11 @@ export function startAutoDetached(ctx, pi, base, verboseMode, options) {
|
|
|
344
346
|
export function shouldUseWorktreeIsolation(basePath) {
|
|
345
347
|
return getIsolationMode(basePath) === "worktree";
|
|
346
348
|
}
|
|
347
|
-
function
|
|
348
|
-
return configuredMode
|
|
349
|
-
}
|
|
350
|
-
export function _resolveEffectiveUnitIsolationModeForTest(configuredMode, isolationDegraded) {
|
|
351
|
-
return resolveEffectiveUnitIsolationMode(configuredMode, isolationDegraded);
|
|
349
|
+
export function _resolveEffectiveUnitIsolationModeForTest(configuredMode, isolationDegraded, strandedRecoveryIsolationMode = null) {
|
|
350
|
+
return resolveEffectiveUnitIsolationMode(configuredMode, isolationDegraded, strandedRecoveryIsolationMode);
|
|
352
351
|
}
|
|
353
352
|
function getEffectiveUnitIsolationMode(basePath) {
|
|
354
|
-
return resolveEffectiveUnitIsolationMode(getIsolationMode(basePath), s.isolationDegraded);
|
|
353
|
+
return resolveEffectiveUnitIsolationMode(getIsolationMode(basePath), s.isolationDegraded, s.strandedRecoveryIsolationMode);
|
|
355
354
|
}
|
|
356
355
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
357
356
|
/** Pending verification retry — set when gate fails with retries remaining, consumed by autoLoop */
|
|
@@ -463,6 +462,7 @@ function stopAutoCommandPolling() {
|
|
|
463
462
|
}
|
|
464
463
|
export function getAutoDashboardData() {
|
|
465
464
|
const ledger = getLedger();
|
|
465
|
+
const runtimeSnapshot = getAutoRuntimeSnapshot();
|
|
466
466
|
const totals = ledger ? getProjectTotals(ledger.units) : null;
|
|
467
467
|
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
|
|
468
468
|
const rtkSavings = sessionId && s.basePath
|
|
@@ -495,6 +495,7 @@ export function getAutoDashboardData() {
|
|
|
495
495
|
pendingCaptureCount,
|
|
496
496
|
rtkSavings,
|
|
497
497
|
rtkEnabled,
|
|
498
|
+
toolSurface: runtimeSnapshot.toolSurface,
|
|
498
499
|
};
|
|
499
500
|
}
|
|
500
501
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
@@ -1003,12 +1004,13 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
1003
1004
|
// worktree was active, and whether the current milestone was merged before
|
|
1004
1005
|
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
1005
1006
|
try {
|
|
1006
|
-
const { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
|
|
1007
|
+
const { autoExitReasonForTerminalOutcome, emitAutoExit, normalizeAutoExitReason, } = await import("./worktree-telemetry.js");
|
|
1007
1008
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
1008
1009
|
// aggregator buckets stably. Raw detail is preserved in the phases.ts
|
|
1009
1010
|
// notification and the notify'd error string.
|
|
1010
1011
|
const rawReason = reason ?? "stop";
|
|
1011
|
-
const normalizedReason =
|
|
1012
|
+
const normalizedReason = autoExitReasonForTerminalOutcome(options.terminalOutcome)
|
|
1013
|
+
?? normalizeAutoExitReason(rawReason);
|
|
1012
1014
|
const telemetryBase = s.originalBasePath || s.basePath;
|
|
1013
1015
|
emitAutoExit(telemetryBase, {
|
|
1014
1016
|
reason: normalizedReason,
|
|
@@ -1184,8 +1186,7 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
1184
1186
|
// ── Step 6: DB cleanup ──
|
|
1185
1187
|
if (isDbAvailable()) {
|
|
1186
1188
|
try {
|
|
1187
|
-
|
|
1188
|
-
closeDatabase();
|
|
1189
|
+
closeWorkflowDatabase();
|
|
1189
1190
|
}
|
|
1190
1191
|
catch (e) {
|
|
1191
1192
|
debugLog("db-close-failed", {
|
|
@@ -1622,7 +1623,7 @@ export function buildWorktreeLifecycleDeps() {
|
|
|
1622
1623
|
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
1623
1624
|
//
|
|
1624
1625
|
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
1625
|
-
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
1626
|
+
// worktreeProjection, mergeMilestoneToMain transaction runner). Down from 18 at slice-7
|
|
1626
1627
|
// closure.
|
|
1627
1628
|
return {
|
|
1628
1629
|
gitServiceFactory: (basePath) => {
|
|
@@ -1630,7 +1631,7 @@ export function buildWorktreeLifecycleDeps() {
|
|
|
1630
1631
|
return new GitServiceImpl(basePath, gitConfig);
|
|
1631
1632
|
},
|
|
1632
1633
|
worktreeProjection: new WorktreeStateProjection(),
|
|
1633
|
-
mergeMilestoneToMain,
|
|
1634
|
+
mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
|
|
1634
1635
|
};
|
|
1635
1636
|
}
|
|
1636
1637
|
function buildLifecycle() {
|