@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
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
unlinkSync,
|
|
21
21
|
lstatSync as lstatSyncFn,
|
|
22
22
|
} from "node:fs";
|
|
23
|
-
import { dirname, isAbsolute, join, relative, resolve
|
|
23
|
+
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
24
24
|
import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
|
|
25
25
|
import {
|
|
26
26
|
reconcileWorktreeDb,
|
|
@@ -28,10 +28,12 @@ import {
|
|
|
28
28
|
getMilestone,
|
|
29
29
|
getMilestoneSlices,
|
|
30
30
|
getSliceTasks,
|
|
31
|
-
closeDatabase,
|
|
32
|
-
openDatabase,
|
|
33
|
-
getDbPath,
|
|
34
31
|
} from "./gsd-db.js";
|
|
32
|
+
import {
|
|
33
|
+
closeWorkflowDatabase,
|
|
34
|
+
getWorkflowDatabasePath,
|
|
35
|
+
openWorkflowDatabasePath,
|
|
36
|
+
} from "./db-workspace.js";
|
|
35
37
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
36
38
|
import { execFileSync } from "node:child_process";
|
|
37
39
|
import { gsdRoot, resolveGsdPathContract } from "./paths.js";
|
|
@@ -48,15 +50,32 @@ import {
|
|
|
48
50
|
nudgeGitBranchCache,
|
|
49
51
|
} from "./worktree.js";
|
|
50
52
|
import {
|
|
53
|
+
findWorktreeSegment,
|
|
51
54
|
isGsdWorktreePath,
|
|
52
55
|
normalizeWorktreePathForCompare,
|
|
53
56
|
resolveWorktreeProjectRoot,
|
|
54
57
|
} from "./worktree-root.js";
|
|
55
58
|
import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
|
|
56
|
-
import { MergeConflictError,
|
|
57
|
-
import {
|
|
59
|
+
import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
60
|
+
import {
|
|
61
|
+
buildPullRequestEvidence,
|
|
62
|
+
createDraftPullRequestFromEvidence,
|
|
63
|
+
} from "./pull-request-process.js";
|
|
58
64
|
import { debugLog } from "./debug-logger.js";
|
|
59
65
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
66
|
+
import {
|
|
67
|
+
checkoutBranchWithStashGuard,
|
|
68
|
+
cleanupConflictState,
|
|
69
|
+
gsdJsonlFilesWithConflictMarkers,
|
|
70
|
+
hasConflictMarkers,
|
|
71
|
+
popStashByRef,
|
|
72
|
+
removeMergeStateFiles,
|
|
73
|
+
stashAlreadyExistsFilesFromError,
|
|
74
|
+
stashRefFromError,
|
|
75
|
+
} from "./worktree-git-recovery.js";
|
|
76
|
+
|
|
77
|
+
// Re-export for existing callers/tests (auto-start.ts, checkout-branch-stash-guard.test.ts).
|
|
78
|
+
export { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
60
79
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
61
80
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
62
81
|
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
@@ -80,22 +99,19 @@ import {
|
|
|
80
99
|
nativeDiffNumstat,
|
|
81
100
|
nativeUpdateRef,
|
|
82
101
|
nativeIsAncestor,
|
|
83
|
-
nativeMergeAbort,
|
|
84
102
|
nativeWorktreeList,
|
|
85
103
|
nativeLsFiles,
|
|
86
104
|
} from "./native-git-bridge.js";
|
|
87
105
|
import {
|
|
88
106
|
CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
|
|
89
|
-
checkCloseoutConsistencyGate,
|
|
90
|
-
formatCloseoutConsistencyBlock,
|
|
91
107
|
} from "./closeout-consistency-gate.js";
|
|
108
|
+
import {
|
|
109
|
+
formatCloseoutProofBlock,
|
|
110
|
+
proveMilestoneCloseout,
|
|
111
|
+
} from "./milestone-closeout-proof.js";
|
|
92
112
|
import { gsdHome } from "./gsd-home.js";
|
|
93
113
|
import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
|
|
94
|
-
import {
|
|
95
|
-
_finalizeProjectionForMergeImpl,
|
|
96
|
-
_projectRootToWorktreeImpl,
|
|
97
|
-
_projectWorktreeToRootImpl,
|
|
98
|
-
} from "./worktree-state-projection.js";
|
|
114
|
+
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
99
115
|
|
|
100
116
|
const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
|
|
101
117
|
const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
|
|
@@ -129,111 +145,6 @@ const ROOT_STATE_FILES = [
|
|
|
129
145
|
// because the project root is authoritative for preferences (#2684).
|
|
130
146
|
] as const;
|
|
131
147
|
|
|
132
|
-
/**
|
|
133
|
-
* Pop a stash entry by tracking the unique marker embedded in its message so
|
|
134
|
-
* concurrent stash operations against the same project root cannot cause us to
|
|
135
|
-
* pop the wrong entry.
|
|
136
|
-
*
|
|
137
|
-
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
138
|
-
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
139
|
-
* returns null.
|
|
140
|
-
*
|
|
141
|
-
* Throws on pop failure so callers can handle conflict cases the same way
|
|
142
|
-
* they would with the prior `git stash pop` form. When throwing after a
|
|
143
|
-
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
144
|
-
*
|
|
145
|
-
* (Issue #4980 HIGH-6)
|
|
146
|
-
*/
|
|
147
|
-
function popStashByRef(basePath: string, stashMarker: string | null): string | null {
|
|
148
|
-
let popArg: string | null = null;
|
|
149
|
-
if (stashMarker) {
|
|
150
|
-
try {
|
|
151
|
-
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
152
|
-
cwd: basePath,
|
|
153
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
154
|
-
encoding: "utf-8",
|
|
155
|
-
}).trim().split("\n").filter(Boolean);
|
|
156
|
-
for (const entry of list) {
|
|
157
|
-
const [ref, subject] = entry.split("\0");
|
|
158
|
-
if (ref && subject?.includes(stashMarker)) {
|
|
159
|
-
popArg = ref;
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
} catch (err) {
|
|
164
|
-
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (!popArg) {
|
|
168
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
execFileSync("git", ["stash", "pop", popArg], {
|
|
173
|
-
cwd: basePath,
|
|
174
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
175
|
-
encoding: "utf-8",
|
|
176
|
-
});
|
|
177
|
-
} catch (err) {
|
|
178
|
-
if (err && typeof err === "object") {
|
|
179
|
-
(err as { stashRef?: string }).stashRef = popArg;
|
|
180
|
-
}
|
|
181
|
-
throw err;
|
|
182
|
-
}
|
|
183
|
-
return popArg;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
188
|
-
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
189
|
-
*/
|
|
190
|
-
function stashRefFromError(err: unknown): string | null {
|
|
191
|
-
if (!err || typeof err !== "object") return null;
|
|
192
|
-
const stashRef = (err as { stashRef?: unknown }).stashRef;
|
|
193
|
-
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function stashAlreadyExistsFilesFromError(err: unknown): string[] {
|
|
197
|
-
if (!err || typeof err !== "object") return [];
|
|
198
|
-
const stderr = (err as { stderr?: unknown }).stderr;
|
|
199
|
-
const stderrText = typeof stderr === "string"
|
|
200
|
-
? stderr
|
|
201
|
-
: stderr instanceof Uint8Array
|
|
202
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
203
|
-
: "";
|
|
204
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
205
|
-
const text = `${stderrText}\n${message}`;
|
|
206
|
-
const files = new Set<string>();
|
|
207
|
-
for (const line of text.split("\n")) {
|
|
208
|
-
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
209
|
-
if (!m) continue;
|
|
210
|
-
const filePath = m[1]?.trim();
|
|
211
|
-
if (filePath) files.add(filePath);
|
|
212
|
-
}
|
|
213
|
-
return [...files];
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
218
|
-
* markers from a failed stash-pop or merge attempt.
|
|
219
|
-
*
|
|
220
|
-
* Returns false when the file cannot be read.
|
|
221
|
-
*/
|
|
222
|
-
function hasConflictMarkers(filePath: string): boolean {
|
|
223
|
-
try {
|
|
224
|
-
const content = readFileSync(filePath, "utf-8");
|
|
225
|
-
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
226
|
-
} catch {
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function gsdJsonlFilesWithConflictMarkers(basePath: string): string[] {
|
|
232
|
-
return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) =>
|
|
233
|
-
hasConflictMarkers(join(basePath, f)),
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
148
|
/**
|
|
238
149
|
* Check if two filesystem paths resolve to the same real location.
|
|
239
150
|
* Returns false if either path cannot be resolved (e.g. doesn't exist).
|
|
@@ -521,49 +432,6 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
|
|
|
521
432
|
filePath.startsWith(".gsd/") ||
|
|
522
433
|
SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
|
|
523
434
|
|
|
524
|
-
function removeMergeStateFiles(basePath: string, contextLabel: string): void {
|
|
525
|
-
try {
|
|
526
|
-
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
527
|
-
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
528
|
-
cwd: basePath,
|
|
529
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
530
|
-
encoding: "utf-8",
|
|
531
|
-
}).trim();
|
|
532
|
-
const p = rawPath.length > 0
|
|
533
|
-
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
534
|
-
: join(resolveGitDir(basePath), f);
|
|
535
|
-
if (existsSync(p)) unlinkSync(p);
|
|
536
|
-
}
|
|
537
|
-
} catch (err) {
|
|
538
|
-
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
function cleanupConflictState(basePath: string): void {
|
|
543
|
-
// Merge conflicts can leave unmerged index entries; merge-abort alone is not
|
|
544
|
-
// enough for squash merges (MERGE_HEAD is never written). Reset the merge
|
|
545
|
-
// index, then remove merge message files that native/libgit2 paths may have
|
|
546
|
-
// created.
|
|
547
|
-
try {
|
|
548
|
-
nativeMergeAbort(basePath);
|
|
549
|
-
} catch (err) {
|
|
550
|
-
// MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
|
|
551
|
-
debugLog("conflict-cleanup:merge-abort-skipped", {
|
|
552
|
-
error: err instanceof Error ? err.message : String(err),
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
try {
|
|
556
|
-
execFileSync("git", ["reset", "--merge"], {
|
|
557
|
-
cwd: basePath,
|
|
558
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
559
|
-
encoding: "utf-8",
|
|
560
|
-
});
|
|
561
|
-
} catch (err) {
|
|
562
|
-
logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
563
|
-
}
|
|
564
|
-
removeMergeStateFiles(basePath, "conflict");
|
|
565
|
-
}
|
|
566
|
-
|
|
567
435
|
// ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
|
|
568
436
|
|
|
569
437
|
/**
|
|
@@ -584,7 +452,7 @@ export function syncProjectRootToWorktree(
|
|
|
584
452
|
worktreePath_: string,
|
|
585
453
|
milestoneId: string | null,
|
|
586
454
|
): void {
|
|
587
|
-
|
|
455
|
+
new WorktreeStateProjection().projectRootToWorktreePaths(projectRoot, worktreePath_, milestoneId);
|
|
588
456
|
}
|
|
589
457
|
|
|
590
458
|
/**
|
|
@@ -597,7 +465,7 @@ export function syncStateToProjectRoot(
|
|
|
597
465
|
projectRoot: string,
|
|
598
466
|
milestoneId: string | null,
|
|
599
467
|
): void {
|
|
600
|
-
|
|
468
|
+
new WorktreeStateProjection().projectWorktreeToRootPaths(worktreePath_, projectRoot, milestoneId);
|
|
601
469
|
}
|
|
602
470
|
|
|
603
471
|
// ─── Resource Staleness ───────────────────────────────────────────────────
|
|
@@ -652,21 +520,12 @@ export function checkResourcesStale(
|
|
|
652
520
|
* Returns the corrected base path.
|
|
653
521
|
*/
|
|
654
522
|
export function escapeStaleWorktree(base: string): string {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
let idx = base.indexOf(directMarker);
|
|
658
|
-
if (idx === -1) {
|
|
659
|
-
// Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
|
|
660
|
-
const symlinkRe = new RegExp(
|
|
661
|
-
`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`,
|
|
662
|
-
);
|
|
663
|
-
const match = base.match(symlinkRe);
|
|
664
|
-
if (!match || match.index === undefined) return base;
|
|
665
|
-
idx = match.index;
|
|
666
|
-
}
|
|
523
|
+
const segment = findWorktreeSegment(base.replaceAll("\\", "/"));
|
|
524
|
+
if (!segment) return base;
|
|
667
525
|
|
|
668
|
-
// base is inside .gsd/worktrees/<something> — extract the project root
|
|
669
|
-
|
|
526
|
+
// base is inside .gsd/worktrees/<something> — extract the project root.
|
|
527
|
+
// Normalization is 1:1 on characters, so the segment index is valid in `base`.
|
|
528
|
+
const projectRoot = base.slice(0, segment.gsdIdx);
|
|
670
529
|
|
|
671
530
|
// Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
|
|
672
531
|
// the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
|
|
@@ -960,7 +819,11 @@ export function syncWorktreeStateBack(
|
|
|
960
819
|
worktreePath: string,
|
|
961
820
|
milestoneId: string,
|
|
962
821
|
): { synced: string[] } {
|
|
963
|
-
return
|
|
822
|
+
return new WorktreeStateProjection().finalizeProjectionForMergePaths(
|
|
823
|
+
mainBasePath,
|
|
824
|
+
worktreePath,
|
|
825
|
+
milestoneId,
|
|
826
|
+
);
|
|
964
827
|
}
|
|
965
828
|
export { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
966
829
|
|
|
@@ -1059,122 +922,6 @@ export function enterBranchModeForMilestone(
|
|
|
1059
922
|
checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
|
|
1060
923
|
}
|
|
1061
924
|
|
|
1062
|
-
export function checkoutBranchWithStashGuard(
|
|
1063
|
-
basePath: string,
|
|
1064
|
-
branch: string,
|
|
1065
|
-
reason: string,
|
|
1066
|
-
): void {
|
|
1067
|
-
let stashMarker: string | null = null;
|
|
1068
|
-
let stashed = false;
|
|
1069
|
-
|
|
1070
|
-
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
1071
|
-
if (status.length > 0) {
|
|
1072
|
-
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
1073
|
-
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
1074
|
-
cwd: basePath,
|
|
1075
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1076
|
-
encoding: "utf-8",
|
|
1077
|
-
});
|
|
1078
|
-
execFileSync(
|
|
1079
|
-
"git",
|
|
1080
|
-
["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`],
|
|
1081
|
-
{
|
|
1082
|
-
cwd: basePath,
|
|
1083
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1084
|
-
encoding: "utf-8",
|
|
1085
|
-
},
|
|
1086
|
-
);
|
|
1087
|
-
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
1088
|
-
cwd: basePath,
|
|
1089
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1090
|
-
encoding: "utf-8",
|
|
1091
|
-
});
|
|
1092
|
-
stashed = stashListAfter !== stashListBefore;
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
// Checkout and stash-restore are split so we can distinguish two failure
|
|
1096
|
-
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
1097
|
-
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
1098
|
-
// the working-tree changes remain in the stash list. We surface a distinct
|
|
1099
|
-
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
1100
|
-
try {
|
|
1101
|
-
nativeCheckoutBranch(basePath, branch);
|
|
1102
|
-
} catch (checkoutErr) {
|
|
1103
|
-
if (stashed) {
|
|
1104
|
-
try {
|
|
1105
|
-
popStashByRef(basePath, stashMarker);
|
|
1106
|
-
} catch (restoreErr) {
|
|
1107
|
-
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
throw checkoutErr;
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
|
-
if (stashed) {
|
|
1114
|
-
try {
|
|
1115
|
-
popStashByRef(basePath, stashMarker);
|
|
1116
|
-
} catch (popErr) {
|
|
1117
|
-
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
1118
|
-
const stderr = popErr && typeof popErr === "object"
|
|
1119
|
-
? (popErr as { stderr?: unknown }).stderr
|
|
1120
|
-
: undefined;
|
|
1121
|
-
const stderrText = typeof stderr === "string"
|
|
1122
|
-
? stderr
|
|
1123
|
-
: stderr instanceof Uint8Array
|
|
1124
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
1125
|
-
: "";
|
|
1126
|
-
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
1127
|
-
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
1128
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
1129
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
1130
|
-
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
1131
|
-
const stashRefForDrop = stashRefFromError(popErr);
|
|
1132
|
-
const nonGsdUnmerged = nativeConflictFiles(basePath).filter((f) => !f.startsWith(".gsd/"));
|
|
1133
|
-
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
1134
|
-
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
1135
|
-
: [];
|
|
1136
|
-
const gsdConflictFiles = [...new Set([...gsdAlreadyExists, ...gsdContentConflicts])];
|
|
1137
|
-
|
|
1138
|
-
if (
|
|
1139
|
-
isUntrackedRestoreFailure &&
|
|
1140
|
-
gsdConflictFiles.length > 0 &&
|
|
1141
|
-
nonGsdAlreadyExists.length === 0 &&
|
|
1142
|
-
nonGsdUnmerged.length === 0
|
|
1143
|
-
) {
|
|
1144
|
-
for (const f of gsdConflictFiles) {
|
|
1145
|
-
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
1146
|
-
cwd: basePath,
|
|
1147
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1148
|
-
encoding: "utf-8",
|
|
1149
|
-
});
|
|
1150
|
-
nativeAddPaths(basePath, [f]);
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
if (stashRefForDrop) {
|
|
1154
|
-
try {
|
|
1155
|
-
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
1156
|
-
cwd: basePath,
|
|
1157
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1158
|
-
encoding: "utf-8",
|
|
1159
|
-
});
|
|
1160
|
-
} catch (err) { /* stash may already be consumed */
|
|
1161
|
-
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1162
|
-
}
|
|
1163
|
-
} else {
|
|
1164
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
1165
|
-
}
|
|
1166
|
-
return;
|
|
1167
|
-
}
|
|
1168
|
-
|
|
1169
|
-
const wrapped = new Error(
|
|
1170
|
-
`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`,
|
|
1171
|
-
);
|
|
1172
|
-
if (stashRefForDrop) (wrapped as { stashRef?: string }).stashRef = stashRefForDrop;
|
|
1173
|
-
throw wrapped;
|
|
1174
|
-
}
|
|
1175
|
-
}
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
925
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
1179
926
|
|
|
1180
927
|
/**
|
|
@@ -1782,10 +1529,10 @@ export function mergeMilestoneToMain(
|
|
|
1782
1529
|
const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
|
|
1783
1530
|
const mainDbPath = contract.projectDb;
|
|
1784
1531
|
try {
|
|
1785
|
-
const activeDbPath =
|
|
1532
|
+
const activeDbPath = getWorkflowDatabasePath();
|
|
1786
1533
|
if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
|
|
1787
|
-
|
|
1788
|
-
if (!
|
|
1534
|
+
closeWorkflowDatabase();
|
|
1535
|
+
if (!openWorkflowDatabasePath(mainDbPath)) {
|
|
1789
1536
|
throw new Error(`cannot open project DB at ${mainDbPath}`);
|
|
1790
1537
|
}
|
|
1791
1538
|
}
|
|
@@ -1798,9 +1545,9 @@ export function mergeMilestoneToMain(
|
|
|
1798
1545
|
throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
|
|
1799
1546
|
}
|
|
1800
1547
|
|
|
1801
|
-
const
|
|
1802
|
-
if (!
|
|
1803
|
-
throw new GSDError(GSD_GIT_ERROR,
|
|
1548
|
+
const closeoutProof = proveMilestoneCloseout(milestoneId);
|
|
1549
|
+
if (!closeoutProof.ok) {
|
|
1550
|
+
throw new GSDError(GSD_GIT_ERROR, formatCloseoutProofBlock(closeoutProof));
|
|
1804
1551
|
}
|
|
1805
1552
|
}
|
|
1806
1553
|
|
|
@@ -2127,10 +1874,10 @@ export function mergeMilestoneToMain(
|
|
|
2127
1874
|
// stashing so Windows releases the handles; reopen after. No-op on
|
|
2128
1875
|
// POSIX, where advisory locks don't block git.
|
|
2129
1876
|
const needsDbCycle = process.platform === "win32" && isDbAvailable();
|
|
2130
|
-
const dbPathToReopen = needsDbCycle ?
|
|
1877
|
+
const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
|
|
2131
1878
|
if (needsDbCycle) {
|
|
2132
1879
|
try {
|
|
2133
|
-
|
|
1880
|
+
closeWorkflowDatabase();
|
|
2134
1881
|
} catch (err) {
|
|
2135
1882
|
logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2136
1883
|
}
|
|
@@ -2180,7 +1927,7 @@ export function mergeMilestoneToMain(
|
|
|
2180
1927
|
: nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
2181
1928
|
if (needsDbCycle && dbPathToReopen) {
|
|
2182
1929
|
try {
|
|
2183
|
-
|
|
1930
|
+
openWorkflowDatabasePath(dbPathToReopen);
|
|
2184
1931
|
} catch (err) {
|
|
2185
1932
|
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2186
1933
|
}
|
|
@@ -2544,7 +2291,7 @@ export function mergeMilestoneToMain(
|
|
|
2544
2291
|
stdio: ["ignore", "pipe", "pipe"],
|
|
2545
2292
|
encoding: "utf-8",
|
|
2546
2293
|
});
|
|
2547
|
-
const prEvidence =
|
|
2294
|
+
const prEvidence = buildPullRequestEvidence({
|
|
2548
2295
|
milestoneId,
|
|
2549
2296
|
milestoneTitle,
|
|
2550
2297
|
changeType: "feat",
|
|
@@ -2553,7 +2300,7 @@ export function mergeMilestoneToMain(
|
|
|
2553
2300
|
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
2554
2301
|
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
2555
2302
|
});
|
|
2556
|
-
const prUrl =
|
|
2303
|
+
const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
|
|
2557
2304
|
head: milestoneBranch,
|
|
2558
2305
|
base: prTarget,
|
|
2559
2306
|
});
|
|
@@ -81,6 +81,7 @@ import {
|
|
|
81
81
|
resolveAutoSupervisorConfig,
|
|
82
82
|
loadEffectiveGSDPreferences,
|
|
83
83
|
getIsolationMode,
|
|
84
|
+
resolveEffectiveUnitIsolationMode,
|
|
84
85
|
} from "./preferences.js";
|
|
85
86
|
import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
|
|
86
87
|
import type { GSDPreferences } from "./preferences.js";
|
|
@@ -185,6 +186,7 @@ import {
|
|
|
185
186
|
} from "./auto-worktree.js";
|
|
186
187
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
187
188
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
189
|
+
import { createMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
|
|
188
190
|
|
|
189
191
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
190
192
|
import {
|
|
@@ -225,8 +227,8 @@ import {
|
|
|
225
227
|
getMilestoneSlices,
|
|
226
228
|
getSlice,
|
|
227
229
|
getTask,
|
|
228
|
-
refreshOpenDatabaseFromDisk,
|
|
229
230
|
} from "./gsd-db.js";
|
|
231
|
+
import { closeWorkflowDatabase } from "./db-workspace.js";
|
|
230
232
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
231
233
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
232
234
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -320,7 +322,7 @@ export type {
|
|
|
320
322
|
UnitRouting,
|
|
321
323
|
StartModel,
|
|
322
324
|
} from "./auto/session.js";
|
|
323
|
-
import { autoSession as s } from "./auto-runtime-state.js";
|
|
325
|
+
import { autoSession as s, getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
|
|
324
326
|
import { gsdHome } from "./gsd-home.js";
|
|
325
327
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
326
328
|
import {
|
|
@@ -633,22 +635,24 @@ export function shouldUseWorktreeIsolation(basePath?: string): boolean {
|
|
|
633
635
|
|
|
634
636
|
type AutoIsolationMode = ReturnType<typeof getIsolationMode>;
|
|
635
637
|
|
|
636
|
-
function resolveEffectiveUnitIsolationMode(
|
|
637
|
-
configuredMode: AutoIsolationMode,
|
|
638
|
-
isolationDegraded: boolean,
|
|
639
|
-
): AutoIsolationMode {
|
|
640
|
-
return configuredMode === "worktree" && isolationDegraded ? "branch" : configuredMode;
|
|
641
|
-
}
|
|
642
|
-
|
|
643
638
|
export function _resolveEffectiveUnitIsolationModeForTest(
|
|
644
639
|
configuredMode: AutoIsolationMode,
|
|
645
640
|
isolationDegraded: boolean,
|
|
641
|
+
strandedRecoveryIsolationMode: "worktree" | "branch" | null = null,
|
|
646
642
|
): AutoIsolationMode {
|
|
647
|
-
return resolveEffectiveUnitIsolationMode(
|
|
643
|
+
return resolveEffectiveUnitIsolationMode(
|
|
644
|
+
configuredMode,
|
|
645
|
+
isolationDegraded,
|
|
646
|
+
strandedRecoveryIsolationMode,
|
|
647
|
+
);
|
|
648
648
|
}
|
|
649
649
|
|
|
650
650
|
function getEffectiveUnitIsolationMode(basePath: string): AutoIsolationMode {
|
|
651
|
-
return resolveEffectiveUnitIsolationMode(
|
|
651
|
+
return resolveEffectiveUnitIsolationMode(
|
|
652
|
+
getIsolationMode(basePath),
|
|
653
|
+
s.isolationDegraded,
|
|
654
|
+
s.strandedRecoveryIsolationMode,
|
|
655
|
+
);
|
|
652
656
|
}
|
|
653
657
|
|
|
654
658
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
@@ -791,6 +795,7 @@ export { type AutoDashboardData } from "./auto-dashboard.js";
|
|
|
791
795
|
|
|
792
796
|
export function getAutoDashboardData(): AutoDashboardData {
|
|
793
797
|
const ledger = getLedger();
|
|
798
|
+
const runtimeSnapshot = getAutoRuntimeSnapshot();
|
|
794
799
|
const totals = ledger ? getProjectTotals(ledger.units) : null;
|
|
795
800
|
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
|
|
796
801
|
const rtkSavings = sessionId && s.basePath
|
|
@@ -822,6 +827,7 @@ export function getAutoDashboardData(): AutoDashboardData {
|
|
|
822
827
|
pendingCaptureCount,
|
|
823
828
|
rtkSavings,
|
|
824
829
|
rtkEnabled,
|
|
830
|
+
toolSurface: runtimeSnapshot.toolSurface,
|
|
825
831
|
};
|
|
826
832
|
}
|
|
827
833
|
|
|
@@ -1476,12 +1482,17 @@ export async function stopAuto(
|
|
|
1476
1482
|
// worktree was active, and whether the current milestone was merged before
|
|
1477
1483
|
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
1478
1484
|
try {
|
|
1479
|
-
const {
|
|
1485
|
+
const {
|
|
1486
|
+
autoExitReasonForTerminalOutcome,
|
|
1487
|
+
emitAutoExit,
|
|
1488
|
+
normalizeAutoExitReason,
|
|
1489
|
+
} = await import("./worktree-telemetry.js");
|
|
1480
1490
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
1481
1491
|
// aggregator buckets stably. Raw detail is preserved in the phases.ts
|
|
1482
1492
|
// notification and the notify'd error string.
|
|
1483
1493
|
const rawReason = reason ?? "stop";
|
|
1484
|
-
const normalizedReason =
|
|
1494
|
+
const normalizedReason = autoExitReasonForTerminalOutcome(options.terminalOutcome)
|
|
1495
|
+
?? normalizeAutoExitReason(rawReason);
|
|
1485
1496
|
const telemetryBase = s.originalBasePath || s.basePath;
|
|
1486
1497
|
emitAutoExit(telemetryBase, {
|
|
1487
1498
|
reason: normalizedReason,
|
|
@@ -1674,8 +1685,7 @@ export async function stopAuto(
|
|
|
1674
1685
|
// ── Step 6: DB cleanup ──
|
|
1675
1686
|
if (isDbAvailable()) {
|
|
1676
1687
|
try {
|
|
1677
|
-
|
|
1678
|
-
closeDatabase();
|
|
1688
|
+
closeWorkflowDatabase();
|
|
1679
1689
|
} catch (e) {
|
|
1680
1690
|
debugLog("db-close-failed", {
|
|
1681
1691
|
error: e instanceof Error ? e.message : String(e),
|
|
@@ -2143,7 +2153,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2143
2153
|
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
2144
2154
|
//
|
|
2145
2155
|
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
2146
|
-
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
2156
|
+
// worktreeProjection, mergeMilestoneToMain transaction runner). Down from 18 at slice-7
|
|
2147
2157
|
// closure.
|
|
2148
2158
|
return {
|
|
2149
2159
|
gitServiceFactory: (basePath: string) => {
|
|
@@ -2152,7 +2162,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
|
2152
2162
|
return new GitServiceImpl(basePath, gitConfig);
|
|
2153
2163
|
},
|
|
2154
2164
|
worktreeProjection: new WorktreeStateProjection(),
|
|
2155
|
-
mergeMilestoneToMain,
|
|
2165
|
+
mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
|
|
2156
2166
|
};
|
|
2157
2167
|
}
|
|
2158
2168
|
|