@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.9bb7453

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 (395) hide show
  1. package/dist/cli.js +3 -2
  2. package/dist/help-text.js +10 -6
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
  5. package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
  6. package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
  7. package/dist/resources/extensions/browser-tools/index.js +57 -9
  8. package/dist/resources/extensions/browser-tools/package.json +5 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
  10. package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
  11. package/dist/resources/extensions/gsd/auto/phases.js +4 -3
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +44 -0
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
  15. package/dist/resources/extensions/gsd/auto-prompts.js +68 -22
  16. package/dist/resources/extensions/gsd/auto-recovery.js +4 -4
  17. package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
  18. package/dist/resources/extensions/gsd/auto-start.js +94 -15
  19. package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
  20. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +2 -1
  21. package/dist/resources/extensions/gsd/auto.js +31 -6
  22. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +83 -4
  23. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
  24. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +39 -14
  25. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -10
  26. package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
  29. package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
  30. package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
  31. package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
  32. package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
  33. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
  34. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  35. package/dist/resources/extensions/gsd/config-overlay.js +2 -1
  36. package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
  37. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  38. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
  39. package/dist/resources/extensions/gsd/error-classifier.js +2 -1
  40. package/dist/resources/extensions/gsd/escalation.js +4 -4
  41. package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
  42. package/dist/resources/extensions/gsd/forensics.js +74 -2
  43. package/dist/resources/extensions/gsd/gsd-db.js +42 -6
  44. package/dist/resources/extensions/gsd/guided-flow.js +30 -69
  45. package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
  46. package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
  47. package/dist/resources/extensions/gsd/memory-store.js +4 -1
  48. package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
  49. package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
  50. package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
  51. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  52. package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
  53. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  54. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  55. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  57. package/dist/resources/extensions/gsd/prompts/run-uat.md +48 -24
  58. package/dist/resources/extensions/gsd/prompts/system.md +3 -1
  59. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  60. package/dist/resources/extensions/gsd/rule-registry.js +428 -52
  61. package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
  62. package/dist/resources/extensions/gsd/skill-activation.js +20 -3
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
  66. package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
  67. package/dist/resources/extensions/gsd/state.js +17 -14
  68. package/dist/resources/extensions/gsd/templates/plan.md +3 -1
  69. package/dist/resources/extensions/gsd/tool-presentation-plan.js +120 -0
  70. package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
  71. package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
  72. package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
  73. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
  74. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  75. package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
  76. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +403 -3
  77. package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
  78. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  79. package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
  80. package/dist/resources/extensions/gsd/verification-gate.js +72 -1
  81. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
  82. package/dist/resources/extensions/gsd/workflow-mcp.js +5 -1
  83. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
  84. package/dist/resources/extensions/mcp-client/manager.js +31 -1
  85. package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
  86. package/dist/rtk.d.ts +7 -1
  87. package/dist/rtk.js +27 -11
  88. package/dist/update-check.d.ts +15 -1
  89. package/dist/update-check.js +87 -12
  90. package/dist/update-cmd.d.ts +1 -0
  91. package/dist/update-cmd.js +53 -2
  92. package/dist/web/standalone/.next/BUILD_ID +1 -1
  93. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  94. package/dist/web/standalone/.next/build-manifest.json +2 -2
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/index.html +1 -1
  114. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  121. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  124. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  125. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  126. package/package.json +5 -3
  127. package/packages/cloud-mcp-gateway/package.json +2 -2
  128. package/packages/contracts/dist/workflow.d.ts +14 -0
  129. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  130. package/packages/contracts/dist/workflow.js +16 -0
  131. package/packages/contracts/dist/workflow.js.map +1 -1
  132. package/packages/contracts/package.json +1 -1
  133. package/packages/daemon/package.json +4 -4
  134. package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
  135. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  136. package/packages/gsd-agent-core/dist/agent-session.js +32 -0
  137. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  138. package/packages/gsd-agent-core/dist/index.d.ts +1 -0
  139. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  140. package/packages/gsd-agent-core/dist/index.js +1 -0
  141. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  142. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
  143. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
  144. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
  145. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
  146. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
  147. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  148. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  149. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  150. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
  151. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  152. package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
  153. package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
  154. package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
  155. package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
  156. package/packages/gsd-agent-core/package.json +6 -6
  157. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
  158. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
  159. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
  160. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
  161. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  162. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  163. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  164. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  165. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  166. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  167. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
  171. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  172. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
  173. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
  174. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
  175. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
  176. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  178. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
  179. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  188. package/packages/gsd-agent-modes/package.json +7 -7
  189. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  190. package/packages/mcp-server/dist/remote-questions.js +23 -9
  191. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  192. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  193. package/packages/mcp-server/dist/workflow-tools.js +84 -2
  194. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  195. package/packages/mcp-server/package.json +3 -3
  196. package/packages/native/package.json +1 -1
  197. package/packages/pi-agent-core/dist/agent-loop.js +38 -0
  198. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  199. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  200. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  201. package/packages/pi-agent-core/dist/agent.js +2 -0
  202. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  203. package/packages/pi-agent-core/dist/types.d.ts +3 -0
  204. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  205. package/packages/pi-agent-core/dist/types.js.map +1 -1
  206. package/packages/pi-agent-core/package.json +1 -1
  207. package/packages/pi-ai/dist/api-registry.d.ts +2 -0
  208. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  209. package/packages/pi-ai/dist/api-registry.js +23 -0
  210. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  211. package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
  212. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/image-models.generated.js +15 -0
  214. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  215. package/packages/pi-ai/dist/models.generated.d.ts +406 -17
  216. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  217. package/packages/pi-ai/dist/models.generated.js +484 -116
  218. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  219. package/packages/pi-ai/dist/stream.js +6 -6
  220. package/packages/pi-ai/dist/stream.js.map +1 -1
  221. package/packages/pi-ai/package.json +1 -1
  222. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  224. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  226. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  228. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  229. package/packages/pi-coding-agent/package.json +7 -7
  230. package/packages/pi-tui/dist/terminal.d.ts +1 -0
  231. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  232. package/packages/pi-tui/dist/terminal.js +8 -4
  233. package/packages/pi-tui/dist/terminal.js.map +1 -1
  234. package/packages/pi-tui/package.json +1 -1
  235. package/packages/rpc-client/package.json +2 -2
  236. package/pkg/package.json +1 -1
  237. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
  238. package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
  239. package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
  240. package/src/resources/extensions/browser-tools/index.ts +60 -9
  241. package/src/resources/extensions/browser-tools/package.json +5 -1
  242. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
  243. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
  244. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
  245. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
  246. package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
  247. package/src/resources/extensions/gsd/auto/phases.ts +5 -3
  248. package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
  249. package/src/resources/extensions/gsd/auto-dispatch.ts +53 -0
  250. package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
  251. package/src/resources/extensions/gsd/auto-prompts.ts +102 -15
  252. package/src/resources/extensions/gsd/auto-recovery.ts +4 -4
  253. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  254. package/src/resources/extensions/gsd/auto-start.ts +112 -17
  255. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  256. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +2 -1
  257. package/src/resources/extensions/gsd/auto.ts +47 -5
  258. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +90 -4
  259. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
  260. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +60 -19
  261. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +21 -10
  262. package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
  263. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  264. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
  265. package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
  266. package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
  267. package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
  268. package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
  269. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
  270. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  271. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  272. package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
  273. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  274. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
  275. package/src/resources/extensions/gsd/error-classifier.ts +2 -1
  276. package/src/resources/extensions/gsd/escalation.ts +4 -4
  277. package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
  278. package/src/resources/extensions/gsd/forensics.ts +99 -5
  279. package/src/resources/extensions/gsd/gsd-db.ts +46 -8
  280. package/src/resources/extensions/gsd/guided-flow.ts +91 -83
  281. package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
  282. package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
  283. package/src/resources/extensions/gsd/memory-store.ts +4 -1
  284. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  285. package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
  286. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  287. package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
  288. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  289. package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
  290. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  291. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  292. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  293. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  294. package/src/resources/extensions/gsd/prompts/run-uat.md +48 -24
  295. package/src/resources/extensions/gsd/prompts/system.md +3 -1
  296. package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  297. package/src/resources/extensions/gsd/rule-registry.ts +558 -58
  298. package/src/resources/extensions/gsd/rule-types.ts +2 -0
  299. package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
  300. package/src/resources/extensions/gsd/skill-activation.ts +20 -2
  301. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
  302. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  303. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
  304. package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
  305. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
  306. package/src/resources/extensions/gsd/state.ts +18 -14
  307. package/src/resources/extensions/gsd/templates/plan.md +3 -1
  308. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
  309. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
  310. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
  311. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
  312. package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
  313. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
  314. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
  315. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
  316. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  317. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
  318. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
  319. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
  320. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
  321. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
  322. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
  323. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
  324. package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
  325. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
  326. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
  327. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
  328. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
  329. package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
  330. package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
  331. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
  332. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
  333. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
  334. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
  335. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
  336. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -10
  337. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
  338. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
  339. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
  340. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
  341. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
  342. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
  343. package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
  344. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
  345. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
  346. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
  347. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
  348. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
  349. package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
  350. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +53 -1
  351. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
  352. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
  353. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
  354. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
  355. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +35 -0
  356. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
  357. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
  358. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
  359. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
  360. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
  361. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  362. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
  363. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  364. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
  365. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
  366. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
  367. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
  368. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
  369. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
  370. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
  371. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
  372. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
  373. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +213 -0
  374. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +25 -0
  375. package/src/resources/extensions/gsd/tool-presentation-plan.ts +167 -0
  376. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
  377. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
  378. package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
  379. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
  380. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  381. package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
  382. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +489 -3
  383. package/src/resources/extensions/gsd/types.ts +69 -5
  384. package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
  385. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  386. package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
  387. package/src/resources/extensions/gsd/verification-gate.ts +87 -1
  388. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
  389. package/src/resources/extensions/gsd/workflow-mcp.ts +5 -1
  390. package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
  391. package/src/resources/extensions/mcp-client/manager.ts +33 -1
  392. package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
  393. package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
  394. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_buildManifest.js +0 -0
  395. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_ssgManifest.js +0 -0
