@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.
Files changed (530) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/resources/.managed-resources-content-hash +1 -1
  5. package/dist/resources/extensions/ask-user-questions.js +78 -23
  6. package/dist/resources/extensions/bg-shell/utilities.js +2 -2
  7. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +92 -230
  9. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  10. package/dist/resources/extensions/github-sync/templates.js +3 -3
  11. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
  14. package/dist/resources/extensions/gsd/auto/phases.js +34 -4
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -9
  21. package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +20 -36
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  30. package/dist/resources/extensions/gsd/auto-worktree.js +34 -289
  31. package/dist/resources/extensions/gsd/auto.js +15 -14
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  33. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
  34. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +131 -140
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +89 -8
  37. package/dist/resources/extensions/gsd/captures.js +5 -13
  38. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  39. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  40. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  41. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  42. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  44. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  45. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  46. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  47. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  48. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  49. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  50. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  51. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  52. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  53. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  54. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  55. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  56. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  57. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  58. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  60. package/dist/resources/extensions/gsd/doctor-environment.js +8 -10
  61. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  62. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +9 -2
  63. package/dist/resources/extensions/gsd/doctor.js +16 -9
  64. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  65. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  66. package/dist/resources/extensions/gsd/git-service.js +1 -0
  67. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  68. package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
  69. package/dist/resources/extensions/gsd/guided-flow.js +68 -471
  70. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  71. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  72. package/dist/resources/extensions/gsd/mcp-filter.js +2 -1
  73. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  74. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  75. package/dist/resources/extensions/gsd/migrate/safety.js +19 -11
  76. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  77. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  78. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  79. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  80. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  81. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  82. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  83. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  84. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  85. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  86. package/dist/resources/extensions/gsd/model-router.js +3 -0
  87. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  88. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  89. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +7 -5
  90. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  91. package/dist/resources/extensions/gsd/paths.js +10 -24
  92. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  93. package/dist/resources/extensions/gsd/preferences.js +161 -29
  94. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  95. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  96. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  99. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  100. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  101. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  102. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  103. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  104. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  105. package/dist/resources/extensions/gsd/recovery-classification.js +12 -1
  106. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  107. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  108. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  109. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  110. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  111. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  112. package/dist/resources/extensions/gsd/state.js +13 -5
  113. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  114. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  115. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  116. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  118. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  119. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  120. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  121. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  122. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -5
  123. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  124. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  125. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  126. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  127. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  128. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  129. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  130. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  131. package/dist/resources/extensions/gsd/undo.js +8 -7
  132. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  133. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  134. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  135. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  136. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  137. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  138. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  139. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  140. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  141. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  142. package/dist/resources/extensions/gsd/worktree-git-recovery.js +287 -0
  143. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  144. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  145. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  146. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  147. package/dist/resources/extensions/gsd/worktree-root.js +17 -6
  148. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  149. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -10
  150. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  151. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  152. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  153. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  154. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  155. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  156. package/dist/update-cmd.js +20 -0
  157. package/dist/web/standalone/.next/BUILD_ID +1 -1
  158. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  159. package/dist/web/standalone/.next/build-manifest.json +3 -3
  160. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  161. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  162. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/index.html +1 -1
  213. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  220. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  221. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  225. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  226. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  227. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  231. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  233. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  235. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  236. package/dist/web-mode.d.ts +2 -0
  237. package/dist/web-mode.js +20 -8
  238. package/dist/worktree-status-banner.js +7 -3
  239. package/package.json +2 -1
  240. package/packages/cloud-mcp-gateway/package.json +2 -2
  241. package/packages/contracts/package.json +1 -1
  242. package/packages/daemon/package.json +4 -4
  243. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  244. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  245. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  246. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  247. package/packages/gsd-agent-core/package.json +5 -5
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  257. package/packages/gsd-agent-modes/package.json +7 -7
  258. package/packages/mcp-server/dist/server.d.ts +10 -0
  259. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  260. package/packages/mcp-server/dist/server.js +8 -0
  261. package/packages/mcp-server/dist/server.js.map +1 -1
  262. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  263. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  264. package/packages/mcp-server/dist/workflow-tools.js +32 -22
  265. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  266. package/packages/mcp-server/package.json +3 -3
  267. package/packages/native/package.json +1 -1
  268. package/packages/pi-agent-core/package.json +1 -1
  269. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  270. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  271. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  272. package/packages/pi-ai/dist/models.generated.d.ts +295 -98
  273. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  274. package/packages/pi-ai/dist/models.generated.js +309 -154
  275. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  276. package/packages/pi-ai/package.json +1 -1
  277. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  279. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  280. package/packages/pi-coding-agent/package.json +7 -7
  281. package/packages/pi-tui/dist/components/input.js +1 -1
  282. package/packages/pi-tui/dist/components/input.js.map +1 -1
  283. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  284. package/packages/pi-tui/dist/keys.js +39 -30
  285. package/packages/pi-tui/dist/keys.js.map +1 -1
  286. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  287. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  288. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  289. package/packages/pi-tui/package.json +2 -2
  290. package/packages/rpc-client/package.json +2 -2
  291. package/pkg/package.json +1 -1
  292. package/src/resources/extensions/ask-user-questions.ts +87 -24
  293. package/src/resources/extensions/bg-shell/utilities.ts +2 -2
  294. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  295. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +114 -281
  296. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
  297. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  298. package/src/resources/extensions/github-sync/templates.ts +3 -3
  299. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  300. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  301. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  302. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  303. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  304. package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
  305. package/src/resources/extensions/gsd/auto/phases.ts +45 -4
  306. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  307. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  308. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  309. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  310. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  311. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -8
  312. package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
  313. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  314. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  315. package/src/resources/extensions/gsd/auto-start.ts +25 -34
  316. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  317. package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
  318. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
  319. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  320. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  321. package/src/resources/extensions/gsd/auto-worktree.ts +53 -306
  322. package/src/resources/extensions/gsd/auto.ts +27 -17
  323. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  324. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
  325. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  326. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +147 -153
  327. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +132 -6
  328. package/src/resources/extensions/gsd/captures.ts +5 -14
  329. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  330. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  331. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  332. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  333. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  334. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  335. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  336. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  337. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  338. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  339. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  340. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  341. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  342. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  343. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  344. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  345. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  346. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  347. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  348. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  349. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  350. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  351. package/src/resources/extensions/gsd/doctor-environment.ts +8 -11
  352. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  353. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -3
  354. package/src/resources/extensions/gsd/doctor.ts +15 -5
  355. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  356. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  357. package/src/resources/extensions/gsd/git-service.ts +1 -0
  358. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  359. package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
  360. package/src/resources/extensions/gsd/guided-flow.ts +81 -561
  361. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  362. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  363. package/src/resources/extensions/gsd/mcp-filter.ts +2 -1
  364. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  365. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  366. package/src/resources/extensions/gsd/migrate/safety.ts +17 -9
  367. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  368. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  369. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  370. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  371. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  372. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  373. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  374. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  375. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  376. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  377. package/src/resources/extensions/gsd/model-router.ts +3 -0
  378. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  379. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  380. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -5
  381. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  382. package/src/resources/extensions/gsd/paths.ts +9 -22
  383. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  384. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  385. package/src/resources/extensions/gsd/preferences.ts +191 -28
  386. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  387. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  388. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  389. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  390. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  391. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  392. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  393. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  394. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  395. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  396. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  397. package/src/resources/extensions/gsd/recovery-classification.ts +14 -1
  398. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  399. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  400. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  401. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  402. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  403. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  404. package/src/resources/extensions/gsd/state.ts +15 -5
  405. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  406. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  407. package/src/resources/extensions/gsd/templates/project.md +1 -0
  408. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  409. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  410. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  411. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  412. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
  413. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  414. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  415. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  416. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  417. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  418. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  419. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  420. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  421. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  422. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  423. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  424. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  425. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  426. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  427. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  428. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  429. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  430. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  431. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  432. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  433. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  434. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  435. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +5 -4
  436. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +1 -1
  437. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  438. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  439. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  440. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  441. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  442. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  443. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  444. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  445. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  446. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  447. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  448. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  449. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  450. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  451. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  452. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  453. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  454. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  455. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  456. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +185 -1
  457. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  458. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  459. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  460. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  461. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  462. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
  463. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  464. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  466. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  467. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  468. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  469. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  470. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  471. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  472. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  473. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  474. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  475. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  476. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  477. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  478. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  479. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  480. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  481. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  482. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  483. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  484. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  485. package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
  486. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  487. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  488. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  489. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  490. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -5
  491. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  492. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  493. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  494. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  495. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  496. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  497. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  498. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  499. package/src/resources/extensions/gsd/undo.ts +9 -8
  500. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  501. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  502. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  503. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  504. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  505. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  506. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  507. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  508. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  509. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  510. package/src/resources/extensions/gsd/worktree-git-recovery.ts +308 -0
  511. package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
  512. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  513. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  514. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  515. package/src/resources/extensions/gsd/worktree-root.ts +17 -6
  516. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  517. package/src/resources/extensions/gsd/worktree-session-state.ts +12 -10
  518. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  519. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  520. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  521. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  522. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  523. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  526. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  528. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  529. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_buildManifest.js +0 -0
  530. /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
