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

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 (662) 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 +54 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  46. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  47. package/dist/resources/extensions/gsd/auto.js +45 -21
  48. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  49. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  50. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  51. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  52. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  53. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  54. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  55. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  56. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  57. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  58. package/dist/resources/extensions/gsd/captures.js +5 -15
  59. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  62. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  63. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  64. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  65. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  66. package/dist/resources/extensions/gsd/constants.js +0 -2
  67. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  68. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  69. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  70. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  71. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  72. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  73. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  74. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  75. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -3
  78. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  79. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  80. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  81. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  82. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  83. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  84. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  85. package/dist/resources/extensions/gsd/files.js +33 -19
  86. package/dist/resources/extensions/gsd/git-service.js +1 -0
  87. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  88. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  89. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  90. package/dist/resources/extensions/gsd/guidance.js +158 -0
  91. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  92. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  93. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  94. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  95. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  96. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  97. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  98. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  100. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  101. package/dist/resources/extensions/gsd/model-router.js +3 -0
  102. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  103. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  104. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  105. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  106. package/dist/resources/extensions/gsd/paths.js +37 -24
  107. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  108. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  109. package/dist/resources/extensions/gsd/preferences.js +14 -0
  110. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  111. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  112. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  115. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  118. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  119. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  120. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  123. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  124. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  125. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  126. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  127. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  128. package/dist/resources/extensions/gsd/publication.js +87 -0
  129. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  130. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  131. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  132. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +6 -20
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  142. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  143. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  144. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  145. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  146. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  148. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  149. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  150. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  151. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  152. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  153. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  156. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  157. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  158. package/dist/resources/extensions/gsd/undo.js +8 -7
  159. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  160. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  161. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  162. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  163. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  164. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  165. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  166. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  167. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  168. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  169. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  170. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  171. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  172. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  173. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  174. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  175. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  176. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  177. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  178. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  179. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  180. package/dist/resources/shared/package-manager-detection.js +1 -1
  181. package/dist/resources/shared/package.json +3 -0
  182. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  183. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  184. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  185. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  186. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  187. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  188. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  189. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  190. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +2 -0
  193. package/dist/update-check.js +24 -1
  194. package/dist/update-cmd.js +20 -3
  195. package/dist/web/standalone/.next/BUILD_ID +1 -1
  196. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  197. package/dist/web/standalone/.next/build-manifest.json +3 -3
  198. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  199. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  201. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/index.html +1 -1
  253. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  260. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  261. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  262. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  263. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  266. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  267. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  268. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  269. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  270. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  271. package/dist/web/standalone/package.json +1 -1
  272. package/dist/worktree-cli.js +3 -6
  273. package/dist/worktree-status-banner.js +7 -11
  274. package/package.json +1 -1
  275. package/packages/cloud-mcp-gateway/package.json +2 -2
  276. package/packages/contracts/dist/rpc.d.ts +1 -0
  277. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  278. package/packages/contracts/dist/rpc.js.map +1 -1
  279. package/packages/contracts/dist/workflow.d.ts +4 -0
  280. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  281. package/packages/contracts/dist/workflow.js.map +1 -1
  282. package/packages/contracts/package.json +1 -1
  283. package/packages/daemon/package.json +4 -4
  284. package/packages/gsd-agent-core/package.json +5 -5
  285. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  291. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  294. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  299. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  300. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  302. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  303. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  304. package/packages/gsd-agent-modes/package.json +7 -7
  305. package/packages/mcp-server/dist/cli.js +9 -1
  306. package/packages/mcp-server/dist/cli.js.map +1 -1
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  310. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  311. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  312. package/packages/mcp-server/dist/server.js +4 -0
  313. package/packages/mcp-server/dist/server.js.map +1 -1
  314. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  315. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  317. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  318. package/packages/mcp-server/package.json +5 -4
  319. package/packages/native/package.json +1 -1
  320. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  321. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  323. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  324. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  325. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/index.js +3 -0
  327. package/packages/pi-agent-core/dist/index.js.map +1 -1
  328. package/packages/pi-agent-core/package.json +1 -1
  329. package/packages/pi-ai/README.md +1 -0
  330. package/packages/pi-ai/dist/index.d.ts +2 -0
  331. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/index.js +2 -0
  333. package/packages/pi-ai/dist/index.js.map +1 -1
  334. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  335. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/models.generated.js +166 -0
  337. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  338. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  340. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  341. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  342. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  344. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  346. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  347. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  348. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  349. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  350. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  351. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  352. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  354. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  355. package/packages/pi-ai/package.json +3 -2
  356. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  357. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  359. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  362. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  365. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  367. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  369. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  371. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/index.js +1 -1
  373. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  375. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  377. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  378. package/packages/pi-coding-agent/package.json +7 -7
  379. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  380. package/packages/pi-tui/dist/tui.js +9 -0
  381. package/packages/pi-tui/dist/tui.js.map +1 -1
  382. package/packages/pi-tui/package.json +2 -2
  383. package/packages/rpc-client/package.json +2 -2
  384. package/pkg/package.json +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +5 -4
  386. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  387. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  388. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  389. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  390. package/src/resources/extensions/async-jobs/index.ts +79 -0
  391. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  392. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  393. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  394. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  395. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  396. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  397. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  398. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  399. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  400. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  401. package/src/resources/extensions/browser-tools/index.ts +71 -13
  402. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  403. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  404. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  405. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  406. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  407. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  408. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  409. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  410. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  411. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  412. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  413. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  414. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  415. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  416. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  417. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  418. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  419. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  420. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  421. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  422. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  423. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  424. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  425. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  426. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  427. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  428. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  429. package/src/resources/extensions/gsd/auto.ts +64 -25
  430. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  431. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  433. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  434. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  435. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  436. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  437. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  440. package/src/resources/extensions/gsd/captures.ts +5 -16
  441. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  442. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  443. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  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/consent-question.ts +431 -0
  447. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  448. package/src/resources/extensions/gsd/constants.ts +0 -3
  449. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  450. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  451. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  452. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  453. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  454. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  455. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  456. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  457. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  458. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  459. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -3
  460. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  461. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  462. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  463. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  464. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  465. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  466. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  467. package/src/resources/extensions/gsd/files.ts +33 -12
  468. package/src/resources/extensions/gsd/git-service.ts +1 -0
  469. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  470. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  471. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  472. package/src/resources/extensions/gsd/guidance.ts +217 -0
  473. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  474. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  475. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  476. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  477. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  478. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  479. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  480. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  481. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  482. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  483. package/src/resources/extensions/gsd/model-router.ts +3 -0
  484. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  485. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  486. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  487. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  488. package/src/resources/extensions/gsd/paths.ts +42 -22
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  490. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  491. package/src/resources/extensions/gsd/preferences.ts +18 -0
  492. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  497. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  499. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  501. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  502. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  503. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  504. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  505. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  506. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  509. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  510. package/src/resources/extensions/gsd/publication.ts +122 -0
  511. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  512. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  513. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  514. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  515. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  516. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  517. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  518. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  519. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  520. package/src/resources/extensions/gsd/state.ts +9 -21
  521. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  522. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  524. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  525. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  526. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  527. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  528. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  529. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  530. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  531. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  532. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  533. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  534. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  535. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  538. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  539. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  540. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  542. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  543. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  544. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  545. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  546. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  548. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  549. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  550. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  551. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  552. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  553. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  554. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  555. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  556. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  559. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  560. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  561. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  562. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  563. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  564. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  565. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  566. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  567. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  568. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  569. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  570. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  571. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  572. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  573. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  574. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  576. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  578. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  579. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  580. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  581. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  582. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  583. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  584. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  585. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  586. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  587. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  588. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  589. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  590. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  591. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  592. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  593. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  594. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  595. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  596. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  597. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  598. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  599. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  600. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  601. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  602. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  603. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  605. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  607. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  608. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  609. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  610. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  611. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  612. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  613. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  614. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  615. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  616. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  617. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  618. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  619. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  620. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  621. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  622. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  623. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  624. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  625. package/src/resources/extensions/gsd/undo.ts +9 -8
  626. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  627. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  628. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  629. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  630. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  631. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  632. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  633. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  634. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  635. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  636. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  637. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  638. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  639. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  640. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  641. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  642. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  643. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  644. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  645. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  646. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  647. package/src/resources/shared/package-manager-detection.ts +1 -1
  648. package/src/resources/shared/package.json +3 -0
  649. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  650. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  651. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  652. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  653. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  654. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  655. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  656. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  657. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  658. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  659. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  660. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  661. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
  662. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
