@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.b1abb545

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 (375) 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/claude-code-cli/stream-adapter.js +84 -228
  7. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  8. package/dist/resources/extensions/github-sync/templates.js +3 -3
  9. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  10. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  11. package/dist/resources/extensions/gsd/auto/orchestrator.js +109 -11
  12. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  13. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  14. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  15. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  19. package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
  20. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  21. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  22. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  23. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  24. package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
  25. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
  26. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  27. package/dist/resources/extensions/gsd/auto-worktree.js +21 -19
  28. package/dist/resources/extensions/gsd/auto.js +11 -7
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  30. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  31. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +100 -138
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  34. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  35. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  36. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  37. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  38. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  39. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  40. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  41. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  42. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  43. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  44. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  45. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  46. package/dist/resources/extensions/gsd/doctor.js +16 -9
  47. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  48. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  49. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  50. package/dist/resources/extensions/gsd/guided-flow.js +34 -468
  51. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  52. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  53. package/dist/resources/extensions/gsd/mcp-filter.js +2 -1
  54. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  55. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  56. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  57. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  58. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  59. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  60. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  61. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  62. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  63. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  64. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  65. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  66. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  67. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  68. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  69. package/dist/resources/extensions/gsd/preferences.js +147 -29
  70. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  71. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  72. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  73. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  74. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  75. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  77. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  78. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  79. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  80. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  81. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  82. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  83. package/dist/resources/extensions/gsd/state.js +13 -5
  84. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  85. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  86. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  87. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  88. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  89. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  90. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  91. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  92. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  93. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  94. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  95. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  96. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  97. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  98. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  99. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  100. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  101. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  102. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  103. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  104. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  105. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  106. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  107. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  108. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  109. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  110. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  111. package/dist/update-cmd.js +20 -0
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  114. package/dist/web/standalone/.next/build-manifest.json +3 -3
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  117. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.html +1 -1
  134. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  141. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  142. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  145. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  146. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  147. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  148. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  149. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  150. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  151. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  152. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  153. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  154. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  155. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  156. package/dist/web-mode.d.ts +2 -0
  157. package/dist/web-mode.js +20 -8
  158. package/package.json +2 -1
  159. package/packages/cloud-mcp-gateway/package.json +2 -2
  160. package/packages/contracts/package.json +1 -1
  161. package/packages/daemon/package.json +4 -4
  162. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  163. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  164. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  165. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  166. package/packages/gsd-agent-core/package.json +5 -5
  167. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  171. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  172. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  173. package/packages/gsd-agent-modes/package.json +7 -7
  174. package/packages/mcp-server/dist/server.d.ts +10 -0
  175. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  176. package/packages/mcp-server/dist/server.js +8 -0
  177. package/packages/mcp-server/dist/server.js.map +1 -1
  178. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  179. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  180. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  181. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  182. package/packages/mcp-server/package.json +3 -3
  183. package/packages/native/package.json +1 -1
  184. package/packages/pi-agent-core/package.json +1 -1
  185. package/packages/pi-ai/dist/models.generated.d.ts +8 -93
  186. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  187. package/packages/pi-ai/dist/models.generated.js +35 -120
  188. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  189. package/packages/pi-ai/package.json +1 -1
  190. package/packages/pi-coding-agent/package.json +7 -7
  191. package/packages/pi-tui/dist/components/input.js +1 -1
  192. package/packages/pi-tui/dist/components/input.js.map +1 -1
  193. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  194. package/packages/pi-tui/dist/keys.js +39 -30
  195. package/packages/pi-tui/dist/keys.js.map +1 -1
  196. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  197. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  198. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  199. package/packages/pi-tui/package.json +2 -2
  200. package/packages/rpc-client/package.json +2 -2
  201. package/pkg/package.json +1 -1
  202. package/src/resources/extensions/ask-user-questions.ts +87 -24
  203. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +108 -281
  204. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +240 -0
  205. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  206. package/src/resources/extensions/github-sync/templates.ts +3 -3
  207. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  208. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  209. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  210. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  211. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  212. package/src/resources/extensions/gsd/auto/orchestrator.ts +125 -12
  213. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  214. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  215. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  216. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  217. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  218. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  219. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  220. package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
  221. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  222. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  223. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  224. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  225. package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
  226. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
  227. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  228. package/src/resources/extensions/gsd/auto-worktree.ts +33 -26
  229. package/src/resources/extensions/gsd/auto.ts +15 -8
  230. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  231. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  232. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  233. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +116 -151
  234. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  235. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  236. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  237. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  238. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  239. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  240. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  241. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  242. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  243. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  244. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  245. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  246. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  247. package/src/resources/extensions/gsd/doctor.ts +15 -5
  248. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  249. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  250. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  251. package/src/resources/extensions/gsd/guided-flow.ts +47 -558
  252. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  253. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  254. package/src/resources/extensions/gsd/mcp-filter.ts +2 -1
  255. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  256. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  257. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  258. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  259. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  260. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  261. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  262. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  263. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  264. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  265. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  266. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  267. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  268. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  269. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  270. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  271. package/src/resources/extensions/gsd/preferences.ts +173 -28
  272. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  273. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  274. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  275. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  276. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  277. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  278. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  279. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  280. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  281. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  282. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  283. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  284. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  285. package/src/resources/extensions/gsd/state.ts +15 -5
  286. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  287. package/src/resources/extensions/gsd/templates/project.md +1 -0
  288. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  289. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  290. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  291. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  292. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  293. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  294. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  295. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  296. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  297. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  298. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  299. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  300. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  301. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  302. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  303. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  304. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  305. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  306. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  307. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  308. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  309. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  310. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  311. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  312. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  313. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  314. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  315. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  316. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  317. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  318. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  319. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  320. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  321. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  322. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  323. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  324. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  325. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  326. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  327. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  328. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  329. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  330. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  331. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  332. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  333. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  334. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  335. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  336. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  337. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  338. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  339. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  340. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  341. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  342. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  343. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  344. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  345. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  346. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  347. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  348. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  349. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  350. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  351. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  352. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  353. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  354. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  355. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  356. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  357. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  358. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  359. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  360. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  361. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  362. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  363. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  364. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  365. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  366. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  367. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  368. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  369. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  370. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  371. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  372. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  373. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  374. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → 3PtrU9qGPEXwNLWkIyiqk}/_buildManifest.js +0 -0
  375. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → 3PtrU9qGPEXwNLWkIyiqk}/_ssgManifest.js +0 -0