- if (!validationFile) {
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. No VALIDATION.md was created.");
223
+ return setToolFailureRetry("You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.");
223
224
  }
224
- const validationContent = await loadFile(validationFile);
225
- if (!validationContent) {
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 exists but is empty.");
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 computedExpectedPath = expectedAutoWorktreePath(input.projectRoot, input.milestoneId);
47
- if (!computedExpectedPath || !samePath(expectedPath, computedExpectedPath)) {
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, resolve, sep as pathSep } from "node:path";
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, closeDatabase, openDatabase, getDbPath, } from "./gsd-db.js";
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, resolveGitDir, worktreePath, isInsideWorktreesDir, } from "./worktree-manager.js";
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, createDraftPR, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
21
- import { buildPrEvidence } from "./pr-evidence.js";
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, nativeMergeAbort, nativeWorktreeList, nativeLsFiles, } from "./native-git-bridge.js";
29
- import { CLOSEOUT_CONSISTENCY_BLOCKED_REASON, checkCloseoutConsistencyGate, formatCloseoutConsistencyBlock, } from "./closeout-consistency-gate.js";
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 { _finalizeProjectionForMergeImpl, _projectRootToWorktreeImpl, _projectWorktreeToRootImpl, } from "./worktree-state-projection.js";
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
- _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
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
- _projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
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
- // Direct layout: /.gsd/worktrees/
541
- const directMarker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
542
- let idx = base.indexOf(directMarker);
543
- if (idx === -1) {
544
- // Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
545
- const symlinkRe = new RegExp(`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`);
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 _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
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 = getDbPath();
1267
+ const activeDbPath = getWorkflowDatabasePath();
1523
1268
  if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
1524
- closeDatabase();
1525
- if (!openDatabase(mainDbPath)) {
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 closeoutGate = checkCloseoutConsistencyGate(milestoneId);
1539
- if (!closeoutGate.ok) {
1540
- throw new GSDError(GSD_GIT_ERROR, formatCloseoutConsistencyBlock(closeoutGate));
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 ? getDbPath() : null;
1588
+ const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
1844
1589
  if (needsDbCycle) {
1845
1590
  try {
1846
- closeDatabase();
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
- openDatabase(dbPathToReopen);
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 = buildPrEvidence({
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 = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
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 resolveEffectiveUnitIsolationMode(configuredMode, isolationDegraded) {
348
- return configuredMode === "worktree" && isolationDegraded ? "branch" : 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 = normalizeAutoExitReason(rawReason);
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
- const { closeDatabase } = await import("./gsd-db.js");
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() {