@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33

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 (575) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +123 -20
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  14. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  15. package/dist/resources/extensions/async-jobs/index.js +65 -0
  16. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  17. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  18. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  19. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  20. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  21. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +30 -4
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
  33. package/dist/resources/extensions/gsd/auto/phases.js +49 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
  46. package/dist/resources/extensions/gsd/auto.js +41 -14
  47. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  48. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  49. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
  50. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  51. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  52. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  53. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  54. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  55. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  56. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  57. package/dist/resources/extensions/gsd/captures.js +4 -6
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  65. package/dist/resources/extensions/gsd/db/queries.js +26 -0
  66. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  67. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  68. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  69. package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
  70. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  71. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  72. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  73. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  74. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  75. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  76. package/dist/resources/extensions/gsd/files.js +33 -19
  77. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  78. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  79. package/dist/resources/extensions/gsd/guidance.js +158 -0
  80. package/dist/resources/extensions/gsd/guided-flow.js +23 -5
  81. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  82. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  83. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  84. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  85. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  86. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  87. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  88. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  89. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  90. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  91. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  92. package/dist/resources/extensions/gsd/paths.js +27 -0
  93. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  94. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  95. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  96. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  97. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  100. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  103. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  104. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  108. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  109. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  116. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  117. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  118. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  119. package/dist/resources/extensions/gsd/state.js +6 -20
  120. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  121. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  122. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  123. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  124. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  125. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  126. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  129. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  132. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  133. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  134. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  135. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  136. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  137. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  138. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  139. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  140. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  141. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  142. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  143. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  144. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  145. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  146. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  147. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  148. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  149. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  150. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  151. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  152. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  153. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  154. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  155. package/dist/resources/extensions/gsd/worktree.js +8 -1
  156. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  157. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  158. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  159. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  160. package/dist/resources/shared/package-manager-detection.js +1 -1
  161. package/dist/resources/shared/package.json +3 -0
  162. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  163. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  164. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  165. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  166. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  167. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  168. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  169. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  170. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  171. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  172. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  173. package/dist/update-check.d.ts +2 -0
  174. package/dist/update-check.js +24 -1
  175. package/dist/update-cmd.js +20 -3
  176. package/dist/web/standalone/.next/BUILD_ID +1 -1
  177. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  178. package/dist/web/standalone/.next/build-manifest.json +3 -3
  179. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  180. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  207. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  215. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  216. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  217. package/dist/web/standalone/package.json +1 -1
  218. package/dist/worktree-cli.js +3 -6
  219. package/dist/worktree-status-banner.js +7 -15
  220. package/package.json +2 -2
  221. package/packages/cloud-mcp-gateway/package.json +2 -2
  222. package/packages/contracts/dist/rpc.d.ts +1 -0
  223. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  224. package/packages/contracts/dist/rpc.js.map +1 -1
  225. package/packages/contracts/dist/workflow.d.ts +4 -0
  226. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  227. package/packages/contracts/dist/workflow.js.map +1 -1
  228. package/packages/contracts/package.json +1 -1
  229. package/packages/daemon/package.json +4 -4
  230. package/packages/gsd-agent-core/package.json +5 -5
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  249. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  250. package/packages/gsd-agent-modes/package.json +7 -7
  251. package/packages/mcp-server/dist/cli.js +9 -1
  252. package/packages/mcp-server/dist/cli.js.map +1 -1
  253. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  254. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  255. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  256. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  257. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  258. package/packages/mcp-server/dist/server.js +4 -0
  259. package/packages/mcp-server/dist/server.js.map +1 -1
  260. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  261. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  262. package/packages/mcp-server/dist/workflow-tools.js +116 -39
  263. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  264. package/packages/mcp-server/package.json +5 -4
  265. package/packages/native/package.json +1 -1
  266. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  267. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  268. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  269. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  270. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  271. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  272. package/packages/pi-agent-core/dist/index.js +3 -0
  273. package/packages/pi-agent-core/dist/index.js.map +1 -1
  274. package/packages/pi-agent-core/package.json +1 -1
  275. package/packages/pi-ai/README.md +1 -0
  276. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  277. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  278. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  279. package/packages/pi-ai/dist/index.d.ts +2 -0
  280. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  281. package/packages/pi-ai/dist/index.js +2 -0
  282. package/packages/pi-ai/dist/index.js.map +1 -1
  283. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  284. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/models.generated.js +46 -120
  286. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  289. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  290. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  291. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  293. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  294. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  296. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  297. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  298. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  299. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  300. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  301. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  303. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  304. package/packages/pi-ai/package.json +3 -2
  305. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  306. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  308. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  311. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  313. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  315. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  317. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/index.js +1 -1
  319. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  321. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  323. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  324. package/packages/pi-coding-agent/package.json +7 -7
  325. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  326. package/packages/pi-tui/dist/tui.js +9 -0
  327. package/packages/pi-tui/dist/tui.js.map +1 -1
  328. package/packages/pi-tui/package.json +2 -2
  329. package/packages/rpc-client/package.json +2 -2
  330. package/pkg/package.json +1 -1
  331. package/src/resources/GSD-WORKFLOW.md +5 -4
  332. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  333. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  334. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  335. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  336. package/src/resources/extensions/async-jobs/index.ts +79 -0
  337. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  338. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  339. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  340. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  341. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  342. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  343. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  344. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  345. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  346. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  347. package/src/resources/extensions/browser-tools/index.ts +71 -13
  348. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  349. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  350. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  351. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
  352. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  353. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  354. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  355. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  356. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  357. package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
  358. package/src/resources/extensions/gsd/auto/phases.ts +65 -26
  359. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  360. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  361. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  362. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  363. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  364. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  365. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  366. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  367. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  368. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  369. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  370. package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
  371. package/src/resources/extensions/gsd/auto.ts +52 -16
  372. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  373. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  374. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
  375. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  376. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  377. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  378. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  379. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  380. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  381. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  382. package/src/resources/extensions/gsd/captures.ts +4 -6
  383. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  384. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  385. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  386. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  387. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  388. package/src/resources/extensions/gsd/constants.ts +0 -3
  389. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  390. package/src/resources/extensions/gsd/db/queries.ts +37 -0
  391. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  392. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  393. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  394. package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
  395. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  396. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  397. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  398. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  399. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  400. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  401. package/src/resources/extensions/gsd/files.ts +33 -12
  402. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  403. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  404. package/src/resources/extensions/gsd/guidance.ts +217 -0
  405. package/src/resources/extensions/gsd/guided-flow.ts +37 -28
  406. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  407. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  408. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  409. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  410. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  411. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  412. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  413. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  414. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  415. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  416. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  417. package/src/resources/extensions/gsd/paths.ts +33 -0
  418. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  419. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  420. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  421. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  422. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  423. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  424. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  426. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  427. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  428. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  429. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  430. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  431. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  432. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  433. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  434. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  435. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  437. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  438. package/src/resources/extensions/gsd/publication.ts +122 -0
  439. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  440. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  441. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  442. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  443. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  444. package/src/resources/extensions/gsd/state.ts +9 -21
  445. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  446. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  447. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  448. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  449. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  450. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  451. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  452. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  453. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  454. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  455. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  456. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  457. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  458. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  459. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  460. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  461. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  462. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  463. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  464. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  465. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  466. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  467. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  468. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  469. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  470. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  471. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  472. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  473. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  474. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  475. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  476. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  477. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
  478. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  479. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  480. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  481. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  482. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  483. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  484. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  485. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  486. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  487. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  488. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  489. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  490. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  491. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  492. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  493. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  494. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  495. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  496. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  497. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  498. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  499. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  500. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  501. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  502. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  503. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  504. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  505. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  506. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  507. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  508. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  510. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  512. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  513. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  514. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  515. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  516. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  517. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  518. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  519. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  520. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  521. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  522. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  523. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  524. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  525. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  526. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  527. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  528. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  529. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  530. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  531. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  532. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  533. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  534. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  535. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  536. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  537. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  538. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  539. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  540. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  541. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  542. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  543. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  544. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  545. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  546. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  547. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  548. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  549. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  550. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  551. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  552. package/src/resources/extensions/gsd/worktree.ts +7 -1
  553. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  554. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  555. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  556. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  557. package/src/resources/shared/package-manager-detection.ts +1 -1
  558. package/src/resources/shared/package.json +3 -0
  559. package/src/resources/skills/create-skill/SKILL.md +3 -0
  560. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  561. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  562. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  563. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  564. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  565. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  566. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  567. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  568. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  569. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  570. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  571. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  572. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  573. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  574. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
  575. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