@@ -1,8 +1,19 @@
1
1
  import { execSync } from "node:child_process";
2
2
  import { existsSync, realpathSync } from "node:fs";
3
- import { dirname, resolve, sep } from "node:path";
3
+ import { basename, dirname, resolve, sep } from "node:path";
4
4
  import { fileURLToPath, pathToFileURL } from "node:url";
5
5
  import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
6
+ import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
7
+ import {
8
+ supportsStructuredQuestions,
9
+ usesWorkflowMcpTransport,
10
+ } from "./question-transport.js";
11
+ import {
12
+ WORKFLOW_TOOL_SURFACE_NAMES,
13
+ isWorkflowToolSurfaceName,
14
+ } from "./workflow-tool-surface.js";
15
+
16
+ export { supportsStructuredQuestions, usesWorkflowMcpTransport };
6
17
 
7
18
  type WorkflowExecutorsModule = typeof import("./tools/workflow-tool-executors.js");
8
19
 
@@ -42,73 +53,9 @@ export function resolveWorkflowMcpProjectRoot(sessionCwd: string): string {
42
53
  return resolved;
43
54
  }
44
55
 
45
- const MCP_WORKFLOW_TOOL_SURFACE = new Set([
46
- "gsd_cancel",
47
- "gsd_captures",
48
- "ask_user_questions",
49
- "gsd_capture_thought",
50
- "gsd_doctor",
51
- "gsd_execute",
52
- "gsd_memory_query",
53
- "gsd_memory_graph",
54
- "gsd_decision_save",
55
- "gsd_exec",
56
- "gsd_exec_search",
57
- "gsd_graph",
58
- "gsd_history",
59
- "gsd_knowledge",
60
- "gsd_progress",
61
- "gsd_query",
62
- "gsd_resume",
63
- "gsd_result",
64
- "gsd_resolve_blocker",
65
- "gsd_roadmap",
66
- "gsd_status",
67
- "gsd_complete_milestone",
68
- "gsd_complete_task",
69
- "gsd_complete_slice",
70
- "gsd_generate_milestone_id",
71
- "gsd_journal_query",
72
- "gsd_milestone_complete",
73
- "gsd_milestone_generate_id",
74
- "gsd_milestone_reopen",
75
- "gsd_checkpoint_db",
76
- "gsd_milestone_plan",
77
- "gsd_milestone_status",
78
- "gsd_milestone_validate",
79
- "gsd_plan_task",
80
- "gsd_plan_milestone",
81
- "gsd_plan_slice",
82
- "gsd_replan_slice",
83
- "gsd_reassess_roadmap",
84
- "gsd_reopen_milestone",
85
- "gsd_reopen_slice",
86
- "gsd_reopen_task",
87
- "gsd_requirement_save",
88
- "gsd_requirement_update",
89
- "gsd_roadmap_reassess",
90
- "gsd_save_decision",
91
- "gsd_save_gate_result",
92
- "gsd_save_requirement",
93
- "gsd_save_summary",
94
- "gsd_skip_slice",
95
- "gsd_slice_plan",
96
- "gsd_slice_replan",
97
- "gsd_slice_complete",
98
- "gsd_slice_reopen",
99
- "gsd_summary_save",
100
- "gsd_task_plan",
101
- "gsd_task_complete",
102
- "gsd_task_reopen",
103
- "gsd_update_requirement",
104
- "gsd_uat_exec",
105
- "gsd_uat_result_save",
106
- "gsd_validate_milestone",
107
- ]);
108
-
109
56
  /** Workflow MCP tools are validated by transport compatibility, not pi tool-compat profiles. */
