@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.6ccd27b3

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 (651) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  15. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  16. package/dist/resources/extensions/async-jobs/index.js +65 -0
  17. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  18. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  19. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  20. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  21. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -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 +450 -217
  27. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  28. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  29. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  30. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  31. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  32. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  33. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  34. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  35. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  36. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  37. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  38. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  39. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  40. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  41. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  42. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  43. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  44. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  45. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  46. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  47. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  48. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  49. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  50. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  51. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  52. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  53. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  54. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  55. package/dist/resources/extensions/gsd/auto.js +41 -2
  56. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  57. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  58. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  59. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  60. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  61. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +172 -59
  62. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  63. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  64. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  65. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  66. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  67. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  68. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  69. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  70. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  71. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  72. package/dist/resources/extensions/gsd/constants.js +0 -2
  73. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  74. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  75. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  78. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  79. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  80. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  81. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  82. package/dist/resources/extensions/gsd/files.js +33 -19
  83. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  84. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  85. package/dist/resources/extensions/gsd/guidance.js +60 -0
  86. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  87. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  88. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  89. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  90. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  91. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  92. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  93. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  94. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  95. package/dist/resources/extensions/gsd/notifications.js +12 -7
  96. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  97. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  98. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  99. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  100. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  101. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  111. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  112. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  115. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  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/skill-activation.js +3 -6
  120. package/dist/resources/extensions/gsd/state.js +11 -2
  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 +83 -31
  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 +65 -2
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  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-context-composer.js +65 -0
  138. package/dist/resources/extensions/gsd/unit-registry.js +41 -24
  139. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  140. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  141. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  142. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  143. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  144. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  145. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  146. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  147. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  148. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  149. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  150. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  151. package/dist/resources/extensions/gsd/worktree.js +8 -1
  152. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  153. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  154. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  155. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  156. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  157. package/dist/resources/shared/package-manager-detection.js +1 -1
  158. package/dist/resources/shared/package.json +3 -0
  159. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  160. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  161. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  162. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  163. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  164. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  165. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  166. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  167. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  168. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  169. package/dist/runtime-checks.d.ts +10 -0
  170. package/dist/runtime-checks.js +27 -0
  171. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  172. package/dist/update-check.d.ts +2 -0
  173. package/dist/update-check.js +24 -1
  174. package/dist/update-cmd.js +20 -3
  175. package/dist/web/standalone/.next/BUILD_ID +1 -1
  176. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  177. package/dist/web/standalone/.next/build-manifest.json +3 -3
  178. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  179. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/index.html +1 -1
  199. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  206. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  207. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  210. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  211. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  212. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  213. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  214. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  215. package/dist/web/standalone/package.json +1 -1
  216. package/package.json +3 -3
  217. package/packages/cloud-mcp-gateway/package.json +2 -2
  218. package/packages/contracts/dist/rpc.d.ts +1 -0
  219. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  220. package/packages/contracts/dist/rpc.js.map +1 -1
  221. package/packages/contracts/package.json +1 -1
  222. package/packages/daemon/package.json +4 -4
  223. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  224. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  225. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  226. package/packages/gsd-agent-core/package.json +5 -5
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -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 +55 -6
  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/components/transcript-design.d.ts +2 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  241. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  249. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  250. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  251. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  259. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  260. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  261. package/packages/gsd-agent-modes/package.json +7 -7
  262. package/packages/mcp-server/README.md +12 -3
  263. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  264. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  265. package/packages/mcp-server/dist/cli-runner.js +137 -0
  266. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  267. package/packages/mcp-server/dist/cli.js +2 -53
  268. package/packages/mcp-server/dist/cli.js.map +1 -1
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  272. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  274. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  275. package/packages/mcp-server/dist/pid-registry.js +452 -0
  276. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  278. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  279. package/packages/mcp-server/dist/probe-mode.js +10 -0
  280. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  281. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  282. package/packages/mcp-server/dist/server.js +4 -0
  283. package/packages/mcp-server/dist/server.js.map +1 -1
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  287. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  288. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  289. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  290. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  291. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  292. package/packages/mcp-server/package.json +5 -4
  293. package/packages/native/package.json +1 -1
  294. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  295. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  296. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  297. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  298. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  299. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  300. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  301. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  302. package/packages/pi-agent-core/dist/index.js +3 -0
  303. package/packages/pi-agent-core/dist/index.js.map +1 -1
  304. package/packages/pi-agent-core/package.json +1 -1
  305. package/packages/pi-ai/README.md +1 -0
  306. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  307. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  308. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  309. package/packages/pi-ai/dist/index.d.ts +2 -0
  310. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/index.js +2 -0
  312. package/packages/pi-ai/dist/index.js.map +1 -1
  313. package/packages/pi-ai/dist/models.generated.d.ts +239 -153
  314. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  315. package/packages/pi-ai/dist/models.generated.js +256 -145
  316. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  317. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  319. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  321. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  323. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  324. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  326. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  327. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  328. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  329. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  330. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  331. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  333. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  334. package/packages/pi-ai/package.json +3 -2
  335. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  336. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  338. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  341. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  343. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  345. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  347. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  349. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  351. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  352. package/packages/pi-coding-agent/dist/index.js +1 -1
  353. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  356. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  358. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  360. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  361. package/packages/pi-coding-agent/package.json +7 -7
  362. package/packages/pi-tui/dist/index.d.ts +1 -1
  363. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/index.js +1 -1
  365. package/packages/pi-tui/dist/index.js.map +1 -1
  366. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  367. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/terminal-image.js +54 -2
  369. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  370. package/packages/pi-tui/dist/tui.d.ts +8 -0
  371. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  372. package/packages/pi-tui/dist/tui.js +72 -18
  373. package/packages/pi-tui/dist/tui.js.map +1 -1
  374. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  375. package/packages/pi-tui/dist/utils.js +110 -36
  376. package/packages/pi-tui/dist/utils.js.map +1 -1
  377. package/packages/pi-tui/package.json +2 -2
  378. package/packages/rpc-client/package.json +2 -2
  379. package/pkg/dist/theme/theme.d.ts.map +1 -1
  380. package/pkg/dist/theme/theme.js +45 -17
  381. package/pkg/dist/theme/theme.js.map +1 -1
  382. package/pkg/package.json +1 -1
  383. package/src/resources/GSD-WORKFLOW.md +5 -4
  384. package/src/resources/extensions/ask-user-questions.ts +7 -2
  385. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  386. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  387. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  388. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  389. package/src/resources/extensions/async-jobs/index.ts +79 -0
  390. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  391. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  392. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  393. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  394. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  395. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  396. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  397. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  398. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  399. package/src/resources/extensions/browser-tools/index.ts +71 -13
  400. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  401. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  402. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  403. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +534 -228
  404. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  405. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  406. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  407. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  408. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  409. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  410. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  411. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  412. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  413. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  414. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  415. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  416. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  417. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  418. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  419. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  420. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  421. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  422. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  423. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  424. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  425. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  426. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  427. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  428. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  429. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  430. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  431. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  432. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  433. package/src/resources/extensions/gsd/auto.ts +49 -2
  434. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  435. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  436. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  437. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  438. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  439. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +211 -59
  440. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  441. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  442. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  443. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  444. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  445. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  446. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  447. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  448. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  449. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  450. package/src/resources/extensions/gsd/constants.ts +0 -3
  451. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  452. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  453. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  454. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  455. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  456. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  457. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  458. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  459. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  460. package/src/resources/extensions/gsd/files.ts +33 -12
  461. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  462. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  463. package/src/resources/extensions/gsd/guidance.ts +78 -0
  464. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  465. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  466. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  467. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  468. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  469. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  470. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  471. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  472. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  473. package/src/resources/extensions/gsd/notifications.ts +13 -6
  474. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  475. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  476. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  477. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  478. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  479. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  481. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  483. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  484. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  485. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  486. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  487. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  488. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  489. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  490. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  491. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  492. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  493. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  494. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  495. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  496. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  497. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  498. package/src/resources/extensions/gsd/state.ts +12 -1
  499. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  500. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  502. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  503. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  504. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  505. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +51 -0
  506. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  507. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  508. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  509. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  510. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  512. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  513. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  514. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  515. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  516. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  517. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  518. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  519. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  520. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  521. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  522. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  523. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  524. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  525. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  526. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  527. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  528. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  529. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  530. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  531. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  532. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  533. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  534. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  535. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  536. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  537. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  538. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
  539. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +35 -58
  540. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  541. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  542. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  543. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  544. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  545. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  546. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  547. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  548. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  551. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  552. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  553. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  554. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  555. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  556. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  557. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  558. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  559. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  560. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  561. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  562. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  563. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  564. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  565. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  566. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  567. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  568. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  570. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  571. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  572. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  573. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  574. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  575. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  576. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  578. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  579. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  580. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  581. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  582. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  583. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  584. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  585. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  586. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  587. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  589. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  590. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  591. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  592. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  593. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  594. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  595. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  596. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  597. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  598. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  599. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  600. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  601. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  602. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  603. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  604. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  605. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  606. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  607. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  608. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  609. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  610. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  611. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  612. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  613. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  614. package/src/resources/extensions/gsd/unit-registry.ts +41 -24
  615. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  616. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  617. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  618. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  619. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  620. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  621. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  622. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  623. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  624. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  625. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  626. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  627. package/src/resources/extensions/gsd/worktree.ts +7 -1
  628. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  629. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  630. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  631. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  632. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  633. package/src/resources/shared/package-manager-detection.ts +1 -1
  634. package/src/resources/shared/package.json +3 -0
  635. package/src/resources/skills/create-skill/SKILL.md +3 -0
  636. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  637. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  638. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  639. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  640. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  641. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  642. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  643. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  644. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  645. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  646. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  647. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  648. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  649. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  650. /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
  651. /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
