@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
@@ -1,7 +1,7 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Unit dispatch contract adapter for auto-mode loop.
3
3
  import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
4
- import { runUnitPhase } from "./phases.js";
4
+ import { runUnitPhase } from "./unit-phase.js";
5
5
  import { decideDispatchNodeKind } from "./workflow-kernel.js";
6
6
  export async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem, deps) {
7
7
  if (dispatchContract === "legacy-direct") {
@@ -0,0 +1,125 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Worktree-safety helpers shared across auto-loop phase modules.
3
+ import { classifyProject } from "../detection.js";
4
+ import { resolveEffectiveUnitIsolationMode } from "../preferences.js";
5
+ import { createWorktreeSafetyModule } from "../worktree-safety.js";
6
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
7
+ import { resolveManifest } from "../unit-context-manifest.js";
8
+ import { debugLog } from "../debug-logger.js";
9
+ import { isSamePathLocal } from "./phase-helpers.js";
10
+ import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
11
+ export function shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification) {
12
+ return (worktreeClassification.kind === "greenfield" &&
13
+ projectRootClassification.kind !== "greenfield" &&
14
+ projectRootClassification.kind !== "invalid-repo");
15
+ }
16
+ export function unitWritesSource(unitType) {
17
+ if (unitType.startsWith("hook/"))
18
+ return false;
19
+ // Backward compatibility: sidecar queues from older builds may persist
20
+ // prefixed unit types (e.g. "sidecar/quick-task").
21
+ const normalizedUnitType = unitType.startsWith("sidecar/")
22
+ ? unitType.slice("sidecar/".length)
23
+ : unitType;
24
+ const manifest = resolveManifest(normalizedUnitType);
25
+ if (!manifest)
26
+ return null;
27
+ return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
28
+ }
29
+ export function formatWorktreeSafetyFailure(result) {
30
+ return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
31
+ }
32
+ export function formatWorktreeSafetyStopReason(result) {
33
+ if (result.kind === "empty-worktree-with-project-content") {
34
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
35
+ }
36
+ return `Worktree Safety failed (${result.kind}).`;
37
+ }
38
+ export function resolveEmptyWorktreeWithProjectContent(unitRoot, projectRoot) {
39
+ if (isSamePathLocal(unitRoot, projectRoot))
40
+ return false;
41
+ const worktreeClassification = classifyProject(unitRoot);
42
+ if (worktreeClassification.kind !== "greenfield")
43
+ return false;
44
+ const projectRootClassification = classifyProject(projectRoot);
45
+ return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
46
+ }
47
+ export async function validateSourceWriteWorktreeSafety(ic, unitType, unitId, milestoneId, phase) {
48
+ const { ctx, pi, s, deps } = ic;
49
+ if (!s.basePath)
50
+ return null;
51
+ // Custom engine workflows (graph-driven, registered via run dirs) define
52
+ // their own step ids that are not in the GSD UnitContextManifest. Don't
53
+ // fail closed for those — the custom engine owns its own dispatch
54
+ // contract. The fail-closed safety check applies only to built-in GSD
55
+ // units whose Tool Contract is registered in the manifest. Use a truthy
56
+ // check so undefined (test sessions that never set the field) routes
57
+ // through the safety check, matching the regression test contract.
58
+ if (s.activeEngineId)
59
+ return null;
60
+ const writesSource = unitWritesSource(unitType);
61
+ if (writesSource === null) {
62
+ const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
63
+ debugLog("worktreeSafety", {
64
+ phase,
65
+ unitType,
66
+ unitId,
67
+ milestoneId,
68
+ result: { ok: false, kind: "missing-tool-contract", reason: msg },
69
+ basePath: s.basePath,
70
+ });
71
+ ctx.ui.notify(msg, "error");
72
+ await deps.stopAuto(ctx, pi, msg);
73
+ return { action: "break", reason: "missing-tool-contract" };
74
+ }
75
+ if (!writesSource)
76
+ return null;
77
+ const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
78
+ // A degraded session already fell back to the milestone branch in the
79
+ // project root — validating against the canonical worktree root there
80
+ // would fail every dispatch with a false invalid-root. The same applies
81
+ // to a stranded-recovery session that adopted the milestone branch.
82
+ const isolationMode = resolveEffectiveUnitIsolationMode(deps.getIsolationMode(projectRoot), s.isolationDegraded, s.strandedRecoveryIsolationMode);
83
+ reclaimMissingMilestoneLease(s, milestoneId, isolationMode, phase);
84
+ const safety = createWorktreeSafetyModule();
85
+ const result = safety.validateUnitRoot({
86
+ unitType,
87
+ unitId,
88
+ writeScope: "source-writing",
89
+ projectRoot,
90
+ unitRoot: s.basePath,
91
+ milestoneId,
92
+ isolationMode,
93
+ expectedBranch: isolationMode !== "none" && milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
94
+ emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
95
+ // The milestone lease coordinates concurrent workers on an isolated
96
+ // milestone worktree/branch, which is established by enterMilestone in
97
+ // worktree/branch modes. `none` mode has no per-milestone isolation and
98
+ // does not reliably claim a lease (e.g. a fresh headless resume of an
99
+ // already-active milestone never re-enters it), so requiring a held lease
100
+ // there would falsely fail dispatch. Enforce the lease only in isolated
101
+ // modes; none-mode safety still validates the unit root.
102
+ lease: s.workerId
103
+ ? {
104
+ required: isolationMode !== "none",
105
+ held: hasHeldMilestoneLease(s, milestoneId),
106
+ owner: s.workerId,
107
+ }
108
+ : undefined,
109
+ });
110
+ if (result.ok)
111
+ return null;
112
+ const msg = formatWorktreeSafetyFailure(result);
113
+ debugLog("worktreeSafety", {
114
+ phase,
115
+ unitType,
116
+ unitId,
117
+ milestoneId,
118
+ result,
119
+ basePath: s.basePath,
120
+ projectRoot,
121
+ });
122
+ ctx.ui.notify(msg, "error");
123
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
124
+ return { action: "break", reason: result.kind };
125
+ }
@@ -4,14 +4,13 @@
4
4
  */
5
5
  import { deriveState } from "./state.js";
6
6
  import { loadFile } from "./files.js";
7
- import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
8
- import { parseRoadmap } from "./parsers-legacy.js";
9
- import { resolveMilestoneFile, resolveSliceFile, relSliceFile, } from "./paths.js";
7
+ import { isDbAvailable, getClosedSliceIds } from "./gsd-db.js";
8
+ import { resolveSliceFile, relSliceFile, } from "./paths.js";
10
9
  import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
11
10
  import { loadEffectiveGSDPreferences } from "./preferences.js";
12
11
  import { pauseAuto } from "./auto.js";
13
12
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
14
- import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, } from "./workflow-mcp.js";
13
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
15
14
  export async function dispatchDirectPhase(ctx, pi, phase, base) {
16
15
  const state = await deriveState(base);
17
16
  const mid = state.activeMilestone?.id;
@@ -135,21 +134,9 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
135
134
  }
