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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  15. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  16. package/dist/resources/extensions/async-jobs/index.js +65 -0
  17. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  18. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  19. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  20. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  21. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +450 -217
  27. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  28. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  29. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  30. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  31. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  32. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  33. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  34. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  35. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  36. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  37. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  38. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  39. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  40. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  41. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  42. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  43. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  44. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  45. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  46. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  47. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  48. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  49. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  50. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  51. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  52. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  53. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  54. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  55. package/dist/resources/extensions/gsd/auto.js +41 -2
  56. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  57. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  58. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  59. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  60. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  61. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +172 -59
  62. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  63. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  64. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  65. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  66. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  67. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  68. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  69. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  70. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  71. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  72. package/dist/resources/extensions/gsd/constants.js +0 -2
  73. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  74. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  75. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  78. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  79. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  80. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  81. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  82. package/dist/resources/extensions/gsd/files.js +33 -19
  83. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  84. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  85. package/dist/resources/extensions/gsd/guidance.js +60 -0
  86. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  87. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  88. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  89. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  90. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  91. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  92. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  93. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  94. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  95. package/dist/resources/extensions/gsd/notifications.js +12 -7
  96. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  97. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  98. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  99. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  100. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  101. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  111. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  112. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  115. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  116. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  117. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  118. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  119. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  120. package/dist/resources/extensions/gsd/state.js +11 -2
  121. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  122. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  123. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  124. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  125. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  126. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  129. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  132. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  133. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  134. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  135. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  136. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  137. package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
  138. package/dist/resources/extensions/gsd/unit-registry.js +41 -24
  139. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  140. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  141. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  142. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  143. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  144. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  145. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  146. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  147. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  148. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  149. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  150. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  151. package/dist/resources/extensions/gsd/worktree.js +8 -1
  152. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  153. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  154. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  155. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  156. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  157. package/dist/resources/shared/package-manager-detection.js +1 -1
  158. package/dist/resources/shared/package.json +3 -0
  159. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  160. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  161. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  162. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  163. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  164. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  165. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  166. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  167. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  168. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  169. package/dist/runtime-checks.d.ts +10 -0
  170. package/dist/runtime-checks.js +27 -0
  171. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  172. package/dist/update-check.d.ts +2 -0
  173. package/dist/update-check.js +24 -1
  174. package/dist/update-cmd.js +20 -3
  175. package/dist/web/standalone/.next/BUILD_ID +1 -1
  176. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  177. package/dist/web/standalone/.next/build-manifest.json +3 -3
  178. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  179. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/index.html +1 -1
  199. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  206. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  207. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  210. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  211. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  212. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  213. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  214. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  215. package/dist/web/standalone/package.json +1 -1
  216. package/package.json +3 -3
  217. package/packages/cloud-mcp-gateway/package.json +2 -2
  218. package/packages/contracts/dist/rpc.d.ts +1 -0
  219. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  220. package/packages/contracts/dist/rpc.js.map +1 -1
  221. package/packages/contracts/package.json +1 -1
  222. package/packages/daemon/package.json +4 -4
  223. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  224. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  225. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  226. package/packages/gsd-agent-core/package.json +5 -5
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  241. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  249. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  250. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  251. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  259. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  260. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  261. package/packages/gsd-agent-modes/package.json +7 -7
  262. package/packages/mcp-server/README.md +12 -3
  263. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  264. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  265. package/packages/mcp-server/dist/cli-runner.js +137 -0
  266. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  267. package/packages/mcp-server/dist/cli.js +2 -53
  268. package/packages/mcp-server/dist/cli.js.map +1 -1
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  272. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  274. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  275. package/packages/mcp-server/dist/pid-registry.js +452 -0
  276. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  278. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  279. package/packages/mcp-server/dist/probe-mode.js +10 -0
  280. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  281. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  282. package/packages/mcp-server/dist/server.js +4 -0
  283. package/packages/mcp-server/dist/server.js.map +1 -1
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  287. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  288. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  289. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  290. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  291. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  292. package/packages/mcp-server/package.json +5 -4
  293. package/packages/native/package.json +1 -1
  294. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  295. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  296. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  297. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  298. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  299. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  300. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  301. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  302. package/packages/pi-agent-core/dist/index.js +3 -0
  303. package/packages/pi-agent-core/dist/index.js.map +1 -1
  304. package/packages/pi-agent-core/package.json +1 -1
  305. package/packages/pi-ai/README.md +1 -0
  306. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  307. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  308. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  309. package/packages/pi-ai/dist/index.d.ts +2 -0
  310. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/index.js +2 -0
  312. package/packages/pi-ai/dist/index.js.map +1 -1
  313. package/packages/pi-ai/dist/models.generated.d.ts +239 -153
  314. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  315. package/packages/pi-ai/dist/models.generated.js +256 -145
  316. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  317. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  319. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  321. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  323. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  324. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  326. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  327. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  328. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  329. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  330. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  331. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  333. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  334. package/packages/pi-ai/package.json +3 -2
  335. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  336. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  338. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  341. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  343. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  345. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  347. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  349. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  351. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  352. package/packages/pi-coding-agent/dist/index.js +1 -1
  353. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  356. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  358. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  360. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  361. package/packages/pi-coding-agent/package.json +7 -7
  362. package/packages/pi-tui/dist/index.d.ts +1 -1
  363. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/index.js +1 -1
  365. package/packages/pi-tui/dist/index.js.map +1 -1
  366. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  367. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/terminal-image.js +54 -2
  369. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  370. package/packages/pi-tui/dist/tui.d.ts +8 -0
  371. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  372. package/packages/pi-tui/dist/tui.js +72 -18
  373. package/packages/pi-tui/dist/tui.js.map +1 -1
  374. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  375. package/packages/pi-tui/dist/utils.js +110 -36
  376. package/packages/pi-tui/dist/utils.js.map +1 -1
  377. package/packages/pi-tui/package.json +2 -2
  378. package/packages/rpc-client/package.json +2 -2
  379. package/pkg/dist/theme/theme.d.ts.map +1 -1
  380. package/pkg/dist/theme/theme.js +45 -17
  381. package/pkg/dist/theme/theme.js.map +1 -1
  382. package/pkg/package.json +1 -1
  383. package/src/resources/GSD-WORKFLOW.md +5 -4
  384. package/src/resources/extensions/ask-user-questions.ts +7 -2
  385. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  386. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  387. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  388. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  389. package/src/resources/extensions/async-jobs/index.ts +79 -0
  390. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  391. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  392. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  393. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  394. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  395. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  396. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  397. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  398. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  399. package/src/resources/extensions/browser-tools/index.ts +71 -13
  400. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  401. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  402. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  403. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +534 -228
  404. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  405. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  406. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  407. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  408. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  409. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  410. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  411. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  412. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  413. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  414. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  415. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  416. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  417. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  418. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  419. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  420. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  421. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  422. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  423. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  424. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  425. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  426. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  427. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  428. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  429. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  430. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  431. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  432. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  433. package/src/resources/extensions/gsd/auto.ts +49 -2
  434. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  435. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  436. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  437. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  438. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  439. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +211 -59
  440. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  441. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  442. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  443. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  444. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  445. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  446. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  447. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  448. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  449. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  450. package/src/resources/extensions/gsd/constants.ts +0 -3
  451. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  452. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  453. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  454. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  455. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  456. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  457. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  458. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  459. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  460. package/src/resources/extensions/gsd/files.ts +33 -12
  461. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  462. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  463. package/src/resources/extensions/gsd/guidance.ts +78 -0
  464. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  465. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  466. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  467. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  468. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  469. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  470. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  471. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  472. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  473. package/src/resources/extensions/gsd/notifications.ts +13 -6
  474. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  475. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  476. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  477. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  478. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  479. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  481. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  483. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  484. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  485. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  486. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  487. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  488. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  489. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  490. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  491. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  492. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  493. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  494. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  495. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  496. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  497. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  498. package/src/resources/extensions/gsd/state.ts +12 -1
  499. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  500. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  502. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  503. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  504. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  505. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +51 -0
  506. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  507. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  508. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  509. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  510. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  512. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  513. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  514. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  515. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  516. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  517. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  518. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  519. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  520. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  521. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  522. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  523. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  524. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  525. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  526. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  527. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  528. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  529. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  530. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  531. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  532. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  533. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  534. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  535. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  536. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  537. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  538. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
  539. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +35 -58
  540. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  541. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  542. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  543. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  544. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  545. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  546. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  547. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  548. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  551. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  552. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  553. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  554. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  555. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  556. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  557. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  558. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  559. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  560. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  561. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  562. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  563. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  564. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  565. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  566. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  567. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  568. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  570. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  571. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  572. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  573. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  574. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  575. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  576. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  578. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  579. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  580. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  581. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  582. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  583. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  584. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  585. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  586. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  587. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  589. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  590. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  591. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  592. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  593. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  594. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  595. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  596. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  597. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  598. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  599. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  600. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  601. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  602. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  603. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  604. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  605. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  606. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  607. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  608. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  609. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  610. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  611. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  612. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  613. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  614. package/src/resources/extensions/gsd/unit-registry.ts +41 -24
  615. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  616. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  617. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  618. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  619. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  620. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  621. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  622. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  623. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  624. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  625. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  626. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  627. package/src/resources/extensions/gsd/worktree.ts +7 -1
  628. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  629. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  630. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  631. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  632. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  633. package/src/resources/shared/package-manager-detection.ts +1 -1
  634. package/src/resources/shared/package.json +3 -0
  635. package/src/resources/skills/create-skill/SKILL.md +3 -0
  636. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  637. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  638. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  639. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  640. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  641. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  642. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  643. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  644. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  645. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  646. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  647. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  648. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  649. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  650. /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
  651. /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