@@ -21,7 +21,7 @@ import { getPendingGatesForTurn } from "./gsd-db.js";
21
21
  import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
22
22
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
23
23
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
24
- import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeUnitContext, } from "./unit-context-composer.js";
24
+ import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeToolSurfaceInstructions, composeUnitContext, } from "./unit-context-composer.js";
25
25
  import { resolveManifest } from "./unit-context-manifest.js";
26
26
  import { compileUnitContextContract } from "./tool-contract.js";
27
27
  import { readCompactionSnapshot } from "./compaction-snapshot.js";
@@ -33,7 +33,7 @@ import { debugLog } from "./debug-logger.js";
33
33
  import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
34
34
  import { findMilestoneIds } from "./milestone-ids.js";
35
35
  import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
36
- import { resolveEffectiveUatType, shouldDispatchUatForContent } from "./uat-policy.js";
36
+ import { classifyUatContentForRun, shouldDispatchUatForContent, } from "./uat-policy.js";
37
37
  import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
38
38
  export { buildSkillActivationBlock, buildSkillDiscoveryVars };
39
39
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
@@ -224,12 +224,14 @@ function renderContextModeBlockForPrompt(unitType, base, renderMode = "standalon
224
224
  return `${contextMode}\n\n## Context Snapshot\nSource: \`.gsd/last-snapshot.md\`\n\n${snapshot.trimEnd()}`;
225
225
  }
