@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
@@ -11,6 +11,7 @@ import {
11
11
  _dispatchWorkflowForTest,
12
12
  resolveGuidedDispatchProjectRoot,
13
13
  } from "../guided-flow.ts";
14
+ import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.ts";
14
15
 
15
16
  test("guided dispatch falls back to cwd only when no project root is supplied", () => {
16
17
  const cwd = process.cwd();
@@ -77,12 +78,8 @@ test("guided dispatch passes the explicit project root through model and compati
77
78
  seen.modelRoot = projectRoot;
78
79
  return { routing: null, appliedModel: null };
79
80
  },
80
- getTransportSupportError: (
81
- _provider: string | undefined,
82
- _requiredTools: string[],
83
- options?: { projectRoot?: string },
84
- ) => {
85
- seen.compatibilityRoot = options?.projectRoot ?? "";
81
+ getDispatchReadinessError: (input: { projectRoot?: string }) => {
82
+ seen.compatibilityRoot = input.projectRoot ?? "";
86
83
  return null;
87
84
  },
88
85
  },
@@ -119,6 +116,7 @@ test("guided dispatch accepts workflow MCP tools absent from parent active tool
119
116
  getProviderAuthMode: () => "externalCli",
120
117
  },
121
118
  ui: {
119
+ setStatus: () => {},
122
120
  notify: (message: string) => {
123
121
  notifications.push(message);
124
122
  },
@@ -134,8 +132,22 @@ test("guided dispatch accepts workflow MCP tools absent from parent active tool
134
132
  "write",
135
133
  ];
136
134
 
135
+ // The workflow MCP server registers its tools out of band, so the unit's
136
+ // required workflow tools show up in the registered tool snapshot
137
+ // (getAllTools) under the MCP server prefix without ever entering the parent
138
+ // session's active tool surface (getActiveTools). This is exactly the shape
139
+ // the readiness gate must accept. Derive the surface from the unit contract
140
+ // so this test stays correct if discuss-milestone's required tools change.
141
+ const registeredTools = [
142
+ ...activeTools,
143
+ ...getRequiredWorkflowToolsForUnit("discuss-milestone").map(
144
+ (tool) => `mcp__gsd-workflow__${tool}`,
145
+ ),
146
+ ];
147
+
137
148
  const pi = {
138
149
  getActiveTools: () => [...activeTools],
150
+ getAllTools: () => registeredTools.map((name) => ({ name })),
139
151
  setActiveTools: (tools: string[]) => {
140
152
  activeTools = [...tools];
141
153
  },
@@ -35,6 +35,7 @@ import {
35
35
  insertTask,
36
36
  openDatabase,
37
37
  } from "../../gsd-db.ts";
38
+ import { createGsdIntegrationProject } from "./gsd-integration-fixture.ts";
38
39
 
39
40
  function run(cmd: string, cwd: string): string {
40
41
  // Safe: all inputs are hardcoded test strings, not user input
@@ -42,17 +43,12 @@ function run(cmd: string, cwd: string): string {
42
43
  }
43
44
 
44
45
  function createTempRepo(): string {
45
- const dir = realpathSync(mkdtempSync(join(tmpdir(), "wt-ms-merge-test-")));
46
- run("git init", dir);
47
- run("git config user.email test@test.com", dir);
48
- run("git config user.name Test", dir);
49
- writeFileSync(join(dir, "README.md"), "# test\n");
50
- mkdirSync(join(dir, ".gsd"), { recursive: true });
51
- writeFileSync(join(dir, ".gsd", "STATE.md"), "# State\n");
52
- run("git add .", dir);
53
- run("git commit -m init", dir);
54
- run("git branch -M main", dir);
55
- return dir;
46
+ return createGsdIntegrationProject({
47
+ prefix: "wt-ms-merge-test-",
48
+ initialFiles: {
49
+ ".gsd/STATE.md": "# State\n",
50
+ },
51
+ }).root;
56
52
  }
57
53
 
58
54
  function createTempRepoWithExternalGsd(): { repo: string; externalState: string } {
@@ -11,6 +11,11 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, realpathSync
11
11
  import { join } from "node:path";
12
12
  import { tmpdir } from "node:os";
13
13
  import { execSync } from "node:child_process";
14
+ import {
15
+ commitAll,
16
+ createGsdIntegrationProject,
17
+ writeGsdMilestoneContext,
18
+ } from "./gsd-integration-fixture.ts";
14
19
 
15
20
  import {
16
21
  createAutoWorktree,
@@ -32,17 +37,12 @@ function run(command: string, cwd: string): string {
32
37
  }
33
38
 
34
39
  function createTempRepo(): string {
35
- const dir = realpathSync(mkdtempSync(join(tmpdir(), "auto-wt-test-")));
36
- run("git init", dir);
37
- run("git config user.email test@test.com", dir);
38
- run("git config user.name Test", dir);
39
- // Create initial commit on main
40
- writeFileSync(join(dir, "README.md"), "# test\n");
41
- run("git add .", dir);
42
- run("git commit -m init", dir);
43
- // Ensure branch is called main
44
- run("git branch -M main", dir);
45
- return dir;
40
+ return createGsdIntegrationProject("auto-wt-test-").root;
41
+ }
42
+
43
+ function commitMilestoneContext(repo: string, milestoneId: string): void {
44
+ writeGsdMilestoneContext(repo, milestoneId);
45
+ commitAll(repo, "add milestone");
46
46
  }
47
47
 
48
48
  describe("auto-worktree lifecycle", () => {
@@ -59,13 +59,7 @@ describe("auto-worktree lifecycle", () => {
59
59
 
60
60
  test("create → detect → teardown", () => {
61
61
  tempDir = createTempRepo();
62
-
63
- // Create .gsd/milestones/M003 with a dummy file (simulates planning artifacts)
64
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
65
- mkdirSync(msDir, { recursive: true });
66
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
67
- run("git add .", tempDir);
68
- run("git commit -m \"add milestone\"", tempDir);
62
+ commitMilestoneContext(tempDir, "M003");
69
63
 
70
64
  // ─── createAutoWorktree ──────────────────────────────────────────
71
65
  const wtPath = createAutoWorktree(tempDir, "M003");
@@ -112,11 +106,7 @@ describe("auto-worktree lifecycle", () => {
112
106
 
113
107
  test("re-entry: create again, exit without teardown, re-enter", () => {
114
108
  tempDir = createTempRepo();
115
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
116
- mkdirSync(msDir, { recursive: true });
117
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
118
- run("git add .", tempDir);
119
- run("git commit -m \"add milestone\"", tempDir);
109
+ commitMilestoneContext(tempDir, "M003");
120
110
 
121
111
  const wtPath2 = createAutoWorktree(tempDir, "M003");
122
112
  assert.ok(existsSync(wtPath2), "worktree re-created");
@@ -144,6 +134,21 @@ describe("auto-worktree lifecycle", () => {
144
134
  teardownAutoWorktree(tempDir, "M003");
145
135
  });
146
136
 
137
+ test("isInAutoWorktree returns false when ambient cwd was deleted", (t) => {
138
+ const cwd = t.mock.method(process, "cwd", () => {
139
+ const err = new Error("process.cwd failed") as NodeJS.ErrnoException;
140
+ err.code = "ENOENT";
141
+ err.syscall = "uv_cwd";
142
+ throw err;
143
+ });
144
+
145
+ try {
146
+ assert.equal(isInAutoWorktree("/repo"), false);
147
+ } finally {
148
+ cwd.mock.restore();
149
+ }
150
+ });
151
+
147
152
  test("symlink-resolved auto worktree is detected after module state reset", () => {
148
153
  tempDir = createTempRepo();
149
154
  const savedGsdHome = process.env.GSD_HOME;
@@ -247,11 +252,7 @@ describe("auto-worktree lifecycle", () => {
247
252
 
248
253
  test("coexistence with manual worktree", async () => {
249
254
  tempDir = createTempRepo();
250
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
251
- mkdirSync(msDir, { recursive: true });
252
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
253
- run("git add .", tempDir);
254
- run("git commit -m \"add milestone\"", tempDir);
255
+ commitMilestoneContext(tempDir, "M003");
255
256
 
256
257
  // Import createWorktree directly for manual worktree
257
258
  const { createWorktree } = await import("../../worktree-manager.ts");
@@ -274,11 +275,7 @@ describe("auto-worktree lifecycle", () => {
274
275
 
275
276
  test("split-brain prevention: originalBase cleared after teardown", () => {
276
277
  tempDir = createTempRepo();
277
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
278
- mkdirSync(msDir, { recursive: true });
279
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
280
- run("git add .", tempDir);
281
- run("git commit -m \"add milestone\"", tempDir);
278
+ commitMilestoneContext(tempDir, "M003");
282
279
 
283
280
  createAutoWorktree(tempDir, "M003");
284
281
  teardownAutoWorktree(tempDir, "M003");
@@ -288,11 +285,7 @@ describe("auto-worktree lifecycle", () => {
288
285
 
289
286
  test("#1526: getMainBranch returns milestone/<MID> in auto-worktree", async () => {
290
287
  tempDir = createTempRepo();
291
- const msDir = join(tempDir, ".gsd", "milestones", "M005");
292
- mkdirSync(msDir, { recursive: true });
293
- writeFileSync(join(msDir, "CONTEXT.md"), "# M005 Context\n");
294
- run("git add .", tempDir);
295
- run("git commit -m \"add milestone\"", tempDir);
288
+ commitMilestoneContext(tempDir, "M005");
296
289
 
297
290
  const { GitServiceImpl } = await import("../../git-service.ts");
298
291
 
@@ -312,11 +305,7 @@ describe("auto-worktree lifecycle", () => {
312
305
 
313
306
  test("#1713: stale worktree directory without .git file", async () => {
314
307
  tempDir = createTempRepo();
315
- const msDir = join(tempDir, ".gsd", "milestones", "M010");
316
- mkdirSync(msDir, { recursive: true });
317
- writeFileSync(join(msDir, "CONTEXT.md"), "# M010 Context\n");
318
- run("git add .", tempDir);
319
- run("git commit -m \"add milestone\"", tempDir);
308
+ commitMilestoneContext(tempDir, "M010");
320
309
 
321
310
  // Simulate a crash leaving a stale directory with no .git file.
322
311
  const { worktreePath } = await import("../../worktree-manager.ts");
@@ -337,11 +326,7 @@ describe("auto-worktree lifecycle", () => {
337
326
 
338
327
  test("#778: re-attach does not reconcile plan checkboxes into a worktree-local .gsd projection", async () => {
339
328
  tempDir = createTempRepo();
340
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
341
- mkdirSync(msDir, { recursive: true });
342
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
343
- run("git add .", tempDir);
344
- run("git commit -m \"add milestone\"", tempDir);
329
+ commitMilestoneContext(tempDir, "M003");
345
330
 
346
331
  const planRelPath = join(".gsd", "milestones", "M004", "slices", "S01", "S01-PLAN.md");
347
332
  const planDir = join(tempDir, ".gsd", "milestones", "M004", "slices", "S01");
@@ -401,11 +386,7 @@ describe("auto-worktree lifecycle", () => {
401
386
 
402
387
  test("#2791: mcp.json is not copied into worktree on creation after copyPlanningArtifacts removal", () => {
403
388
  tempDir = createTempRepo();
404
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
405
- mkdirSync(msDir, { recursive: true });
406
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
407
- run("git add .", tempDir);
408
- run("git commit -m \"add milestone\"", tempDir);
389
+ commitMilestoneContext(tempDir, "M003");
409
390
 
410
391
  // Create mcp.json in .gsd/ AFTER the commit (untracked, like real usage).
411
392
  // Phase C removed copyPlanningArtifacts, so creation should not seed a
@@ -430,11 +411,7 @@ describe("auto-worktree lifecycle", () => {
430
411
 
431
412
  test("#2791: mcp.json synced via syncGsdStateToWorktree (ROOT_STATE_FILES)", () => {
432
413
  tempDir = createTempRepo();
433
- const msDir = join(tempDir, ".gsd", "milestones", "M003");
434
- mkdirSync(msDir, { recursive: true });
435
- writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
436
- run("git add .", tempDir);
437
- run("git commit -m \"add milestone\"", tempDir);
414
+ commitMilestoneContext(tempDir, "M003");
438
415
 
439
416
  // Create worktree first (no mcp.json yet)
440
417
  const wtPath = createAutoWorktree(tempDir, "M003");
@@ -0,0 +1,104 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Verify the non-blocking runEnvironmentChecksAsync is behaviourally
3
+ // identical to the synchronous runEnvironmentChecks (the health-widget render
4
+ // path was moved onto the async variant for performance), and that the single-
5
+ // scan checkPortConflicts still detects a real in-use port.
6
+
7
+ import test, { type TestContext } from "node:test";
8
+ import assert from "node:assert/strict";
9
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
10
+ import { join, dirname } from "node:path";
11
+ import { tmpdir } from "node:os";
12
+ import { createServer } from "node:net";
13
+
14
+ import {
15
+ runEnvironmentChecks,
16
+ runEnvironmentChecksAsync,
17
+ type EnvironmentCheckResult,
18
+ } from "../../doctor-environment.ts";
19
+
20
+ function makeProject(t: TestContext, files: Record<string, string>): string {
21
+ const dir = mkdtempSync(join(tmpdir(), "gsd-env-async-"));
22
+ t.after(() => {
23
+ try {
24
+ rmSync(dir, { recursive: true, force: true });
25
+ } catch {
26
+ /* ignore */
27
+ }
28
+ });
29
+ for (const [name, content] of Object.entries(files)) {
30
+ const filePath = join(dir, name);
31
+ mkdirSync(dirname(filePath), { recursive: true });
32
+ writeFileSync(filePath, content);
33
+ }
34
+ return dir;
35
+ }
36
+
37
+ // Stable, order-independent signature of a check-result set for comparison.
38
+ function normalize(results: EnvironmentCheckResult[]): string[] {
39
+ return results.map((r) => `${r.name}|${r.status}|${r.message}|${r.detail ?? ""}`).sort();
40
+ }
41
+
42
+ test("runEnvironmentChecksAsync returns the same results as runEnvironmentChecks", async (t) => {
43
+ const dir = makeProject(t, {
44
+ "package.json": JSON.stringify({
45
+ name: "fixture",
46
+ engines: { node: ">=18" },
47
+ scripts: { dev: "vite --port 4321", build: "tsc" },
48
+ devDependencies: { typescript: "^5.0.0" },
49
+ }),
50
+ ".env.example": "API_KEY=\n",
51
+ Dockerfile: "FROM node:20\n",
52
+ });
53
+ mkdirSync(join(dir, "node_modules"), { recursive: true });
54
+
55
+ const sync = runEnvironmentChecks(dir);
56
+ const asyncResults = await runEnvironmentChecksAsync(dir);
57
+
58
+ assert.deepEqual(
59
+ normalize(asyncResults),
60
+ normalize(sync),
61
+ "async checks must produce the identical result set as the sync checks",
62
+ );
63
+ // Sanity: the fixture is rich enough that the suite actually produced checks.
64
+ assert.ok(sync.length > 0, "expected the fixture to yield environment checks");
65
+ });
66
+
67
+ test("runEnvironmentChecksAsync matches sync on a bare directory (no package.json)", async (t) => {
68
+ const dir = makeProject(t, {});
69
+ const sync = runEnvironmentChecks(dir);
70
+ const asyncResults = await runEnvironmentChecksAsync(dir);
71
+ assert.deepEqual(normalize(asyncResults), normalize(sync));
72
+ });
73
+
74
+ test(
75
+ "single-scan port check detects a real in-use port, identically sync and async",
76
+ { skip: process.platform === "win32" ? "lsof-based port check is macOS/Linux only" : false },
77
+ async (t) => {
78
+ // Bind a real listener, then reference its port from package.json scripts so
79
+ // collectPortsToCheck picks it up. The server stays up across both check runs.
80
+ const server = createServer();
81
+ const port = await new Promise<number>((resolve, reject) => {
82
+ server.once("error", reject);
83
+ server.listen(0, "127.0.0.1", () => {
84
+ const addr = server.address();
85
+ resolve(typeof addr === "object" && addr ? addr.port : 0);
86
+ });
87
+ });
88
+ t.after(() => new Promise<void>((resolve) => server.close(() => resolve())));
89
+ assert.ok(port >= 1024 && port <= 65535, "ephemeral port should be in the checked range");
90
+
91
+ const dir = makeProject(t, {
92
+ "package.json": JSON.stringify({ name: "fixture", scripts: { dev: `serve --port ${port}` } }),
93
+ });
94
+
95
+ const syncConflicts = runEnvironmentChecks(dir).filter((r) => r.name === "port_conflict");
96
+ const asyncConflicts = (await runEnvironmentChecksAsync(dir)).filter((r) => r.name === "port_conflict");
97
+
98
+ // Equivalence holds regardless of whether lsof is present on the runner.
99
+ assert.deepEqual(normalize(asyncConflicts), normalize(syncConflicts), "sync and async must agree on port conflicts");
100
+ // On macOS/Linux lsof is standard, so the listener must be reported and named.
101
+ assert.equal(syncConflicts.length, 1, "expected exactly one port conflict for the in-use port");
102
+ assert.match(syncConflicts[0]!.message, new RegExp(`\\b${port}\\b`), "conflict message must name the in-use port");
103
+ },
104
+ );
@@ -0,0 +1,80 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+
6
+ export type GsdIntegrationProject = {
7
+ root: string;
8
+ };
9
+
10
+ export type CreateGsdIntegrationProjectOptions = {
11
+ prefix?: string;
12
+ initialFiles?: Record<string, string>;
13
+ };
14
+
15
+ export function projectRoot(project: GsdIntegrationProject | string): string {
16
+ return typeof project === "string" ? project : project.root;
17
+ }
18
+
19
+ export function git(project: GsdIntegrationProject | string, ...args: string[]): string {
20
+ return execFileSync("git", args, {
21
+ cwd: projectRoot(project),
22
+ encoding: "utf-8",
23
+ stdio: ["ignore", "pipe", "pipe"],
24
+ }).trim();
25
+ }
26
+
27
+ export function createGsdIntegrationProject(
28
+ options: CreateGsdIntegrationProjectOptions | string = {},
29
+ ): GsdIntegrationProject {
30
+ const resolvedOptions = typeof options === "string" ? { prefix: options } : options;
31
+ const prefix = resolvedOptions.prefix ?? "gsd-integration-";
32
+ const root = realpathSync(mkdtempSync(join(tmpdir(), prefix)));
33
+
34
+ git(root, "init");
35
+ git(root, "config", "user.email", "test@test.com");
36
+ git(root, "config", "user.name", "Test");
37
+ git(root, "config", "core.autocrlf", "false");
38
+
39
+ writeProjectFile(root, "README.md", "# test\n");
40
+ for (const [relativePath, content] of Object.entries(resolvedOptions.initialFiles ?? {})) {
41
+ writeProjectFile(root, relativePath, content);
42
+ }
43
+ git(root, "add", ".");
44
+ git(root, "commit", "-m", "init");
45
+ git(root, "branch", "-M", "main");
46
+
47
+ return { root };
48
+ }
49
+
50
+ export function writeProjectFile(
51
+ project: GsdIntegrationProject | string,
52
+ relativePath: string,
53
+ content: string,
54
+ ): string {
55
+ const filePath = join(projectRoot(project), relativePath);
56
+ mkdirSync(dirname(filePath), { recursive: true });
57
+ writeFileSync(filePath, content, "utf-8");
58
+ return filePath;
59
+ }
60
+
61
+ export function writeGsdMilestoneContext(
62
+ project: GsdIntegrationProject | string,
63
+ milestoneId: string,
64
+ content = `# ${milestoneId} Context\n`,
65
+ ): string {
66
+ return writeProjectFile(
67
+ project,
68
+ join(".gsd", "milestones", milestoneId, "CONTEXT.md"),
69
+ content,
70
+ );
71
+ }
72
+
73
+ export function commitAll(project: GsdIntegrationProject | string, message: string): void {
74
+ git(project, "add", ".");
75
+ git(project, "commit", "-m", message);
76
+ }
77
+
78
+ export function cleanupGsdIntegrationProject(project: GsdIntegrationProject | string): void {
79
+ rmSync(projectRoot(project), { recursive: true, force: true });
80
+ }
@@ -317,6 +317,24 @@ test('(k2) run-uat prompt references gsd_uat_result_save, not direct write', ()
317
317
  );
318
318
  });
319
319
 
320
+ test('(k3) run-uat prompt warns that .gsd glob misses can be symlink traversal artifacts', async () => {
321
+ const base = createFixtureBase();
322
+ try {
323
+ const uatRel = '.gsd/milestones/M001/slices/S01/S01-UAT.md';
324
+ const uatContent = makeUatContent('runtime-executable');
325
+ writeSliceFile(base, 'M001', 'S01', 'UAT', uatContent);
326
+
327
+ const prompt = await buildRunUatPrompt('M001', 'S01', uatRel, uatContent, base);
328
+
329
+ assert.match(prompt, /\.gsd\/\*\*/);
330
+ assert.match(prompt, /symlink-backed/i);
331
+ assert.match(prompt, /do not infer that the GSD harness is missing/i);
332
+ assert.match(prompt, /use the preloaded UAT context/i);
333
+ } finally {
334
+ cleanup(base);
335
+ }
336
+ });
337
+
320
338
  test('(l) dispatch preconditions via resolveSliceFile', () => {
321
339
  const base = createFixtureBase();
322
340
  const uatContent = makeUatContent('artifact-driven');
@@ -731,6 +749,75 @@ test('(u) run-uat prompt promotes artifact-driven browser specs to browser-execu
731
749
  }
732
750
  });
733
751
 
752
+ test('(w) run-uat prompt promotes browser-executable harness specs to runtime-executable (M006/S01)', async () => {
753
+ const base = createFixtureBase();
754
+ try {
755
+ const uatRel = '.gsd/milestones/M006/slices/S01/S01-UAT.md';
756
+ const uatContent = [
757
+ '# S01 UAT',
758
+ '',
759
+ '## UAT Type',
760
+ '- UAT mode: browser-executable',
761
+ '',
762
+ '## Preconditions',
763
+ '- Start the local app server with `npm run start`.',
764
+ '- Open the app at `http://127.0.0.1:4173`.',
765
+ '',
766
+ '## Evidence',
767
+ '- Fresh closeout verification command: `npm run test:uat`',
768
+ ].join('\n');
769
+ writeSliceFile(base, 'M006', 'S01', 'UAT', uatContent);
770
+
771
+ const prompt = await buildRunUatPrompt('M006', 'S01', uatRel, uatContent, base);
772
+
773
+ assert.match(prompt, /\*\*Detected UAT mode:\*\*\s*`runtime-executable`/);
774
+ assert.match(prompt, /uatType: "runtime-executable"/);
775
+ assert.match(prompt, /Runtime harness override/i);
776
+ assert.match(prompt, /Do \*\*not\*\* call `uat-service-start`/);
777
+ assert.doesNotMatch(prompt, /uatType: "browser-executable"/);
778
+ } finally {
779
+ cleanup(base);
780
+ }
781
+ });
782
+
783
+ test('(w2) run-uat prompt promotes harness from slice context when UAT only names test:server (M007/S01)', async () => {
784
+ const base = createFixtureBase();
785
+ try {
786
+ const uatRel = '.gsd/milestones/M007/slices/S01/S01-UAT.md';
787
+ const uatContent = [
788
+ '# S01 UAT',
789
+ '',
790
+ '## UAT Type',
791
+ '- UAT mode: browser-executable',
792
+ '',
793
+ '## Preconditions',
794
+ '- Start the dev/local verification server with `npm run test:server`.',
795
+ '- Open the app at the localhost URL printed by the server.',
796
+ ].join('\n');
797
+ writeSliceFile(base, 'M007', 'S01', 'UAT', uatContent);
798
+ writeSliceFile(
799
+ base,
800
+ 'M007',
801
+ 'S01',
802
+ 'SUMMARY',
803
+ [
804
+ '# S01 Summary',
805
+ '',
806
+ 'Verification: `npm run test:uat` passed with clean browser diagnostics.',
807
+ ].join('\n'),
808
+ );
809
+
810
+ const prompt = await buildRunUatPrompt('M007', 'S01', uatRel, uatContent, base);
811
+
812
+ assert.match(prompt, /\*\*Detected UAT mode:\*\*\s*`runtime-executable`/);
813
+ assert.match(prompt, /Runtime harness override/i);
814
+ assert.match(prompt, /npm run test:server/);
815
+ assert.match(prompt, /uatType: "runtime-executable"/);
816
+ } finally {
817
+ cleanup(base);
818
+ }
819
+ });
820
+
734
821
  test('(v) run-uat prompt keeps deferred browser work artifact-driven', async () => {
735
822
  const base = createFixtureBase();
736
823
  try {
@@ -748,4 +835,134 @@ test('(v) run-uat prompt keeps deferred browser work artifact-driven', async ()
748
835
  cleanup(base);
749
836
  }
750
837
  });
838
+
839
+ test('(x) checkNeedsRunUat returns runtime-executable when slice SUMMARY names a self-contained harness (M007/S01)', async () => {
840
+ // Regression: the dispatch gate must surface the same effective UAT mode
841
+ // that buildRunUatPrompt emits. When the UAT file alone declares
842
+ // `browser-executable` but the slice SUMMARY references `npm run test:uat`,
843
+ // the prompt promotes to `runtime-executable` — and so must the gate, or
844
+ // the auto-dispatch path requires browser tools / warms up the browser
845
+ // daemon (and may stop dispatch entirely) for a UAT that never touches
846
+ // the browser. See cursor[bot] review on PR #696.
847
+ const base = createFixtureBase();
848
+ try {
849
+ const roadmapDir = join(base, '.gsd', 'milestones', 'M007');
850
+ mkdirSync(roadmapDir, { recursive: true });
851
+ writeFileSync(
852
+ join(roadmapDir, 'M007-ROADMAP.md'),
853
+ [
854
+ '# M007: Test roadmap',
855
+ '',
856
+ '## Slices',
857
+ '',
858
+ '- [x] **S01: Only slice** `risk:low` `depends:[]`',
859
+ '',
860
+ '## Boundary Map',
861
+ '',
862
+ ].join('\n'),
863
+ );
864
+ writeSliceFile(
865
+ base,
866
+ 'M007',
867
+ 'S01',
868
+ 'UAT',
869
+ [
870
+ '# S01 UAT',
871
+ '',
872
+ '## UAT Type',
873
+ '- UAT mode: browser-executable',
874
+ '',
875
+ '## Preconditions',
876
+ '- Start the dev/local verification server with `npm run test:server`.',
877
+ ].join('\n'),
878
+ );
879
+ writeSliceFile(
880
+ base,
881
+ 'M007',
882
+ 'S01',
883
+ 'SUMMARY',
884
+ [
885
+ '# S01 Summary',
886
+ '',
887
+ 'Verification: `npm run test:uat` passed with clean browser diagnostics.',
888
+ ].join('\n'),
889
+ );
890
+
891
+ const state = {
892
+ activeMilestone: { id: 'M007', title: 'Test roadmap' },
893
+ activeSlice: null,
894
+ activeTask: null,
895
+ phase: 'validating-milestone',
896
+ recentDecisions: [],
897
+ blockers: [],
898
+ nextAction: 'Validate M007',
899
+ registry: [],
900
+ } as const;
901
+
902
+ const result = await checkNeedsRunUat(base, 'M007', state as any, { uat_dispatch: true } as any);
903
+ assert.deepStrictEqual(
904
+ result,
905
+ { sliceId: 'S01', uatType: 'runtime-executable' },
906
+ 'dispatch gate must mirror the prompt`s runtime-executable promotion so it does not require browser tools',
907
+ );
908
+ } finally {
909
+ cleanup(base);
910
+ }
911
+ });
912
+
913
+ test('(x2) checkNeedsRunUat leaves true browser-executable UAT unpromoted when no harness is referenced', async () => {
914
+ // Counter-test for (x): when the slice SUMMARY does NOT name a
915
+ // self-contained harness, the dispatch gate must still require browser
916
+ // tools for a genuinely browser-executable UAT.
917
+ const base = createFixtureBase();
918
+ try {
919
+ const roadmapDir = join(base, '.gsd', 'milestones', 'M008');
920
+ mkdirSync(roadmapDir, { recursive: true });
921
+ writeFileSync(
922
+ join(roadmapDir, 'M008-ROADMAP.md'),
923
+ [
924
+ '# M008: Test roadmap',
925
+ '',
926
+ '## Slices',
927
+ '',
928
+ '- [x] **S01: Only slice** `risk:low` `depends:[]`',
929
+ '',
930
+ '## Boundary Map',
931
+ '',
932
+ ].join('\n'),
933
+ );
934
+ writeSliceFile(base, 'M008', 'S01', 'UAT', makeBrowserObservableUatContent('browser-executable'));
935
+ writeSliceFile(
936
+ base,
937
+ 'M008',
938
+ 'S01',
939
+ 'SUMMARY',
940
+ [
941
+ '# S01 Summary',
942
+ '',
943
+ 'Verification: clicked through the UI and confirmed the search box filters todos.',
944
+ ].join('\n'),
945
+ );
946
+
947
+ const state = {
948
+ activeMilestone: { id: 'M008', title: 'Test roadmap' },
949
+ activeSlice: null,
950
+ activeTask: null,
951
+ phase: 'validating-milestone',
952
+ recentDecisions: [],
953
+ blockers: [],
954
+ nextAction: 'Validate M008',
955
+ registry: [],
956
+ } as const;
957
+
958
+ const result = await checkNeedsRunUat(base, 'M008', state as any, { uat_dispatch: true } as any);
959
+ assert.deepStrictEqual(
960
+ result,
961
+ { sliceId: 'S01', uatType: 'browser-executable' },
962
+ 'a true browser-executable UAT without a harness reference must keep its browser-executable mode',
963
+ );
964
+ } finally {
965
+ cleanup(base);
966
+ }
967
+ });
751
968
  });