@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
@@ -18,6 +18,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
18
18
  import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
19
19
  import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
20
20
  import { gsdRoot, resolveMilestoneFile } from "./paths.js";
21
+ import { milestoneEntryBlockedGuidance } from "./guidance.js";
21
22
  import { invalidateAllCaches } from "./cache.js";
22
23
  import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
23
24
  import { acquireSessionLock, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
@@ -25,7 +26,8 @@ import { ensureGitignore, untrackRuntimeFiles } from "./gitignore.js";
25
26
  import { nativeIsRepo, nativeInit, nativeAddAll, nativeCommit, nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchList, nativeBranchExists, nativeBranchListMerged, nativeBranchDelete, nativeWorktreeRemove, nativeCommitCountBetween, nativeHasChanges, } from "./native-git-bridge.js";
26
27
  import { GitServiceImpl } from "./git-service.js";
27
28
  import { captureIntegrationBranch, detectWorktreeName, setActiveMilestoneId, } from "./worktree.js";
28
- import { getAutoWorktreePath, checkoutBranchWithStashGuard } from "./auto-worktree.js";
29
+ import { getAutoWorktreePath } from "./auto-worktree.js";
30
+ import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
29
31
  import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
30
32
  import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
31
33
  import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
@@ -740,12 +742,14 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
740
742
  // phase-specific planning model for a discuss turn (#2829).
741
743
  //
742
744
  // Precedence:
743
- // 1) Explicit session override via /gsd model (this session)
744
- // 2) Current session model from settings/session restore (if provider ready)
745
- // 3) GSD model preferences from PREFERENCES.md (validated against live auth)
745
+ // 1) Explicit session override via /gsd model or /gsd auto --model (this session)
746
+ // 2) GSD model preferences from PREFERENCES.md (validated against live auth)
747
+ // 3) Current session model from settings/session restore (if provider ready)
746
748
  //
747
- // This preserves #3517 defaults while honoring explicit runtime model
748
- // selection for subsequent /gsd runs in the same session.
749
+ // PREFERENCES.md wins over the ambient session default (#3517) so /gsd auto
750
+ // does not stick on claude-code/claude-sonnet-4-6 when the user configured
751
+ // models via /gsd workflow-preferences or PREFERENCES.md. Custom providers
752
+ // still skip PREFERENCES.md entirely (#4122).
749
753
  //
750
754
  // Exception (#4122): when the session provider is a custom provider declared
751
755
  // in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
@@ -757,7 +761,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
757
761
  const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
758
762
  const preferredModel = sessionProviderIsCustom
759
763
  ? null
760
- : resolveDefaultSessionModel(ctx.model?.provider);
764
+ : resolveDefaultSessionModel(ctx.model?.provider, base);
761
765
  // Validate the preferred model against the live registry + provider auth so
762
766
  // an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
763
767
  // start-model snapshot. Without this, every subsequent unit would try to
@@ -780,8 +784,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
780
784
  : null;
781
785
  const startThinkingSnapshot = pi.getThinkingLevel();
782
786
  const startModelSnapshot = manualSessionOverride
783
- ?? currentSessionModel
784
787
  ?? validatedPreferredModel
788
+ ?? currentSessionModel
785
789
  ?? null;
786
790
  try {
787
791
  // Validate GSD_PROJECT_ID early so the user gets immediate feedback
@@ -972,9 +976,26 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
972
976
  state = await deriveState(wtPath);
973
977
  }
974
978
  }