226
226
  function prependContextModeToBlock(unitType, base, block, renderMode = "standalone") {
227
+ const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
227
228
  const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
228
- if (!contextMode)
229
+ const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
230
+ if (!guidance)
229
231
  return block;
230
232
  if (!block.trim())
231
- return contextMode;
232
- return `${contextMode}\n\n${block}`;
233
+ return guidance;
234
+ return `${guidance}\n\n${block}`;
233
235
  }
234
236
  function requireUnitPromptContextContract(unitType) {
235
237
  const result = compileUnitContextContract(unitType);
@@ -841,7 +843,7 @@ export async function inlineDecisionsFromDb(base, milestoneId, scope, level) {
841
843
  }
842
844
  /**
843
845
  * Inline requirements with optional milestone and slice scoping from the DB.
844
- * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
846
+ * Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
845
847
  */
846
848
  export async function inlineRequirementsFromDb(base, milestoneId, sliceId, level) {
847
849
  const inlineLevel = level ?? resolveInlineLevel();
@@ -849,14 +851,28 @@ export async function inlineRequirementsFromDb(base, milestoneId, sliceId, level
849
851
  const { isDbAvailable } = await import("./gsd-db.js");
850
852
  if (isDbAvailable()) {
851
853
  const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
852
- const requirements = queryRequirements({ milestoneId, sliceId });
854
+ let requirements = queryRequirements({ milestoneId, sliceId });
855
+ let broadenedScope = false;
856
+ if (requirements.length === 0 && sliceId) {
857
+ requirements = queryRequirements({ milestoneId });
858
+ broadenedScope = true;
859
+ }
860
+ if (requirements.length === 0 && milestoneId) {
861
+ requirements = queryRequirements({ status: "active" });
862
+ broadenedScope = true;
863
+ }
853
864
  if (requirements.length > 0) {
854
- // Use compact format for non-full levels to save ~40% tokens
855
- const formatted = inlineLevel !== "full"
865
+ // Use compact format for non-full levels, milestone-scoped calls, and
866
+ // any cascade stage that broadened past the originally requested scope —
867
+ // a slice-scoped "full" call that fell through to the project-wide
868
+ // active fallback must not format those rows as full requirements.
869
+ const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
870
+ const formatted = useCompact
856
871
  ? formatRequirementsCompact(requirements)
857
872
  : formatRequirementsForPrompt(requirements);
858
873
  return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
859
874
  }
875
+ return null;
860
876
  }
861
877
  }
862
878
  catch (err) {
@@ -1265,6 +1281,32 @@ export async function checkNeedsReassessment(base, mid, state) {
1265
1281
  * - No UAT file exists for the slice
1266
1282
  * - UAT result file already exists (idempotent — already ran)
1267
1283
  */
1284
+ /**
1285
+ * Resolve the effective UAT mode for the dispatch gate the same way
1286
+ * `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
1287
+ * supplemental context, so a `browser-executable` UAT whose slice references a
1288
+ * self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
1289
+ * playwright test`) is promoted to `runtime-executable` for the gate too.
1290
+ *
1291
+ * Without this, `checkNeedsRunUat` returns `browser-executable` while the
1292
+ * prompt instructs runtime-only execution, causing the dispatch gate to
1293
+ * require browser tools / warm up the browser daemon (or stop dispatch when
1294
+ * browser MCP is unavailable) for UAT runs that never touch the browser. See
1295
+ * cursor[bot] review on PR #696 for the M007/S01 regression.
1296
+ */
1297
+ async function resolveRunUatEffectiveType(base, mid, sliceId, uatContent) {
1298
+ let summaryContent = "";
1299
+ try {
1300
+ const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
1301
+ if (summaryPath) {
1302
+ summaryContent = (await loadFile(summaryPath)) ?? "";
1303
+ }
1304
+ }
1305
+ catch (err) {
1306
+ logWarning("prompt", `resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`);
1307
+ }
1308
+ return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
1309
+ }
1268
1310
  export async function checkNeedsRunUat(base, mid, state, prefs) {
1269
1311
  // DB primary path — fall through to file-based when DB has no data for this milestone
1270
1312
  try {
@@ -1297,7 +1339,8 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
1297
1339
  }
1298
1340
  if (!shouldDispatchUatForContent(uatContent, prefs))
1299
1341
  continue;
1300
- return { sliceId: sid, uatType: resolveEffectiveUatType(uatContent) };
1342
+ const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
1343
+ return { sliceId: sid, uatType };
1301
1344
  }
1302
1345
  return null;
1303
1346
  }
@@ -1338,7 +1381,8 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
1338
1381
  }
1339
1382
  if (!shouldDispatchUatForContent(uatContentFb, prefs))
1340
1383
  continue;
1341
- return { sliceId: uatSid, uatType: resolveEffectiveUatType(uatContentFb) };
1384
+ const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
1385
+ return { sliceId: uatSid, uatType };
1342
1386
  }
1343
1387
  return null;
1344
1388
  }