110
57
  export function isWorkflowMcpSurfaceTool(toolName: string): boolean {
111
- return MCP_WORKFLOW_TOOL_SURFACE.has(toolName);
58
+ return isWorkflowToolSurfaceName(toolName);
112
59
  }
113
60
 
114
61
  function parseLookupOutput(output: Buffer | string): string {
@@ -276,8 +223,12 @@ function getBundledWorkflowWriteGateModulePath(): string | null {
276
223
 
277
224
  function getResolveTsHookPath(): string | null {
278
225
  const repoRoot = findGsdPiRepoRoot(dirname(fileURLToPath(import.meta.url)));
226
+ const sourceRepoRoot = repoRoot && basename(repoRoot) === "dist-test" ? dirname(repoRoot) : repoRoot;
279
227
  return firstExistingPath([
280
- ...(repoRoot
228
+ ...(sourceRepoRoot
229
+ ? [resolve(sourceRepoRoot, "src", "resources", "extensions", "gsd", "tests", "resolve-ts.mjs")]
230
+ : []),
231
+ ...(repoRoot && repoRoot !== sourceRepoRoot
281
232
  ? [resolve(repoRoot, "src", "resources", "extensions", "gsd", "tests", "resolve-ts.mjs")]
282
233
  : []),
283
234
  resolve(fileURLToPath(new URL("./tests/resolve-ts.mjs", import.meta.url))),
@@ -421,52 +372,13 @@ export function getRequiredWorkflowToolsForAutoUnit(unitType: string): string[]
421
372
  return getRequiredWorkflowToolsForUnit(unitType);
422
373
  }
423
374
 
424
- export function usesWorkflowMcpTransport(
425
- authMode: WorkflowCapabilityOptions["authMode"],
426
- baseUrl: string | undefined,
427
- ): boolean {
428
- return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
429
- }
430
-
431
- function hasAskUserQuestionsTool(activeTools: string[]): boolean {
432
- return activeTools.some((toolName) => {
433
- if (toolName === "ask_user_questions") return true;
434
- if (!toolName.startsWith("mcp__")) return false;
435
- const toolSeparator = toolName.indexOf("__", "mcp__".length);
436
- return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === "ask_user_questions";
437
- });
438
- }
439
-
440
375
  function hasRequiredTool(requiredTool: string, activeTools: string[]): boolean {
441
376
  return activeTools.some((toolName) => {
442
377
  if (toolName === requiredTool) return true;
443
- if (!toolName.startsWith("mcp__")) return false;
444
- const toolSeparator = toolName.indexOf("__", "mcp__".length);
445
- return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === requiredTool;
378
+ return mcpToolMatchesBaseName(toolName, requiredTool);
446
379
  });
447
380
  }
448
381
 
449
- function workflowMcpStructuredQuestionsOptIn(env: NodeJS.ProcessEnv = process.env): boolean {
450
- const value = env.GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS;
451
- return value === "1" || value === "true";
452
- }
453
-
454
- export function supportsStructuredQuestions(
455
- activeTools: string[],
456
- options: Pick<WorkflowCapabilityOptions, "authMode" | "baseUrl" | "env"> = {},
457
- ): boolean {
458
- if (!hasAskUserQuestionsTool(activeTools)) return false;
459
- if (usesWorkflowMcpTransport(options.authMode, options.baseUrl)) {
460
- // Claude Code local workflow-MCP exposes ask_user_questions, but form
461
- // elicitation can return an immediate cancel outside GSD's chat turn. Keep
462
- // checkpoints in plain chat unless a caller deliberately opts into testing
463
- // that transport.
464
- return workflowMcpStructuredQuestionsOptIn(options.env);
465
- }
466
-
467
- return true;
468
- }
469
-
470
382
  export function getWorkflowTransportSupportError(
471
383
  provider: string | undefined,
472
384
  requiredTools: string[],
@@ -488,13 +400,13 @@ export function getWorkflowTransportSupportError(
488
400
 
489
401
  const uniqueRequired = [...new Set(requiredTools)];
490
402
  const missing = (options.activeTools && options.activeTools.length > 0)
491
- ? uniqueRequired.filter((tool) => !hasRequiredTool(tool, options.activeTools!))
492
- : uniqueRequired.filter((tool) => !MCP_WORKFLOW_TOOL_SURFACE.has(tool));
403
+ ? uniqueRequired.filter((tool) => !isWorkflowToolSurfaceName(tool) && !hasRequiredTool(tool, options.activeTools!))
404
+ : uniqueRequired.filter((tool) => !isWorkflowToolSurfaceName(tool));
493
405
  if (missing.length === 0) return null;
494
406
 
495
407
  if (options.activeTools && options.activeTools.length > 0) {
496
408
  return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the active runtime toolset currently exposes only ${options.activeTools.slice().sort().join(", ")}.`;
497
409
  }
498
410
 
499
- return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${Array.from(MCP_WORKFLOW_TOOL_SURFACE).sort().join(", ")}.`;
411
+ return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${[...WORKFLOW_TOOL_SURFACE_NAMES].sort().join(", ")}.`;
500
412
  }
@@ -13,11 +13,11 @@ import {
13
13
  getMilestoneSlices,
14
14
  insertVerificationEvidence,
15
15
  upsertDecision,
16
- openDatabase,
17
16
  setTaskBlockerDiscovered,
18
17
  insertOrIgnoreSlice,
19
18
  insertOrIgnoreTask,
20
19
  } from "./gsd-db.js";
20
+ import { openWorkflowDatabasePath } from "./db-workspace.js";
21
21
  import { isClosedStatus } from "./status-guards.js";
22
22
  import { invalidateStateCache } from "./state.js";
23
23
  import { clearPathCache, resolveGsdPathContract } from "./paths.js";
@@ -500,7 +500,7 @@ function _reconcileWorktreeLogsInner(
500
500
  atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
501
501
 
502
502
  // Step 8: Replay into DB (wrapped in a transaction by replayEvents)
503
- openDatabase(resolveGsdPathContract(mainBasePath).projectDb);
503
+ openWorkflowDatabasePath(resolveGsdPathContract(mainBasePath).projectDb);
504
504
  replayEvents(merged);
505
505
 
506
506
  // Step 9: Write manifest
@@ -655,7 +655,7 @@ export function resolveConflict(
655
655
  writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
656
656
 
657
657
  // Replay resolved events through the DB (updates DB state)
658
- openDatabase(resolveGsdPathContract(basePath).projectDb);
658
+ openWorkflowDatabasePath(resolveGsdPathContract(basePath).projectDb);
659
659
  replayEvents(eventsToReplay);
660
660
  invalidateStateCache();
661
661
  clearPathCache();
@@ -0,0 +1,73 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Adapts shared workflow tool contracts into the extension runtime surface.
3
+
4
+ import {
5
+ CANONICAL_WORKFLOW_TOOL_NAMES as CONTRACT_CANONICAL_WORKFLOW_TOOL_NAMES,
6
+ WORKFLOW_TOOL_ALIAS_NAMES as CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES,
7
+ WORKFLOW_TOOL_CONTRACTS as CONTRACT_WORKFLOW_TOOL_CONTRACTS,
8
+ WORKFLOW_TOOL_NAMES as CONTRACT_WORKFLOW_TOOL_NAMES,
9
+ } from "@opengsd/contracts";
10
+ import { stripMcpToolPrefix } from "./mcp-tool-name.js";
11
+
12
+ export interface WorkflowToolAliasPair {
13
+ canonical: string;
14
+ alias: string;
15
+ }
16
+
17
+ export const WORKFLOW_TOOL_CONTRACTS = CONTRACT_WORKFLOW_TOOL_CONTRACTS;
18
+
19
+ export const CANONICAL_WORKFLOW_TOOL_NAMES = CONTRACT_CANONICAL_WORKFLOW_TOOL_NAMES;
20
+ export const WORKFLOW_TOOL_ALIAS_NAMES = CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES;
21
+ export const DB_WORKFLOW_TOOL_NAMES = CONTRACT_WORKFLOW_TOOL_NAMES;
22
+
23
+ export const WORKFLOW_TOOL_ALIAS_PAIRS: readonly WorkflowToolAliasPair[] =
24
+ WORKFLOW_TOOL_CONTRACTS.flatMap((tool) =>
25
+ tool.aliases.map((alias) => ({ canonical: tool.canonicalName, alias })),
26
+ );
27
+
28
+ export const WORKFLOW_TOOL_ALIAS_TO_CANONICAL: Readonly<Record<string, string>> =
29
+ Object.fromEntries(WORKFLOW_TOOL_ALIAS_PAIRS.map(({ alias, canonical }) => [alias, canonical]));
30
+
31
+ const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
32
+ "gsd_cancel",
33
+ "gsd_captures",
34
+ "ask_user_questions",
35
+ "gsd_doctor",
36
+ "gsd_execute",
37
+ "gsd_graph",
38
+ "gsd_history",
39
+ "gsd_knowledge",
40
+ "gsd_progress",
41
+ "gsd_query",
42
+ "gsd_result",
43
+ "gsd_resolve_blocker",
44
+ "gsd_roadmap",
45
+ "gsd_status",
46
+ ] as const;
47
+
48
+ export const WORKFLOW_TOOL_SURFACE_NAMES = [
49
+ ...WORKFLOW_MCP_ADAPTER_TOOL_NAMES,
50
+ ...DB_WORKFLOW_TOOL_NAMES,
51
+ ] as readonly string[];
52
+
53
+ const WORKFLOW_TOOL_SURFACE_NAME_SET = new Set(WORKFLOW_TOOL_SURFACE_NAMES);
54
+
55
+ export { stripMcpToolPrefix } from "./mcp-tool-name.js";
56
+
57
+ export function canonicalWorkflowSurfaceToolName(toolName: string): string {
58
+ const baseName = stripMcpToolPrefix(toolName);
59
+ return WORKFLOW_TOOL_ALIAS_TO_CANONICAL[baseName] ?? baseName;
60
+ }
61
+
62
+ export function isWorkflowSurfaceAliasTool(toolName: string): boolean {
63
+ const baseName = stripMcpToolPrefix(toolName);
64
+ return WORKFLOW_TOOL_ALIAS_TO_CANONICAL[baseName] !== undefined;
65
+ }
66
+
67
+ export function isWorkflowToolSurfaceName(toolName: string): boolean {
68
+ return WORKFLOW_TOOL_SURFACE_NAME_SET.has(stripMcpToolPrefix(toolName));
69
+ }
70
+
71
+ export function aliasesForWorkflowTool(canonicalName: string): readonly string[] {
72
+ return WORKFLOW_TOOL_CONTRACTS.find((tool) => tool.canonicalName === canonicalName)?.aliases ?? [];
73
+ }
@@ -14,6 +14,7 @@ export function isWorkspaceGitAllowedCommand(trimmed: string): boolean {
14
14
 
15
15
  const [name, subcommand] = command.split(/\s+/, 2);
16
16
  if (name === "doctor") return true;
17
+ if (name === "forensics") return true;
17
18
  if (name === "closeout" || command.startsWith("closeout")) return true;
18
19
  if (name === "dispatch") {
19
20
  return subcommand === "complete" || subcommand === "complete-milestone";
@@ -79,6 +79,7 @@ import {
79
79
  teardownAutoWorktree,
80
80
  } from "./auto-worktree.js";
81
81
  import { resolveRoadmapForMilestoneMerge } from "./milestone-merge-roadmap.js";
82
+ import type { MilestoneMergeTransactionRunner } from "./milestone-merge-transaction.js";
82
83
 
83
84
  const recentWorktreeMergeFailures = new Map<string, number>();
84
85
  const MERGE_FAILURE_DEDUPE_MS = 60_000;
@@ -147,25 +148,15 @@ export interface WorktreeLifecycleDeps {
147
148
  */
148
149
  worktreeProjection: WorktreeStateProjection;
149
150
 
150
- // ── Merge primitive ──────────────────────────────────────────────────
151
+ // ── Merge transaction ────────────────────────────────────────────────
151
152
  /**
152
- * Inner squash-merge primitive (`auto-worktree.ts:mergeMilestoneToMain`).
153
+ * Milestone Merge Transaction Module runner.
153
154
  *
154
- * **Module-internal seam do not construct your own.** Only the wiring
155
- * factory `auto.ts:buildWorktreeLifecycleDeps()` is permitted to populate
156
- * this field. The primitive is `@internal`; production callers reach the
157
- * merge body through `WorktreeLifecycle.exitMilestone({ merge: true })`,
158
- * never by calling this dep directly.
155
+ * The field name is preserved for existing test fixtures, but production
156
+ * wiring now supplies the named transaction wrapper rather than the raw
157
+ * squash-merge primitive directly.
159
158
  */
160
- mergeMilestoneToMain: (
161
- basePath: string,
162
- milestoneId: string,
163
- roadmapContent: string,
164
- ) => {
165
- pushed: boolean;
166
- codeFilesChanged: boolean;
167
- commitMessage?: string;
168
- };
159
+ mergeMilestoneToMain: MilestoneMergeTransactionRunner;
169
160
 
170
161
  // ADR-016 phase 2 / C1 + C2 + C3 + C4 inlined the following fields as
171
162
  // direct imports — leaf primitives that did not vary across callers:
@@ -74,6 +74,30 @@ const VERDICT_RE = /verdict:\s*[\w-]+/i;
74
74
  * Only overwrites when the source has a verdict — never clobbers a
75
75
  * worktree ASSESSMENT with a verdictless project-root copy.
76
76
  */
77
+ function forceOverwriteValidationWithVerdict(
78
+ srcMilestoneDir: string,
79
+ dstMilestoneDir: string,
80
+ milestoneId: string,
81
+ ): void {
82
+ if (!existsSync(srcMilestoneDir) || !milestoneId) return;
83
+
84
+ const srcFile = join(srcMilestoneDir, `${milestoneId}-VALIDATION.md`);
85
+ if (!existsSync(srcFile)) return;
86
+
87
+ try {
88
+ const srcContent = readFileSync(srcFile, "utf-8");
89
+ if (!VERDICT_RE.test(srcContent)) return;
90
+
91
+ mkdirSync(dstMilestoneDir, { recursive: true });
92
+ safeCopy(srcFile, join(dstMilestoneDir, `${milestoneId}-VALIDATION.md`), { force: true });
93
+ } catch (err) {
94
+ logWarning(
95
+ "worktree",
96
+ `validation force-copy failed: ${err instanceof Error ? err.message : String(err)}`,
97
+ );
98
+ }
99
+ }
100
+
77
101
  function forceOverwriteAssessmentsWithVerdict(
78
102
  srcMilestoneDir: string,
79
103
  dstMilestoneDir: string,
@@ -260,10 +284,10 @@ export function _projectRootToWorktreeImpl(
260
284
  // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
261
285
  // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
262
286
  // run-uat indefinitely (stuck-loop ×9).
263
- forceOverwriteAssessmentsWithVerdict(
264
- join(prGsd, "milestones", milestoneId),
265
- join(wtGsd, "milestones", milestoneId),
266
- );
287
+ const prMilestoneDir = join(prGsd, "milestones", milestoneId);
288
+ const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
289
+ forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
290
+ forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
267
291
 
268
292
  // Forward-sync completed-units.json from project root to worktree.
269
293
  // Project root is authoritative for completion state after crash recovery;
@@ -442,25 +466,41 @@ export class WorktreeStateProjection {
442
466
  * any Unit dispatches.
443
467
  */
444
468
  projectRootToWorktree(scope: MilestoneScope): void {
445
- _projectRootToWorktreeImpl(
469
+ this.projectRootToWorktreePaths(
446
470
  scope.workspace.projectRoot,
447
471
  scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
448
472
  scope.milestoneId,
449
473
  );
450
474
  }
451
475
 
476
+ projectRootToWorktreePaths(
477
+ projectRoot: string,
478
+ worktreePath: string,
479
+ milestoneId: string | null,
480
+ ): void {
481
+ _projectRootToWorktreeImpl(projectRoot, worktreePath, milestoneId);
482
+ }
483
+
452
484
  /**
453
485
  * Project state from the auto-worktree back onto the project root for `scope`.
454
486
  * Called by the post-unit pipeline between Units.
455
487
  */
456
488
  projectWorktreeToRoot(scope: MilestoneScope): void {
457
- _projectWorktreeToRootImpl(
489
+ this.projectWorktreeToRootPaths(
458
490
  scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
459
491
  scope.workspace.projectRoot,
460
492
  scope.milestoneId,
461
493
  );
462
494
  }
463
495
 
496
+ projectWorktreeToRootPaths(
497
+ worktreePath: string,
498
+ projectRoot: string,
499
+ milestoneId: string | null,
500
+ ): void {
501
+ _projectWorktreeToRootImpl(worktreePath, projectRoot, milestoneId);
502
+ }
503
+
464
504
  /**
465
505
  * Final projection from the auto-worktree to the project root before
466
506
  * teardown. Called by Lifecycle's exit path after a successful merge,
@@ -471,10 +511,18 @@ export class WorktreeStateProjection {
471
511
  * telemetry on what crossed the boundary.
472
512
  */
473
513
  finalizeProjectionForMerge(scope: MilestoneScope): { synced: string[] } {
474
- return _finalizeProjectionForMergeImpl(
514
+ return this.finalizeProjectionForMergePaths(
475
515
  scope.workspace.projectRoot,
476
516
  scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
477
517
  scope.milestoneId,
478
518
  );
479
519
  }
520
+
521
+ finalizeProjectionForMergePaths(
522
+ projectRoot: string,
523
+ worktreePath: string,
524
+ milestoneId: string,
525
+ ): { synced: string[] } {
526
+ return _finalizeProjectionForMergeImpl(projectRoot, worktreePath, milestoneId);
527
+ }
480
528
  }
@@ -22,6 +22,7 @@
22
22
  import { randomUUID } from "node:crypto";
23
23
  import { emitJournalEvent, queryJournal } from "./journal.js";
24
24
  import type { JournalEntry } from "./journal.js";
25
+ import type { AutoTerminalOutcome } from "./auto/contracts.js";
25
26
 
26
27
  function now(): string {
27
28
  return new Date().toISOString();
@@ -91,6 +92,21 @@ export function normalizeAutoExitReason(rawReason?: string): AutoExitReason {
91
92
  : "other";
92
93
  }
93
94
 
95
+ export function autoExitReasonForTerminalOutcome(
96
+ outcome: AutoTerminalOutcome | undefined,
97
+ ): AutoExitReason | null {
98
+ switch (outcome?.code) {
99
+ case "all-complete":
100
+ return "all-complete";
101
+ case "settlement-blocked":
102
+ return "blocked";
103
+ case "no-remaining-units":
104
+ return "stop";
105
+ default:
106
+ return null;
107
+ }
108
+ }
109
+
94
110
  // ─── Emitters ────────────────────────────────────────────────────────────
95
111
 
96
112
  export function emitWorktreeCreated(
@@ -62,6 +62,13 @@ export interface RoundResult {
62
62
  /** Always false — end is handled by showWrapUpScreen, not per-question */
63
63
  endInterview: false;
64
64
  answers: Record<string, { selected: string | string[]; notes: string }>;
65
+ /**
66
+ * Set to true only when the round ended because the external AbortSignal
67
+ * fired (e.g. a system/host teardown), as distinct from a deliberate user
68
+ * dismissal. Consumers use this to avoid laundering a system teardown into a
69
+ * clean user-declined cancel. Additive/optional — native consumers ignore it.
70
+ */
71
+ interrupted?: boolean;
65
72
  }
66
73
 
67
74
  export interface WrapUpResult {
@@ -97,6 +104,12 @@ export interface InterviewRoundOptions {
97
104
  * Defaults to "end interview".
98
105
  */
99
106
  exitLabel?: string;
107
+ /**
108
+ * Render as a floating overlay instead of replacing the editor. Use when the
109
+ * interview must stay visible during an in-flight agent stream (e.g. claude-code-cli
110
+ * MCP elicitation).
111
+ */
112
+ overlay?: boolean;
100
113
  }
101
114
 
102
115
  export interface WrapUpOptions {
@@ -240,7 +253,7 @@ export async function showInterviewRound(
240
253
 
241
254
  // External cancellation (e.g. remote channel won the race)
242
255
  if (opts.signal) {
243
- const onAbort = () => finish({ endInterview: false, answers: {} });
256
+ const onAbort = () => finish({ endInterview: false, answers: {}, interrupted: true });
244
257
  if (opts.signal.aborted) { onAbort(); }
245
258
  else {
246
259
  opts.signal.addEventListener("abort", onAbort, { once: true });
@@ -845,5 +858,5 @@ export async function showInterviewRound(
845
858
  invalidate: () => { cachedLines = undefined; },
846
859
  handleInput,
847
860
  };
848
- });
861
+ }, opts.overlay ? { overlay: true } : undefined);
849
862
  }