975
- const blockingStrandedRecoveryAction = state.activeMilestone
976
- ? strandedRecoveryActions.find((action) => action.milestoneId !== state.activeMilestone?.id) ?? strandedRecoveryAction
977
- : strandedRecoveryAction;
979
+ const requestedMilestoneLock = process.env.GSD_MILESTONE_LOCK?.trim() || null;
980
+ const lockedActiveMilestone = requestedMilestoneLock && state.activeMilestone?.id === requestedMilestoneLock;
981
+ let blockingStrandedRecoveryAction;
982
+ if (lockedActiveMilestone) {
983
+ // Parallel worker or explicit `/gsd auto Mxxx`: sibling milestones'
984
+ // stranded work must not block this milestone's resumption, and the
985
+ // downstream `strandedRecoveryAction` (used for currentMilestoneId,
986
+ // setActiveMilestoneId, and adoptStrandedMilestone) must be scoped to
987
+ // the locked milestone only. Falling back to the first sibling action
988
+ // would mis-target adoption (#742).
989
+ const lockMatch = strandedRecoveryActions.find((action) => action.milestoneId === requestedMilestoneLock) ?? null;
990
+ blockingStrandedRecoveryAction = lockMatch;
991
+ strandedRecoveryAction = lockMatch;
992
+ }
993
+ else if (state.activeMilestone) {
994
+ blockingStrandedRecoveryAction = strandedRecoveryActions.find((action) => action.milestoneId !== state.activeMilestone?.id) ?? strandedRecoveryAction;
995
+ }
996
+ else {
997
+ blockingStrandedRecoveryAction = strandedRecoveryAction;
998
+ }
978
999
  if (blockingStrandedRecoveryAction) {
979
1000
  if (!state.activeMilestone) {
980
1001
  ctx.ui.notify(formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, null), "error");
@@ -987,6 +1008,9 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
987
1008
  strandedRecoveryAction = blockingStrandedRecoveryAction;
988
1009
  ctx.ui.notify(formatStrandedWorkRecoveryMessage(strandedRecoveryAction), "info");
989
1010
  }
1011
+ else if (lockedActiveMilestone) {
1012
+ strandedRecoveryAction = null;
1013
+ }
990
1014
  if (process.env.GSD_HEADLESS === "1" &&
991
1015
  orphanAuditRecovered &&
992
1016
  !state.activeMilestone &&
@@ -1249,8 +1273,10 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
1249
1273
  const normalized = p.replaceAll("\\", "/");
1250
1274
  if (findWorktreeSegment(normalized) !== null)
1251
1275
  return true;
1252
- // The container directory itself (no trailing worktree name).
1253
- return normalized.endsWith("/.gsd/worktrees") || normalized.endsWith("/.gsd-worktrees");
1276
+ // The container directory itself (no trailing worktree name), in any layout.
1277
+ return normalized.endsWith("/.gsd/worktrees")
1278
+ || normalized.endsWith("/.gsd-worktrees")
1279
+ || /\/\.gsd\/projects\/[^/]+\/worktrees$/.test(normalized);
1254
1280
  };
1255
1281
  if (s.currentMilestoneId &&
1256
1282
  (getIsolationMode(base) !== "none" || strandedRecoveryAction?.recoveryMode) &&
@@ -1267,11 +1293,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
1267
1293
  if (enterResult.reason === "lease-conflict") {
1268
1294
  ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`, "error");
1269
1295
  }
1270
- else if (enterResult.reason === "creation-failed") {
1271
- ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`, "error");
1272
- }
1273
- else if (enterResult.reason === "isolation-degraded") {
1274
- ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: isolation is degraded from a prior worktree failure. Close processes locking the worktree and retry, or run /gsd doctor fix.`, "error");
1296
+ else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
1297
+ ctx.ui.notify(milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason), "error");
1275
1298
  }
1276
1299
  else if (enterResult.reason === "invalid-milestone-id") {
1277
1300
  ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: milestone id is invalid.`, "error");
@@ -4,6 +4,7 @@
4
4
  * can distinguish "waiting for tool completion" from "truly idle".
5
5
  */
6
6
  import { stripMcpToolPrefix } from "@gsd/pi-ai";
7
+ import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
7
8
  const inFlightTools = new Map();
8
9
  /**
9
10
  * Tools that block waiting for human input by design.
@@ -117,6 +118,14 @@ export function clearInFlightTools() {
117
118
  */
118
119
  const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
119
120
  const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