@@ -5,103 +5,53 @@
5
5
  * as a fire-and-forget side-effect so that Telegram/Slack/Discord channels
6
6
  * receive the same events as native desktop notifications.
7
7
  *
8
- * Testing strategy (structural analysis):
9
- * node:test does not support mock.module without --experimental-test-module-mocks,
10
- * so we use the same source-code structural approach established in this codebase
11
- * (see session-start-footer.test.ts). We read notifications.ts and assert that:
12
- * 1. It imports sendRemoteNotification from the remote-questions/notify module.
13
- * 2. The sendDesktopNotification function body calls sendRemoteNotification
14
- * with title and message as arguments.
15
- * 3. The call uses the void fire-and-forget pattern with a .catch(() => {})
16
- * suppressor so that async failures never break the synchronous caller.
8
+ * Testing strategy (behavioral):
9
+ * Import sendDesktopNotification and the swappable remoteNotificationDispatcher.
10
+ * Mock the dispatcher's send method, call sendDesktopNotification, and assert
11
+ * that the dispatcher received the same title/message and that the call is
12
+ * fire-and-forget (the function returns without awaiting).
17
13
  *
18
14
  * Relates to #4341.
19
15
  */
20
16
 
21
17
  import test from "node:test";
22
18
  import assert from "node:assert/strict";