@@ -33,6 +33,24 @@ export interface UnitActivitySnapshot {
33
33
  assistantMessages: number;
34
34
  }
35
35
 
36
+ export interface AutoUnitCloseoutRequest {
37
+ ctx: ExtensionContext;
38
+ basePath: string;
39
+ unitType: string;
40
+ unitId: string;
41
+ startedAt: number;
42
+ opts?: CloseoutOptions;
43
+ }
44
+
45
+ export interface AutoUnitCloseoutResult {
46
+ activityFile?: string;
47
+ gitTransactionRecorded: boolean;
48
+ }
49
+
50
+ type GitTransactionCloseoutOptions =
51
+ Required<Pick<CloseoutOptions, "traceId" | "turnId" | "gitAction" | "gitStatus">>
52
+ & Pick<CloseoutOptions, "gitPush" | "gitError">;
53
+
36
54
  export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
37
55
 
38
56
  export function snapshotUnitActivity(
@@ -76,25 +94,27 @@ export function isSuspiciousGhostCompletion(
76
94
  }
77
95
 
78
96
  /**
79
- * Snapshot metrics, save activity log, and fire-and-forget memory extraction
80
- * for a completed unit. Returns the activity log file path (if any).
97
+ * Snapshot metrics, save activity log, extract memories, and record the git
98
+ * transaction for a completed auto-mode unit.
81
99
  */
82
- export async function closeoutUnit(
83
- ctx: ExtensionContext,
84
- basePath: string,
85
- unitType: string,
86
- unitId: string,
87
- startedAt: number,
88
- opts?: CloseoutOptions,
89
- ): Promise<string | undefined> {
90
- const modelId = ctx.model?.id ?? "unknown";
91
- snapshotUnitMetrics(ctx, unitType, unitId, startedAt, modelId, opts);
92
- const activityFile = saveActivityLog(ctx, basePath, unitType, unitId);
100
+ export async function closeoutAutoUnit(
101
+ request: AutoUnitCloseoutRequest,
102
+ ): Promise<AutoUnitCloseoutResult> {
103
+ const modelId = request.ctx.model?.id ?? "unknown";
104
+ snapshotUnitMetrics(
105
+ request.ctx,
106
+ request.unitType,
107
+ request.unitId,
108
+ request.startedAt,
109
+ modelId,
110
+ request.opts,
111
+ );
112
+ const activityFile = saveActivityLog(request.ctx, request.basePath, request.unitType, request.unitId);
93
113
 
94
114
  if (activityFile) {
95
115
  try {
96
- const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import('./memory-extractor.js');
97
- const llmCallFn = buildMemoryLLMCall(ctx);
116
+ const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import("./memory-extractor.js");
117
+ const llmCallFn = buildMemoryLLMCall(request.ctx);
98
118
  if (llmCallFn) {
99
119
  // Awaited: a fire-and-forget here lets memory-extractor writes land in
100
120
  // .gsd/ after closeoutUnit returns but before the milestone merge
@@ -103,11 +123,11 @@ export async function closeoutUnit(
103
123
  // bounded by the extractor's LLM call, which is the acceptable price
104
124
  // for not racing the merge boundary.
105
125
  try {
106
- await extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn);
126
+ await extractMemoriesFromUnit(activityFile, request.unitType, request.unitId, llmCallFn);
107
127
  } catch (err) {
108
128
  logWarning(
109
129
  "engine",
110
- `memory extraction failed for ${unitType}/${unitId}: ${(err as Error).message}`,
130
+ `memory extraction failed for ${request.unitType}/${request.unitId}: ${(err as Error).message}`,
111
131
  );
112
132
  }
113
133
  }
@@ -116,23 +136,58 @@ export async function closeoutUnit(
116
136
  }
117
137
  }
118
138
 
119
- if (opts?.traceId && opts.turnId && opts.gitAction && opts.gitStatus) {
139
+ const gitTransaction = resolveGitTransactionOptions(request.opts);
140
+
141
+ if (gitTransaction) {
120
142
  writeTurnGitTransaction({
121
- basePath,
122
- traceId: opts.traceId,
123
- turnId: opts.turnId,
124
- unitType,
125
- unitId,
143
+ basePath: request.basePath,
144
+ traceId: gitTransaction.traceId,
145
+ turnId: gitTransaction.turnId,
146
+ unitType: request.unitType,
147
+ unitId: request.unitId,
126
148
  stage: "record",
127
- action: opts.gitAction,
128
- push: opts.gitPush === true,
129
- status: opts.gitStatus,
130
- error: opts.gitError,
149
+ action: gitTransaction.gitAction,
150
+ push: gitTransaction.gitPush === true,
151
+ status: gitTransaction.gitStatus,
152
+ error: gitTransaction.gitError,
131
153
  metadata: {
132
154
  activityFile,
133
155
  },
134
156
  });
135
157
  }
136
158
 
137
- return activityFile ?? undefined;
159
+ return {
160
+ ...(activityFile ? { activityFile } : {}),
161
+ gitTransactionRecorded: Boolean(gitTransaction),
162
+ };
163
+ }
164
+
165
+ function resolveGitTransactionOptions(
166
+ opts: CloseoutOptions | undefined,
167
+ ): GitTransactionCloseoutOptions | null {
168
+ if (!opts?.traceId || !opts.turnId || !opts.gitAction || !opts.gitStatus) return null;
169
+ return {
170
+ traceId: opts.traceId,
171
+ turnId: opts.turnId,
172
+ gitAction: opts.gitAction,
173
+ gitStatus: opts.gitStatus,
174
+ gitPush: opts.gitPush,
175
+ gitError: opts.gitError,
176
+ };
177
+ }
178
+
179
+ /**
180
+ * Compatibility wrapper for existing auto-loop callers. New code should prefer
181
+ * closeoutAutoUnit so the closeout request and result stay explicit.
182
+ */
183
+ export async function closeoutUnit(
184
+ ctx: ExtensionContext,
185
+ basePath: string,
186
+ unitType: string,
187
+ unitId: string,
188
+ startedAt: number,
189
+ opts?: CloseoutOptions,
190
+ ): Promise<string | undefined> {
191
+ const result = await closeoutAutoUnit({ ctx, basePath, unitType, unitId, startedAt, opts });
192
+ return result.activityFile;
138
193
  }
@@ -5,32 +5,25 @@ import {
5
5
  } from "./unit-tool-contracts.js";
6
6
  import {
7
7
  WORKFLOW_TOOL_ALIAS_PAIRS,
8
- canonicalWorkflowSurfaceToolName,
9
8
  isWorkflowSurfaceAliasTool,
10
9
  stripMcpToolPrefix,
11
10
  } from "./workflow-tool-surface.js";
11
+ import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
12
12
 
13
13
  export {
14
14
  AUTO_UNIT_SCOPED_TOOLS,
15
15
  RUN_UAT_BROWSER_TOOL_NAMES,
16
16
  } from "./unit-tool-contracts.js";
17
17
 
18
- const EXECUTE_TASK_UNIT_TYPES = new Set([
19
- "execute-task",
20
- "execute-task-simple",
21
- "reactive-execute",
22
- ]);
23
-
24
- // These units own quality gates, but their completion handlers persist verdicts
25
- // from artifact sections. gsd_save_gate_result belongs to gate-evaluate, so keep
26
- // blocking it here with a calm redirect to the section-write path.
27
- const SECTION_CLOSE_GATE_UNIT_TYPES = new Set([
28
- "execute-task",
29
- "execute-task-simple",
30
- "reactive-execute",
31
- "complete-slice",
32
- "validate-milestone",
33
- ]);
18
+ // Scope-class membership is declared per unit in the Unit Registry (ADR-033).
19
+ // EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
20
+ // Set additionally includes scopeClass "section-close" — units whose completion
21
+ // handlers persist gate verdicts from artifact sections (gsd_save_gate_result
22
+ // belongs to gate-evaluate, so it is soft-blocked with a redirect below).
23
+ import {
24
+ EXECUTE_TASK_UNIT_TYPES,
25
+ SECTION_CLOSE_GATE_UNIT_TYPES,
26
+ } from "./unit-registry.js";
34
27
 
35
28
  const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
36
29
  "gsd_skip_slice",
@@ -58,9 +51,9 @@ type AutoUnitToolScopeResult = {
58
51
  displayReason?: string;
59
52
  };
60
53
 
61
- export function canonicalWorkflowToolName(toolName: string): string {
62
- return canonicalWorkflowSurfaceToolName(toolName);
63
- }
54
+ // Normalizer seam lives in engine-hook-contract.ts; re-exported here for
55
+ // existing scope importers.
56
+ export { canonicalWorkflowToolName };
64
57
 
65
58
  export function isWorkflowAliasTool(toolName: string): boolean {
66
59
  return isWorkflowSurfaceAliasTool(toolName);
@@ -110,7 +103,7 @@ function isNativeWorkflowTool(toolName: string): boolean {
110
103
  return stripMcpToolPrefix(toolName) === "Workflow";
111
104
  }
112
105
 
113
- function readStringField(input: unknown, camel: string, snake: string): string | undefined {
106
+ export function readStringField(input: unknown, camel: string, snake: string): string | undefined {
114
107
  if (!input || typeof input !== "object") return undefined;
115
108
  const record = input as Record<string, unknown>;
116
109
  const value = record[camel] ?? record[snake];
@@ -15,7 +15,7 @@
15
15
 
16
16
  import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
17
17
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
18
- import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
18
+ import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath } from "./paths.js";
19
19
  import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
20
20
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
21
21
  import { parseUnitId } from "./unit-id.js";
@@ -25,8 +25,6 @@ import { loadEffectiveGSDPreferences } from "./preferences.js";
25
25
  import type { GSDPreferences } from "./preferences-types.js";
26
26
  import { isClosedStatus } from "./status-guards.js";
27
27
  import { loadFile } from "./files.js";
28
- import { parseRoadmap } from "./parsers-legacy.js";
29
- import { isMilestoneComplete } from "./state.js";
30
28
  import {
31
29
  runVerificationGate,
32
30
  runVerificationGateForTargets,
@@ -52,6 +50,7 @@ import { getSlice } from "./gsd-db.js";
52
50
  import { getLedger } from "./metrics.js";
53
51
  import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
54
52
  import { formatPostUnitStatusCard } from "./auto-status-message.js";
53
+ import { detectWebApp } from "./web-app-uat.js";
55
54
 
56
55
  export interface VerificationContext {
57
56
  s: AutoSession;
@@ -373,29 +372,13 @@ async function runValidateMilestonePostCheck(
373
372
  * DB-backed projects are authoritative (#4094 peer review); falls back to
374
373
  * roadmap parsing only when the DB is unavailable.
375
374
  */
376
- async function countIncompleteSlices(basePath: string, milestoneId: string): Promise<number> {
377
- if (isDbAvailable()) {
378
- const slices = getMilestoneSlices(milestoneId);
379
- if (slices.length === 0) {
380
- // No DB rows — treat as "unknown", do not pause.
381
- return 1;
382
- }
383
- return slices.filter((slice) => !isClosedStatus(slice.status)).length;
384
- }
385
-
386
- // Filesystem fallback: parse the roadmap markdown.
387
- try {
388
- const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
389
- if (!roadmapFile) return 1;
390
- const roadmapContent = await loadFile(roadmapFile);
391
- if (!roadmapContent) return 1;
392
- const roadmap = parseRoadmap(roadmapContent);
393
- if (roadmap.slices.length === 0) return 1;
394
- return isMilestoneComplete(roadmap) ? 0 : 1;
395
- } catch {
396
- // Parsing failures should not cause false-positive pauses.
397
- return 1;
398
- }
375
+ async function countIncompleteSlices(_basePath: string, milestoneId: string): Promise<number> {
376
+ // DB-authoritative (ADR-017): no markdown fallback. DB unavailable or no
377
+ // rows means "unknown" — do not pause.
378
+ if (!isDbAvailable()) return 1;
379
+ const slices = getMilestoneSlices(milestoneId);
380
+ if (slices.length === 0) return 1;
381
+ return slices.filter((slice) => !isClosedStatus(slice.status)).length;
399
382
  }
400
383
 
401
384
  /**
@@ -805,17 +788,32 @@ export async function runPostUnitVerification(
805
788
  s.verificationRetryFailureHashes.delete(retryKey);
806
789
  s.pendingVerificationRetry = null;
807
790
  return "continue";
791
+ } else if (
792
+ verdict.reason === "no-host-checks" &&
793
+ taskAlreadyComplete &&
794
+ detectWebApp(s.basePath) &&
795
+ !result.runtimeErrors?.some((e) => e.blocking)
796
+ ) {
797
+ s.verificationRetryCount.delete(retryKey);
798
+ s.verificationRetryFailureHashes.delete(retryKey);
799
+ s.pendingVerificationRetry = null;
800
+ ctx.ui.notify(
801
+ "No task-level host verification command was found for a completed browser-facing task; continuing so slice UAT can verify the UI with browser tools.",
802
+ "warning",
803
+ );
804
+ return "continue";
808
805
  } else if (verdict.reason === "no-host-checks") {
809
806
  s.verificationRetryCount.delete(retryKey);
810
807
  s.verificationRetryFailureHashes.delete(retryKey);
811
808
  s.pendingVerificationRetry = null;
809
+ const pauseMessage = `Verification failed: ${verdict.failureContext}`;
812
810
  ctx.ui.notify(
813
- "Verification gate FAILED — no runnable host-owned verification checks were discovered. Pausing for human review.",
811
+ `Verification gate FAILED — ${verdict.failureContext}`,
814
812
  "error",
815
813
  );
816
814
  process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
817
815
  await pauseAuto(ctx, pi, {
818
- message: "Verification failed: no runnable host-owned verification checks were discovered.",
816
+ message: pauseMessage,
819
817
  category: "unknown",
820
818
  });
821
819
  return "pause";
@@ -44,23 +44,21 @@ import {
44
44
  worktreePath,
45
45
  isInsideWorktreesDir,
46
46
  } from "./worktree-manager.js";
47
+ import { worktreePathFor } from "./worktree-placement.js";
47
48
  import {
48
49
  detectWorktreeName,
49
50
  resolveGitHeadPath,
50
51
  nudgeGitBranchCache,
51
52
  } from "./worktree.js";
52
53
  import {
53
- findWorktreeSegment,
54
54
  isGsdWorktreePath,
55
+ projectRootFromWorktreePath,
55
56
  normalizeWorktreePathForCompare,
56
57
  resolveWorktreeProjectRoot,
57
58
  } from "./worktree-root.js";
58
59
  import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
59
60
  import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
60
- import {
61
- buildPullRequestEvidence,
62
- createDraftPullRequestFromEvidence,
63
- } from "./pull-request-process.js";
61
+ import { publishMilestone } from "./publication.js";
64
62
  import { debugLog } from "./debug-logger.js";
65
63
  import { logWarning, logError } from "./workflow-logger.js";
66
64
  import {
@@ -73,9 +71,6 @@ import {
73
71
  stashAlreadyExistsFilesFromError,
74
72
  stashRefFromError,
75
73
  } 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";
79
74
  import { loadEffectiveGSDPreferences } from "./preferences.js";
80
75
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
81
76
  import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
@@ -290,19 +285,6 @@ export function _gitPathspecForWorktreePath(basePath: string, targetPath: string
290
285
  return gitPathspecForWorktreePath(basePath, targetPath);
291
286
  }
292
287
 
293
- function gitRemoteExists(basePath: string, remote: string): boolean {
294
- try {
295
- execFileSync("git", ["remote", "get-url", remote], {
296
- cwd: basePath,
297
- stdio: ["ignore", "pipe", "pipe"],
298
- encoding: "utf-8",
299
- });
300
- return true;
301
- } catch {
302
- return false;
303
- }
304
- }
305
-
306
288
  function findRegularMergeChangedPaths(basePath: string, milestoneBranch: string, mainBranch: string): Set<string> {
307
289
  const changedPaths = new Set<string>();
308
290
  let mergeLog = "";
@@ -520,12 +502,8 @@ export function checkResourcesStale(
520
502
  * Returns the corrected base path.
521
503
  */
522
504
  export function escapeStaleWorktree(base: string): string {
523
- const segment = findWorktreeSegment(base.replaceAll("\\", "/"));
524
- if (!segment) return base;
525
-
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);
505
+ const projectRoot = projectRootFromWorktreePath(base);
506
+ if (projectRoot === null) return base;
529
507
 
530
508
  // Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
531
509
  // the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
@@ -994,6 +972,14 @@ function _resolveIntegrationBranchForReuse(
994
972
  }
995
973
  }
996
974
 
975
+ function safeCwd(fallback: string): string {
976
+ try {
977
+ return process.cwd();
978
+ } catch {
979
+ return fallback;
980
+ }
981
+ }
982
+
997
983
  /**
998
984
  * When reusing an existing milestone branch, fast-forward it onto the
999
985
  * integration branch when that's safe (branch is a strict ancestor of
@@ -1177,7 +1163,7 @@ export function teardownAutoWorktree(
1177
1163
 
1178
1164
  const branch = autoWorktreeBranch(milestoneId);
1179
1165
  const { preserveBranch = false, preserveWorktree = false } = opts;
1180
- const previousCwd = process.cwd();
1166
+ const previousCwd = safeCwd(originalBasePath);
1181
1167
 
1182
1168
  // Wrap the entire teardown body in a single try/finally so activeWorkspace
1183
1169
  // is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
@@ -1307,7 +1293,9 @@ export function getAutoWorktreePath(
1307
1293
  ): string | null {
1308
1294
  basePath = resolveWorktreeProjectRoot(basePath);
1309
1295
 
1310
- const p = worktreePath(basePath, milestoneId);
1296
+ // basePath is already the resolved project root — go straight to placement
1297
+ // instead of worktreePath(), which would re-resolve the root.
1298
+ const p = worktreePathFor(basePath, milestoneId);
1311
1299
  if (!existsSync(p)) return null;
1312
1300
 
1313
1301
  // Validate this is a real git worktree, not a stray directory.
@@ -2049,8 +2037,6 @@ export function mergeMilestoneToMain(
2049
2037
  const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
2050
2038
  const gsdContentConflicts: string[] = [];
2051
2039
  const alreadyExists = stashAlreadyExistsFilesFromError(e);
2052
- const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
2053
- const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
2054
2040
 
2055
2041
  // Untracked-file restore failures can leave marker conflicts in tracked
2056
2042
  // .gsd JSONL files without producing `U` status entries.
@@ -2114,11 +2100,12 @@ export function mergeMilestoneToMain(
2114
2100
  } else if (
2115
2101
  gsdUU.length === 0 &&
2116
2102
  nonGsdUU.length === 0 &&
2117
- gsdAlreadyExists.length > 0 &&
2118
- nonGsdAlreadyExists.length === 0
2103
+ alreadyExists.length > 0
2119
2104
  ) {
2120
- // Untracked-file restore failure from stash pop where all collided
2121
- // paths are .gsd/ artifacts that already exist after merge.
2105
+ // Untracked-file restore failure from stash pop where all collided paths
2106
+ // already exist after merge (committed on target). Safe to drop the stash
2107
+ // for the full alreadyExists set — they were untracked on source by
2108
+ // definition of the "already exists, no checkout" failure.
2122
2109
  if (stashRefForDrop) {
2123
2110
  try {
2124
2111
  execFileSync("git", ["stash", "drop", stashRefForDrop], {
@@ -2137,10 +2124,6 @@ export function mergeMilestoneToMain(
2137
2124
  logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
2138
2125
  files: nonGsdUU.join(", "),
2139
2126
  });
2140
- } else if (nonGsdAlreadyExists.length > 0) {
2141
- logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
2142
- files: nonGsdAlreadyExists.join(", "),
2143
- });
2144
2127
  } else {
2145
2128
  logWarning(
2146
2129
  "worktree",
@@ -2254,66 +2237,33 @@ export function mergeMilestoneToMain(
2254
2237
  process.chdir(originalBasePath_);
2255
2238
  } catch (err) {
2256
2239
  logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
2240
+ debugLog("mergeMilestoneToMain", {
2241
+ phase: "post-merge-chdir-failed",
2242
+ target: originalBasePath_,
2243
+ error: err instanceof Error ? err.message : String(err),
2244
+ });
2257
2245
  }
2258
2246
  };
2259
2247
 
2260
2248
  let shouldCleanup = false;
2261
- let pushed = false;
2262
- let prCreated = false;
2263
2249
  try {
2264
- // 10. Auto-push if enabled
2265
- if (prefs.auto_push === true && prefs.auto_pr !== true && !nothingToCommit) {
2266
- const remote = prefs.remote ?? "origin";
2267
- if (gitRemoteExists(originalBasePath_, remote)) {
2268
- try {
2269
- execFileSync("git", ["push", remote, mainBranch], {
2270
- cwd: originalBasePath_,
2271
- stdio: ["ignore", "pipe", "pipe"],
2272
- encoding: "utf-8",
2273
- });
2274
- pushed = true;
2275
- } catch (err) {
2276
- // Push failure is non-fatal
2277
- logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
2278
- }
2279
- }
2280
- }
2281
-
2282
- // 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
2283
- if (prefs.auto_pr === true && !nothingToCommit) {
2284
- const remote = prefs.remote ?? "origin";
2285
- const prTarget = prefs.pr_target_branch ?? mainBranch;
2286
- if (gitRemoteExists(originalBasePath_, remote)) {
2287
- try {
2288
- // Push the milestone branch to remote first
2289
- execFileSync("git", ["push", remote, milestoneBranch], {
2290
- cwd: originalBasePath_,
2291
- stdio: ["ignore", "pipe", "pipe"],
2292
- encoding: "utf-8",
2293
- });
2294
- const prEvidence = buildPullRequestEvidence({
2295
- milestoneId,
2296
- milestoneTitle,
2297
- changeType: "feat",
2298
- summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
2299
- testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
2300
- rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
2301
- how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
2302
- });
2303
- const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
2304
- head: milestoneBranch,
2305
- base: prTarget,
2306
- });
2307
- if (!prUrl) {
2308
- throw new Error("gh pr create returned no URL");
2309
- }
2310
- prCreated = true;
2311
- } catch (err) {
2312
- // PR creation failure is non-fatal — gh may not be installed or authenticated
2313
- logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
2314
- }
2315
- }
2316
- }
2250
+ // 10/9b. Publication (auto-push / draft PR) — Publication module seam (ADR-034).
2251
+ const publication = publishMilestone({
2252
+ basePath: originalBasePath_,
2253
+ milestoneId,
2254
+ milestoneTitle,
2255
+ integrationBranch: mainBranch,
2256
+ milestoneBranch,
2257
+ sliceSummaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
2258
+ nothingToCommit,
2259
+ prefs: {
2260
+ autoPush: prefs.auto_push === true,
2261
+ autoPr: prefs.auto_pr === true,
2262
+ remote: prefs.remote,
2263
+ prTargetBranch: prefs.pr_target_branch,
2264
+ },
2265
+ });
2266
+ const { pushed, prCreated } = publication;
2317
2267
 
2318
2268
  // 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
2319
2269
  // throws only when the milestone has unanchored code changes, passes
@@ -331,6 +331,11 @@ import {
331
331
  } from "./db/auto-workers.js";
332
332
  import { releaseMilestoneLease } from "./db/milestone-leases.js";
333
333
  import { normalizeRealPath } from "./paths.js";
334
+ import {
335
+ formatStopNoticePrefix,
336
+ isBlockedStopReason,
337
+ stopNoticeDisplayReason,
338
+ } from "./stop-notice.js";
334
339
 
335
340
  // ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
336
341
  // ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
@@ -355,19 +360,7 @@ export function formatAutoStopNotification(prefix: string, totals: { cost: numbe
355
360
  ].join("\n");
356
361
  }
357
362
 
358
- function isBlockedStopReason(reason?: string | null): boolean {
359
- return /^Blocked:\s*/i.test(reason ?? "");
360
- }
361
-
362
- function formatAutoStopDisplayReason(reason?: string | null): string {
363
- return (reason ?? "").replace(/^Blocked:\s*/i, "").trim();
364
- }
365
-
366
- export function formatAutoStopNotificationPrefix(reason?: string | null): string {
367
- const displayReason = formatAutoStopDisplayReason(reason);
368
- const prefix = isBlockedStopReason(reason) ? "Auto-mode blocked" : "Auto-mode stopped";
369
- return displayReason ? `${prefix} — ${displayReason}` : prefix;
370
- }
363
+ export { formatStopNoticePrefix as formatAutoStopNotificationPrefix } from "./stop-notice.js";
371
364
 
372
365
  function clearSessionModelOverrideForCommandSession(ctx?: ExtensionContext | null): void {
373
366
  const sessionId =
@@ -931,6 +924,14 @@ export function setCurrentDispatchedModelId(model: { provider: string; id: strin
931
924
  s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
932
925
  }
933
926
 
927
+ /**
928
+ * Update the active unit model after runtime recovery switches models mid-unit.
929
+ * The next session restore path reads this field before dispatching again.
930
+ */
931
+ export function setCurrentUnitModelForRecovery(model: any | null): void {
932
+ s.currentUnitModel = model;
933
+ }
934
+
934
935
  // Tool tracking — delegates to auto-tool-tracking.ts
935
936
  export function markToolStart(toolCallId: string, toolName?: string): void {
936
937
  _markToolStart(toolCallId, s.active, toolName);
@@ -1007,6 +1008,41 @@ export function stopAutoRemote(projectRoot: string): {
1007
1008
  }
1008
1009
  }
1009
1010
 
1011
+ /**
1012
+ * Force-stop a remote auto-mode session before stealing its lock.
1013
+ * The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
1014
+ * this path is only for the explicit "Force start" action.
1015
+ */
1016
+ export function forceStopAutoRemote(projectRoot: string): {
1017
+ found: boolean;
1018
+ pid?: number;
1019
+ error?: string;
1020
+ } {
1021
+ const lock = readCrashLock(projectRoot);
1022
+ if (!lock) return { found: false };
1023
+
1024
+ if (lock.pid === process.pid) {
1025
+ clearLock(projectRoot);
1026
+ return { found: false };
1027
+ }
1028
+
1029
+ if (!isLockProcessAlive(lock)) {
1030
+ clearLock(projectRoot);
1031
+ return { found: false };
1032
+ }
1033
+
1034
+ try {
1035
+ process.kill(lock.pid, "SIGTERM");
1036
+ if (isLockProcessAlive(lock)) {
1037
+ process.kill(lock.pid, "SIGKILL");
1038
+ }
1039
+ clearLock(projectRoot);
1040
+ return { found: true, pid: lock.pid };
1041
+ } catch (err) {
1042
+ return { found: false, error: (err as Error).message };
1043
+ }
1044
+ }
1045
+
1010
1046
  /**
1011
1047
  * Check if a remote auto-mode session is running (from a different process).
1012
1048
  * Reads the crash lock, checks PID liveness, and returns session details.
@@ -1465,8 +1501,8 @@ export async function stopAuto(
1465
1501
  ): Promise<void> {
1466
1502
  if (!s.active && !s.paused) return;
1467
1503
  const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
1468
- const stopNotificationPrefix = formatAutoStopNotificationPrefix(reason);
1469
- const displayReason = formatAutoStopDisplayReason(reason);
1504
+ const stopNotificationPrefix = formatStopNoticePrefix(reason);
1505
+ const displayReason = stopNoticeDisplayReason(reason);
1470
1506
  const isHeadlessStop = process.env.GSD_HEADLESS === "1";
1471
1507
  const completionStopRequested = Boolean(options.completionWidget);
1472
1508
  const preserveCloseoutTranscript = !isHeadlessStop && (
@@ -2407,7 +2443,7 @@ export async function startAuto(
2407
2443
  const pid = freshStartAssessment.lock?.pid;
2408
2444
  ctx.ui.notify(
2409
2445
  pid
2410
- ? `Another auto-mode session (PID ${pid}) appears to be running.\nStop it with \`kill ${pid}\` before starting a new session.`
2446
+ ? `Another auto-mode session (PID ${pid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
2411
2447
  : "Another auto-mode session appears to be running.",
2412
2448
  "error",
2413
2449
  );