121
+ /**
122
+ * Matches the runtime's "tool not registered" error. Unlike the deterministic
123
+ * invocation failures above, this one is usually transient: the workflow MCP
124
+ * server registers its tool surface asynchronously after session start, so a
125
+ * Unit's first tool call can race the registration. Callers should retry
126
+ * (bounded) instead of breaking the loop.
127
+ */
128
+ const TOOL_UNAVAILABLE_ERROR_RE = new RegExp(`No such tool available|${TOOL_SURFACE_NOT_READY}`, "i");
120
129
  /**
121
130
  * Returns true if the error message indicates a deterministic invocation or
122
131
  * policy failure (as opposed to a normal tool execution error).
@@ -126,6 +135,15 @@ export function isToolInvocationError(errorMsg) {
126
135
  return false;
127
136
  return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
128
137
  }
138
+ /**
139
+ * Returns true if the error message indicates the called tool was not on the
140
+ * session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
141
+ */
142
+ export function isToolUnavailableError(errorMsg) {
143
+ if (!errorMsg)
144
+ return false;
145
+ return TOOL_UNAVAILABLE_ERROR_RE.test(errorMsg);
146
+ }
129
147
  /**
130
148
  * Returns true if the error message indicates the tool was skipped because
131
149
  * a queued user message interrupted the turn (#3595). Retrying will produce
@@ -36,17 +36,17 @@ export function isSuspiciousGhostCompletion(ctx, startedAt, maxElapsedMs = GHOST
36
36
  activity.assistantMessages === 0);
37
37
  }
38
38
  /**
39
- * Snapshot metrics, save activity log, and fire-and-forget memory extraction
40
- * for a completed unit. Returns the activity log file path (if any).
39
+ * Snapshot metrics, save activity log, extract memories, and record the git
40
+ * transaction for a completed auto-mode unit.
41
41
  */
42
- export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, opts) {
43
- const modelId = ctx.model?.id ?? "unknown";
44
- snapshotUnitMetrics(ctx, unitType, unitId, startedAt, modelId, opts);
45
- const activityFile = saveActivityLog(ctx, basePath, unitType, unitId);
42
+ export async function closeoutAutoUnit(request) {
43
+ const modelId = request.ctx.model?.id ?? "unknown";
44
+ snapshotUnitMetrics(request.ctx, request.unitType, request.unitId, request.startedAt, modelId, request.opts);
45
+ const activityFile = saveActivityLog(request.ctx, request.basePath, request.unitType, request.unitId);
46
46
  if (activityFile) {
47
47
  try {
48
- const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import('./memory-extractor.js');
49
- const llmCallFn = buildMemoryLLMCall(ctx);
48
+ const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import("./memory-extractor.js");
49
+ const llmCallFn = buildMemoryLLMCall(request.ctx);
50
50
  if (llmCallFn) {
51
51
  // Awaited: a fire-and-forget here lets memory-extractor writes land in
52
52
  // .gsd/ after closeoutUnit returns but before the milestone merge
@@ -55,10 +55,10 @@ export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, o
55
55
  // bounded by the extractor's LLM call, which is the acceptable price
56
56
  // for not racing the merge boundary.
57
57
  try {
58
- await extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn);
58
+ await extractMemoriesFromUnit(activityFile, request.unitType, request.unitId, llmCallFn);
59
59
  }
60
60
  catch (err) {
61
- logWarning("engine", `memory extraction failed for ${unitType}/${unitId}: ${err.message}`);
61
+ logWarning("engine", `memory extraction failed for ${request.unitType}/${request.unitId}: ${err.message}`);
62
62
  }
63
63
  }
64
64
  }
@@ -66,22 +66,46 @@ export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, o
66
66
  logWarning("engine", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
67
67
  }
68
68
  }
69
- if (opts?.traceId && opts.turnId && opts.gitAction && opts.gitStatus) {
69
+ const gitTransaction = resolveGitTransactionOptions(request.opts);
70
+ if (gitTransaction) {
70
71
  writeTurnGitTransaction({
71
- basePath,
72
- traceId: opts.traceId,
73
- turnId: opts.turnId,
74
- unitType,
75
- unitId,
72
+ basePath: request.basePath,
73
+ traceId: gitTransaction.traceId,
74
+ turnId: gitTransaction.turnId,
75
+ unitType: request.unitType,
76
+ unitId: request.unitId,
76
77
  stage: "record",
77
- action: opts.gitAction,
78
- push: opts.gitPush === true,
79
- status: opts.gitStatus,
80
- error: opts.gitError,
78
+ action: gitTransaction.gitAction,
79
+ push: gitTransaction.gitPush === true,
80
+ status: gitTransaction.gitStatus,
81
+ error: gitTransaction.gitError,
81
82
  metadata: {
82
83
  activityFile,
83
84
  },
84
85
  });
85
86
  }
86
- return activityFile ?? undefined;
87
+ return {
88
+ ...(activityFile ? { activityFile } : {}),
89
+ gitTransactionRecorded: Boolean(gitTransaction),
90
+ };
91
+ }
92
+ function resolveGitTransactionOptions(opts) {
93
+ if (!opts?.traceId || !opts.turnId || !opts.gitAction || !opts.gitStatus)
94
+ return null;
95
+ return {
96
+ traceId: opts.traceId,
97
+ turnId: opts.turnId,
98
+ gitAction: opts.gitAction,
99
+ gitStatus: opts.gitStatus,
100
+ gitPush: opts.gitPush,
101
+ gitError: opts.gitError,
102
+ };
103
+ }
104
+ /**
105
+ * Compatibility wrapper for existing auto-loop callers. New code should prefer
106
+ * closeoutAutoUnit so the closeout request and result stay explicit.
107
+ */
108
+ export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, opts) {
109
+ const result = await closeoutAutoUnit({ ctx, basePath, unitType, unitId, startedAt, opts });
110
+ return result.activityFile;
87
111
  }