136
135
  case "reassess":
137
136
  case "reassess-roadmap": {
138
- // DB primary pathget completed slices, fall back to file parsing when DB has no data
139
- let completedSliceIds = [];
140
- if (isDbAvailable()) {
141
- completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
142
- }
143
- if (completedSliceIds.length === 0) {
144
- // File-based fallback: parse roadmap checkboxes
145
- const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
146
- if (roadmapPath) {
147
- const roadmapContent = await loadFile(roadmapPath);
148
- if (roadmapContent) {
149
- completedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
150
- }
151
- }
152
- }
137
+ // DB-authoritative read (ADR-017)markdown projections are never
138
+ // consulted for dispatch decisions. No DB rows means no completed slices.
139
+ const completedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
153
140
  if (completedSliceIds.length === 0) {
154
141
  ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
155
142
  return;
@@ -173,20 +160,9 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
173
160
  // incomplete) slice. After slice completion, state.activeSlice advances
174
161
  // to the next incomplete slice, so we find the last done slice from the
175
162
  // roadmap instead (#1693).
176
- let uatCompletedSliceIds = [];
177
- if (isDbAvailable()) {
178
- uatCompletedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
179
- }
180
- if (uatCompletedSliceIds.length === 0) {
181
- // File-based fallback: parse roadmap checkboxes
182
- const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
183
- if (roadmapPath) {
184
- const roadmapContent = await loadFile(roadmapPath);
185
- if (roadmapContent) {
186
- uatCompletedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
187
- }
188
- }
189
- }
163
+ // DB-authoritative read (ADR-017) — no markdown fallback for dispatch
164
+ // decisions.
165
+ const uatCompletedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
190
166
  if (uatCompletedSliceIds.length === 0) {
191
167
  ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
192
168
  return;
@@ -225,7 +201,8 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
225
201
  ctx.ui.notify(`Unknown phase "${phase}". Valid phases: research, plan, execute, complete, validate, reassess, uat, replan.`, "warning");
226
202
  return;
227
203
  }
228
- const compatibilityError = getWorkflowTransportSupportError(ctx.model?.provider, getRequiredWorkflowToolsForAutoUnit(unitType), {
204
+ const compatibilityError = getUnitWorkflowDispatchReadinessError({
205
+ provider: ctx.model?.provider,
229
206
  projectRoot,
230
207
  surface: "direct phase dispatch",
231
208
  unitType,
@@ -2,11 +2,10 @@
2
2
  // File Purpose: Declarative auto-mode dispatch rules and dispatch resolver.
3
3
  import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
4
4
  import { getUatBrowserToolSupportError } from "./uat-policy.js";
5
- import { isDbAvailable, getMilestoneSlices, getPendingGatesForTurn, markPendingGatesOmittedForTurn, getMilestone, insertArtifact, insertAssessment, setSliceSketchFlag, transaction, getAssessment, } from "./gsd-db.js";
5
+ import { isDbAvailable, getMilestoneSlices, getMilestoneSliceSummaries, getClosedSliceIds, getPendingGatesForTurn, markPendingGatesOmittedForTurn, getMilestone, insertArtifact, insertAssessment, setSliceSketchFlag, transaction, getAssessment, } from "./gsd-db.js";
6
6
  import { isClosedStatus } from "./status-guards.js";
7
7
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
8
8
  import { gsdRoot, resolveGsdPathContract, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, relTaskFile, relSliceFile, buildMilestoneFileName, buildSliceFileName, buildTaskFileName, gsdProjectionRoot, } from "./paths.js";
9
- import { parseRoadmap } from "./parsers-legacy.js";
10
9
  import { validateArtifact } from "./schemas/validate.js";
11
10
  import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
12
11
  import { logWarning, logError } from "./workflow-logger.js";
@@ -19,10 +18,15 @@ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
19
18
  import { getMilestonePipelineVariant } from "./milestone-scope-classifier.js";
20
19
  import { EXECUTION_ENTRY_PHASES, hasFinalizedMilestoneContext } from "./uok/plan-v2.js";
21
20
  import { isAutoActive } from "./auto.js";
22
- import { markDepthVerified } from "./bootstrap/write-gate.js";
21
+ // Host adapter explicitly: auto-dispatch runs in the extension host, and the
22
+ // ambient write-gate exports env-sniff the adapter per call (they are reserved
23
+ // for the workflow MCP child's dynamic-import surface).
24
+ import { hostWriteGateAdapter } from "./bootstrap/write-gate.js";
23
25
  import { ensureWorkflowPreferencesCaptured } from "./planning-depth.js";
24
26
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
25
- import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, } from "./workflow-mcp.js";
27
+ import { resolveWorkflowMcpProjectRoot } from "./workflow-mcp.js";
28
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
29
+ import { prepareBrowserDaemonForUat } from "./browser-daemon-auto-prep.js";
26
30
  import { PROJECT_RESEARCH_INFLIGHT_MARKER, } from "./project-research-policy.js";
27
31
  import { isWorkflowPrefsCaptured, resolveDeepProjectSetupState, } from "./deep-project-setup-policy.js";
28
32
  import { annotateBackgroundable } from "./delegation-policy.js";
@@ -289,30 +293,13 @@ function persistSliceAssessmentBackfill(assessmentRelPath, mid, sliceId, content
289
293
  });
290
294
  }
291
295
  function backfillMissingAssessmentsFromSummaries(basePath, mid) {
292
- const completedSliceIds = new Set();
293
- if (isDbAvailable()) {
294
- for (const slice of getMilestoneSlices(mid)) {
295
- if (slice.status === "complete" || slice.status === "done") {
296
- completedSliceIds.add(slice.id);
297
- }
298
- }
299
- }
300
- else {
301
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
302
- if (!roadmapFile)
303
- return;
304
- try {
305
- const roadmap = parseRoadmap(readFileSync(roadmapFile, "utf-8"));
306
- for (const slice of roadmap.slices) {
307
- if (slice.done)
308
- completedSliceIds.add(slice.id);
309
- }
310
- }
311
- catch {
312
- return;
313
- }
314
- }
315
- for (const sliceId of completedSliceIds) {
296
+ // DB-authoritative (ADR-017): no markdown fallback. Without DB rows there
297
+ // is nothing to backfill.
298
+ if (!isDbAvailable())
299
+ return;
300
+ // Canonical closed vocabulary (complete/done/skipped/closed) — a skipped or
301
+ // closed slice with a SUMMARY gets the same assessment backfill treatment.
302
+ for (const sliceId of getClosedSliceIds(mid)) {
316
303
  const summaryPath = resolveSliceFile(basePath, mid, sliceId, "SUMMARY");
317
304
  if (!summaryPath || !existsSync(summaryPath))
318
305
  continue;
@@ -488,7 +475,7 @@ export const DISPATCH_RULES = [
488
475
  // deadlock. Deep planning is still user-driven even inside auto-mode,
489
476
  // so it must wait for explicit approval instead of taking this bypass.
490
477
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
491
- markDepthVerified(mid, basePath);
478
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
492
479
  }
493
480
  return {
494
481
  action: "dispatch",
@@ -526,7 +513,15 @@ export const DISPATCH_RULES = [
526
513
  // Transport preflight: verify required MCP tools are actually connected
527
514
  // before consuming a retry attempt. Fixes tool-starved sessions burning
528
515
  // all MAX_UAT_ATTEMPTS before stopping (#477).
529
- const transportError = getWorkflowTransportSupportError(sessionProvider, getRequiredWorkflowToolsForAutoUnit("run-uat"), { projectRoot: basePath, surface: "auto-mode", unitType: "run-uat", authMode: sessionAuthMode, baseUrl: sessionBaseUrl, activeTools });
516
+ const transportError = getUnitWorkflowDispatchReadinessError({
517
+ provider: sessionProvider,
518
+ projectRoot: basePath,
519
+ surface: "auto-mode",
520
+ unitType: "run-uat",
521
+ authMode: sessionAuthMode,
522
+ baseUrl: sessionBaseUrl,
523
+ activeTools,
524
+ });
530
525
  if (transportError) {
531
526
  return { action: "stop", reason: transportError, level: "warning" };
532
527
  }
@@ -540,6 +535,16 @@ export const DISPATCH_RULES = [
540
535
  if (browserToolError) {
541
536
  return { action: "stop", reason: browserToolError, level: "warning" };
542
537
  }
538
+ const browserDaemonError = prepareBrowserDaemonForUat({
539
+ uatType,
540
+ sessionProvider,
541
+ sessionAuthMode,
542
+ sessionBaseUrl,
543
+ projectRoot: resolveWorkflowMcpProjectRoot(basePath),
544
+ });
545
+ if (browserDaemonError) {
546
+ return { action: "stop", reason: browserDaemonError, level: "warning" };
547
+ }
543
548
  // Cap run-uat dispatch attempts to prevent infinite replay (#3624).
544
549
  // Check before incrementing so an exhausted counter cannot create a
545
550
  // no-progress skip loop that starves later dispatch rules.
@@ -569,24 +574,11 @@ export const DISPATCH_RULES = [
569
574
  // Only applies when UAT dispatch is enabled
570
575
  if (!prefs?.uat_dispatch)
571
576
  return null;
572
- // DB-first: prefer closed slices from DB; fall back to ROADMAP on disk.
573
- let closedSliceIds;
574
- if (isDbAvailable()) {
575
- closedSliceIds = getMilestoneSlices(mid)
576
- .filter(s => isClosedStatus(s.status))
577
- .map(s => s.id);
578
- }
579
- else {
580
- // Filesystem fallback for degraded / unmigrated projects.
581
- // `slice.done` in the parsed ROADMAP is the disk-level closed signal.
582
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
583
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
584
- if (!roadmapContent)
585
- return null;
586
- const roadmap = parseRoadmap(roadmapContent);
587
- closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
588
- }
589
- for (const sliceId of closedSliceIds) {
577
+ // DB-authoritative (ADR-017): closed slices come from the DB only; the
578
+ // ROADMAP projection is never parsed for gate decisions.
579
+ if (!isDbAvailable())
580
+ return null;
581
+ for (const sliceId of getClosedSliceIds(mid)) {
590
582
  const result = await readUatGateVerdict(basePath, mid, sliceId);
591
583
  if (!result)
592
584
  continue;
@@ -641,7 +633,7 @@ export const DISPATCH_RULES = [
641
633
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
642
634
  // pre-verify deep planning's user-facing milestone approval gate.
643
635
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
644
- markDepthVerified(mid, basePath);
636
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
645
637
  }
646
638
  return {
647
639
  action: "dispatch",
@@ -823,7 +815,7 @@ export const DISPATCH_RULES = [
823
815
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
824
816
  // pre-verify deep planning's user-facing milestone approval gate.
825
817
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
826
- markDepthVerified(mid, basePath);
818
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
827
819
  }
828
820
  return {
829
821
  action: "dispatch",
@@ -905,18 +897,18 @@ export const DISPATCH_RULES = [
905
897
  // behavior.
906
898
  if (await getMilestonePipelineVariant(mid) === "trivial")
907
899
  return null;
908
- // Load roadmap to find all slices
909
- const roadmapFile = resolveExistingExpectedArtifact("plan-milestone", mid, basePath) ??
910
- resolveMilestoneFile(basePath, mid, "ROADMAP");
911
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
912
- if (!roadmapContent)
900
+ // DB-authoritative slice list (ADR-017): the ROADMAP projection is
901
+ // never parsed for dispatch decisions. No DB / no rows → skip this rule.
902
+ if (!isDbAvailable())
903
+ return null;
904
+ const dbSlices = getMilestoneSliceSummaries(mid);
905
+ if (dbSlices.length === 0)
913
906
  return null;
914
- const roadmap = parseRoadmap(roadmapContent);
915
907
  // Find slices that need research (no RESEARCH file, dependencies done)
916
908
  const milestoneResearchFile = resolveExistingExpectedArtifact("research-milestone", mid, basePath) ??
917
909
  resolveMilestoneFile(basePath, mid, "RESEARCH");
918
910
  const researchReadySlices = [];
919
- for (const slice of roadmap.slices) {
911
+ for (const slice of dbSlices) {
920
912
  if (slice.done)
921
913
  continue;
922
914
  // Skip S01 when milestone research exists
@@ -926,7 +918,7 @@ export const DISPATCH_RULES = [
926
918
  if (resolveExistingExpectedArtifact("research-slice", `${mid}/${slice.id}`, basePath))
927
919
  continue;
928
920
  // Skip if dependencies aren't done (check for SUMMARY files)
929
- const depsComplete = (slice.depends ?? []).every((depId) => !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath));
921
+ const depsComplete = slice.depends.every((depId) => !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath));
930
922
  if (!depsComplete)
931
923
  continue;
932
924
  researchReadySlices.push({ id: slice.id, title: slice.title });
@@ -13,7 +13,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
13
13
  import { logWarning } from "./workflow-logger.js";
14
14
  import { resolveUokFlags } from "./uok/flags.js";
15
15
  import { applyModelPolicyFilter } from "./uok/model-policy.js";
16
- import { isModelBlocked } from "./blocked-models.js";
16
+ import { isModelBlocked, isModelTemporarilyUnavailable } from "./blocked-models.js";
17
17
  import { getRequiredWorkflowToolsForAutoUnit, isWorkflowMcpSurfaceTool } from "./workflow-mcp.js";
18
18
  /**
19
19
  * Thrown when the model-policy gate rejects every candidate model for a unit
@@ -218,6 +218,10 @@ function buildModelPolicyBlockReasons(policyDenyReasons, availableModels, routin
218
218
  reason: `configured model(s) did not resolve against policy-eligible registry [${eligibleSummary}]`,
219
219
  }];
220
220
  }
221
+ function isModelUnavailable(basePath, provider, id) {
222
+ return isModelBlocked(basePath, provider, id) ||
223
+ isModelTemporarilyUnavailable(basePath, provider, id);
224
+ }
221
225
  function restoreToolBaseline(pi) {
222
226
  const key = pi;
223
227
  const baseline = TOOL_BASELINE.get(key);
@@ -657,8 +661,8 @@ autoModeStartThinkingLevel) {
657
661
  // (issue #4513). The block is persisted in .gsd/runtime/blocked-models.json
658
662
  // so it survives /gsd auto restarts — without this, the same dead model
659
663
  // gets reselected after every restart.
660
- if (isModelBlocked(basePath, model.provider, model.id)) {
661
- ctx.ui.notify(`Skipping blocked model ${model.provider}/${model.id} (provider rejected it for this account).`, "warning");
664
+ if (isModelUnavailable(basePath, model.provider, model.id)) {
665
+ ctx.ui.notify(`Skipping unavailable model ${model.provider}/${model.id}.`, "warning");
662
666
  continue;
663
667
  }
664
668
  // Warn if the ID is ambiguous across providers
@@ -724,7 +728,7 @@ autoModeStartThinkingLevel) {
724
728
  const key = `${model.provider.toLowerCase()}/${model.id.toLowerCase()}`;
725
729
  if (!policyAllowedModelKeys.has(key))
726
730
  continue;
727
- if (isModelBlocked(basePath, model.provider, model.id))
731
+ if (isModelUnavailable(basePath, model.provider, model.id))
728
732
  continue;
729
733
  const ok = await pi.setModel(model, { persist: false });
730
734
  if (!ok)
@@ -746,16 +750,16 @@ autoModeStartThinkingLevel) {
746
750
  // No model preference for this unit type — re-apply the model captured
747
751
  // at auto-mode start to prevent bleed from shared global settings.json (#650).
748
752
  const availableModels = buildModelPolicyCandidates(ctx, autoModeStartModel, effectiveSessionModelOverride);
749
- const startBlocked = isModelBlocked(basePath, autoModeStartModel.provider, autoModeStartModel.id);
753
+ const startBlocked = isModelUnavailable(basePath, autoModeStartModel.provider, autoModeStartModel.id);
750
754
  if (startBlocked) {
751
- ctx.ui.notify(`Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is blocked for this account. Using current session model instead.`, "warning");
755
+ ctx.ui.notify(`Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is unavailable. Using current session model instead.`, "warning");
752
756
  }
753
757
  else {
754
758
  const startModel = availableModels.find(m => m.provider === autoModeStartModel.provider && m.id === autoModeStartModel.id);
755
759
  if (startModel) {
756
760
  const ok = await pi.setModel(startModel, { persist: false });
757
761
  if (!ok) {
758
- const byId = availableModels.find(m => m.id === autoModeStartModel.id && !isModelBlocked(basePath, m.provider, m.id));
762
+ const byId = availableModels.find(m => m.id === autoModeStartModel.id && !isModelUnavailable(basePath, m.provider, m.id));
759
763
  if (byId) {
760
764
  const fallbackOk = await pi.setModel(byId, { persist: false });
761
765
  if (fallbackOk) {
@@ -839,15 +843,34 @@ export function resolveModelId(modelId, availableModels, currentProvider) {
839
843
  if (providerMatch)
840
844
  return providerMatch;
841
845
  }
842
- // Prefer "anthropic" as the canonical provider for Anthropic models.
843
- // Transport-specific tiebreaker (ADR-012): intentionally keys on provider,
844
- // not api we want the plain Anthropic transport when multiple are available.
845
- const anthropicMatch = candidates.find(m => m.provider === "anthropic");
846
- if (anthropicMatch)
847
- return anthropicMatch;
846
+ // Subscription/OAuth routes beat pay-per-token API when the same model ID
847
+ // exists on multiple providers. Order matters — first match wins.
848
+ for (const provider of BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE) {
849
+ const match = candidates.find(m => m.provider === provider);
850
+ if (match)
851
+ return match;
852
+ }
848
853
  // Fall back to first non-extension candidate, or any candidate
849
854
  return candidates.find(m => !EXTENSION_PROVIDERS.has(m.provider)) ?? candidates[0];
850
855
  }
856
+ /**
857
+ * When a bare model ID exists on multiple providers, prefer subscription/OAuth
858
+ * routes over pay-per-token API keys. Matches PROVIDER_ROUTES in doctor-providers
859
+ * but applies when *both* sides are authenticated.
860
+ *
861
+ * Order rationale:
862
+ * - openai-codex before github-copilot: ChatGPT-native for shared GPT IDs
863
+ * - google-gemini-cli before github-copilot: first-party Gemini CLI
864
+ * - anthropic before github-copilot: first-party Claude API/OAuth over Copilot
865
+ * - github-copilot before openai/google: Copilot OAuth over platform API keys
866
+ */
867
+ export const BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE = [
868
+ "openai-codex",
869
+ "google-gemini-cli",
870
+ "anthropic",
871
+ "github-copilot",
872
+ "google-antigravity",
873
+ ];
851
874
  /**
852
875
  * Flat-rate providers charge the same per request regardless of model.
853
876
  * Dynamic routing provides no cost benefit — it only degrades quality (#3453).
@@ -16,7 +16,7 @@ import { deriveState } from "./state.js";
16
16
  import { logWarning, logError } from "./workflow-logger.js";
17
17
  import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
18
18
  import { loadPrompt } from "./prompt-loader.js";
19
- import { isAwaitingUserInput } from "./user-input-boundary.js";
19
+ import { isAwaitingUserInput } from "./consent-question.js";
20
20
  import { resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName, } from "./paths.js";
21
21
  import { invalidateAllCaches } from "./cache.js";
22
22
  import { rebuildState } from "./doctor.js";
@@ -30,8 +30,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
30
30
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
31
31
  import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
32
32
  import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
33
- import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
34
- import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
33
+ import { renderPlanCheckboxes, renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "./markdown-renderer.js";
35
34
  import { consumeSignal } from "./session-status-io.js";
36
35
  import { checkPostUnitHooks, consumeHookFailure, isRetryPending, consumeRetryTrigger, consumeGateBlock, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
37
36
  import { hasPendingCaptures, loadPendingCaptures, revertExecutorResolvedCaptures } from "./captures.js";
@@ -60,6 +59,7 @@ import { formatConnectedStepStack, formatPostUnitStatusCard } from "./auto-statu
60
59
  import { clearProjectResearchInflightMarker, finalizeProjectResearchTimeout, } from "./project-research-policy.js";
61
60
  import { validateArtifact } from "./schemas/validate.js";
62
61
  import { verificationRetryKey } from "./auto/verification-retry-policy.js";
62
+ import { saveCustomVerifyRetryCounts } from "./auto/custom-verify-retry-store.js";
63
63
  import { getLedger } from "./metrics.js";
64
64
  import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
65
65
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
@@ -722,7 +722,7 @@ export const USER_DRIVEN_DEEP_UNITS = new Set([
722
722
  "discuss-milestone",
723
723
  "research-decision",
724
724
  ]);
725
- export { isAwaitingUserInput } from "./user-input-boundary.js";
725
+ export { isAwaitingUserInput } from "./consent-question.js";
726
726
  function artifactValidationKind(unitType) {
727
727
  if (unitType === "discuss-project")
728
728
  return "project";
@@ -800,11 +800,13 @@ async function repairCompleteSliceRoadmapProjection(unitType, unitId, basePath)
800
800
  if (!summaryPath || !existsSync(summaryPath) || !uatPath || !existsSync(uatPath)) {
801
801
  return false;
802
802
  }
803
+ // Stale-render detection (ADR-017): the DB already says the slice is closed;
804
+ // this only checks whether the rendered ROADMAP projection reflects it, to
805
+ // decide whether a repair re-render is needed.
803
806
  const roadmapPath = resolveMilestoneFile(artifactBase, mid, "ROADMAP");
804
807
  if (roadmapPath && existsSync(roadmapPath)) {
805
808
  try {
806
- const roadmap = parseLegacyRoadmap(readFileSync(roadmapPath, "utf-8"));
807
- if (roadmap.slices.find((roadmapSlice) => roadmapSlice.id === sid)?.done) {
809
+ if (roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sid)) {
808
810
  return false;
809
811
  }
810
812
  }
@@ -1702,13 +1704,24 @@ export async function postUnitPreVerification(pctx, opts) {
1702
1704
  }
1703
1705
  else if (!triggerArtifactVerified) {
1704
1706
  if (s.lastToolInvocationError && isToolUnavailableError(s.lastToolInvocationError)) {
1705
- // Tool-unavailable is the one transient invocation error: the
1706
- // workflow MCP server registers its surface asynchronously, so a
1707
- // Unit's first call can race the registration. Fall through to the
1708
- // bounded verification retry instead of pausing.
1709
- debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError });
1710
- ctx.ui.notify(`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. The tool surface may still be registering — retrying.`, "warning");
1707
+ // Tool-unavailable is transient: the workflow MCP server registers
1708
+ // its surface asynchronously, so a Unit's first call can race the
1709
+ // registration. Retry with escalating delay, bounded at 3 attempts.
1710
+ // ponytail: MAX constant so the guard, log, and display all agree
1711
+ const MAX_TOOL_UNAVAIL_RETRIES = 3;
1712
+ if (s.toolUnavailableRetries >= MAX_TOOL_UNAVAIL_RETRIES) {
1713
+ debugLog("postUnit", { phase: "tool-unavailable-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, retries: s.toolUnavailableRetries });
1714
+ ctx.ui.notify(`Tool unavailable for ${s.currentUnit.type} after ${MAX_TOOL_UNAVAIL_RETRIES} retries: ${s.lastToolInvocationError}. MCP server may not be starting — pausing auto-mode.`, "error");
1715
+ s.lastToolInvocationError = null;
1716
+ await pauseAuto(ctx, pi);
1717
+ return "dispatched";
1718
+ }
1719
+ s.toolUnavailableRetries++;
1720
+ const delayMs = s.toolUnavailableRetries * 1000;
1721
+ debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError, attempt: s.toolUnavailableRetries, delayMs });
1722
+ ctx.ui.notify(`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Waiting ${delayMs}ms for MCP server — retry ${s.toolUnavailableRetries}/${MAX_TOOL_UNAVAIL_RETRIES}.`, "warning");
1711
1723
  s.lastToolInvocationError = null;
1724
+ await new Promise(r => setTimeout(r, delayMs));
1712
1725
  }
1713
1726
  else if (s.lastToolInvocationError) {
1714
1727
  const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
@@ -1798,12 +1811,14 @@ export async function postUnitPreVerification(pctx, opts) {
1798
1811
  }
1799
1812
  }
1800
1813
  s.exhaustedVerificationUnits.add(retryKey);
1814
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
1801
1815
  debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
1802
1816
  ctx.ui.notify(`${failureDetails} Pausing auto-mode after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries.`, "error");
1803
1817
  await pauseAuto(ctx, pi);
1804
1818
  return "dispatched";
1805
1819
  }
1806
1820
  s.verificationRetryCount.set(retryKey, attempt);
1821
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
1807
1822
  s.pendingVerificationRetry = {
1808
1823
  unitId: s.currentUnit.id,
1809
1824
  failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
@@ -1821,8 +1836,11 @@ export async function postUnitPreVerification(pctx, opts) {
1821
1836
  if (s.pendingVerificationRetry?.unitId === s.currentUnit.id) {
1822
1837
  s.pendingVerificationRetry = null;
1823
1838
  }
1839
+ s.toolUnavailableRetries = 0;
1824
1840
  s.verificationRetryCount.delete(retryKey);
1825
1841
  s.verificationRetryFailureHashes.delete(retryKey);
1842
+ s.exhaustedVerificationUnits.delete(retryKey);
1843
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
1826
1844
  if (s.currentUnit.type === "complete-milestone") {
1827
1845
  const { milestone: mid } = parseUnitId(s.currentUnit.id);
1828
1846
  if (mid) {