23
- import { readFileSync } from "node:fs";
24
- import { join, dirname } from "node:path";
25
- import { fileURLToPath } from "node:url";
26
19
 
27
- const __dirname = dirname(fileURLToPath(import.meta.url));
28
- const SOURCE = readFileSync(join(__dirname, "..", "notifications.ts"), "utf-8");
20
+ import {
21
+ sendDesktopNotification,
22
+ remoteNotificationDispatcher,
23
+ } from "../notifications.js";
29
24
 
30
- test("notifications.ts imports sendRemoteNotification from remote-questions/notify", () => {
31
- const hasImport =
32
- SOURCE.includes('from "../remote-questions/notify.js"') ||
33
- SOURCE.includes("from '../remote-questions/notify.js'");
34
- assert.ok(
35
- hasImport,
36
- "notifications.ts must import from '../remote-questions/notify.js'",
37
- );
38
-
39
- const importLine = SOURCE.split("\n").find(
40
- (line) =>
41
- line.includes("sendRemoteNotification") &&
42
- (line.includes("remote-questions/notify") || line.includes("remote-questions/notify.js")),
43
- );
44
- assert.ok(
45
- importLine,
46
- "The import statement must include sendRemoteNotification from the remote-questions/notify module",
47
- );
48
- });
49
-
50
- test("sendDesktopNotification calls sendRemoteNotification(title, message)", () => {
51
- // Extract the body of sendDesktopNotification — from its opening brace to the
52
- // closing brace at the same indentation level.
53
- const fnStart = SOURCE.indexOf("export function sendDesktopNotification(");
54
- assert.ok(fnStart > -1, "sendDesktopNotification must be present in notifications.ts");
25
+ test("sendDesktopNotification calls sendRemoteNotification with title and message", async (t) => {
26
+ const sendMock = t.mock.method(remoteNotificationDispatcher, "send", async () => {});
55
27
 
56
- // Find the next exported function/const after sendDesktopNotification to bound the search.
57
- const nextExportIdx = SOURCE.indexOf("\nexport ", fnStart + 1);
58
- const fnBody = nextExportIdx > -1 ? SOURCE.slice(fnStart, nextExportIdx) : SOURCE.slice(fnStart);
59
-
60
- assert.ok(
61
- fnBody.includes("sendRemoteNotification"),
62
- "sendDesktopNotification must call sendRemoteNotification",
63
- );
28
+ sendDesktopNotification("Test Title", "Test Message");
64
29
 
65
- assert.ok(
66
- fnBody.includes("sendRemoteNotification(title") || fnBody.includes("sendRemoteNotification(title,"),
67
- "sendRemoteNotification must be called with title as first argument",
68
- );
30
+ assert.equal(sendMock.mock.callCount(), 1);
31
+ assert.deepEqual(sendMock.mock.calls[0].arguments, ["Test Title", "Test Message"]);
69
32
  });
70
33
 
71
- test("sendRemoteNotification is invoked as void fire-and-forget with .catch(() => {})", () => {
72
- const fnStart = SOURCE.indexOf("export function sendDesktopNotification(");
73
- const nextExportIdx = SOURCE.indexOf("\nexport ", fnStart + 1);
74
- const fnBody = nextExportIdx > -1 ? SOURCE.slice(fnStart, nextExportIdx) : SOURCE.slice(fnStart);
34
+ test("sendDesktopNotification does not await the remote notification", async (t) => {
35
+ const sendMock = t.mock.method(remoteNotificationDispatcher, "send", async () => {});
75
36
 
76
- assert.ok(
77
- fnBody.includes("void sendRemoteNotification("),
78
- "sendRemoteNotification must be called with void (fire-and-forget)",
79
- );
37
+ const result = sendDesktopNotification("Async Title", "Async Message");
80
38
 
81
- assert.ok(
82
- fnBody.includes(".catch("),
83
- "sendRemoteNotification call must be followed by .catch() to suppress unhandled-rejection warnings",
84
- );
39
+ assert.equal(result, undefined, "sendDesktopNotification must return void");
40
+ assert.equal(sendMock.mock.callCount(), 1);
85
41
  });
86
42
 
87
- test("sendRemoteNotification call appears before shouldSendDesktopNotification guard", () => {
88
- // Regression guard for the HIGH-severity bug where remote notifications were
89
- // gated behind the desktop-notification preference check. Users who disable
90
- // desktop notifications must still receive Telegram/Slack/Discord messages.
91
- const fnStart = SOURCE.indexOf("export function sendDesktopNotification(");
92
- assert.ok(fnStart > -1, "sendDesktopNotification must be present in notifications.ts");
93
-
94
- const nextExportIdx = SOURCE.indexOf("\nexport ", fnStart + 1);
95
- const fnBody = nextExportIdx > -1 ? SOURCE.slice(fnStart, nextExportIdx) : SOURCE.slice(fnStart);
43
+ test("sendDesktopNotification fires remote notification even when desktop notifications are disabled", async (t) => {
44
+ const sendMock = t.mock.method(remoteNotificationDispatcher, "send", async () => {});
96
45
 
97
- const remoteCallIdx = fnBody.indexOf("sendRemoteNotification(");
98
- const guardIdx = fnBody.indexOf("shouldSendDesktopNotification(");
99
-
100
- assert.ok(remoteCallIdx > -1, "sendRemoteNotification must be called inside sendDesktopNotification");
101
- assert.ok(guardIdx > -1, "shouldSendDesktopNotification guard must be present inside sendDesktopNotification");
102
-
103
- assert.ok(
104
- remoteCallIdx < guardIdx,
105
- `sendRemoteNotification (pos ${remoteCallIdx}) must appear BEFORE the shouldSendDesktopNotification guard (pos ${guardIdx}) so that remote channels fire even when desktop notifications are disabled`,
46
+ sendDesktopNotification(
47
+ "Remote Title",
48
+ "Remote Message",
49
+ "info",
50
+ "complete",
51
+ undefined,
52
+ { notifications: { enabled: false } },
106
53
  );
54
+
55
+ assert.equal(sendMock.mock.callCount(), 1);
56
+ assert.deepEqual(sendMock.mock.calls[0].arguments, ["Remote Title", "Remote Message"]);
107
57
  });
@@ -200,6 +200,74 @@ test("parseRoadmapSlices: checkbox slices with pipe characters do not switch to
200
200
  assert.deepEqual(slices[2]?.depends, ["S01", "S02"]);
201
201
  });
202
202
 
203
+ test("parseRoadmapSlices: demo markdown table does not switch checkbox roadmap to table mode (#721)", () => {
204
+ const checkboxWithDemoTable = [
205
+ "# M004: Demo Table Repro",
206
+ "",
207
+ "## Slices",
208
+ "",
209
+ "- [x] **S01: First** `risk:low` `depends:[]`",
210
+ " > After this: cli can render examples:",
211
+ "| Example | Meaning |",
212
+ "| --- | --- |",
213
+ "| S01 | Not a roadmap row |",
214
+ "- [ ] **S02: Second** `risk:medium` `depends:[S01]`",
215
+ " > After this: cat file | sort returns stable output.",
216
+ "",
217
+ ].join("\n");
218
+
219
+ const slices = parseRoadmapSlices(checkboxWithDemoTable);
220
+ assert.equal(slices.length, 2);
221
+ assert.equal(slices[0]?.id, "S01");
222
+ assert.equal(slices[0]?.title, "First");
223
+ assert.equal(slices[0]?.done, true);
224
+ assert.equal(slices[1]?.id, "S02");
225
+ assert.deepEqual(slices[1]?.depends, ["S01"]);
226
+ });
227
+
228
+ test("parseRoadmapSlices: table preceded by intro prose still parsed as table (#722)", () => {
229
+ const tableWithIntro = [
230
+ "# M005: Intro Before Table",
231
+ "",
232
+ "## Slices",
233
+ "",
234
+ "This milestone is broken into the following slices:",
235
+ "",
236
+ "| Slice | Title | Risk | Status |",
237
+ "| --- | --- | --- | --- |",
238
+ "| S01 | Foundation | Low | [x] Done |",
239
+ "| S02 | Core | High | [ ] Pending |",
240
+ "",
241
+ ].join("\n");
242
+
243
+ const slices = parseRoadmapSlices(tableWithIntro);
244
+ assert.equal(slices.length, 2);
245
+ assert.equal(slices[0]?.id, "S01");
246
+ assert.equal(slices[0]?.done, true);
247
+ assert.equal(slices[1]?.id, "S02");
248
+ assert.equal(slices[1]?.done, false);
249
+ });
250
+
251
+ test("parseRoadmapSlices: table without markdown separator row still parsed as table (#722)", () => {
252
+ const tableWithoutSeparator = [
253
+ "# M006: No Separator",
254
+ "",
255
+ "## Slices",
256
+ "",
257
+ "| Slice | Title | Risk | Status |",
258
+ "| S01 | Foundation | Low | [x] Done |",
259
+ "| S02 | Core | High | [ ] Pending |",
260
+ "",
261
+ ].join("\n");
262
+
263
+ const slices = parseRoadmapSlices(tableWithoutSeparator);
264
+ assert.equal(slices.length, 2);
265
+ assert.equal(slices[0]?.id, "S01");
266
+ assert.equal(slices[0]?.done, true);
267
+ assert.equal(slices[1]?.id, "S02");
268
+ assert.equal(slices[1]?.done, false);
269
+ });
270
+
203
271
  // --- Prose slice header completion marker tests (#1803) ---
204
272
 
205
273
  test("parseRoadmapSlices: prose headers with ✓ marker detected as done", () => {
@@ -6,7 +6,11 @@ import assert from "node:assert/strict";
6
6
 
7
7
  import { classifyFailure } from "../recovery-classification.js";
8
8
  import { reconcileBeforeDispatch } from "../state-reconciliation.js";
9
- import { compileUnitContextContract, compileUnitToolContract } from "../tool-contract.js";
9
+ import {
10
+ compileUnitContextContract,
11
+ compileUnitToolContract,
12
+ getUnitWorkflowDispatchReadinessError,
13
+ } from "../tool-contract.js";
10
14
  import { shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
11
15
  import type { GSDState } from "../types.js";
12
16
 
@@ -63,7 +67,13 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
63
67
 
64
68
  assert.equal(result.ok, true);
65
69
  assert.equal(result.ok && result.contract.unitType, "execute-task");
66
- assert.deepEqual(result.ok && result.contract.requiredWorkflowTools, ["gsd_task_complete"]);
70
+ assert.deepEqual(result.ok && result.contract.requiredWorkflowTools, [
71
+ "gsd_task_complete",
72
+ "gsd_exec",
73
+ "gsd_exec_search",
74
+ "gsd_resume",
75
+ "gsd_capture_thought",
76
+ ]);
67
77
  assert.deepEqual(result.ok && result.contract.forbiddenWorkflowTools, []);
68
78
  assert.equal(result.ok && result.contract.toolsPolicy.mode, "all");
69
79
  assert.ok(result.ok && result.contract.validationRules.includes("closeout-tool-present"));
@@ -87,6 +97,20 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
87
97
  });
88
98
  });
89
99
 
100
+ test("Tool Contract derives dispatch readiness from Unit workflow tools", () => {
101
+ const error = getUnitWorkflowDispatchReadinessError({
102
+ provider: "claude-code",
103
+ unitType: "plan-slice",
104
+ projectRoot: "/tmp/project",
105
+ env: { GSD_WORKFLOW_MCP_COMMAND: "node" },
106
+ surface: "auto-mode",
107
+ authMode: "externalCli",
108
+ baseUrl: "local://claude-code",
109
+ });
110
+
111
+ assert.equal(error, null);
112
+ });
113
+
90
114
  test("Unit Context Contract exposes prompt context without workflow tool surface", () => {
91
115
  const result = compileUnitContextContract("execute-task");
92
116
 
@@ -92,14 +92,14 @@ test("buildSkillActivationBlock activates skills via prefer_skills when context
92
92
  prefer_skills: ["react"],
93
93
  });
94
94
 
95
- assert.match(result, /Call Skill\(\{ skill: 'react' \}\)/);
95
+ assert.match(result, /Read the installed 'react' skill file from <available_skills>/);
96
96
  assert.doesNotMatch(result, /swiftui/);
97
97
  } finally {
98
98
  cleanup(base);
99
99
  }
100
100
  });
101
101
 
102
- test("buildSkillActivationBlock includes always_use_skills from preferences using exact Skill tool format", () => {
102
+ test("buildSkillActivationBlock includes always_use_skills using read-based skill loading", () => {
103
103
  const base = makeTempBase();
104
104
  try {
105
105
  writeSkill(base, "swift-testing", "Use for Swift Testing assertions and verification patterns.");
@@ -109,7 +109,10 @@ test("buildSkillActivationBlock includes always_use_skills from preferences usin
109
109
  always_use_skills: ["swift-testing"],
110
110
  });
111
111
 
112
- assert.equal(result, "<skill_activation>Call Skill({ skill: 'swift-testing' }).</skill_activation>");
112
+ assert.equal(
113
+ result,
114
+ "<skill_activation>Read the installed 'swift-testing' skill file from <available_skills>.</skill_activation>",
115
+ );
113
116
  } finally {
114
117
  cleanup(base);
115
118
  }
@@ -137,8 +140,8 @@ test("buildSkillActivationBlock includes skill_rules matches and task-plan skill
137
140
  skill_rules: [{ when: "prisma database schema", use: ["prisma"] }],
138
141
  });
139
142
 
140
- assert.match(result, /Call Skill\(\{ skill: 'accessibility' \}\)/);
141
- assert.match(result, /Call Skill\(\{ skill: 'prisma' \}\)/);
143
+ assert.match(result, /Read the installed 'accessibility' skill file from <available_skills>/);
144
+ assert.match(result, /Read the installed 'prisma' skill file from <available_skills>/);
142
145
  } finally {
143
146
  cleanup(base);
144
147
  }
@@ -160,7 +163,7 @@ test("buildSkillActivationBlock matches skill_rules against exact unit type cont
160
163
  ],
161
164
  });
162
165
 
163
- assert.match(result, /Call Skill\(\{ skill: 'complete-slice-policies' \}\)/);
166
+ assert.match(result, /Read the installed 'complete-slice-policies' skill file from <available_skills>/);
164
167
  assert.doesNotMatch(result, /slice-broad/);
165
168
  } finally {
166
169
  cleanup(base);
@@ -264,8 +267,8 @@ test("buildSkillActivationBlock allows valid skill names and rejects invalid one
264
267
  });
265
268
 
266
269
  assert.match(result, /skill_activation/);
267
- assert.match(result, /Call Skill\(\{ skill: 'react' \}\)/);
268
- assert.match(result, /Call Skill\(\{ skill: 'good-skill-2' \}\)/);
270
+ assert.match(result, /Read the installed 'react' skill file from <available_skills>/);
271
+ assert.match(result, /Read the installed 'good-skill-2' skill file from <available_skills>/);
269
272
  assert.doesNotMatch(result, /bad'name/);
270
273
  } finally {
271
274
  cleanup(base);
@@ -289,8 +292,8 @@ test("buildSkillActivationBlock: explicit always_use_skills bypass the unit-type
289
292
  always_use_skills: ["write-docs", "swiftui"],
290
293
  });
291
294
 
292
- assert.match(result, /Call Skill\(\{ skill: 'write-docs' \}\)/);
293
- assert.match(result, /Call Skill\(\{ skill: 'swiftui' \}\)/);
295
+ assert.match(result, /Read the installed 'write-docs' skill file from <available_skills>/);
296
+ assert.match(result, /Read the installed 'swiftui' skill file from <available_skills>/);
294
297
  } finally {
295
298
  cleanup(base);
296
299
  }