@@ -1,22 +1,14 @@
1
1
  import { parseUnitId } from "./unit-id.js";
2
2
  import { AUTO_UNIT_SCOPED_TOOLS, getForbiddenGsdToolReason, } from "./unit-tool-contracts.js";
3
- import { WORKFLOW_TOOL_ALIAS_PAIRS, canonicalWorkflowSurfaceToolName, isWorkflowSurfaceAliasTool, stripMcpToolPrefix, } from "./workflow-tool-surface.js";
3
+ import { WORKFLOW_TOOL_ALIAS_PAIRS, isWorkflowSurfaceAliasTool, stripMcpToolPrefix, } from "./workflow-tool-surface.js";
4
+ import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
4
5
  export { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, } from "./unit-tool-contracts.js";
5
- const EXECUTE_TASK_UNIT_TYPES = new Set([
6
- "execute-task",
7
- "execute-task-simple",
8
- "reactive-execute",
9
- ]);
10
- // These units own quality gates, but their completion handlers persist verdicts
11
- // from artifact sections. gsd_save_gate_result belongs to gate-evaluate, so keep
12
- // blocking it here with a calm redirect to the section-write path.
13
- const SECTION_CLOSE_GATE_UNIT_TYPES = new Set([
14
- "execute-task",
15
- "execute-task-simple",
16
- "reactive-execute",
17
- "complete-slice",
18
- "validate-milestone",
19
- ]);
6
+ // Scope-class membership is declared per unit in the Unit Registry (ADR-033).
7
+ // EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
8
+ // Set additionally includes scopeClass "section-close" — units whose completion
9
+ // handlers persist gate verdicts from artifact sections (gsd_save_gate_result
10
+ // belongs to gate-evaluate, so it is soft-blocked with a redirect below).
11
+ import { EXECUTE_TASK_UNIT_TYPES, SECTION_CLOSE_GATE_UNIT_TYPES, } from "./unit-registry.js";
20
12
  const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
21
13
  "gsd_skip_slice",
22
14
  "gsd_slice_reopen",