@@ -40,6 +40,7 @@ import {
40
40
  composeContextModeInstructions,
41
41
  composeContractedUnitContext,
42
42
  composeInlinedContext,
43
+ composeToolSurfaceInstructions,
43
44
  composeUnitContext,
44
45
  type ArtifactResolver,
45
46
  type ComposedUnitContextBlock,
@@ -57,7 +58,11 @@ import { debugLog } from "./debug-logger.js";
57
58
  import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
58
59
  import { findMilestoneIds } from "./milestone-ids.js";
59
60
  import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
60
- import { resolveEffectiveUatType, shouldDispatchUatForContent, type UatType } from "./uat-policy.js";
61
+ import {
62
+ classifyUatContentForRun,
63
+ shouldDispatchUatForContent,
64
+ type UatType,
65
+ } from "./uat-policy.js";
61
66
  import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
62
67
 
63
68
  export { buildSkillActivationBlock, buildSkillDiscoveryVars };
@@ -292,10 +297,12 @@ function prependContextModeToBlock(
292
297
  block: string,
293
298
  renderMode: ContextModeRenderMode = "standalone",
294
299
  ): string {
300
+ const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
295
301
  const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
296
- if (!contextMode) return block;
297
- if (!block.trim()) return contextMode;
298
- return `${contextMode}\n\n${block}`;
302
+ const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
303
+ if (!guidance) return block;
304
+ if (!block.trim()) return guidance;
305
+ return `${guidance}\n\n${block}`;
299
306
  }
300
307
 
301
308
  function requireUnitPromptContextContract(unitType: string): UnitPromptContextContract {
@@ -969,7 +976,7 @@ export async function inlineDecisionsFromDb(
969
976
 
970
977
  /**
971
978
  * Inline requirements with optional milestone and slice scoping from the DB.
972
- * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
979
+ * Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
973
980
  */
974
981
  export async function inlineRequirementsFromDb(
975
982
  base: string, milestoneId?: string, sliceId?: string, level?: InlineLevel,
@@ -979,14 +986,28 @@ export async function inlineRequirementsFromDb(
979
986
  const { isDbAvailable } = await import("./gsd-db.js");
980
987
  if (isDbAvailable()) {
981
988
  const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
982
- const requirements = queryRequirements({ milestoneId, sliceId });
989
+ let requirements = queryRequirements({ milestoneId, sliceId });
990
+ let broadenedScope = false;
991
+ if (requirements.length === 0 && sliceId) {
992
+ requirements = queryRequirements({ milestoneId });
993
+ broadenedScope = true;
994
+ }
995
+ if (requirements.length === 0 && milestoneId) {
996
+ requirements = queryRequirements({ status: "active" });
997
+ broadenedScope = true;
998
+ }
983
999
  if (requirements.length > 0) {
984
- // Use compact format for non-full levels to save ~40% tokens
985
- const formatted = inlineLevel !== "full"
1000
+ // Use compact format for non-full levels, milestone-scoped calls, and
1001
+ // any cascade stage that broadened past the originally requested scope —
1002
+ // a slice-scoped "full" call that fell through to the project-wide
1003
+ // active fallback must not format those rows as full requirements.
1004
+ const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
1005
+ const formatted = useCompact
986
1006
  ? formatRequirementsCompact(requirements)
987
1007
  : formatRequirementsForPrompt(requirements);
988
1008
  return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
989
1009
  }
1010
+ return null;
990
1011
  }
991
1012
  } catch (err) {
992
1013
  logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -1442,6 +1463,40 @@ export async function checkNeedsReassessment(
1442
1463
  * - No UAT file exists for the slice
1443
1464
  * - UAT result file already exists (idempotent — already ran)
1444
1465
  */
1466
+ /**
1467
+ * Resolve the effective UAT mode for the dispatch gate the same way
1468
+ * `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
1469
+ * supplemental context, so a `browser-executable` UAT whose slice references a
1470
+ * self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
1471
+ * playwright test`) is promoted to `runtime-executable` for the gate too.
1472
+ *
1473
+ * Without this, `checkNeedsRunUat` returns `browser-executable` while the
1474
+ * prompt instructs runtime-only execution, causing the dispatch gate to
1475
+ * require browser tools / warm up the browser daemon (or stop dispatch when
1476
+ * browser MCP is unavailable) for UAT runs that never touch the browser. See
1477
+ * cursor[bot] review on PR #696 for the M007/S01 regression.
1478
+ */
1479
+ async function resolveRunUatEffectiveType(
1480
+ base: string,
1481
+ mid: string,
1482
+ sliceId: string,
1483
+ uatContent: string,
1484
+ ): Promise<UatType> {
1485
+ let summaryContent = "";
1486
+ try {
1487
+ const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
1488
+ if (summaryPath) {
1489
+ summaryContent = (await loadFile(summaryPath)) ?? "";
1490
+ }
1491
+ } catch (err) {
1492
+ logWarning(
1493
+ "prompt",
1494
+ `resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
1495
+ );
1496
+ }
1497
+ return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
1498
+ }
1499
+
1445
1500
  export async function checkNeedsRunUat(
1446
1501
  base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
1447
1502
  ): Promise<{ sliceId: string; uatType: UatType } | null> {
@@ -1470,7 +1525,8 @@ export async function checkNeedsRunUat(
1470
1525
  if (assessmentContent && hasVerdict(assessmentContent)) continue;
1471
1526
  }
1472
1527
  if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
1473
- return { sliceId: sid, uatType: resolveEffectiveUatType(uatContent) };
1528
+ const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
1529
+ return { sliceId: sid, uatType };
1474
1530
  }
1475
1531
  return null;
1476
1532
  }
@@ -1503,7 +1559,8 @@ export async function checkNeedsRunUat(
1503
1559
  if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
1504
1560
  }
1505
1561
  if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
1506
- return { sliceId: uatSid, uatType: resolveEffectiveUatType(uatContentFb) };
1562
+ const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
1563
+ return { sliceId: uatSid, uatType };
1507
1564
  }
1508
1565
  return null;
1509
1566
  }
@@ -2470,6 +2527,9 @@ export async function buildPlanSlicePrompt(
2470
2527
  `Either (a) add an earlier task that creates X on disk before the task that needs it, ` +
2471
2528
  `or (b) if this task IS the one that creates X, move X from inputs to expected_output. ` +
2472
2529
  `Do NOT put X in a task's expected_output if that task only reads or verifies X — only tasks that actually write X to disk should list it in expected_output.\n` +
2530
+ `- **"[file] X: ... GSD planning artifacts are projections preloaded as context / written by workflow tools"**: ` +
2531
+ `Remove X from the task's inputs, files, and expectedOutput entirely. Planning artifacts (anything under .gsd/, .planning/, or .audits/, or names like M001-CONTEXT.md / S01-PLAN.md) are preloaded as context and written by workflow tools — ` +
2532
+ `do NOT add a task that creates X and do NOT move X to expectedOutput.\n` +
2473
2533
  `- **"[file] X: Task T_early reads X but it's created by task T_late (sequence violation)"**: ` +
2474
2534
  `Either (a) reorder tasks so T_late (the creator) runs before T_early (the reader), ` +
2475
2535
  `or (b) if T_late doesn't actually create X (it only reads/tests it), remove X from T_late's expected_output entirely.\n` +
@@ -3554,15 +3614,30 @@ export async function buildRunUatPrompt(
3554
3614
  null,
3555
3615
  cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget",
3556
3616
  );
3617
+ const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
3618
+ const uatType = uatPolicy.effectiveType;
3619
+ const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
3620
+ ? [
3621
+ "## Runtime harness override",
3622
+ "",
3623
+ "This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
3624
+ "Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
3625
+ "Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
3626
+ "Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
3627
+ "When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
3628
+ "",
3629
+ ].join("\n")
3630
+ : "";
3557
3631
  const inlinedContext = prependContextModeToBlock(
3558
3632
  "run-uat",
3559
3633
  base,
3560
- cappedInlinedContext,
3634
+ runtimeHarnessOverride
3635
+ ? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
3636
+ : cappedInlinedContext,
3561
3637
  );
3562
3638
  emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
3563
3639
 
3564
3640
  const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
3565
- const uatType = resolveEffectiveUatType(uatContent);
3566
3641
  const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
3567
3642
 
3568
3643
  return loadPrompt("run-uat", {
@@ -3847,18 +3922,22 @@ export async function buildReactiveExecutePrompt(
3847
3922
  const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
3848
3923
  trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
3849
3924
 
3850
- const prompt = loadPrompt("reactive-execute", {
3851
- workingDirectory: base,
3852
- milestoneId: mid,
3853
- milestoneTitle: midTitle,
3854
- sliceId: sid,
3855
- sliceTitle: sTitle,
3856
- graphContext: prependContextModeToBlock("reactive-execute", base, graphContext),
3857
- readyTaskCount: String(readyTaskIds.length),
3858
- readyTaskList: readyTaskListLines.join("\n"),
3859
- subagentPrompts: subagentSections.join("\n\n---\n\n"),
3860
- inlinedTemplates,
3861
- });
3925
+ const prompt = prependContextModeToBlock(
3926
+ "reactive-execute",
3927
+ base,
3928
+ loadPrompt("reactive-execute", {
3929
+ workingDirectory: base,
3930
+ milestoneId: mid,
3931
+ milestoneTitle: midTitle,
3932
+ sliceId: sid,
3933
+ sliceTitle: sTitle,
3934
+ graphContext,
3935
+ readyTaskCount: String(readyTaskIds.length),
3936
+ readyTaskList: readyTaskListLines.join("\n"),
3937
+ subagentPrompts: subagentSections.join("\n\n---\n\n"),
3938
+ inlinedTemplates,
3939
+ }),
3940
+ );
3862
3941
  emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
3863
3942
  return prompt;
3864
3943
  }
@@ -4037,17 +4116,21 @@ export async function buildGateEvaluatePrompt(
4037
4116
  ].join("\n"));
4038
4117
  }
4039
4118
 
4040
- return loadPrompt("gate-evaluate", {
4041
- workingDirectory: base,
4042
- milestoneId: mid,
4043
- milestoneTitle: midTitle,
4044
- sliceId: sid,
4045
- sliceTitle: sTitle,
4046
- slicePlanContent: prependContextModeToBlock("gate-evaluate", base, planContent),
4047
- gateCount: String(pending.length),
4048
- gateList: gateListLines.join("\n"),
4049
- subagentPrompts: subagentSections.join("\n\n---\n\n"),
4050
- });
4119
+ return prependContextModeToBlock(
4120
+ "gate-evaluate",
4121
+ base,
4122
+ loadPrompt("gate-evaluate", {
4123
+ workingDirectory: base,
4124
+ milestoneId: mid,
4125
+ milestoneTitle: midTitle,
4126
+ sliceId: sid,
4127
+ sliceTitle: sTitle,
4128
+ slicePlanContent: planContent,
4129
+ gateCount: String(pending.length),
4130
+ gateList: gateListLines.join("\n"),
4131
+ subagentPrompts: subagentSections.join("\n\n---\n\n"),
4132
+ }),
4133
+ );
4051
4134
  }
4052
4135
 
4053
4136
  export async function buildRewriteDocsPrompt(
@@ -16,6 +16,7 @@ import type {
16
16
  ExtensionCommandContext,
17
17
  } from "@gsd/pi-coding-agent";
18
18
  import { deriveState } from "./state.js";
19
+ import { findWorktreeSegment, isGsdWorktreePath } from "./worktree-root.js";
19
20
  import { loadFile, getManifestStatus } from "./files.js";
20
21
  import type { InterruptedSessionAssessment } from "./interrupted-session.js";
21
22
  import {
@@ -27,6 +28,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
27
28
  import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
28
29
  import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
29
30
  import { gsdRoot, resolveMilestoneFile } from "./paths.js";
31
+ import { milestoneEntryBlockedGuidance } from "./guidance.js";
30
32
  import { invalidateAllCaches } from "./cache.js";
31
33
  import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
32
34
  import {
@@ -56,7 +58,8 @@ import {
56
58
  detectWorktreeName,
57
59
  setActiveMilestoneId,
58
60
  } from "./worktree.js";
59
- import { getAutoWorktreePath, isInAutoWorktree, checkoutBranchWithStashGuard } from "./auto-worktree.js";
61
+ import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
62
+ import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
60
63
  import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
61
64
  import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
62
65
  import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
@@ -96,7 +99,6 @@ import {
96
99
  rmSync,
97
100
  } from "node:fs";
98
101
  import { join } from "node:path";
99
- import { sep as pathSep } from "node:path";
100
102
 
101
103
  import { validateDirectory } from "./validate-directory.js";
102
104
  import {
@@ -601,7 +603,7 @@ export function auditOrphanedMilestoneBranches(
601
603
  warnings.push(`Failed to remove worktree directory for ${milestoneId}: ${err2 instanceof Error ? err2.message : String(err2)}`);
602
604
  }
603
605
  } else {
604
- warnings.push(`Orphaned worktree directory for ${milestoneId} is outside .gsd/worktrees/ — skipping removal for safety.`);
606
+ warnings.push(`Orphaned worktree directory for ${milestoneId} is outside the GSD worktrees containers — skipping removal for safety.`);
605
607
  }
606
608
  } else {
607
609
  pushAction({
@@ -717,7 +719,7 @@ export function auditOrphanedMilestoneBranches(
717
719
  if (!existsSync(wtDir)) continue;
718
720
  if (!isInsideWorktreesDir(basePath, wtDir)) {
719
721
  warnings.push(
720
- `Orphaned worktree directory for ${m.id} is outside .gsd/worktrees/ — skipping removal for safety.`,
722
+ `Orphaned worktree directory for ${m.id} is outside the GSD worktrees containers — skipping removal for safety.`,
721
723
  );
722
724
  continue;
723
725
  }
@@ -993,12 +995,14 @@ export async function bootstrapAutoSession(
993
995
  // phase-specific planning model for a discuss turn (#2829).
994
996
  //
995
997
  // Precedence:
996
- // 1) Explicit session override via /gsd model (this session)
997
- // 2) Current session model from settings/session restore (if provider ready)
998
- // 3) GSD model preferences from PREFERENCES.md (validated against live auth)
998
+ // 1) Explicit session override via /gsd model or /gsd auto --model (this session)
999
+ // 2) GSD model preferences from PREFERENCES.md (validated against live auth)
1000
+ // 3) Current session model from settings/session restore (if provider ready)
999
1001
  //
1000
- // This preserves #3517 defaults while honoring explicit runtime model
1001
- // selection for subsequent /gsd runs in the same session.
1002
+ // PREFERENCES.md wins over the ambient session default (#3517) so /gsd auto
1003
+ // does not stick on claude-code/claude-sonnet-4-6 when the user configured
1004
+ // models via /gsd workflow-preferences or PREFERENCES.md. Custom providers
1005
+ // still skip PREFERENCES.md entirely (#4122).
1002
1006
  //
1003
1007
  // Exception (#4122): when the session provider is a custom provider declared
1004
1008
  // in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
@@ -1010,7 +1014,7 @@ export async function bootstrapAutoSession(
1010
1014
  const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
1011
1015
  const preferredModel = sessionProviderIsCustom
1012
1016
  ? null
1013
- : resolveDefaultSessionModel(ctx.model?.provider);
1017
+ : resolveDefaultSessionModel(ctx.model?.provider, base);
1014
1018
  // Validate the preferred model against the live registry + provider auth so
1015
1019
  // an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
1016
1020
  // start-model snapshot. Without this, every subsequent unit would try to
@@ -1040,8 +1044,8 @@ export async function bootstrapAutoSession(
1040
1044
  : null;
1041
1045
  const startThinkingSnapshot = pi.getThinkingLevel();
1042
1046
  const startModelSnapshot = manualSessionOverride
1043
- ?? currentSessionModel
1044
1047
  ?? validatedPreferredModel
1048
+ ?? currentSessionModel
1045
1049
  ?? null;
1046
1050
 
1047
1051
  try {
@@ -1325,7 +1329,7 @@ export async function bootstrapAutoSession(
1325
1329
  (state.phase === "pre-planning" || state.phase === "complete") &&
1326
1330
  survivorIsolationMode !== "none" &&
1327
1331
  !detectWorktreeName(base) &&
1328
- !base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)
1332
+ !isGsdWorktreePath(base)
1329
1333
  ) {
1330
1334
  const milestoneBranch = `milestone/${survivorMilestoneId}`;
1331
1335
  const { nativeBranchExists } = await import("./native-git-bridge.js");
@@ -1610,16 +1614,12 @@ export async function bootstrapAutoSession(
1610
1614
  // live here is gone.
1611
1615
 
1612
1616
  const isUnderGsdWorktrees = (p: string): boolean => {
1613
- // Direct layout: /.gsd/worktrees/
1614
- const marker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
1615
- if (p.includes(marker)) return true;
1616
- const worktreesSuffix = `${pathSep}.gsd${pathSep}worktrees`;
1617
- if (p.endsWith(worktreesSuffix)) return true;
1618
- // Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
1619
- const symlinkRe = new RegExp(
1620
- `\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees(?:\\${pathSep}|$)`,
1621
- );
1622
- return symlinkRe.test(p);
1617
+ const normalized = p.replaceAll("\\", "/");
1618
+ if (findWorktreeSegment(normalized) !== null) return true;
1619
+ // The container directory itself (no trailing worktree name), in any layout.
1620
+ return normalized.endsWith("/.gsd/worktrees")
1621
+ || normalized.endsWith("/.gsd-worktrees")
1622
+ || /\/\.gsd\/projects\/[^/]+\/worktrees$/.test(normalized);
1623
1623
  };
1624
1624
 
1625
1625
  if (
@@ -1646,14 +1646,9 @@ export async function bootstrapAutoSession(
1646
1646
  `Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`,
1647
1647
  "error",
1648
1648
  );
1649
- } else if (enterResult.reason === "creation-failed") {
1650
- ctx.ui.notify(
1651
- `Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`,
1652
- "error",
1653
- );
1654
- } else if (enterResult.reason === "isolation-degraded") {
1649
+ } else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
1655
1650
  ctx.ui.notify(
1656
- `Cannot enter milestone ${s.currentMilestoneId}: isolation is degraded from a prior worktree failure. Close processes locking the worktree and retry, or run /gsd doctor fix.`,
1651
+ milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason),
1657
1652
  "error",
1658
1653
  );
1659
1654
  } else if (enterResult.reason === "invalid-milestone-id") {
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { stripMcpToolPrefix } from "@gsd/pi-ai";
8
+ import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
8
9
 
9
10
  interface InFlightTool {
10
11
  startedAt: number;
@@ -132,6 +133,15 @@ export function clearInFlightTools(): void {
132
133
  const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
133
134
  const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
134
135
 
136
+ /**
137
+ * Matches the runtime's "tool not registered" error. Unlike the deterministic
138
+ * invocation failures above, this one is usually transient: the workflow MCP
139
+ * server registers its tool surface asynchronously after session start, so a
140
+ * Unit's first tool call can race the registration. Callers should retry
141
+ * (bounded) instead of breaking the loop.
142
+ */
143
+ const TOOL_UNAVAILABLE_ERROR_RE = new RegExp(`No such tool available|${TOOL_SURFACE_NOT_READY}`, "i");
144
+
135
145
  /**
136
146
  * Returns true if the error message indicates a deterministic invocation or
137
147
  * policy failure (as opposed to a normal tool execution error).
@@ -141,6 +151,15 @@ export function isToolInvocationError(errorMsg: string): boolean {
141
151
  return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
142
152
  }
143
153
 
154
+ /**
155
+ * Returns true if the error message indicates the called tool was not on the
156
+ * session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
157
+ */
158
+ export function isToolUnavailableError(errorMsg: string): boolean {
159
+ if (!errorMsg) return false;
160
+ return TOOL_UNAVAILABLE_ERROR_RE.test(errorMsg);
161
+ }
162
+
144
163
  /**
145
164
  * Returns true if the error message indicates the tool was skipped because
146
165
  * a queued user message interrupted the turn (#3595). Retrying will produce
@@ -33,6 +33,24 @@ export interface UnitActivitySnapshot {
33
33
  assistantMessages: number;
34
34
  }
35
35
 
36
+ export interface AutoUnitCloseoutRequest {
37
+ ctx: ExtensionContext;
38
+ basePath: string;
39
+ unitType: string;
40
+ unitId: string;
41
+ startedAt: number;
42
+ opts?: CloseoutOptions;
43
+ }
44
+
45
+ export interface AutoUnitCloseoutResult {
46
+ activityFile?: string;
47
+ gitTransactionRecorded: boolean;
48
+ }
49
+
50
+ type GitTransactionCloseoutOptions =
51
+ Required<Pick<CloseoutOptions, "traceId" | "turnId" | "gitAction" | "gitStatus">>
52
+ & Pick<CloseoutOptions, "gitPush" | "gitError">;
53
+
36
54
  export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
37
55
 
38
56
  export function snapshotUnitActivity(
@@ -76,25 +94,27 @@ export function isSuspiciousGhostCompletion(
76
94
  }
77
95
 
78
96
  /**
79
- * Snapshot metrics, save activity log, and fire-and-forget memory extraction
80
- * for a completed unit. Returns the activity log file path (if any).
97
+ * Snapshot metrics, save activity log, extract memories, and record the git
98
+ * transaction for a completed auto-mode unit.
81
99
  */
82
- export async function closeoutUnit(
83
- ctx: ExtensionContext,
84
- basePath: string,
85
- unitType: string,
86
- unitId: string,
87
- startedAt: number,
88
- opts?: CloseoutOptions,
89
- ): Promise<string | undefined> {
90
- const modelId = ctx.model?.id ?? "unknown";
91
- snapshotUnitMetrics(ctx, unitType, unitId, startedAt, modelId, opts);
92
- const activityFile = saveActivityLog(ctx, basePath, unitType, unitId);
100
+ export async function closeoutAutoUnit(
101
+ request: AutoUnitCloseoutRequest,
102
+ ): Promise<AutoUnitCloseoutResult> {
103
+ const modelId = request.ctx.model?.id ?? "unknown";
104
+ snapshotUnitMetrics(
105
+ request.ctx,
106
+ request.unitType,
107
+ request.unitId,
108
+ request.startedAt,
109
+ modelId,
110
+ request.opts,
111
+ );
112
+ const activityFile = saveActivityLog(request.ctx, request.basePath, request.unitType, request.unitId);
93
113
 
94
114
  if (activityFile) {
95
115
  try {
96
- const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import('./memory-extractor.js');
97
- const llmCallFn = buildMemoryLLMCall(ctx);
116
+ const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import("./memory-extractor.js");
117
+ const llmCallFn = buildMemoryLLMCall(request.ctx);
98
118
  if (llmCallFn) {
99
119
  // Awaited: a fire-and-forget here lets memory-extractor writes land in
100
120
  // .gsd/ after closeoutUnit returns but before the milestone merge
@@ -103,11 +123,11 @@ export async function closeoutUnit(
103
123
  // bounded by the extractor's LLM call, which is the acceptable price
104
124
  // for not racing the merge boundary.
105
125
  try {
106
- await extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn);
126
+ await extractMemoriesFromUnit(activityFile, request.unitType, request.unitId, llmCallFn);
107
127
  } catch (err) {
108
128
  logWarning(
109
129
  "engine",
110
- `memory extraction failed for ${unitType}/${unitId}: ${(err as Error).message}`,
130
+ `memory extraction failed for ${request.unitType}/${request.unitId}: ${(err as Error).message}`,
111
131
  );
112
132
  }
113
133
  }
@@ -116,23 +136,58 @@ export async function closeoutUnit(
116
136
  }
117
137
  }
118
138
 
119
- if (opts?.traceId && opts.turnId && opts.gitAction && opts.gitStatus) {
139
+ const gitTransaction = resolveGitTransactionOptions(request.opts);
140
+
141
+ if (gitTransaction) {
120
142
  writeTurnGitTransaction({
121
- basePath,
122
- traceId: opts.traceId,
123
- turnId: opts.turnId,
124
- unitType,
125
- unitId,
143
+ basePath: request.basePath,
144
+ traceId: gitTransaction.traceId,
145
+ turnId: gitTransaction.turnId,
146
+ unitType: request.unitType,
147
+ unitId: request.unitId,
126
148
  stage: "record",
127
- action: opts.gitAction,
128
- push: opts.gitPush === true,
129
- status: opts.gitStatus,
130
- error: opts.gitError,
149
+ action: gitTransaction.gitAction,
150
+ push: gitTransaction.gitPush === true,
151
+ status: gitTransaction.gitStatus,
152
+ error: gitTransaction.gitError,
131
153
  metadata: {
132
154
  activityFile,
133
155
  },
134
156
  });
135
157
  }
136
158
 
137
- return activityFile ?? undefined;
159
+ return {
160
+ ...(activityFile ? { activityFile } : {}),
161
+ gitTransactionRecorded: Boolean(gitTransaction),
162
+ };
163
+ }
164
+
165
+ function resolveGitTransactionOptions(
166
+ opts: CloseoutOptions | undefined,
167
+ ): GitTransactionCloseoutOptions | null {
168
+ if (!opts?.traceId || !opts.turnId || !opts.gitAction || !opts.gitStatus) return null;
169
+ return {
170
+ traceId: opts.traceId,
171
+ turnId: opts.turnId,
172
+ gitAction: opts.gitAction,
173
+ gitStatus: opts.gitStatus,
174
+ gitPush: opts.gitPush,
175
+ gitError: opts.gitError,
176
+ };
177
+ }
178
+
179
+ /**
180
+ * Compatibility wrapper for existing auto-loop callers. New code should prefer
181
+ * closeoutAutoUnit so the closeout request and result stay explicit.
182
+ */
183
+ export async function closeoutUnit(
184
+ ctx: ExtensionContext,
185
+ basePath: string,
186
+ unitType: string,
187
+ unitId: string,
188
+ startedAt: number,
189
+ opts?: CloseoutOptions,
190
+ ): Promise<string | undefined> {
191
+ const result = await closeoutAutoUnit({ ctx, basePath, unitType, unitId, startedAt, opts });
192
+ return result.activityFile;
138
193
  }
@@ -5,32 +5,25 @@ import {
5
5
  } from "./unit-tool-contracts.js";
6
6
  import {
7
7
  WORKFLOW_TOOL_ALIAS_PAIRS,
8
- canonicalWorkflowSurfaceToolName,
9
8
  isWorkflowSurfaceAliasTool,
10
9
  stripMcpToolPrefix,
11
10
  } from "./workflow-tool-surface.js";
11
+ import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
12
12
 
13
13
  export {
14
14
  AUTO_UNIT_SCOPED_TOOLS,
15
15
  RUN_UAT_BROWSER_TOOL_NAMES,
16
16
  } from "./unit-tool-contracts.js";
17
17
 
18
- const EXECUTE_TASK_UNIT_TYPES = new Set([
19
- "execute-task",
20
- "execute-task-simple",
21
- "reactive-execute",
22
- ]);
23
-
24
- // These units own quality gates, but their completion handlers persist verdicts
25
- // from artifact sections. gsd_save_gate_result belongs to gate-evaluate, so keep
26
- // blocking it here with a calm redirect to the section-write path.
27
- const SECTION_CLOSE_GATE_UNIT_TYPES = new Set([
28
- "execute-task",
29
- "execute-task-simple",
30
- "reactive-execute",
31
- "complete-slice",
32
- "validate-milestone",
33
- ]);
18
+ // Scope-class membership is declared per unit in the Unit Registry (ADR-033).
19
+ // EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
20
+ // Set additionally includes scopeClass "section-close" — units whose completion
21
+ // handlers persist gate verdicts from artifact sections (gsd_save_gate_result
22
+ // belongs to gate-evaluate, so it is soft-blocked with a redirect below).
23
+ import {
24
+ EXECUTE_TASK_UNIT_TYPES,
25
+ SECTION_CLOSE_GATE_UNIT_TYPES,
26
+ } from "./unit-registry.js";
34
27
 
35
28
  const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
36
29
  "gsd_skip_slice",
@@ -58,9 +51,9 @@ type AutoUnitToolScopeResult = {
58
51
  displayReason?: string;
59
52
  };
60
53
 
61
- export function canonicalWorkflowToolName(toolName: string): string {
62
- return canonicalWorkflowSurfaceToolName(toolName);
63
- }
54
+ // Normalizer seam lives in engine-hook-contract.ts; re-exported here for
55
+ // existing scope importers.
56
+ export { canonicalWorkflowToolName };
64
57
 
65
58
  export function isWorkflowAliasTool(toolName: string): boolean {
66
59
  return isWorkflowSurfaceAliasTool(toolName);
@@ -110,7 +103,7 @@ function isNativeWorkflowTool(toolName: string): boolean {
110
103
  return stripMcpToolPrefix(toolName) === "Workflow";
111
104
  }
112
105
 
113
- function readStringField(input: unknown, camel: string, snake: string): string | undefined {
106
+ export function readStringField(input: unknown, camel: string, snake: string): string | undefined {
114
107
  if (!input || typeof input !== "object") return undefined;
115
108
  const record = input as Record<string, unknown>;
116
109
  const value = record[camel] ?? record[snake];