@@ -307,7 +310,7 @@ test("buildSkillActivationBlock falls through to all skills for unknown unit typ
307
310
  });
308
311
 
309
312
  // Unknown unit type = wildcard fallback (pre-manifest behavior).
310
- assert.match(result, /Call Skill\(\{ skill: 'swiftui' \}\)/);
313
+ assert.match(result, /Read the installed 'swiftui' skill file from <available_skills>/);
311
314
  } finally {
312
315
  cleanup(base);
313
316
  }
@@ -324,7 +327,7 @@ test("buildSkillActivationBlock without unitType preserves pre-manifest behavior
324
327
  always_use_skills: ["swiftui"],
325
328
  });
326
329
 
327
- assert.match(result, /Call Skill\(\{ skill: 'swiftui' \}\)/);
330
+ assert.match(result, /Read the installed 'swiftui' skill file from <available_skills>/);
328
331
  } finally {
329
332
  cleanup(base);
330
333
  }
@@ -341,12 +344,12 @@ test("milestone prompt builders propagate always_use_skills through buildSkillAc
341
344
  loadOnlyTestSkills(base);
342
345
 
343
346
  const researchPrompt = await buildResearchMilestonePrompt("M001", "Test", base);
344
- assert.match(researchPrompt, /Call Skill\(\{ skill: 'write-docs' \}\)/);
345
- assert.match(researchPrompt, /Call Skill\(\{ skill: 'swiftui' \}\)/);
347
+ assert.match(researchPrompt, /Read the installed 'write-docs' skill file from <available_skills>/);
348
+ assert.match(researchPrompt, /Read the installed 'swiftui' skill file from <available_skills>/);
346
349
 
347
350
  const planPrompt = await buildPlanMilestonePrompt("M001", "Test", base);
348
- assert.match(planPrompt, /Call Skill\(\{ skill: 'write-docs' \}\)/);
349
- assert.match(planPrompt, /Call Skill\(\{ skill: 'swiftui' \}\)/);
351
+ assert.match(planPrompt, /Read the installed 'write-docs' skill file from <available_skills>/);
352
+ assert.match(planPrompt, /Read the installed 'swiftui' skill file from <available_skills>/);
350
353
  } finally {
351
354
  cleanup(base);
352
355
  }
