@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.e8563f58

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 (604) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +8 -3
  34. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  35. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  36. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  37. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
  38. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  39. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  40. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  41. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  42. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  43. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  44. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  45. package/dist/resources/extensions/gsd/auto.js +15 -20
  46. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  47. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  48. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  49. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  50. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  51. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  52. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  53. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  54. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  55. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  56. package/dist/resources/extensions/gsd/captures.js +5 -15
  57. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  65. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  66. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  67. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  68. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  69. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  70. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  71. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  72. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  73. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  74. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  75. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  76. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  77. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  78. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  79. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  80. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  81. package/dist/resources/extensions/gsd/files.js +33 -19
  82. package/dist/resources/extensions/gsd/git-service.js +1 -0
  83. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  84. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  85. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +158 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  88. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  89. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  90. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  91. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  92. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  93. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  94. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  95. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  96. package/dist/resources/extensions/gsd/model-router.js +3 -0
  97. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  98. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  99. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  100. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  101. package/dist/resources/extensions/gsd/paths.js +37 -24
  102. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  103. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  104. package/dist/resources/extensions/gsd/preferences.js +14 -0
  105. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  106. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  110. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  116. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  117. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  118. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  119. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  120. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  121. package/dist/resources/extensions/gsd/state.js +6 -20
  122. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  123. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  124. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  125. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  126. package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  129. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  130. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  131. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  132. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  133. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  134. package/dist/resources/extensions/gsd/undo.js +8 -7
  135. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  136. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  137. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  138. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  139. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  140. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  141. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  142. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  143. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  144. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  145. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  146. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  147. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  148. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  149. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  150. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  151. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  152. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  153. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  154. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  155. package/dist/resources/shared/package-manager-detection.js +1 -1
  156. package/dist/resources/shared/package.json +3 -0
  157. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  158. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  159. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  160. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  161. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  162. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  163. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  164. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  165. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  166. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  167. package/dist/update-check.d.ts +2 -0
  168. package/dist/update-check.js +24 -1
  169. package/dist/update-cmd.js +20 -3
  170. package/dist/web/standalone/.next/BUILD_ID +1 -1
  171. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  172. package/dist/web/standalone/.next/build-manifest.json +3 -3
  173. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  174. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/index.html +1 -1
  228. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  229. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  235. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  236. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  237. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  238. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  241. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  242. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  243. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  245. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  246. package/dist/web/standalone/package.json +1 -1
  247. package/dist/worktree-cli.js +3 -6
  248. package/dist/worktree-status-banner.js +7 -11
  249. package/package.json +1 -1
  250. package/packages/cloud-mcp-gateway/package.json +2 -2
  251. package/packages/contracts/dist/rpc.d.ts +1 -0
  252. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  253. package/packages/contracts/dist/rpc.js.map +1 -1
  254. package/packages/contracts/dist/workflow.d.ts +4 -0
  255. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/package.json +4 -4
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  261. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/cli.js +6 -3
  281. package/packages/mcp-server/dist/cli.js.map +1 -1
  282. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  283. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  284. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  285. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  286. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/server.js +4 -0
  288. package/packages/mcp-server/dist/server.js.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  290. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  292. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  293. package/packages/mcp-server/package.json +5 -4
  294. package/packages/native/package.json +1 -1
  295. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  296. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  297. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  298. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  299. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/index.js +3 -0
  302. package/packages/pi-agent-core/dist/index.js.map +1 -1
  303. package/packages/pi-agent-core/package.json +1 -1
  304. package/packages/pi-ai/README.md +1 -0
  305. package/packages/pi-ai/dist/index.d.ts +2 -0
  306. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  307. package/packages/pi-ai/dist/index.js +2 -0
  308. package/packages/pi-ai/dist/index.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +166 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  315. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  317. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  319. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  322. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  323. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  324. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  326. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  327. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  329. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  330. package/packages/pi-ai/package.json +3 -2
  331. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  332. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  334. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  337. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  340. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  342. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  344. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/index.js +1 -1
  348. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  350. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  352. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  353. package/packages/pi-coding-agent/package.json +7 -7
  354. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  355. package/packages/pi-tui/dist/tui.js +9 -0
  356. package/packages/pi-tui/dist/tui.js.map +1 -1
  357. package/packages/pi-tui/package.json +2 -2
  358. package/packages/rpc-client/package.json +2 -2
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  362. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  363. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  364. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  365. package/src/resources/extensions/async-jobs/index.ts +79 -0
  366. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  367. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  368. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  369. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  370. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  371. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  372. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  373. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  374. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  375. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  376. package/src/resources/extensions/browser-tools/index.ts +71 -13
  377. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  378. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  379. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  380. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  383. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  384. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  385. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  387. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  388. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  389. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  390. package/src/resources/extensions/gsd/auto/phases.ts +12 -3
  391. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  392. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  393. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  394. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
  395. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  396. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  397. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  398. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  399. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  400. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  401. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  402. package/src/resources/extensions/gsd/auto.ts +28 -24
  403. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  404. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  405. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  406. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  407. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  409. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  410. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  411. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  412. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  413. package/src/resources/extensions/gsd/captures.ts +5 -16
  414. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  415. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  416. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  417. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  418. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  419. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  420. package/src/resources/extensions/gsd/constants.ts +0 -3
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  431. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  432. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  433. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  434. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  435. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  436. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  437. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  438. package/src/resources/extensions/gsd/files.ts +33 -12
  439. package/src/resources/extensions/gsd/git-service.ts +1 -0
  440. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  441. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  442. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  443. package/src/resources/extensions/gsd/guidance.ts +217 -0
  444. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  445. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  446. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  447. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  448. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  449. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  450. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  451. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  452. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  453. package/src/resources/extensions/gsd/model-router.ts +3 -0
  454. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  455. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  456. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  458. package/src/resources/extensions/gsd/paths.ts +42 -22
  459. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  460. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  461. package/src/resources/extensions/gsd/preferences.ts +18 -0
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  464. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  467. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  468. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  469. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  470. package/src/resources/extensions/gsd/publication.ts +122 -0
  471. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  472. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  473. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  474. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  475. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  476. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  477. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  478. package/src/resources/extensions/gsd/state.ts +9 -21
  479. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  480. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  481. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  482. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  483. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  484. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  485. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  486. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  487. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  488. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  489. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  490. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  491. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  492. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  493. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  494. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  495. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  496. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  497. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  498. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  499. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  500. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  501. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  502. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  503. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  504. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  505. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  506. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  507. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  508. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  509. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  510. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  511. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  512. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  513. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  514. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  515. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  516. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  517. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  518. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  519. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  520. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  521. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  522. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  523. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  524. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  525. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  526. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  527. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  528. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  529. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  530. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  531. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  532. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  533. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  534. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  535. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  536. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  537. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  538. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  539. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  540. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  541. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  542. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  543. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  544. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  545. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  546. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  547. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  549. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  550. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  551. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  552. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  553. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  554. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  555. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  556. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  557. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  558. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  559. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  560. package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
  561. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  562. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  563. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  564. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  565. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  566. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  567. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  568. package/src/resources/extensions/gsd/undo.ts +9 -8
  569. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  570. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  571. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  572. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  573. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  574. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  575. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  576. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  577. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  578. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  579. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  580. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  581. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  582. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  583. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  584. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  585. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  586. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  587. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  588. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  589. package/src/resources/shared/package-manager-detection.ts +1 -1
  590. package/src/resources/shared/package.json +3 -0
  591. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  592. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  593. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  594. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  595. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  596. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  597. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  598. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  599. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  600. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  601. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  602. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  603. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
  604. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
