@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
@@ -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, sep as pathSep } from "node:path";
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, createDraftPR, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
57
- import { buildPrEvidence } from "./pr-evidence.js";
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
- _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
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
- _projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
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
- // Direct layout: /.gsd/worktrees/
656
- const directMarker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
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
- const projectRoot = base.slice(0, idx);
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 _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
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 = getDbPath();
1532
+ const activeDbPath = getWorkflowDatabasePath();
1786
1533
  if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
1787
- closeDatabase();
1788
- if (!openDatabase(mainDbPath)) {
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 closeoutGate = checkCloseoutConsistencyGate(milestoneId);
1802
- if (!closeoutGate.ok) {
1803
- throw new GSDError(GSD_GIT_ERROR, formatCloseoutConsistencyBlock(closeoutGate));
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 ? getDbPath() : null;
1877
+ const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
2131
1878
  if (needsDbCycle) {
2132
1879
  try {
2133
- closeDatabase();
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
- openDatabase(dbPathToReopen);
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 = buildPrEvidence({
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 = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
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(configuredMode, isolationDegraded);
643
+ return resolveEffectiveUnitIsolationMode(
644
+ configuredMode,
645
+ isolationDegraded,
646
+ strandedRecoveryIsolationMode,
647
+ );
648
648
  }
649
649
 
650
650
  function getEffectiveUnitIsolationMode(basePath: string): AutoIsolationMode {
651
- return resolveEffectiveUnitIsolationMode(getIsolationMode(basePath), s.isolationDegraded);
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 { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
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 = normalizeAutoExitReason(rawReason);
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
- const { closeDatabase } = await import("./gsd-db.js");
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