@@ -3097,10 +3141,25 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
3097
3141
  const rawInlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${composedBody}`;
3098
3142
  const cappedInlinedContext = capPreamble(rawInlinedContext);
3099
3143
  trackPromptContext(contextTelemetry, "cap", cappedInlinedContext.length < rawInlinedContext.length ? "skipped" : "inline", null, cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget");
3100
- const inlinedContext = prependContextModeToBlock("run-uat", base, cappedInlinedContext);
3144
+ const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
3145
+ const uatType = uatPolicy.effectiveType;
3146
+ const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
3147
+ ? [
3148
+ "## Runtime harness override",
3149
+ "",
3150
+ "This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
3151
+ "Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
3152
+ "Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
3153
+ "Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
3154
+ "When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
3155
+ "",
3156
+ ].join("\n")
3157
+ : "";
3158
+ const inlinedContext = prependContextModeToBlock("run-uat", base, runtimeHarnessOverride
3159
+ ? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
3160
+ : cappedInlinedContext);
3101
3161
  emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
3102
3162
  const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
3103
- const uatType = resolveEffectiveUatType(uatContent);
3104
3163
  const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
3105
3164
  return loadPrompt("run-uat", {
3106
3165
  workingDirectory: base,
@@ -3341,18 +3400,18 @@ opts) {
3341
3400
  }
3342
3401
  const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
3343
3402
  trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
3344
- const prompt = loadPrompt("reactive-execute", {
3403
+ const prompt = prependContextModeToBlock("reactive-execute", base, loadPrompt("reactive-execute", {
3345
3404
  workingDirectory: base,
3346
3405
  milestoneId: mid,
3347
3406
  milestoneTitle: midTitle,
3348
3407
  sliceId: sid,
3349
3408
  sliceTitle: sTitle,
3350
- graphContext: prependContextModeToBlock("reactive-execute", base, graphContext),
3409
+ graphContext,
3351
3410
  readyTaskCount: String(readyTaskIds.length),
3352
3411
  readyTaskList: readyTaskListLines.join("\n"),
3353
3412
  subagentPrompts: subagentSections.join("\n\n---\n\n"),
3354
3413
  inlinedTemplates,
3355
- });
3414
+ }));
3356
3415
  emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
3357
3416
  return prompt;
3358
3417
  }
@@ -3492,17 +3551,17 @@ export async function buildGateEvaluatePrompt(mid, midTitle, sid, sTitle, base,
3492
3551
  "```",