@@ -31,9 +23,9 @@ const SCOPED_GSD_LIFECYCLE_TOOLS = new Set([
31
23
  .map(canonicalWorkflowToolName));
32
24
  export const GSD_PHASE_SCOPE_DISPLAY_REASON = "This GSD phase only allows its scoped workflow tools.";
33
25
  export const GSD_SECTION_CLOSE_GATE_DISPLAY_REASON = "Gates here close by writing summary sections — gsd_save_gate_result isn't needed.";
34
- export function canonicalWorkflowToolName(toolName) {
35
- return canonicalWorkflowSurfaceToolName(toolName);
36
- }
26
+ // Normalizer seam lives in engine-hook-contract.ts; re-exported here for
27
+ // existing scope importers.
28
+ export { canonicalWorkflowToolName };
37
29
  export function isWorkflowAliasTool(toolName) {
38
30
  return isWorkflowSurfaceAliasTool(toolName);
39
31
  }
@@ -74,7 +66,7 @@ function allowedGsdToolsForUnit(unitType) {
74
66
  function isNativeWorkflowTool(toolName) {
75
67
  return stripMcpToolPrefix(toolName) === "Workflow";
76
68
  }
77
- function readStringField(input, camel, snake) {
69
+ export function readStringField(input, camel, snake) {
78
70
  if (!input || typeof input !== "object")
79
71
  return undefined;
80
72
  const record = input;
@@ -1,7 +1,7 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Post-unit verification gate for GSD auto-mode units.
3
3
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
4
- import { gsdProjectionRoot, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
4
+ import { gsdProjectionRoot, resolveSlicePath } from "./paths.js";
5
5
  import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
6
6
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
7
7
  import { parseUnitId } from "./unit-id.js";
@@ -9,8 +9,6 @@ import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd
9
9
  import { loadEffectiveGSDPreferences } from "./preferences.js";
10
10
  import { isClosedStatus } from "./status-guards.js";
11
11
  import { loadFile } from "./files.js";
12
- import { parseRoadmap } from "./parsers-legacy.js";
13
- import { isMilestoneComplete } from "./state.js";
14
12
  import { runVerificationGate, runVerificationGateForTargets, formatFailureContext, captureRuntimeErrors, runDependencyAudit, } from "./verification-gate.js";
15
13
  import { writeVerificationJSON } from "./verification-evidence.js";
16
14
  import { logWarning } from "./workflow-logger.js";
@@ -25,6 +23,7 @@ import { getSlice } from "./gsd-db.js";
25
23
  import { getLedger } from "./metrics.js";
26
24
  import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
27
25
  import { formatPostUnitStatusCard } from "./auto-status-message.js";
26
+ import { detectWebApp } from "./web-app-uat.js";
28
27
  function getCurrentUnitCostStats(unitId) {
29
28
  const ledger = getLedger();
30
29
  if (!ledger || !Array.isArray(ledger.units) || ledger.units.length === 0) {
@@ -274,32 +273,15 @@ async function runValidateMilestonePostCheck(vctx, pauseAuto) {
274
273
  * DB-backed projects are authoritative (#4094 peer review); falls back to
275
274
  * roadmap parsing only when the DB is unavailable.
276
275
  */
277
- async function countIncompleteSlices(basePath, milestoneId) {
278
- if (isDbAvailable()) {
279
- const slices = getMilestoneSlices(milestoneId);
280
- if (slices.length === 0) {
281
- // No DB rows — treat as "unknown", do not pause.
282
- return 1;
283
- }
284
- return slices.filter((slice) => !isClosedStatus(slice.status)).length;
285
- }
286
- // Filesystem fallback: parse the roadmap markdown.
287
- try {
288
- const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
289
- if (!roadmapFile)
290
- return 1;
291
- const roadmapContent = await loadFile(roadmapFile);
292
- if (!roadmapContent)
293
- return 1;
294
- const roadmap = parseRoadmap(roadmapContent);
295
- if (roadmap.slices.length === 0)
296
- return 1;
297
- return isMilestoneComplete(roadmap) ? 0 : 1;
298
- }
299
- catch {
300
- // Parsing failures should not cause false-positive pauses.
276
+ async function countIncompleteSlices(_basePath, milestoneId) {
277
+ // DB-authoritative (ADR-017): no markdown fallback. DB unavailable or no
278
+ // rows means "unknown" — do not pause.
279
+ if (!isDbAvailable())
301
280
  return 1;
302
- }
281
+ const slices = getMilestoneSlices(milestoneId);
282
+ if (slices.length === 0)
283
+ return 1;
284
+ return slices.filter((slice) => !isClosedStatus(slice.status)).length;
303
285
  }
304
286
  /**
305
287
  * Run the verification gate for the current execute-task unit.
@@ -636,14 +618,25 @@ export async function runPostUnitVerification(vctx, pauseAuto) {
636
618
  s.pendingVerificationRetry = null;
637
619
  return "continue";
638
620
  }
621
+ else if (verdict.reason === "no-host-checks" &&
622
+ taskAlreadyComplete &&
623
+ detectWebApp(s.basePath) &&
624
+ !result.runtimeErrors?.some((e) => e.blocking)) {
625
+ s.verificationRetryCount.delete(retryKey);
626
+ s.verificationRetryFailureHashes.delete(retryKey);
627
+ s.pendingVerificationRetry = null;
628
+ ctx.ui.notify("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.", "warning");
629
+ return "continue";
630
+ }
639
631
  else if (verdict.reason === "no-host-checks") {
640
632
  s.verificationRetryCount.delete(retryKey);
641
633
  s.verificationRetryFailureHashes.delete(retryKey);
642
634
  s.pendingVerificationRetry = null;
643
- ctx.ui.notify("Verification gate FAILED no runnable host-owned verification checks were discovered. Pausing for human review.", "error");
635
+ const pauseMessage = `Verification failed: ${verdict.failureContext}`;
636
+ ctx.ui.notify(`Verification gate FAILED — ${verdict.failureContext}`, "error");
644
637
  process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
645
638
  await pauseAuto(ctx, pi, {
646
- message: "Verification failed: no runnable host-owned verification checks were discovered.",
639
+ message: pauseMessage,
647
640
  category: "unknown",
648
641
  });
649
642
  return "pause";
@@ -15,16 +15,15 @@ import { closeWorkflowDatabase, getWorkflowDatabasePath, openWorkflowDatabasePat
15
15
  import { execFileSync } from "node:child_process";
16
16
  import { gsdRoot, resolveGsdPathContract } from "./paths.js";
17
17
  import { createWorktree, removeWorktree, worktreePath, isInsideWorktreesDir, } from "./worktree-manager.js";
18
+ import { worktreePathFor } from "./worktree-placement.js";
18
19
  import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
19
- import { findWorktreeSegment, isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
20
+ import { isGsdWorktreePath, projectRootFromWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
20
21
  import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
21
22
  import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
22
- import { buildPullRequestEvidence, createDraftPullRequestFromEvidence, } from "./pull-request-process.js";
23
+ import { publishMilestone } from "./publication.js";
23
24
  import { debugLog } from "./debug-logger.js";
24
25
  import { logWarning, logError } from "./workflow-logger.js";
25
26
  import { checkoutBranchWithStashGuard, cleanupConflictState, gsdJsonlFilesWithConflictMarkers, hasConflictMarkers, popStashByRef, removeMergeStateFiles, stashAlreadyExistsFilesFromError, stashRefFromError, } from "./worktree-git-recovery.js";
26
- // Re-export for existing callers/tests (auto-start.ts, checkout-branch-stash-guard.test.ts).
27
- export { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
28
27
  import { loadEffectiveGSDPreferences } from "./preferences.js";
29
28
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
30
29
  import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
@@ -184,19 +183,6 @@ function gitPathspecForWorktreePath(basePath, targetPath) {
184
183
  export function _gitPathspecForWorktreePath(basePath, targetPath) {
185
184
  return gitPathspecForWorktreePath(basePath, targetPath);
186
185
  }
187
- function gitRemoteExists(basePath, remote) {
188
- try {
189
- execFileSync("git", ["remote", "get-url", remote], {
190
- cwd: basePath,
191
- stdio: ["ignore", "pipe", "pipe"],
192
- encoding: "utf-8",
193
- });
194
- return true;
195
- }
196
- catch {
197
- return false;
198
- }
199
- }
200
186
  function findRegularMergeChangedPaths(basePath, milestoneBranch, mainBranch) {
201
187
  const changedPaths = new Set();
202
188
  let mergeLog = "";
@@ -392,12 +378,9 @@ export function checkResourcesStale(versionOnStart) {
392
378
  * Returns the corrected base path.
393
379
  */
394
380
  export function escapeStaleWorktree(base) {
395
- const segment = findWorktreeSegment(base.replaceAll("\\", "/"));
396
- if (!segment)
381
+ const projectRoot = projectRootFromWorktreePath(base);
382
+ if (projectRoot === null)
397
383
  return base;
398
- // base is inside .gsd/worktrees/<something> — extract the project root.
399
- // Normalization is 1:1 on characters, so the segment index is valid in `base`.
400
- const projectRoot = base.slice(0, segment.gsdIdx);
401
384
  // Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
402
385
  // the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
403
386
  // when .gsd is a symlink into ~/.gsd/projects/<hash> and process.cwd()
@@ -817,6 +800,14 @@ function _resolveIntegrationBranchForReuse(basePath, milestoneId) {
817
800
  return null;
818
801
  }
819
802
  }
803
+ function safeCwd(fallback) {
804
+ try {
805
+ return process.cwd();
806
+ }
807
+ catch {
808
+ return fallback;
809
+ }
810
+ }
820
811
  /**
821
812
  * When reusing an existing milestone branch, fast-forward it onto the
822
813
  * integration branch when that's safe (branch is a strict ancestor of
@@ -966,7 +957,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
966
957
  originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
967
958
  const branch = autoWorktreeBranch(milestoneId);
968
959
  const { preserveBranch = false, preserveWorktree = false } = opts;
969
- const previousCwd = process.cwd();
960
+ const previousCwd = safeCwd(originalBasePath);
970
961
  // Wrap the entire teardown body in a single try/finally so activeWorkspace
971
962
  // is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
972
963
  // was deleted before teardown ran). Previously the finally only covered
@@ -1078,7 +1069,9 @@ export function isInAutoWorktree(basePath) {
1078
1069
  */
1079
1070
  export function getAutoWorktreePath(basePath, milestoneId) {
1080
1071
  basePath = resolveWorktreeProjectRoot(basePath);
1081
- const p = worktreePath(basePath, milestoneId);
1072
+ // basePath is already the resolved project root — go straight to placement
1073
+ // instead of worktreePath(), which would re-resolve the root.
1074
+ const p = worktreePathFor(basePath, milestoneId);
1082
1075
  if (!existsSync(p))
1083
1076
  return null;
1084
1077
  // Validate this is a real git worktree, not a stray directory.
@@ -1738,8 +1731,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1738
1731
  const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
1739
1732
  const gsdContentConflicts = [];
1740
1733
  const alreadyExists = stashAlreadyExistsFilesFromError(e);
1741
- const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
1742
- const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
1743
1734
  // Untracked-file restore failures can leave marker conflicts in tracked
1744
1735
  // .gsd JSONL files without producing `U` status entries.
1745
1736
  if (isUntrackedRestoreFailure) {
@@ -1800,10 +1791,11 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1800
1791
  }
1801
1792
  else if (gsdUU.length === 0 &&
1802
1793
  nonGsdUU.length === 0 &&
1803
- gsdAlreadyExists.length > 0 &&
1804
- nonGsdAlreadyExists.length === 0) {
1805
- // Untracked-file restore failure from stash pop where all collided
1806
- // paths are .gsd/ artifacts that already exist after merge.
1794
+ alreadyExists.length > 0) {
1795
+ // Untracked-file restore failure from stash pop where all collided paths
1796
+ // already exist after merge (committed on target). Safe to drop the stash
1797
+ // for the full alreadyExists set they were untracked on source by
1798
+ // definition of the "already exists, no checkout" failure.
1807
1799
  if (stashRefForDrop) {
1808
1800
  try {
1809
1801
  execFileSync("git", ["stash", "drop", stashRefForDrop], {
@@ -1826,11 +1818,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1826
1818
  files: nonGsdUU.join(", "),
1827
1819
  });
1828
1820
  }
1829
- else if (nonGsdAlreadyExists.length > 0) {
1830
- logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
1831
- files: nonGsdAlreadyExists.join(", "),
1832
- });
1833
- }
1834
1821
  else {
1835
1822
  logWarning("worktree", "git stash pop failed without resolvable conflict files; leaving stash for manual recovery");
1836
1823
  }
@@ -1922,66 +1909,32 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1922
1909
  }
1923
1910
  catch (err) {
1924
1911
  logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
1912
+ debugLog("mergeMilestoneToMain", {
1913
+ phase: "post-merge-chdir-failed",
1914
+ target: originalBasePath_,
1915
+ error: err instanceof Error ? err.message : String(err),
1916
+ });
1925
1917
  }
1926
1918
  };
1927
1919
  let shouldCleanup = false;
1928
- let pushed = false;
1929
- let prCreated = false;
1930
1920
  try {
1931
- // 10. Auto-push if enabled
1932
- if (prefs.auto_push === true && prefs.auto_pr !== true && !nothingToCommit) {
1933
- const remote = prefs.remote ?? "origin";
1934
- if (gitRemoteExists(originalBasePath_, remote)) {
1935
- try {
1936
- execFileSync("git", ["push", remote, mainBranch], {
1937
- cwd: originalBasePath_,
1938
- stdio: ["ignore", "pipe", "pipe"],
1939
- encoding: "utf-8",
1940
- });
1941
- pushed = true;
1942
- }
1943
- catch (err) {
1944
- // Push failure is non-fatal
1945
- logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
1946
- }
1947
- }
1948
- }
1949
- // 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
1950
- if (prefs.auto_pr === true && !nothingToCommit) {
1951
- const remote = prefs.remote ?? "origin";
1952
- const prTarget = prefs.pr_target_branch ?? mainBranch;
1953
- if (gitRemoteExists(originalBasePath_, remote)) {
1954
- try {
1955
- // Push the milestone branch to remote first
1956
- execFileSync("git", ["push", remote, milestoneBranch], {
1957
- cwd: originalBasePath_,
1958
- stdio: ["ignore", "pipe", "pipe"],
1959
- encoding: "utf-8",
1960
- });
1961
- const prEvidence = buildPullRequestEvidence({
1962
- milestoneId,
1963
- milestoneTitle,
1964
- changeType: "feat",
1965
- summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
1966
- testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
1967
- rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
1968
- how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
1969
- });
1970
- const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
1971
- head: milestoneBranch,
1972
- base: prTarget,
1973
- });
1974
- if (!prUrl) {
1975
- throw new Error("gh pr create returned no URL");
1976
- }
1977
- prCreated = true;
1978
- }
1979
- catch (err) {
1980
- // PR creation failure is non-fatal — gh may not be installed or authenticated
1981
- logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
1982
- }
1983
- }
1984
- }
1921
+ // 10/9b. Publication (auto-push / draft PR) — Publication module seam (ADR-034).
1922
+ const publication = publishMilestone({
1923
+ basePath: originalBasePath_,
1924
+ milestoneId,
1925
+ milestoneTitle,
1926
+ integrationBranch: mainBranch,
1927
+ milestoneBranch,
1928
+ sliceSummaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
1929
+ nothingToCommit,
1930
+ prefs: {
1931
+ autoPush: prefs.auto_push === true,
1932
+ autoPr: prefs.auto_pr === true,
1933
+ remote: prefs.remote,
1934
+ prTargetBranch: prefs.pr_target_branch,
1935
+ },
1936
+ });
1937
+ const { pushed, prCreated } = publication;
1985
1938
  // 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
1986
1939
  // throws only when the milestone has unanchored code changes, passes
1987
1940
  // through when the code is genuinely already on the integration branch.