@@ -377,7 +380,7 @@ test("complete-slice prompt propagates always_use_skills through buildSkillActiv
377
380
 
378
381
  const prompt = await buildCompleteSlicePrompt("M001", "Test", "S01", "Slice", base);
379
382
 
380
- assert.match(prompt, /Call Skill\(\{ skill: 'write-docs' \}\)/);
383
+ assert.match(prompt, /Read the installed 'write-docs' skill file from <available_skills>/);
381
384
  } finally {
382
385
  cleanup(base);
383
386
  }
@@ -339,7 +339,7 @@ test("resume path only hard-exits on blocked stop, not blocked pause (#6154)", (
339
339
  );
340
340
  });
341
341
 
342
- test("prepareForUnit skips worktree safety when isolation is not worktree (#6154)", () => {
342
+ test("prepareForUnit enforces worktree safety for all isolation modes (#6154)", () => {
343
343
  const orchSrc = readGsdFile("auto/orchestrator.ts");
344
344
  const prepareForUnitIdx = orchSrc.indexOf("private async prepareWorktreeForUnit(");
345
345
  const prepareForUnitBody = orchSrc.slice(prepareForUnitIdx, orchSrc.indexOf("private classifyAndRecover(", prepareForUnitIdx));
@@ -350,8 +350,12 @@ test("prepareForUnit skips worktree safety when isolation is not worktree (#6154
350
350
  "prepareForUnit should resolve the effective isolation mode once",
351
351
  );
352
352
  assert.ok(
353
- prepareForUnitBody.includes('if (isolationMode !== "worktree")'),
354
- "prepareForUnit should bypass worktree safety validation outside worktree isolation mode",
353
+ prepareForUnitBody.includes('const writeScope ='),
354
+ "prepareForUnit should classify the unit's write scope before validating",
355
+ );
356
+ assert.ok(
357
+ !prepareForUnitBody.includes('if (isolationMode !== "worktree")'),
358
+ "prepareForUnit must not bypass worktree safety outside worktree isolation mode",
355
359
  );
356
360
  });
357
361
 
@@ -3,7 +3,7 @@
3
3
  import test from "node:test";
4
4
  import assert from "node:assert/strict";
5
5
 
6
- import { _resolveCurrentUnitStartedAtForTest } from "../auto/phases.ts";
6
+ import { _resolveCurrentUnitStartedAtForTest } from "../auto/phase-helpers.ts";
7
7
 
8
8
  test("unit started-at resolver tolerates stopAuto clearing currentUnit", () => {
9
9
  assert.equal(_resolveCurrentUnitStartedAtForTest(null), undefined);
@@ -159,4 +159,21 @@ describe("teardown chdir failure clears registry", () => {
159
159
  assert.strictEqual(getAutoWorktreeOriginalBase(), null, "registry null after successful teardown");
160
160
  assert.strictEqual(getActiveAutoWorktreeContext(), null, "context null after successful teardown");
161
161
  });
162
+
163
+ test("teardown survives when current working directory was deleted", () => {
164
+ repoDir = createTempRepo();
165
+ seedMilestone(repoDir, "M003");
166
+
167
+ const worktreePath = createAutoWorktree(repoDir, "M003");
168
+ process.chdir(worktreePath);
169
+ rmSync(worktreePath, { recursive: true, force: true });
170
+
171
+ assert.doesNotThrow(
172
+ () => teardownAutoWorktree(repoDir, "M003"),
173
+ "teardownAutoWorktree should not call process.cwd() unguarded from a deleted cwd",
174
+ );
175
+
176
+ assert.strictEqual(getAutoWorktreeOriginalBase(), null, "registry null after deleted-cwd teardown");
177
+ assert.strictEqual(getActiveAutoWorktreeContext(), null, "context null after deleted-cwd teardown");
178
+ });
162
179
  });
@@ -10,6 +10,7 @@ import { DISCUSS_TOOLS_ALLOWLIST } from "../constants.ts";
10
10
  import { buildMinimalAutoGsdToolSet, buildMinimalGsdToolSet, buildMinimalGsdWorkflowToolSet, buildRequestScopedGsdToolSet, MINIMAL_AUTO_BASE_TOOL_NAMES, MINIMAL_GSD_TOOL_NAMES, requestHasGsdCustomType, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "../bootstrap/register-hooks.ts";
11
11
  import { filterToolsForProvider } from "../model-router.ts";
12
12
  import { applyUnitSkillVisibility } from "../skill-scope.ts";
13
+ import { drainLogs } from "../workflow-logger.ts";
13
14
 
14
15
  test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surface", () => {
15
16
  const result = buildMinimalGsdToolSet([
@@ -17,6 +18,7 @@ test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surf
17
18
  "read",
18
19
  "browser_open",
19
20
  "gsd_plan_milestone",
21
+ "gsd_plan_slice",
20
22
  "gsd_task_complete",
21
23
  "gsd_exec",
22
24
  "gsd_exec_search",
@@ -103,6 +105,40 @@ test("buildMinimalAutoGsdToolSet keeps unit-specific completion tools without al
103
105
  assert.ok(!result.includes("gsd_complete_slice"));
104
106
  });
105
107
 
108
+ test("buildMinimalAutoGsdToolSet warns when plan-milestone required tools are unresolved", () => {
109
+ drainLogs();
110
+ const result = buildMinimalAutoGsdToolSet(
111
+ [
112
+ "ask_user_questions",
113
+ "bash",
114
+ "read",
115
+ "gsd_milestone_status",
116
+ "gsd_plan_milestone",
117
+ ],
118
+ "plan-milestone",
119
+ [
120
+ "ask_user_questions",
121
+ "bash",
122
+ "read",
123
+ "gsd_milestone_status",
124
+ "gsd_plan_milestone",
125
+ ],
126
+ );
127
+
128
+ assert.ok(result.includes("gsd_plan_milestone"));
129
+ assert.ok(!result.includes("gsd_plan_slice"));
130
+
131
+ const logs = drainLogs();
132
+ assert.ok(
133
+ logs.some((entry) =>
134
+ entry.component === "bootstrap" &&
135
+ entry.message.includes("buildMinimalAutoGsdToolSet(plan-milestone)") &&
136
+ entry.message.includes("gsd_plan_slice")
137
+ ),
138
+ `expected missing gsd_plan_slice bootstrap warning, got ${JSON.stringify(logs)}`,
139
+ );
140
+ });
141
+
106
142
  test("buildMinimalAutoGsdToolSet scopes run-uat to UAT-specific and read-only tools", () => {
107
143
  const active = ["ask_user_questions", "bash", "read", "edit", "write", "gsd_summary_save"];
108
144
  const registered = [
@@ -329,13 +365,14 @@ test("buildMinimalAutoGsdToolSet includes closeout tool for complete-slice", ()
329
365
  "gsd_complete_slice",
330
366
  "memory_query",
331
367
  "capture_thought",
368
+ "gsd_capture_thought",
332
369
  ], "complete-slice");
333
370
 
334
371
  assert.ok(result.includes("gsd_slice_complete"));
335
372
  assert.ok(result.includes("gsd_task_reopen"));
336
373
  assert.ok(result.includes("gsd_replan_slice"));
337
374
  assert.ok(result.includes("subagent"));
338
- assert.ok(result.includes("capture_thought"));
375
+ assert.ok(result.includes("gsd_capture_thought"));
339
376
  assert.ok(!result.includes("gsd_task_complete"));
340
377
  assert.ok(!result.includes("gsd_complete_slice"));
341
378
  });
@@ -351,6 +388,7 @@ test("buildMinimalAutoGsdToolSet preserves workflow MCP-namespaced closeout tool
351
388
  "mcp__gsd-workflow__gsd_exec",
352
389
  "mcp__gsd-workflow__memory_query",
353
390
  "mcp__gsd-workflow__capture_thought",
391
+ "mcp__gsd-workflow__gsd_capture_thought",
354
392
  ], "complete-slice");
355
393
 
356
394
  assert.ok(result.includes("mcp__gsd-workflow__gsd_task_reopen"));
@@ -359,7 +397,7 @@ test("buildMinimalAutoGsdToolSet preserves workflow MCP-namespaced closeout tool
359
397
  assert.ok(!result.includes("mcp__gsd-workflow__gsd_complete_slice"));
360
398
  assert.ok(result.includes("mcp__gsd-workflow__gsd_exec"));
361
399
  assert.ok(result.includes("mcp__gsd-workflow__memory_query"));
362
- assert.ok(result.includes("mcp__gsd-workflow__capture_thought"));
400
+ assert.ok(result.includes("mcp__gsd-workflow__gsd_capture_thought"));
363
401
  });
364
402
 
365
403
  test("buildMinimalAutoGsdToolSet covers execute-task-simple", () => {
@@ -613,6 +651,46 @@ test("buildMinimalAutoGsdToolSet resolves MCP-scoped gsd_memory_query and gsd_ca
613
651
  );
614
652
  });
615
653
 
654
+ // ── Regression #627: auto-mode cannot run plan-milestone because gsd_plan_slice is missing ──
655
+ // gsd_plan_slice is in AUTO_UNIT_SCOPED_TOOLS["plan-milestone"] (via unit-tool-contracts).
656
+ // buildMinimalAutoGsdToolSet must expose it when unitType is "plan-milestone".
657
+
658
+ test("buildMinimalAutoGsdToolSet includes gsd_plan_slice for plan-milestone (regression #627)", () => {
659
+ const result = buildMinimalAutoGsdToolSet([
660
+ "bash",
661
+ "read",
662
+ "gsd_plan_milestone",
663
+ "gsd_plan_slice",
664
+ "gsd_milestone_status",
665
+ "gsd_checkpoint_db",
666
+ "memory_query",
667
+ "capture_thought",
668
+ ], "plan-milestone");
669
+
670
+ assert.ok(
671
+ result.includes("gsd_plan_slice"),
672
+ "gsd_plan_slice must be included in plan-milestone auto-mode tool set",
673
+ );
674
+ });
675
+
676
+ test("buildMinimalAutoGsdToolSet resolves MCP-scoped gsd_plan_slice for plan-milestone when subprocess only registers prefixed variant (regression #627)", () => {
677
+ const result = buildMinimalAutoGsdToolSet([
678
+ "bash",
679
+ "read",
680
+ "mcp__gsd-workflow__gsd_plan_milestone",
681
+ "mcp__gsd-workflow__gsd_plan_slice",
682
+ "mcp__gsd-workflow__gsd_milestone_status",
683
+ "mcp__gsd-workflow__gsd_checkpoint_db",
684
+ "mcp__gsd-workflow__memory_query",
685
+ "mcp__gsd-workflow__capture_thought",
686
+ ], "plan-milestone");
687
+
688
+ assert.ok(
689
+ result.includes("mcp__gsd-workflow__gsd_plan_slice"),
690
+ "mcp__gsd-workflow__gsd_plan_slice must be included when only the MCP-scoped variant is available",
691
+ );
692
+ });
693
+
616
694
  test("applyUnitSkillVisibility sets manifest or clears for wildcard", () => {
617
695
  const calls: Array<string[] | undefined> = [];
618
696
  applyUnitSkillVisibility({