3493
3552
  ].join("\n"));
3494
3553
  }
3495
- return loadPrompt("gate-evaluate", {
3554
+ return prependContextModeToBlock("gate-evaluate", base, loadPrompt("gate-evaluate", {
3496
3555
  workingDirectory: base,
3497
3556
  milestoneId: mid,
3498
3557
  milestoneTitle: midTitle,
3499
3558
  sliceId: sid,
3500
3559
  sliceTitle: sTitle,
3501
- slicePlanContent: prependContextModeToBlock("gate-evaluate", base, planContent),
3560
+ slicePlanContent: planContent,
3502
3561
  gateCount: String(pending.length),
3503
3562
  gateList: gateListLines.join("\n"),
3504
3563
  subagentPrompts: subagentSections.join("\n\n---\n\n"),
3505
- });
3564
+ }));
3506
3565
  }
3507
3566
  export async function buildRewriteDocsPrompt(mid, midTitle, activeSlice, base, overrides) {
3508
3567
  const sid = activeSlice?.id;
@@ -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";
@@ -741,12 +742,14 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
741
742
  // phase-specific planning model for a discuss turn (#2829).
742
743
  //
743
744
  // Precedence:
744
- // 1) Explicit session override via /gsd model (this session)
745
- // 2) Current session model from settings/session restore (if provider ready)
746
- // 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)
747
748
  //
748
- // This preserves #3517 defaults while honoring explicit runtime model
749
- // 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).
750
753
  //
751
754
  // Exception (#4122): when the session provider is a custom provider declared
752
755
  // in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
@@ -758,7 +761,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
758
761
  const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
759
762
  const preferredModel = sessionProviderIsCustom
760
763
  ? null
761
- : resolveDefaultSessionModel(ctx.model?.provider);
764
+ : resolveDefaultSessionModel(ctx.model?.provider, base);
762
765
  // Validate the preferred model against the live registry + provider auth so
763
766
  // an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
764
767
  // start-model snapshot. Without this, every subsequent unit would try to
@@ -781,8 +784,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
781
784
  : null;
782
785
  const startThinkingSnapshot = pi.getThinkingLevel();
783
786
  const startModelSnapshot = manualSessionOverride
784
- ?? currentSessionModel
785
787
  ?? validatedPreferredModel
788
+ ?? currentSessionModel
786
789
  ?? null;
787
790
  try {
788
791
  // Validate GSD_PROJECT_ID early so the user gets immediate feedback
@@ -973,9 +976,26 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
973
976
  state = await deriveState(wtPath);
974
977
  }
975
978
  }