@@ -20,6 +20,8 @@ import { getUatBrowserToolSupportError, type UatType } from "./uat-policy.js";
20
20
  import {
21
21
  isDbAvailable,
22
22
  getMilestoneSlices,
23
+ getMilestoneSliceSummaries,
24
+ getClosedSliceIds,
23
25
  getPendingGatesForTurn,
24
26
  markPendingGatesOmittedForTurn,
25
27
  getMilestone,
@@ -47,7 +49,6 @@ import {
47
49
  buildTaskFileName,
48
50
  gsdProjectionRoot,
49
51
  } from "./paths.js";
50
- import { parseRoadmap } from "./parsers-legacy.js";
51
52
  import { validateArtifact } from "./schemas/validate.js";
52
53
  import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
53
54
  import { logWarning, logError } from "./workflow-logger.js";
@@ -84,13 +85,18 @@ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
84
85
  import { getMilestonePipelineVariant } from "./milestone-scope-classifier.js";
85
86
  import { EXECUTION_ENTRY_PHASES, hasFinalizedMilestoneContext } from "./uok/plan-v2.js";
86
87
  import { isAutoActive } from "./auto.js";
87
- import { markDepthVerified } from "./bootstrap/write-gate.js";
88
+ // Host adapter explicitly: auto-dispatch runs in the extension host, and the
89
+ // ambient write-gate exports env-sniff the adapter per call (they are reserved
90
+ // for the workflow MCP child's dynamic-import surface).
91
+ import { hostWriteGateAdapter } from "./bootstrap/write-gate.js";
88
92
  import { ensureWorkflowPreferencesCaptured } from "./planning-depth.js";
89
93
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
90
94
  import {
91
95
  getWorkflowTransportSupportError,
92
96
  getRequiredWorkflowToolsForAutoUnit,
97
+ resolveWorkflowMcpProjectRoot,
93
98
  } from "./workflow-mcp.js";
99
+ import { prepareBrowserDaemonForUat } from "./browser-daemon-auto-prep.js";
94
100
  import {
95
101
  PROJECT_RESEARCH_INFLIGHT_MARKER,
96
102
  } from "./project-research-policy.js";
@@ -490,27 +496,12 @@ function persistSliceAssessmentBackfill(
490
496
  }
491
497
 
492
498
  function backfillMissingAssessmentsFromSummaries(basePath: string, mid: string): void {
493
- const completedSliceIds = new Set<string>();
494
- if (isDbAvailable()) {
495
- for (const slice of getMilestoneSlices(mid)) {
496
- if (slice.status === "complete" || slice.status === "done") {
497
- completedSliceIds.add(slice.id);
498
- }
499
- }
500
- } else {
501
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
502
- if (!roadmapFile) return;
503
- try {
504
- const roadmap = parseRoadmap(readFileSync(roadmapFile, "utf-8"));
505
- for (const slice of roadmap.slices) {
506
- if (slice.done) completedSliceIds.add(slice.id);
507
- }
508
- } catch {
509
- return;
510
- }
511
- }
512
-
513
- for (const sliceId of completedSliceIds) {
499
+ // DB-authoritative (ADR-017): no markdown fallback. Without DB rows there
500
+ // is nothing to backfill.
501
+ if (!isDbAvailable()) return;
502
+ // Canonical closed vocabulary (complete/done/skipped/closed) a skipped or
503
+ // closed slice with a SUMMARY gets the same assessment backfill treatment.
504
+ for (const sliceId of getClosedSliceIds(mid)) {
514
505
  const summaryPath = resolveSliceFile(basePath, mid, sliceId, "SUMMARY");
515
506
  if (!summaryPath || !existsSync(summaryPath)) continue;
516
507
 
@@ -696,7 +687,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
696
687
  // deadlock. Deep planning is still user-driven even inside auto-mode,
697
688
  // so it must wait for explicit approval instead of taking this bypass.
698
689
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
699
- markDepthVerified(mid, basePath);
690
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
700
691
  }
701
692
  return {
702
693
  action: "dispatch",
@@ -772,6 +763,16 @@ export const DISPATCH_RULES: DispatchRule[] = [
772
763
  if (browserToolError) {
773
764
  return { action: "stop" as const, reason: browserToolError, level: "warning" as const };
774
765
  }
766
+ const browserDaemonError = prepareBrowserDaemonForUat({
767
+ uatType,
768
+ sessionProvider,
769
+ sessionAuthMode,
770
+ sessionBaseUrl,
771
+ projectRoot: resolveWorkflowMcpProjectRoot(basePath),
772
+ });
773
+ if (browserDaemonError) {
774
+ return { action: "stop" as const, reason: browserDaemonError, level: "warning" as const };
775
+ }
775
776
 
776
777
  // Cap run-uat dispatch attempts to prevent infinite replay (#3624).
777
778
  // Check before incrementing so an exhausted counter cannot create a
@@ -808,23 +809,10 @@ export const DISPATCH_RULES: DispatchRule[] = [
808
809
  // Only applies when UAT dispatch is enabled
809
810
  if (!prefs?.uat_dispatch) return null;
810
811
 
811
- // DB-first: prefer closed slices from DB; fall back to ROADMAP on disk.
812
- let closedSliceIds: string[];
813
- if (isDbAvailable()) {
814
- closedSliceIds = getMilestoneSlices(mid)
815
- .filter(s => isClosedStatus(s.status))
816
- .map(s => s.id);
817
- } else {
818
- // Filesystem fallback for degraded / unmigrated projects.
819
- // `slice.done` in the parsed ROADMAP is the disk-level closed signal.
820
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
821
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
822
- if (!roadmapContent) return null;
823
- const roadmap = parseRoadmap(roadmapContent);
824
- closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
825
- }
826
-
827
- for (const sliceId of closedSliceIds) {
812
+ // DB-authoritative (ADR-017): closed slices come from the DB only; the
813
+ // ROADMAP projection is never parsed for gate decisions.
814
+ if (!isDbAvailable()) return null;
815
+ for (const sliceId of getClosedSliceIds(mid)) {
828
816
  const result = await readUatGateVerdict(basePath, mid, sliceId);
829
817
  if (!result) continue;
830
818
  const { verdict, uatType } = result;
@@ -879,7 +867,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
879
867
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
880
868
  // pre-verify deep planning's user-facing milestone approval gate.
881
869
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
882
- markDepthVerified(mid, basePath);
870
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
883
871
  }
884
872
  return {
885
873
  action: "dispatch",
@@ -1050,7 +1038,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1050
1038
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
1051
1039
  // pre-verify deep planning's user-facing milestone approval gate.
1052
1040
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
1053
- markDepthVerified(mid, basePath);
1041
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
1054
1042
  }
1055
1043
  return {
1056
1044
  action: "dispatch",
@@ -1128,13 +1116,11 @@ export const DISPATCH_RULES: DispatchRule[] = [
1128
1116
  // behavior.
1129
1117
  if (await getMilestonePipelineVariant(mid) === "trivial") return null;
1130
1118
 
1131
- // Load roadmap to find all slices
1132
- const roadmapFile =
1133
- resolveExistingExpectedArtifact("plan-milestone", mid, basePath) ??
1134
- resolveMilestoneFile(basePath, mid, "ROADMAP");
1135
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
1136
- if (!roadmapContent) return null;
1137
- const roadmap = parseRoadmap(roadmapContent);
1119
+ // DB-authoritative slice list (ADR-017): the ROADMAP projection is
1120
+ // never parsed for dispatch decisions. No DB / no rows → skip this rule.
1121
+ if (!isDbAvailable()) return null;
1122
+ const dbSlices = getMilestoneSliceSummaries(mid);
1123
+ if (dbSlices.length === 0) return null;
1138
1124
 
1139
1125
  // Find slices that need research (no RESEARCH file, dependencies done)
1140
1126
  const milestoneResearchFile =
@@ -1142,14 +1128,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
1142
1128
  resolveMilestoneFile(basePath, mid, "RESEARCH");
1143
1129
  const researchReadySlices: Array<{ id: string; title: string }> = [];
1144
1130
 
1145
- for (const slice of roadmap.slices) {
1131
+ for (const slice of dbSlices) {
1146
1132
  if (slice.done) continue;
1147
1133
  // Skip S01 when milestone research exists
1148
1134
  if (milestoneResearchFile && slice.id === "S01") continue;
1149
1135
  // Skip if already has research
1150
1136
  if (resolveExistingExpectedArtifact("research-slice", `${mid}/${slice.id}`, basePath)) continue;
1151
1137
  // Skip if dependencies aren't done (check for SUMMARY files)
1152
- const depsComplete = (slice.depends ?? []).every((depId) =>
1138
+ const depsComplete = slice.depends.every((depId) =>
1153
1139
  !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath),
1154
1140
  );
1155
1141
  if (!depsComplete) continue;
@@ -18,7 +18,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
18
18
  import { logWarning } from "./workflow-logger.js";
19
19
  import { resolveUokFlags } from "./uok/flags.js";
20
20
  import { applyModelPolicyFilter } from "./uok/model-policy.js";
21
- import { isModelBlocked } from "./blocked-models.js";
21
+ import { isModelBlocked, isModelTemporarilyUnavailable } from "./blocked-models.js";
22
22
  import { getRequiredWorkflowToolsForAutoUnit, isWorkflowMcpSurfaceTool } from "./workflow-mcp.js";
23
23
 
24
24
  /**
@@ -272,6 +272,15 @@ function buildModelPolicyBlockReasons(
272
272
  }];
273
273
  }
274
274
 
275
+ function isModelUnavailable(
276
+ basePath: string,
277
+ provider: string | undefined,
278
+ id: string | undefined,
279
+ ): boolean {
280
+ return isModelBlocked(basePath, provider, id) ||
281
+ isModelTemporarilyUnavailable(basePath, provider, id);
282
+ }
283
+
275
284
  function restoreToolBaseline(pi: ExtensionAPI): void {
276
285
  const key = pi as unknown as object;
277
286
  const baseline = TOOL_BASELINE.get(key);
@@ -817,9 +826,9 @@ export async function selectAndApplyModel(
817
826
  // (issue #4513). The block is persisted in .gsd/runtime/blocked-models.json
818
827
  // so it survives /gsd auto restarts — without this, the same dead model
819
828
  // gets reselected after every restart.
820
- if (isModelBlocked(basePath, model.provider, model.id)) {
829
+ if (isModelUnavailable(basePath, model.provider, model.id)) {
821
830
  ctx.ui.notify(
822
- `Skipping blocked model ${model.provider}/${model.id} (provider rejected it for this account).`,
831
+ `Skipping unavailable model ${model.provider}/${model.id}.`,
823
832
  "warning",
824
833
  );
825
834
  continue;
@@ -896,7 +905,7 @@ export async function selectAndApplyModel(
896
905
  for (const model of buildPolicyEligibleFallbackOrder(ctx, routingEligibleModels, autoModeStartModel)) {
897
906
  const key = `${model.provider.toLowerCase()}/${model.id.toLowerCase()}`;
898
907
  if (!policyAllowedModelKeys.has(key)) continue;
899
- if (isModelBlocked(basePath, model.provider, model.id)) continue;
908
+ if (isModelUnavailable(basePath, model.provider, model.id)) continue;
900
909
  const ok = await pi.setModel(model, { persist: false });
901
910
  if (!ok) continue;
902
911
  appliedModel = model;
@@ -926,10 +935,10 @@ export async function selectAndApplyModel(
926
935
  autoModeStartModel,
927
936
  effectiveSessionModelOverride,
928
937
  );
929
- const startBlocked = isModelBlocked(basePath, autoModeStartModel.provider, autoModeStartModel.id);
938
+ const startBlocked = isModelUnavailable(basePath, autoModeStartModel.provider, autoModeStartModel.id);
930
939
  if (startBlocked) {
931
940
  ctx.ui.notify(
932
- `Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is blocked for this account. Using current session model instead.`,
941
+ `Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is unavailable. Using current session model instead.`,
933
942
  "warning",
934
943
  );
935
944
  } else {
@@ -940,7 +949,7 @@ export async function selectAndApplyModel(
940
949
  const ok = await pi.setModel(startModel, { persist: false });
941
950
  if (!ok) {
942
951
  const byId = availableModels.find(
943
- m => m.id === autoModeStartModel.id && !isModelBlocked(basePath, m.provider, m.id),
952
+ m => m.id === autoModeStartModel.id && !isModelUnavailable(basePath, m.provider, m.id),
944
953
  );
945
954
  if (byId) {
946
955
  const fallbackOk = await pi.setModel(byId, { persist: false });
@@ -1041,16 +1050,36 @@ export function resolveModelId<T extends { id: string; provider: string }>(
1041
1050
  if (providerMatch) return providerMatch;
1042
1051
  }
1043
1052
 
1044
- // Prefer "anthropic" as the canonical provider for Anthropic models.
1045
- // Transport-specific tiebreaker (ADR-012): intentionally keys on provider,
1046
- // not api we want the plain Anthropic transport when multiple are available.
1047
- const anthropicMatch = candidates.find(m => m.provider === "anthropic");
1048
- if (anthropicMatch) return anthropicMatch;
1053
+ // Subscription/OAuth routes beat pay-per-token API when the same model ID
1054
+ // exists on multiple providers. Order matters — first match wins.
1055
+ for (const provider of BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE) {
1056
+ const match = candidates.find(m => m.provider === provider);
1057
+ if (match) return match;
1058
+ }
1049
1059
 
1050
1060
  // Fall back to first non-extension candidate, or any candidate
1051
1061
  return candidates.find(m => !EXTENSION_PROVIDERS.has(m.provider)) ?? candidates[0];
1052
1062
  }
1053
1063
 
1064
+ /**
1065
+ * When a bare model ID exists on multiple providers, prefer subscription/OAuth
1066
+ * routes over pay-per-token API keys. Matches PROVIDER_ROUTES in doctor-providers
1067
+ * but applies when *both* sides are authenticated.
1068
+ *
1069
+ * Order rationale:
1070
+ * - openai-codex before github-copilot: ChatGPT-native for shared GPT IDs
1071
+ * - google-gemini-cli before github-copilot: first-party Gemini CLI
1072
+ * - anthropic before github-copilot: first-party Claude API/OAuth over Copilot
1073
+ * - github-copilot before openai/google: Copilot OAuth over platform API keys
1074
+ */
1075
+ export const BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE = [
1076
+ "openai-codex",
1077
+ "google-gemini-cli",
1078
+ "anthropic",
1079
+ "github-copilot",
1080
+ "google-antigravity",
1081
+ ] as const;
1082
+
1054
1083
  /**
1055
1084
  * Flat-rate providers charge the same per request regardless of model.
1056
1085
  * Dynamic routing provides no cost benefit — it only degrades quality (#3453).
@@ -18,7 +18,7 @@ import { deriveState } from "./state.js";
18
18
  import { logWarning, logError } from "./workflow-logger.js";
19
19
  import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
20
20
  import { loadPrompt } from "./prompt-loader.js";
21
- import { isAwaitingUserInput } from "./user-input-boundary.js";
21
+ import { isAwaitingUserInput } from "./consent-question.js";
22
22
  import {
23
23
  resolveMilestonePath,
24
24
  resolveSliceFile,
@@ -51,8 +51,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
51
51
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
52
52
  import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
53
53
  import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
54
- import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
55
- import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
54
+ import { renderPlanCheckboxes, renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "./markdown-renderer.js";
56
55
  import { consumeSignal } from "./session-status-io.js";
57
56
  import {
58
57
  checkPostUnitHooks,
@@ -72,7 +71,7 @@ import {
72
71
  } from "./milestone-closeout.js";
73
72
  import type { AutoSession, SidecarItem } from "./auto/session.js";
74
73
  import { getEvidence, clearEvidenceFromDisk, isExecutionToolName } from "./safety/evidence-collector.js";
75
- import { validateFileChanges } from "./safety/file-change-validator.js";
74
+ import { validateFileChanges, effectiveFileChangeAllowlist } from "./safety/file-change-validator.js";
76
75
  import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
77
76
  import { validateContent } from "./safety/content-validator.js";
78
77
  import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
@@ -88,7 +87,7 @@ import { writeTurnGitTransaction } from "./uok/gitops.js";
88
87
  import { isClosedStatus } from "./status-guards.js";
89
88
  import { detectAbandonMilestone } from "./abandon-detect.js";
90
89
  import { getPendingGate } from "./bootstrap/write-gate.js";
91
- import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
90
+ import { isDeterministicPolicyError, isToolUnavailableError } from "./auto-tool-tracking.js";
92
91
  import { formatConnectedStepStack, formatPostUnitStatusCard } from "./auto-status-message.js";
93
92
  import {
94
93
  clearProjectResearchInflightMarker,
@@ -96,6 +95,7 @@ import {
96
95
  } from "./project-research-policy.js";
97
96
  import { validateArtifact } from "./schemas/validate.js";
98
97
  import { verificationRetryKey } from "./auto/verification-retry-policy.js";
98
+ import { saveCustomVerifyRetryCounts } from "./auto/custom-verify-retry-store.js";
99
99
  import { getLedger } from "./metrics.js";
100
100
  import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
101
101
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
@@ -619,8 +619,10 @@ export function _hasExecutionToolCallsInSessionForTest(entries: readonly unknown
619
619
  return true;
620
620
  }
621
621
 
622
- if (e?.type !== "message") continue;
623
- const msg = e?.message;
622
+ // Accept both session-manager entries ({type: "message", message}) and
623
+ // bare agent-end messages ({role, content}) — the auto loop passes the
624
+ // latter via opts.agentEndMessages.
625
+ const msg = e?.type === "message" ? e?.message : e;
624
626
  if (!msg || msg.role !== "assistant" || !Array.isArray(msg.content)) continue;
625
627
  for (const block of msg.content) {
626
628
  if (block?.type !== "toolCall") continue;
@@ -899,7 +901,7 @@ export const USER_DRIVEN_DEEP_UNITS = new Set([
899
901
  "discuss-milestone",
900
902
  "research-decision",
901
903
  ]);
902
- export { isAwaitingUserInput } from "./user-input-boundary.js";
904
+ export { isAwaitingUserInput } from "./consent-question.js";
903
905
 
904
906
  function artifactValidationKind(unitType: string): "project" | "requirements" | null {
905
907
  if (unitType === "discuss-project") return "project";
@@ -988,11 +990,13 @@ async function repairCompleteSliceRoadmapProjection(
988
990
  return false;
989
991
  }
990
992
 
993
+ // Stale-render detection (ADR-017): the DB already says the slice is closed;
994
+ // this only checks whether the rendered ROADMAP projection reflects it, to
995
+ // decide whether a repair re-render is needed.
991
996
  const roadmapPath = resolveMilestoneFile(artifactBase, mid, "ROADMAP");
992
997
  if (roadmapPath && existsSync(roadmapPath)) {
993
998
  try {
994
- const roadmap = parseLegacyRoadmap(readFileSync(roadmapPath, "utf-8"));
995
- if (roadmap.slices.find((roadmapSlice) => roadmapSlice.id === sid)?.done) {
999
+ if (roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sid)) {
996
1000
  return false;
997
1001
  }
998
1002
  } catch (err) {
@@ -1535,6 +1539,11 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
1535
1539
  if (safetyConfig.enabled) {
1536
1540
  const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
1537
1541
 
1542
+ const fileChangeAllowlist = effectiveFileChangeAllowlist(
1543
+ safetyConfig.file_change_allowlist,
1544
+ (prefs?.git as { manage_gitignore?: boolean } | undefined)?.manage_gitignore,
1545
+ );
1546
+
1538
1547
  // File change validation (execute-task only, after unit execution)
1539
1548
  if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid) {
1540
1549
  try {
@@ -1554,7 +1563,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
1554
1563
  files: taskRow.files,
1555
1564
  })),
1556
1565
  );
1557
- const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
1566
+ const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, fileChangeAllowlist);
1558
1567
  if (audit && audit.violations.length > 0) {
1559
1568
  const warnings = audit.violations.filter(v => v.severity === "warning");
1560
1569
  for (const v of warnings) {
@@ -1576,7 +1585,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
1576
1585
  s.basePath,
1577
1586
  expectedOutput,
1578
1587
  plannedFiles,
1579
- safetyConfig.file_change_allowlist,
1588
+ fileChangeAllowlist,
1580
1589
  );
1581
1590
  if (audit && audit.violations.length > 0) {
1582
1591
  const warnings = audit.violations.filter(v => v.severity === "warning");
@@ -2015,7 +2024,18 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2015
2024
  "error",
2016
2025
  );
2017
2026
  } else if (!triggerArtifactVerified) {
2018
- if (s.lastToolInvocationError) {
2027
+ if (s.lastToolInvocationError && isToolUnavailableError(s.lastToolInvocationError)) {
2028
+ // Tool-unavailable is the one transient invocation error: the
2029
+ // workflow MCP server registers its surface asynchronously, so a
2030
+ // Unit's first call can race the registration. Fall through to the
2031
+ // bounded verification retry instead of pausing.
2032
+ debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError });
2033
+ ctx.ui.notify(
2034
+ `Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. The tool surface may still be registering — retrying.`,
2035
+ "warning",
2036
+ );
2037
+ s.lastToolInvocationError = null;
2038
+ } else if (s.lastToolInvocationError) {
2019
2039
  const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
2020
2040
  const errMsg = isUserSkip
2021
2041
  ? `Tool skipped for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Queued user message interrupted the turn — pausing auto-mode.`
@@ -2141,6 +2161,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2141
2161
  }
2142
2162
  }
2143
2163
  s.exhaustedVerificationUnits.add(retryKey);
2164
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
2144
2165
  debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
2145
2166
  ctx.ui.notify(
2146
2167
  `${failureDetails} Pausing auto-mode after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries.`,
@@ -2150,6 +2171,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2150
2171
  return "dispatched";
2151
2172
  }
2152
2173
  s.verificationRetryCount.set(retryKey, attempt);
2174
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
2153
2175
  s.pendingVerificationRetry = {
2154
2176
  unitId: s.currentUnit.id,
2155
2177
  failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
@@ -2173,6 +2195,8 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2173
2195
  }
2174
2196
  s.verificationRetryCount.delete(retryKey);
2175
2197
  s.verificationRetryFailureHashes.delete(retryKey);
2198
+ s.exhaustedVerificationUnits.delete(retryKey);
2199
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
2176
2200
 
2177
2201
  if (s.currentUnit.type === "complete-milestone") {
2178
2202
  const { milestone: mid } = parseUnitId(s.currentUnit.id);