@@ -1,11 +1,16 @@
1
- /** browser-tools — pi extension: full browser interaction via Playwright. */
1
+ /** browser-tools — Pi Browser Automation Contract adapter. */
2
2
  import { importExtensionModule, type ExtensionAPI } from "@gsd/pi-coding-agent";
3
3
 
4
- let registrationPromise: Promise<void> | null = null;
4
+ import { closeManagedGsdBrowser, registerManagedGsdBrowserTools } from "./engine/managed-gsd-browser.js";
5
+ import { resolveBrowserEngineMode, type BrowserEngineMode } from "./engine/selection.js";
5
6
 
6
- async function registerBrowserTools(pi: ExtensionAPI): Promise<void> {
7
- if (!registrationPromise) {
8
- registrationPromise = (async () => {
7
+ let legacyRegistrationPromise: Promise<void> | null = null;
8
+ let managedRegistrationPromise: Promise<void> | null = null;
9
+ let registeredEngine: Exclude<BrowserEngineMode, "off"> | null = null;
10
+
11
+ async function registerLegacyBrowserTools(pi: ExtensionAPI): Promise<void> {
12
+ if (!legacyRegistrationPromise) {
13
+ legacyRegistrationPromise = (async () => {
9
14
  const [
10
15
  lifecycle,
11
16
  capture,
@@ -136,12 +141,55 @@ async function registerBrowserTools(pi: ExtensionAPI): Promise<void> {
136
141
  injectionDetection.registerInjectionDetectionTools(pi, deps);
137
142
  verify.registerVerifyTools(pi, deps);
138
143
  })().catch((error) => {
139
- registrationPromise = null;
144
+ legacyRegistrationPromise = null;
140
145
  throw error;
141
146
  });
142
147
  }
143
148
 
144
- return registrationPromise;
149
+ return legacyRegistrationPromise;
150
+ }
151
+
152
+ async function registerBrowserTools(pi: ExtensionAPI): Promise<void> {
153
+ const engine = resolveBrowserEngineMode();
154
+ if (engine === "off") return;
155
+ if (registeredEngine && registeredEngine !== engine) {
156
+ throw new Error(
157
+ `Browser tools already registered with GSD_BROWSER_ENGINE=${registeredEngine}. Restart GSD before switching to ${engine}.`,
158
+ );
159
+ }
160
+
161
+ let registration: Promise<void>;
162
+ if (engine === "legacy") {
163
+ registration = registerLegacyBrowserTools(pi);
164
+ } else if (!managedRegistrationPromise) {
165
+ managedRegistrationPromise = Promise.resolve()
166
+ .then(() => {
167
+ registerManagedGsdBrowserTools(pi);
168
+ })
169
+ .catch((error) => {
170
+ managedRegistrationPromise = null;
171
+ throw error;
172
+ });
173
+ registration = managedRegistrationPromise;
174
+ } else {
175
+ registration = managedRegistrationPromise;
176
+ }
177
+
178
+ registeredEngine = engine;
179
+ try {
180
+ await registration;
181
+ } catch (error) {
182
+ if (registeredEngine === engine) registeredEngine = null;
183
+ throw error;
184
+ }
185
+ }
186
+
187
+ async function closeActiveBrowserEngines(): Promise<void> {
188
+ await closeManagedGsdBrowser();
189
+ if (legacyRegistrationPromise) {
190
+ const { closeBrowser } = await importExtensionModule<typeof import("./lifecycle.js")>(import.meta.url, "./lifecycle.js");
191
+ await closeBrowser();
192
+ }
145
193
  }
146
194
 
147
195
  export default function (pi: ExtensionAPI) {
@@ -157,7 +205,10 @@ export default function (pi: ExtensionAPI) {
157
205
  });
158
206
 
159
207
  pi.on("session_shutdown", async () => {
160
- const { closeBrowser } = await importExtensionModule<typeof import("./lifecycle.js")>(import.meta.url, "./lifecycle.js");
161
- await closeBrowser();
208
+ await closeActiveBrowserEngines();
209
+ });
210
+
211
+ pi.on("session_switch", async () => {
212
+ await closeActiveBrowserEngines();
162
213
  });
163
214
  }
@@ -4,16 +4,20 @@
4
4
  "version": "1.0.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "test": "node --test tests/*.test.mjs"
7
+ "test": "node --import ../gsd/tests/resolve-ts.mjs --experimental-strip-types --test tests/*.test.mjs"
8
8
  },
9
9
  "pi": {
10
10
  "extensions": ["./index.ts"]
11
11
  },
12
12
  "peerDependencies": {
13
+ "@opengsd/gsd-browser": ">=0.1.27",
13
14
  "playwright": ">=1.40.0",
14
15
  "sharp": ">=0.33.0"
15
16
  },
16
17
  "peerDependenciesMeta": {
18
+ "@opengsd/gsd-browser": {
19
+ "optional": true
20
+ },
17
21
  "playwright": {
18
22
  "optional": true
19
23
  },
@@ -0,0 +1,35 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { createRequire } from "node:module";
4
+ import { dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const require = createRequire(import.meta.url);
9
+ const jiti = require("jiti")(__dirname, { interopDefault: true, debug: false });
10
+
11
+ const { resolveBrowserEngineMode } = jiti("../engine/selection.ts");
12
+
13
+ describe("resolveBrowserEngineMode", () => {
14
+ it("defaults to gsd-browser", () => {
15
+ assert.equal(resolveBrowserEngineMode({}), "gsd-browser");
16
+ });
17
+
18
+ it("accepts the explicit engine modes", () => {
19
+ assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "gsd-browser" }), "gsd-browser");
20
+ assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "legacy" }), "legacy");
21
+ assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "off" }), "off");
22
+ });
23
+
24
+ it("accepts compatibility aliases", () => {
25
+ assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "playwright" }), "legacy");
26
+ assert.equal(resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "false" }), "off");
27
+ });
28
+
29
+ it("rejects unknown engine modes", () => {
30
+ assert.throws(
31
+ () => resolveBrowserEngineMode({ GSD_BROWSER_ENGINE: "surprise" }),
32
+ /Expected "gsd-browser", "legacy", or "off"/,
33
+ );
34
+ });
35
+ });
@@ -0,0 +1,33 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ const {
5
+ MANAGED_GSD_BROWSER_TOOL_NAMES,
6
+ registerManagedGsdBrowserTools,
7
+ } = await import("../engine/managed-gsd-browser.ts");
8
+
9
+ describe("registerManagedGsdBrowserTools", () => {
10
+ it("registers the curated Pi browser contract", () => {
11
+ const tools = [];
12
+ registerManagedGsdBrowserTools({
13
+ registerTool(tool) {
14
+ tools.push(tool);
15
+ },
16
+ });
17
+
18
+ assert.deepEqual(tools.map((tool) => tool.name), [...MANAGED_GSD_BROWSER_TOOL_NAMES]);
19
+ assert.equal(new Set(tools.map((tool) => tool.name)).size, tools.length);
20
+ });
21
+
22
+ it("keeps screenshots marked as image-producing evidence", () => {
23
+ const tools = [];
24
+ registerManagedGsdBrowserTools({
25
+ registerTool(tool) {
26
+ tools.push(tool);
27
+ },
28
+ });
29
+
30
+ const screenshot = tools.find((tool) => tool.name === "browser_screenshot");
31
+ assert.equal(screenshot?.compatibility?.producesImages, true);
32
+ });
33
+ });
@@ -27,10 +27,21 @@ import { homedir } from "node:os";
27
27
  import { createRequire } from "node:module";
28
28
  import { dirname, join } from "node:path";
29
29
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
30
- import { buildWorkflowMcpServers, resolveWorkflowMcpProjectRoot } from "../gsd/workflow-mcp.js";
31
- import { buildProjectGsdMcpServers } from "../gsd/mcp-project-config.js";
30
+ import {
31
+ buildWorkflowMcpServers,
32
+ getRequiredWorkflowToolsForAutoUnit,
33
+ resolveWorkflowMcpProjectRoot,
34
+ } from "../gsd/workflow-mcp.js";
35
+ import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
32
36
  import { loadProjectGSDPreferences } from "../gsd/preferences.js";
33
- import { discoverBrowserMcpServerName, discoverMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools } from "../gsd/mcp-filter.js";
37
+ import {
38
+ discoverBrowserMcpServerName,
39
+ discoverMcpServers,
40
+ discoverMcpServerNames,
41
+ discoverWorkflowMcpServerName,
42
+ computeMcpDisallowedTools,
43
+ } from "../gsd/mcp-filter.js";
44
+ import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
34
45
  import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
35
46
  import type {
36
47
  BetaRawMessageStreamEvent,
@@ -324,6 +335,33 @@ function extractMessageText(msg: { role: string; content: unknown }): string {
324
335
  return "";
325
336
  }
326
337
 
338
+ const GSD_PHASE_PATTERNS: Array<[string, RegExp]> = [
339
+ ["run-uat", /\b(?:UNIT:\s*Run UAT|run-uat)\b/i],
340
+ ["complete-milestone", /\b(?:UNIT:\s*Complete Milestone|complete-milestone)\b/i],
341
+ ["validate-milestone", /\b(?:UNIT:\s*Validate Milestone|validate-milestone)\b/i],
342
+ ["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
343
+ ["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
344
+ ["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
345
+ ["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
346
+ ["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
347
+ ["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
348
+ ["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
349
+ ["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
350
+ ["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
351
+ ["discuss-milestone", /\b(?:Discuss milestone|discuss-milestone)\b/i],
352
+ ];
353
+
354
+ export function inferGsdPhaseFromContext(context: Context): string | undefined {
355
+ const text = [
356
+ context.systemPrompt ?? "",
357
+ ...context.messages.map((message) => extractMessageText(message)),
358
+ ].join("\n");
359
+ for (const [phase, pattern] of GSD_PHASE_PATTERNS) {
360
+ if (pattern.test(text)) return phase;
361
+ }
362
+ return undefined;
363
+ }
364
+
327
365
  /**
328
366
  * Build a full conversational prompt from GSD's context messages.
329
367
  *
@@ -1462,19 +1500,113 @@ function mapThinkingLevelToAnthropicEffort(level: ThinkingLevel | undefined, mod
1462
1500
  }
1463
1501
  }
1464
1502
 
1465
- function workflowMcpServerNameFromAllowedTools(allowedTools: unknown): string | undefined {
1503
+ function parseAllowedMcpToolName(toolName: string): { server: string; tool: string } | undefined {
1504
+ const match = /^mcp__(.+)__(\*|[^*]+)$/.exec(toolName);
1505
+ return match?.[1] && match[2] ? { server: match[1], tool: match[2] } : undefined;
1506
+ }
1507
+
1508
+ function browserMcpServerNameFromAllowedTools(allowedTools: unknown): string | undefined {
1466
1509
  if (!Array.isArray(allowedTools)) return undefined;
1467
1510
  for (const toolName of allowedTools) {
1468
1511
  if (typeof toolName !== "string") continue;
1469
- const match = /^mcp__(.+)__\*$/.exec(toolName);
1470
- if (match?.[1] && match[1] !== "gsd-browser") return match[1];
1512
+ const parsed = parseAllowedMcpToolName(toolName);
1513
+ if (!parsed) continue;
1514
+ if (parsed.server === "gsd-browser" || parsed.tool.startsWith("browser_")) {
1515
+ return parsed.server;
1516
+ }
1471
1517
  }
1472
1518
  return undefined;
1473
1519
  }
1474
1520
 
1475
- function browserMcpServerNameFromAllowedTools(allowedTools: unknown): string | undefined {
1521
+ function workflowMcpServerNameFromAllowedTools(allowedTools: unknown): string | undefined {
1476
1522
  if (!Array.isArray(allowedTools)) return undefined;
1477
- return allowedTools.includes("mcp__gsd-browser__*") ? "gsd-browser" : undefined;
1523
+ const browserServerName = browserMcpServerNameFromAllowedTools(allowedTools);
1524
+ for (const toolName of allowedTools) {
1525
+ if (typeof toolName !== "string") continue;
1526
+ const parsed = parseAllowedMcpToolName(toolName);
1527
+ if (!parsed || parsed.server === browserServerName || parsed.tool.startsWith("browser_")) continue;
1528
+ return parsed.server;
1529
+ }
1530
+ return undefined;
1531
+ }
1532
+
1533
+ function isRecord(value: unknown): value is Record<string, unknown> {
1534
+ return !!value && typeof value === "object" && !Array.isArray(value);
1535
+ }
1536
+
1537
+ function isStringRecord(value: unknown): value is Record<string, string> {
1538
+ return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
1539
+ }
1540
+
1541
+ function cloneSdkMcpServerConfig(config: unknown): Record<string, unknown> | undefined {
1542
+ if (!isRecord(config)) return undefined;
1543
+ const cloned: Record<string, unknown> = {};
1544
+ for (const key of ["type", "command", "cwd", "url"] as const) {
1545
+ if (typeof config[key] === "string") cloned[key] = config[key];
1546
+ }
1547
+ if (Array.isArray(config.args)) {
1548
+ cloned.args = config.args.filter((arg): arg is string => typeof arg === "string");
1549
+ }
1550
+ if (isStringRecord(config.env)) cloned.env = { ...config.env };
1551
+ if (isStringRecord(config.headers)) cloned.headers = { ...config.headers };
1552
+ if (isRecord(config.oauth)) cloned.oauth = { ...config.oauth };
1553
+ return Object.keys(cloned).length > 0 ? cloned : undefined;
1554
+ }
1555
+
1556
+ function resolveProjectMcpServerConfig(
1557
+ projectRoot: string,
1558
+ serverName: string | undefined,
1559
+ fallbackServers?: Record<string, unknown>,
1560
+ ): Record<string, unknown> | undefined {
1561
+ if (!serverName) return undefined;
1562
+ const projectServer = discoverMcpServers(projectRoot).find((server) => server.name === serverName);
1563
+ return cloneSdkMcpServerConfig(projectServer?.config) ?? cloneSdkMcpServerConfig(fallbackServers?.[serverName]);
1564
+ }
1565
+
1566
+ function resolveProjectMcpServerConfigs(
1567
+ projectRoot: string,
1568
+ serverNames: readonly (string | undefined)[],
1569
+ fallbackServers?: Record<string, unknown>,
1570
+ ): Record<string, Record<string, unknown>> | undefined {
1571
+ const resolved: Record<string, Record<string, unknown>> = {};
1572
+ for (const serverName of serverNames) {
1573
+ const serverConfig = resolveProjectMcpServerConfig(projectRoot, serverName, fallbackServers);
1574
+ if (serverName && serverConfig) resolved[serverName] = serverConfig;
1575
+ }
1576
+ return Object.keys(resolved).length > 0 ? resolved : undefined;
1577
+ }
1578
+
1579
+ function resolveExactWorkflowMcpToolsForPhase(
1580
+ gsdPhase: string | undefined,
1581
+ workflowServerName: string | undefined,
1582
+ workflowExplicitlyBlocked: boolean,
1583
+ ): string[] {
1584
+ if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked) return [];
1585
+ const requiredTools = gsdPhase === "run-uat"
1586
+ ? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
1587
+ : getRequiredWorkflowToolsForAutoUnit(gsdPhase);
1588
+ const supportTools = gsdPhase === "run-uat" ? [] : ["gsd_milestone_status"];
1589
+ const requestedToolNames = [...new Set([...requiredTools, ...supportTools])];
1590
+ if (requestedToolNames.length === 0) return [];
1591
+ return resolveToolPresentationPlan({
1592
+ phase: gsdPhase,
1593
+ surface: "claude-code-sdk",
1594
+ workflowMcpServerName: workflowServerName,
1595
+ requestedToolNames,
1596
+ }).presentedToolNames;
1597
+ }
1598
+
1599
+ export function autoInitClaudeCodeWorkflowMcp(cwd: string): void {
1600
+ const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1601
+ try {
1602
+ ensureProjectWorkflowMcpConfig(projectRoot);
1603
+ } catch (err) {
1604
+ if (process.env.GSD_DEBUG === "1") {
1605
+ console.warn(
1606
+ `[claude-code] workflow MCP auto-init failed: ${err instanceof Error ? err.message : String(err)}`,
1607
+ );
1608
+ }
1609
+ }
1478
1610
  }
1479
1611
 
1480
1612
  /**
@@ -1492,9 +1624,9 @@ export function buildSdkOptions(
1492
1624
  modelId: string,
1493
1625
  prompt: string,
1494
1626
  overrides?: { permissionMode?: "bypassPermissions" | "acceptEdits" | "default" | "plan" },
1495
- extraOptions: Record<string, unknown> & { reasoning?: ThinkingLevel } = {},
1627
+ extraOptions: Record<string, unknown> & { reasoning?: ThinkingLevel; gsdPhase?: string } = {},
1496
1628
  ): Record<string, unknown> {
1497
- const { reasoning, cwd, ...sdkExtraOptions } = extraOptions;
1629
+ const { reasoning, cwd, gsdPhase, ...sdkExtraOptions } = extraOptions;
1498
1630
  const sdkCwd = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
1499
1631
  // Claude Code runs in the milestone worktree for file/shell work, but workflow MCP
1500
1632
  // config (.mcp.json) and server discovery live at the project root.
@@ -1578,13 +1710,46 @@ export function buildSdkOptions(
1578
1710
  const browserMcpTools = !browserExplicitlyBlocked && browserServerName
1579
1711
  ? [`mcp__${browserServerName}__*`]
1580
1712
  : [];
1581
- const gsdMcpTools = [...workflowMcpTools, ...browserMcpTools];
1713
+ const phaseUsesBrowserMcp = !gsdPhase || gsdPhase === "run-uat";
1714
+ const allowedBrowserMcpTools = phaseUsesBrowserMcp ? browserMcpTools : [];
1715
+ const inlinePhaseMcpServers = gsdPhase
1716
+ ? resolveProjectMcpServerConfigs(
1717
+ projectRoot,
1718
+ [
1719
+ workflowExplicitlyBlocked ? undefined : workflowServerName,
1720
+ phaseUsesBrowserMcp && !browserExplicitlyBlocked ? browserServerName : undefined,
1721
+ ],
1722
+ defaultMcpServers.servers,
1723
+ )
1724
+ : undefined;
1725
+ const sdkMcpServers = inlinePhaseMcpServers ?? filteredMcpServers;
1726
+ const strictMcpConfig = !!inlinePhaseMcpServers;
1727
+ // Strict phase configs inline the exact MCP servers GSD needs. Loading
1728
+ // project/local settings at the same time can duplicate those servers and
1729
+ // leave allowed mcp__... tools with no registered backing tool.
1730
+ const settingSources = strictMcpConfig ? [] : ["project", "local"];
1731
+ const exactWorkflowMcpTools = resolveExactWorkflowMcpToolsForPhase(
1732
+ gsdPhase,
1733
+ workflowServerName,
1734
+ workflowExplicitlyBlocked,
1735
+ );
1736
+ const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
1737
+ ? [
1738
+ ...RUN_UAT_FORBIDDEN_TOOL_NAMES.filter((toolName) => !toolName.startsWith("mcp__")),
1739
+ "WebFetch",
1740
+ "Agent",
1741
+ `mcp__${workflowServerName}__gsd_exec`,
1742
+ `mcp__${workflowServerName}__gsd_summary_save`,
1743
+ `mcp__${workflowServerName}__gsd_save_gate_result`,
1744
+ ]
1745
+ : [];
1582
1746
  const disallowedTools: string[] = [...new Set([
1583
1747
  "ToolSearch",
1584
- ...(workflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
1748
+ ...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
1749
+ ...runUatDisallowedTools,
1585
1750
  ...extraDisallowedTools,
1586
1751
  ])];
1587
- const allowedTools = [
1752
+ const standardClaudeTools = [
1588
1753
  "Read",
1589
1754
  "Write",
1590
1755
  "Edit",
@@ -1594,8 +1759,19 @@ export function buildSdkOptions(
1594
1759
  "Agent",
1595
1760
  "WebFetch",
1596
1761
  "WebSearch",
1597
- ...(workflowMcpTools.length > 0 ? gsdMcpTools : ["AskUserQuestion", ...browserMcpTools]),
1598
1762
  ];
1763
+ const allowedTools = gsdPhase === "run-uat"
1764
+ ? [
1765
+ ...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES,
1766
+ ...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
1767
+ ...allowedBrowserMcpTools,
1768
+ ]
1769
+ : [
1770
+ ...standardClaudeTools,
1771
+ ...exactWorkflowMcpTools,
1772
+ ...(workflowMcpTools.length > 0 ? workflowMcpTools : ["AskUserQuestion"]),
1773
+ ...allowedBrowserMcpTools,
1774
+ ];
1599
1775
  const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
1600
1776
  const effort =
1601
1777
  reasoning && supportsAdaptive
@@ -1619,11 +1795,12 @@ export function buildSdkOptions(
1619
1795
  cwd: sdkCwd,
1620
1796
  permissionMode,
1621
1797
  allowDangerouslySkipPermissions: permissionMode === "bypassPermissions",
1622
- settingSources: ["project"],
1798
+ settingSources,
1623
1799
  systemPrompt: { type: "preset", preset: "claude_code" },
1624
1800
  disallowedTools,
1625
1801
  ...(allowedTools.length > 0 ? { allowedTools } : {}),
1626
- ...(filteredMcpServers ? { mcpServers: filteredMcpServers } : {}),
1802
+ ...(sdkMcpServers ? { mcpServers: sdkMcpServers } : {}),
1803
+ ...(strictMcpConfig ? { strictMcpConfig: true } : {}),
1627
1804
  betas: (
1628
1805
  modelId.includes("sonnet")
1629
1806
  || modelId.includes("opus-4-7")
@@ -1954,6 +2131,8 @@ async function pumpSdkMessages(
1954
2131
  const onExternalToolCall = (options as ClaudeCodeStreamOptions | undefined)?.onExternalToolCall;
1955
2132
  const onExternalToolResult = (options as ClaudeCodeStreamOptions | undefined)?.onExternalToolResult;
1956
2133
  const cwd = resolveClaudeCodeCwd(options);
2134
+ autoInitClaudeCodeWorkflowMcp(cwd);
2135
+ const gsdPhase = inferGsdPhaseFromContext(context);
1957
2136
  const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
1958
2137
  // When no UI is available (headless / auto-mode), auto-approve all
1959
2138
  // tool requests. This replaces the old bypassPermissions workaround.
@@ -1966,6 +2145,7 @@ async function pumpSdkMessages(
1966
2145
  { permissionMode },
1967
2146
  {
1968
2147
  cwd,
2148
+ gsdPhase,
1969
2149
  reasoning: options?.reasoning,
1970
2150
  canUseTool: canUseToolFallback,
1971
2151
  ...(uiContext