976
- const blockingStrandedRecoveryAction = state.activeMilestone
977
- ? strandedRecoveryActions.find((action) => action.milestoneId !== state.activeMilestone?.id) ?? strandedRecoveryAction
978
- : 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
+ }
979
999
  if (blockingStrandedRecoveryAction) {
980
1000
  if (!state.activeMilestone) {
981
1001
  ctx.ui.notify(formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, null), "error");
@@ -988,6 +1008,9 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
988
1008
  strandedRecoveryAction = blockingStrandedRecoveryAction;
989
1009
  ctx.ui.notify(formatStrandedWorkRecoveryMessage(strandedRecoveryAction), "info");
990
1010
  }
1011
+ else if (lockedActiveMilestone) {
1012
+ strandedRecoveryAction = null;
1013
+ }
991
1014
  if (process.env.GSD_HEADLESS === "1" &&
992
1015
  orphanAuditRecovered &&
993
1016
  !state.activeMilestone &&
@@ -1270,11 +1293,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
1270
1293
  if (enterResult.reason === "lease-conflict") {
1271
1294
  ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`, "error");
1272
1295
  }
1273
- else if (enterResult.reason === "creation-failed") {
1274
- ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`, "error");
1275
- }
1276
- else if (enterResult.reason === "isolation-degraded") {
1277
- 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");
1278
1298
  }
1279
1299
  else if (enterResult.reason === "invalid-milestone-id") {
1280
1300
  ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: milestone id is invalid.`, "error");
@@ -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,6 +1,7 @@
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
6
  // Scope-class membership is declared per unit in the Unit Registry (ADR-033).
6
7
  // EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
@@ -22,9 +23,9 @@ const SCOPED_GSD_LIFECYCLE_TOOLS = new Set([
22
23
  .map(canonicalWorkflowToolName));
23
24
  export const GSD_PHASE_SCOPE_DISPLAY_REASON = "This GSD phase only allows its scoped workflow tools.";
24
25
  export const GSD_SECTION_CLOSE_GATE_DISPLAY_REASON = "Gates here close by writing summary sections — gsd_save_gate_result isn't needed.";
25
- export function canonicalWorkflowToolName(toolName) {
26
- return canonicalWorkflowSurfaceToolName(toolName);
27
- }
26
+ // Normalizer seam lives in engine-hook-contract.ts; re-exported here for
27
+ // existing scope importers.
28
+ export { canonicalWorkflowToolName };
28
29
  export function isWorkflowAliasTool(toolName) {
29
30
  return isWorkflowSurfaceAliasTool(toolName);
30
31
  }
@@ -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";
@@ -800,6 +800,14 @@ function _resolveIntegrationBranchForReuse(basePath, milestoneId) {
800
800
  return null;
801
801
  }
802
802
  }
803
+ function safeCwd(fallback) {
804
+ try {
805
+ return process.cwd();
806
+ }
807
+ catch {
808
+ return fallback;
809
+ }
810
+ }
803
811
  /**
804
812
  * When reusing an existing milestone branch, fast-forward it onto the
805
813
  * integration branch when that's safe (branch is a strict ancestor of
@@ -949,7 +957,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
949
957
  originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
950
958
  const branch = autoWorktreeBranch(milestoneId);
951
959
  const { preserveBranch = false, preserveWorktree = false } = opts;
952
- const previousCwd = process.cwd();
960
+ const previousCwd = safeCwd(originalBasePath);
953
961
  // Wrap the entire teardown body in a single try/finally so activeWorkspace
954
962
  // is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
955
963
  // was deleted before teardown ran). Previously the finally only covered
@@ -1033,7 +1041,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
1033
1041
  * still works after process restart when module state has been reset.
1034
1042
  */
1035
1043
  export function isInAutoWorktree(basePath) {
1036
- const targetPath = isGsdWorktreePath(basePath) ? basePath : process.cwd();
1044
+ const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
1037
1045
  if (!isGsdWorktreePath(targetPath))
1038
1046
  return false;
1039
1047
  const storedBase = getAutoWorktreeOriginalBase();
@@ -1901,6 +1909,11 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1901
1909
  }
1902
1910
  catch (err) {
1903
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
+ });
1904
1917
  }
1905
1918
  };
1906
1919
  let shouldCleanup = false;
@@ -557,6 +557,13 @@ export function getAutoModeStartModel() {
557
557
  export function setCurrentDispatchedModelId(model) {
558
558
  s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
559
559
  }
560
+ /**
561
+ * Update the active unit model after runtime recovery switches models mid-unit.
562
+ * The next session restore path reads this field before dispatching again.
563
+ */
564
+ export function setCurrentUnitModelForRecovery(model) {
565
+ s.currentUnitModel = model;
566
+ }
560
567
  // Tool tracking — delegates to auto-tool-tracking.ts
561
568
  export function markToolStart(toolCallId, toolName) {
562
569
  _markToolStart(toolCallId, s.active, toolName);
@@ -623,6 +630,35 @@ export function stopAutoRemote(projectRoot) {
623
630
  return { found: false, error: err.message };
624
631
  }
625
632
  }
633
+ /**
634
+ * Force-stop a remote auto-mode session before stealing its lock.
635
+ * The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
636
+ * this path is only for the explicit "Force start" action.
637
+ */
638
+ export function forceStopAutoRemote(projectRoot) {
639
+ const lock = readCrashLock(projectRoot);
640
+ if (!lock)
641
+ return { found: false };
642
+ if (lock.pid === process.pid) {
643
+ clearLock(projectRoot);
644
+ return { found: false };
645
+ }
646
+ if (!isLockProcessAlive(lock)) {
647
+ clearLock(projectRoot);
648
+ return { found: false };
649
+ }
650
+ try {
651
+ process.kill(lock.pid, "SIGTERM");
652
+ if (isLockProcessAlive(lock)) {
653
+ process.kill(lock.pid, "SIGKILL");
654
+ }
655
+ clearLock(projectRoot);
656
+ return { found: true, pid: lock.pid };
657
+ }
658
+ catch (err) {
659
+ return { found: false, error: err.message };
660
+ }
661
+ }
626
662
  /**
627
663
  * Check if a remote auto-mode session is running (from a different process).
628
664
  * Reads the crash lock, checks PID liveness, and returns session details.
@@ -715,6 +751,9 @@ function pauseAutoUnitIdentityMatches(expected) {
715
751
  s.currentUnit.id === expected.id &&
716
752
  s.currentUnit.startedAt === expected.startedAt;
717
753
  }
754
+ function shouldPreserveCoordinationForPause(errorContext) {
755
+ return errorContext?.category === "provider" && errorContext.isTransient === true;
756
+ }
718
757
  function setLifecycleOutcome(ctx, input) {
719
758
  if (!ctx?.hasUI)
720
759
  return;
@@ -1549,7 +1588,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
1549
1588
  releaseSessionLock(lockBase());
1550
1589
  clearLock(lockBase());
1551
1590
  }
1552
- if (s.workerId) {
1591
+ if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
1553
1592
  try {
1554
1593
  if (s.currentMilestoneId && s.milestoneLeaseToken) {
1555
1594
  releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
@@ -1824,7 +1863,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1824
1863
  if (freshStartAssessment.classification === "running") {
1825
1864
  const pid = freshStartAssessment.lock?.pid;
1826
1865
  ctx.ui.notify(pid
1827
- ? `Another auto-mode session (PID ${pid}) appears to be running.\nStop it with \`kill ${pid}\` before starting a new session.`
1866
+ ? `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.`
1828
1867
  : "Another auto-mode session appears to be running.", "error");
1829
1868
  return;
1830
1869
  }