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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +8 -3
  34. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  35. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  36. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  37. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
  38. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  39. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  40. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  41. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  42. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  43. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  44. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  45. package/dist/resources/extensions/gsd/auto.js +15 -20
  46. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  47. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  48. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  49. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  50. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  51. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  52. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  53. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  54. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  55. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  56. package/dist/resources/extensions/gsd/captures.js +5 -15
  57. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  65. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  66. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  67. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  68. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  69. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  70. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  71. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  72. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  73. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  74. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  75. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  76. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  77. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  78. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  79. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  80. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  81. package/dist/resources/extensions/gsd/files.js +33 -19
  82. package/dist/resources/extensions/gsd/git-service.js +1 -0
  83. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  84. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  85. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +158 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  88. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  89. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  90. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  91. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  92. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  93. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  94. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  95. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  96. package/dist/resources/extensions/gsd/model-router.js +3 -0
  97. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  98. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  99. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  100. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  101. package/dist/resources/extensions/gsd/paths.js +37 -24
  102. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  103. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  104. package/dist/resources/extensions/gsd/preferences.js +14 -0
  105. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  106. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  110. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  116. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  117. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  118. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  119. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  120. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  121. package/dist/resources/extensions/gsd/state.js +6 -20
  122. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  123. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  124. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  125. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  126. package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  129. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  130. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  131. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  132. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  133. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  134. package/dist/resources/extensions/gsd/undo.js +8 -7
  135. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  136. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  137. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  138. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  139. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  140. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  141. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  142. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  143. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  144. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  145. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  146. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  147. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  148. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  149. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  150. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  151. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  152. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  153. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  154. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  155. package/dist/resources/shared/package-manager-detection.js +1 -1
  156. package/dist/resources/shared/package.json +3 -0
  157. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  158. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  159. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  160. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  161. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  162. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  163. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  164. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  165. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  166. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  167. package/dist/update-check.d.ts +2 -0
  168. package/dist/update-check.js +24 -1
  169. package/dist/update-cmd.js +20 -3
  170. package/dist/web/standalone/.next/BUILD_ID +1 -1
  171. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  172. package/dist/web/standalone/.next/build-manifest.json +3 -3
  173. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  174. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/index.html +1 -1
  228. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  229. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  235. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  236. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  237. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  238. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  241. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  242. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  243. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  245. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  246. package/dist/web/standalone/package.json +1 -1
  247. package/dist/worktree-cli.js +3 -6
  248. package/dist/worktree-status-banner.js +7 -11
  249. package/package.json +1 -1
  250. package/packages/cloud-mcp-gateway/package.json +2 -2
  251. package/packages/contracts/dist/rpc.d.ts +1 -0
  252. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  253. package/packages/contracts/dist/rpc.js.map +1 -1
  254. package/packages/contracts/dist/workflow.d.ts +4 -0
  255. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/package.json +4 -4
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  261. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/cli.js +6 -3
  281. package/packages/mcp-server/dist/cli.js.map +1 -1
  282. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  283. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  284. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  285. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  286. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/server.js +4 -0
  288. package/packages/mcp-server/dist/server.js.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  290. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  292. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  293. package/packages/mcp-server/package.json +5 -4
  294. package/packages/native/package.json +1 -1
  295. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  296. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  297. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  298. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  299. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/index.js +3 -0
  302. package/packages/pi-agent-core/dist/index.js.map +1 -1
  303. package/packages/pi-agent-core/package.json +1 -1
  304. package/packages/pi-ai/README.md +1 -0
  305. package/packages/pi-ai/dist/index.d.ts +2 -0
  306. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  307. package/packages/pi-ai/dist/index.js +2 -0
  308. package/packages/pi-ai/dist/index.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +166 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  315. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  317. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  319. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  322. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  323. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  324. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  326. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  327. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  329. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  330. package/packages/pi-ai/package.json +3 -2
  331. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  332. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  334. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  337. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  340. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  342. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  344. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/index.js +1 -1
  348. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  350. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  352. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  353. package/packages/pi-coding-agent/package.json +7 -7
  354. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  355. package/packages/pi-tui/dist/tui.js +9 -0
  356. package/packages/pi-tui/dist/tui.js.map +1 -1
  357. package/packages/pi-tui/package.json +2 -2
  358. package/packages/rpc-client/package.json +2 -2
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  362. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  363. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  364. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  365. package/src/resources/extensions/async-jobs/index.ts +79 -0
  366. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  367. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  368. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  369. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  370. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  371. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  372. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  373. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  374. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  375. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  376. package/src/resources/extensions/browser-tools/index.ts +71 -13
  377. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  378. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  379. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  380. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  383. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  384. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  385. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  387. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  388. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  389. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  390. package/src/resources/extensions/gsd/auto/phases.ts +12 -3
  391. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  392. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  393. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  394. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
  395. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  396. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  397. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  398. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  399. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  400. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  401. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  402. package/src/resources/extensions/gsd/auto.ts +28 -24
  403. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  404. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  405. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  406. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  407. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  409. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  410. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  411. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  412. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  413. package/src/resources/extensions/gsd/captures.ts +5 -16
  414. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  415. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  416. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  417. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  418. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  419. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  420. package/src/resources/extensions/gsd/constants.ts +0 -3
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  431. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  432. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  433. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  434. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  435. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  436. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  437. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  438. package/src/resources/extensions/gsd/files.ts +33 -12
  439. package/src/resources/extensions/gsd/git-service.ts +1 -0
  440. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  441. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  442. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  443. package/src/resources/extensions/gsd/guidance.ts +217 -0
  444. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  445. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  446. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  447. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  448. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  449. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  450. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  451. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  452. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  453. package/src/resources/extensions/gsd/model-router.ts +3 -0
  454. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  455. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  456. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  458. package/src/resources/extensions/gsd/paths.ts +42 -22
  459. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  460. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  461. package/src/resources/extensions/gsd/preferences.ts +18 -0
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  464. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  467. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  468. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  469. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  470. package/src/resources/extensions/gsd/publication.ts +122 -0
  471. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  472. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  473. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  474. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  475. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  476. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  477. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  478. package/src/resources/extensions/gsd/state.ts +9 -21
  479. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  480. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  481. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  482. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  483. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  484. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  485. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  486. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  487. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  488. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  489. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  490. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  491. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  492. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  493. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  494. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  495. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  496. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  497. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  498. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  499. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  500. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  501. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  502. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  503. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  504. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  505. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  506. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  507. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  508. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  509. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  510. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  511. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  512. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  513. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  514. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  515. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  516. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  517. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  518. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  519. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  520. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  521. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  522. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  523. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  524. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  525. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  526. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  527. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  528. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  529. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  530. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  531. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  532. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  533. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  534. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  535. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  536. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  537. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  538. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  539. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  540. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  541. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  542. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  543. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  544. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  545. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  546. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  547. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  549. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  550. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  551. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  552. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  553. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  554. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  555. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  556. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  557. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  558. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  559. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  560. package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
  561. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  562. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  563. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  564. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  565. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  566. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  567. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  568. package/src/resources/extensions/gsd/undo.ts +9 -8
  569. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  570. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  571. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  572. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  573. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  574. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  575. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  576. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  577. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  578. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  579. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  580. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  581. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  582. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  583. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  584. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  585. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  586. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  587. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  588. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  589. package/src/resources/shared/package-manager-detection.ts +1 -1
  590. package/src/resources/shared/package.json +3 -0
  591. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  592. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  593. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  594. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  595. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  596. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  597. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  598. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  599. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  600. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  601. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  602. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  603. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
  604. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Worktree Placement module — owns WHERE GSD worktrees physically live.
3
+ *
4
+ * Canonical placement: `<projectRoot>/.gsd-worktrees/<name>` — a real
5
+ * directory that never crosses the `.gsd` symlink managed by repo-identity.
6
+ * Under the external-state layout (`.gsd → ~/.gsd/projects/<hash>/`), the
7
+ * legacy `.gsd/worktrees/` location materialised worktrees inside the user's
8
+ * home directory behind an opaque hash path; the canonical sibling keeps the
9
+ * working copy at the project root regardless of where `.gsd` state lives.
10
+ *
11
+ * Legacy placement (`<projectRoot>/.gsd/worktrees/<name>`, possibly resolving
12
+ * through the symlink to `~/.gsd/projects/<hash>/worktrees/<name>`) stays
13
+ * recognized so in-flight milestones keep working across upgrades:
14
+ * - creation always uses the canonical location;
15
+ * - resolution prefers an existing legacy worktree for the same name;
16
+ * - containment checks accept membership in either location.
17
+ *
18
+ * Path → project identification lives in worktree-root.ts; this module owns
19
+ * only the forward direction (project + name → physical path).
20
+ */
21
+
22
+ import { existsSync } from "node:fs";
23
+ import { join } from "node:path";
24
+
25
+ /** Directory name of the canonical worktrees container at the project root. */
26
+ export const CANONICAL_WORKTREES_DIRNAME = ".gsd-worktrees";
27
+
28
+ /** Canonical container for newly created worktrees. Never crosses the `.gsd` symlink. */
29
+ export function canonicalWorktreesDir(projectRoot: string): string {
30
+ return join(projectRoot, CANONICAL_WORKTREES_DIRNAME);
31
+ }
32
+
33
+ /** Legacy container (`.gsd/worktrees/`) — may resolve through the external-state symlink. */
34
+ export function legacyWorktreesDir(projectRoot: string): string {
35
+ return join(projectRoot, ".gsd", "worktrees");
36
+ }
37
+
38
+ /**
39
+ * All containers a GSD worktree may live in, canonical first.
40
+ * Use for listing, scanning, and containment checks.
41
+ */
42
+ export function worktreesDirs(projectRoot: string): string[] {
43
+ return [canonicalWorktreesDir(projectRoot), legacyWorktreesDir(projectRoot)];
44
+ }
45
+
46
+ /**
47
+ * Physical path for the worktree `name` under `projectRoot`.
48
+ *
49
+ * Canonical wins only when it has a `.git` marker (i.e. is a live worktree).
50
+ * A bare directory with no `.git` — a stale leftover from an aborted create
51
+ * or a partial cleanup — does not shadow an existing legacy worktree, so the
52
+ * legacy path is tried next. The legacy check remains a plain existsSync;
53
+ * callers that need a *registered* worktree validate the `.git` marker
54
+ * themselves (resolveCanonicalMilestoneRoot, getAutoWorktreePath).
55
+ * Falls back to canonical for new-worktree creation when neither path exists.
56
+ */
57
+ export function worktreePathFor(projectRoot: string, name: string): string {
58
+ const canonical = join(canonicalWorktreesDir(projectRoot), name);
59
+ if (existsSync(canonical) && existsSync(join(canonical, ".git"))) return canonical;
60
+ const legacy = join(legacyWorktreesDir(projectRoot), name);
61
+ if (existsSync(legacy)) return legacy;
62
+ return canonical;
63
+ }
@@ -10,7 +10,7 @@ import { readdirSync } from "node:fs";
10
10
 
11
11
  import { enterAutoWorktree, getAutoWorktreePath } from "./auto-worktree.js";
12
12
  import { getIsolationMode } from "./preferences.js";
13
- import { worktreesDir } from "./worktree-manager.js";
13
+ import { allWorktreesDirs } from "./worktree-manager.js";
14
14
  import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
15
15
 
16
16
  interface LiveWorktree {
@@ -19,15 +19,18 @@ interface LiveWorktree {
19
19
  }
20
20
 
21
21
  /**
22
- * Enumerate the live (valid git) auto-worktrees under <projectRoot>/.gsd/worktrees/.
22
+ * Enumerate the live (valid git) auto-worktrees in the project's worktree
23
+ * containers (canonical .gsd-worktrees/ and legacy .gsd/worktrees/).
23
24
  * Reuses getAutoWorktreePath's validation so stray directories are ignored.
24
25
  */
25
26
  function liveMilestoneWorktrees(projectRoot: string): LiveWorktree[] {
26
- let names: string[];
27
- try {
28
- names = readdirSync(worktreesDir(projectRoot));
29
- } catch {
30
- return [];
27
+ const names = new Set<string>();
28
+ for (const dir of allWorktreesDirs(projectRoot)) {
29
+ try {
30
+ for (const name of readdirSync(dir)) names.add(name);
31
+ } catch {
32
+ // container absent — skip
33
+ }
31
34
  }
32
35
  const live: LiveWorktree[] = [];
33
36
  for (const id of names) {
@@ -20,10 +20,17 @@ export function normalizeWorktreePathForCompare(path: string): string {
20
20
  }
21
21
 
22
22
  /**
23
- * Find the GSD worktree segment in both direct project layout and the
24
- * symlink-resolved external-state layout used by ~/.gsd/projects/<hash>.
23
+ * Find the GSD worktree segment in the canonical layout (.gsd-worktrees/),
24
+ * the legacy direct layout (.gsd/worktrees/), and the symlink-resolved
25
+ * external-state layout used by ~/.gsd/projects/<hash>.
25
26
  */
26
27
  export function findWorktreeSegment(normalizedPath: string): WorktreeSegment | null {
28
+ const canonicalMarker = "/.gsd-worktrees/";
29
+ const canonicalIdx = normalizedPath.indexOf(canonicalMarker);
30
+ if (canonicalIdx !== -1) {
31
+ return { gsdIdx: canonicalIdx, afterWorktrees: canonicalIdx + canonicalMarker.length };
32
+ }
33
+
27
34
  const directMarker = "/.gsd/worktrees/";
28
35
  const directIdx = normalizedPath.indexOf(directMarker);
29
36
  if (directIdx !== -1) {
@@ -62,6 +69,18 @@ export function isGsdWorktreePath(path: string): boolean {
62
69
  return findWorktreeSegment(path.replaceAll("\\", "/")) !== null;
63
70
  }
64
71
 
72
+ /**
73
+ * Project-root prefix of a GSD worktree path, or null when the path is not
74
+ * inside a recognized worktree layout. Pure string split — no env handling,
75
+ * HOME guard, or filesystem fallbacks (resolveWorktreeProjectRoot adds
76
+ * those). Separator normalization is 1:1 on characters, so the prefix is
77
+ * sliced from the ORIGINAL string and keeps its separators.
78
+ */
79
+ export function projectRootFromWorktreePath(path: string): string | null {
80
+ const segment = findWorktreeSegment(path.replaceAll("\\", "/"));
81
+ return segment ? path.slice(0, segment.gsdIdx) : null;
82
+ }
83
+
65
84
  /**
66
85
  * When a milestone worktree lives under the external-state layout
67
86
  * (`<gsdHome>/projects/<hash>/worktrees/<MID>/`, or the `GSD_STATE_DIR`
@@ -72,7 +91,8 @@ export function isGsdWorktreePath(path: string): boolean {
72
91
  export function resolveExternalStateProjectGsdFromWorktreePath(projectPath: string): string | null {
73
92
  const normalized = resolve(projectPath).replaceAll("\\", "/");
74
93
 
75
- // Direct layout — parent state is resolved via repoIdentity(git root).
94
+ // Canonical/direct layouts — parent state is resolved via repoIdentity(git root).
95
+ if (normalized.includes("/.gsd-worktrees/")) return null;
76
96
  if (normalized.includes("/.gsd/worktrees/") && !normalized.includes("/.gsd/projects/")) {
77
97
  return null;
78
98
  }
@@ -139,12 +159,15 @@ function resolveProjectRootFromPath(path: string): string {
139
159
  return resolveNearestBootstrappedGsdRoot(path) ?? resolveGitWorkingTreeRoot(path) ?? path;
140
160
  }
141
161
 
162
+ // Slice at the first `.gsd` boundary, but never past the worktree segment:
163
+ // in the canonical layout (`<root>/.gsd-worktrees/<MID>/.gsd/...`) the first
164
+ // `/.gsd/` occurrence is the worktree-local projection dir, not the project
165
+ // root's state dir.
142
166
  const sepChar = path.includes("\\") ? "\\" : "/";
143
167
  const gsdMarker = `${sepChar}.gsd${sepChar}`;
144
168
  const markerIdx = path.indexOf(gsdMarker);
145
- const candidate = markerIdx !== -1
146
- ? path.slice(0, markerIdx)
147
- : path.slice(0, segment.gsdIdx);
169
+ const sliceIdx = markerIdx !== -1 ? Math.min(markerIdx, segment.gsdIdx) : segment.gsdIdx;
170
+ const candidate = path.slice(0, sliceIdx);
148
171
 
149
172
  const gsdHomeNorm = normalizeWorktreePathForCompare(gsdHome());
150
173
  const candidateGsdPath = normalizeWorktreePathForCompare(join(candidate, ".gsd"));
@@ -6,6 +6,7 @@ import { execFileSync } from "node:child_process";
6
6
  import { join, resolve } from "node:path";
7
7
 
8
8
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
9
+ import { worktreesDirs } from "./worktree-placement.js";
9
10
  import { listWorktrees } from "./worktree-manager.js";
10
11
  import { getCurrentBranch } from "./worktree.js";
11
12
 
@@ -158,10 +159,12 @@ export function createWorktreeSafetyModule(
158
159
  const projectRoot = resolve(input.projectRoot);
159
160
  const unitRoot = resolve(input.unitRoot);
160
161
  const isolationMode = input.isolationMode ?? "worktree";
161
- const expectedRoot = isolationMode === "worktree"
162
- ? join(projectRoot, ".gsd", "worktrees", milestoneId)
163
- : projectRoot;
164
- if (!samePath(unitRoot, expectedRoot)) {
162
+ // A milestone worktree may live in the canonical container or the
163
+ // legacy one (pre-placement-change worktrees keep their location).
164
+ const expectedRoots = isolationMode === "worktree"
165
+ ? worktreesDirs(projectRoot).map((dir) => join(dir, milestoneId))
166
+ : [projectRoot];
167
+ if (!expectedRoots.some((expectedRoot) => samePath(unitRoot, expectedRoot))) {
165
168
  return failure(
166
169
  "invalid-root",
167
170
  isolationMode === "worktree"
@@ -170,7 +173,7 @@ export function createWorktreeSafetyModule(
170
173
  isolationMode === "worktree"
171
174
  ? "Prepare the Unit in its canonical milestone worktree before allowing source writes."
172
175
  : "Run the Unit from the project root when worktree isolation is disabled.",
173
- { expectedRoot, unitRoot },
176
+ { expectedRoot: expectedRoots[0], unitRoot },
174
177
  );
175
178
  }
176
179
 
@@ -1,4 +1,6 @@
1
1
  // GSD worktree session state
2
+ import { findWorktreeSegment, projectRootFromWorktreePath } from "./worktree-root.js";
3
+
2
4
  let originalCwd: string | null = null;
3
5
 
4
6
  export function getWorktreeOriginalCwd(): string | null {
@@ -15,21 +17,19 @@ export function clearWorktreeOriginalCwd(): void {
15
17
 
16
18
  export function ensureWorktreeOriginalCwdFromPath(cwd: string = process.cwd()): string | null {
17
19
  if (originalCwd) return originalCwd;
18
- const marker = `${/\\/.test(cwd) ? "\\" : "/"}.gsd${/\\/.test(cwd) ? "\\" : "/"}worktrees${/\\/.test(cwd) ? "\\" : "/"}`;
19
- const markerIdx = cwd.indexOf(marker);
20
- if (markerIdx !== -1) {
21
- originalCwd = cwd.slice(0, markerIdx);
22
- }
20
+ const root = projectRootFromWorktreePath(cwd);
21
+ if (root) originalCwd = root;
23
22
  return originalCwd;
24
23
  }
25
24
 
26
25
  export function getActiveWorktreeName(): string | null {
27
26
  if (!originalCwd) return null;
28
- const cwd = process.cwd();
29
- const wtDir = `${originalCwd.replace(/[\\/]+$/, "")}/.gsd/worktrees`.replaceAll("\\", "/");
30
- const normalizedCwd = cwd.replaceAll("\\", "/");
31
- if (!normalizedCwd.startsWith(`${wtDir}/`)) return null;
32
- const rel = normalizedCwd.slice(wtDir.length + 1);
33
- const name = rel.split("/")[0];
27
+ const normalizedCwd = process.cwd().replaceAll("\\", "/");
28
+ const normalizedOriginal = originalCwd.replace(/[\\/]+$/, "").replaceAll("\\", "/");
29
+ const segment = findWorktreeSegment(normalizedCwd);
30
+ if (!segment) return null;
31
+ // Only treat the cwd as an active worktree of OUR project root.
32
+ if (normalizedCwd.slice(0, segment.gsdIdx) !== normalizedOriginal) return null;
33
+ const name = normalizedCwd.slice(segment.afterWorktrees).split("/")[0];
34
34
  return name || null;
35
35
  }
@@ -243,9 +243,11 @@ export function registerNativeSearchHooks(pi: NativeSearchPI): { getIsAnthropic:
243
243
  // Anthropic-only tool never leaks into OpenAI Responses requests.
244
244
  isAnthropic = isAnthropicProvider && payloadLooksAnthropic !== false;
245
245
  } else {
246
- // Last resort: session-restore paths where the SDK doesn't pass model.
247
- // The model-name prefix is best-effort and assumes direct Anthropic.
248
- isAnthropic = payloadLooksAnthropic === true;
246
+ // No authoritative provider info available (no event.model, no model_select).
247
+ // Do NOT inject native web_search guessing on model name alone causes 400
248
+ // "unsupported_value" errors when the actual provider (copilot, openrouter,
249
+ // proxy, etc.) doesn't expose the server-side search tool (#648).
250
+ isAnthropic = false;
249
251
  }
250
252
  if (!isAnthropic) return;
251
253
 
@@ -0,0 +1,66 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Browser Automation Contract — the single source for the canonical
3
+ // Pi-facing browser tool vocabulary. Engine adapters (legacy Playwright, managed
4
+ // gsd-browser), UAT policy, dispatch preflight, and evidence detection all derive
5
+ // their browser tool knowledge from this module instead of re-listing names.
6
+
7
+ /**
8
+ * Canonical `browser_*` tool names of the Browser Automation Contract.
9
+ *
10
+ * These are the product-level names Units see regardless of which Browser
11
+ * Automation Engine serves them (ADR-024). Adding a capability here is the
12
+ * one-line vocabulary change; the engine adapters and presentation surfaces
13
+ * are typed against this list, so missing coverage fails typecheck.
14
+ */
15
+ export const BROWSER_CONTRACT_TOOL_NAMES = [
16
+ "browser_navigate",
17
+ "browser_click",
18
+ "browser_type",
19
+ "browser_fill_form",
20
+ "browser_click_ref",
21
+ "browser_fill_ref",
22
+ "browser_wait_for",
23
+ "browser_assert",
24
+ "browser_verify",
25
+ "browser_screenshot",
26
+ "browser_snapshot_refs",
27
+ "browser_find",
28
+ "browser_get_console_logs",
29
+ "browser_get_network_logs",
30
+ "browser_evaluate",
31
+ "browser_reload",
32
+ "browser_batch",
33
+ "browser_act",
34
+ ] as const;
35
+
36
+ export type BrowserContractToolName = (typeof BROWSER_CONTRACT_TOOL_NAMES)[number];
37
+
38
+ const BROWSER_CONTRACT_TOOL_NAME_SET: ReadonlySet<string> = new Set(BROWSER_CONTRACT_TOOL_NAMES);
39
+
40
+ export function isBrowserContractToolName(name: string): name is BrowserContractToolName {
41
+ return BROWSER_CONTRACT_TOOL_NAME_SET.has(name);
42
+ }
43
+
44
+ /**
45
+ * Whether a canonical (non-MCP-prefixed) tool name belongs to the browser tool
46
+ * family. Broader than the contract list on purpose: an External MCP Client or
47
+ * host integration may supply additional `browser_*` tools that still satisfy
48
+ * browser-backed UAT.
49
+ */
50
+ export function hasBrowserContractPrefix(canonicalToolName: string): boolean {
51
+ return canonicalToolName.startsWith("browser_");
52
+ }
53
+
54
+ /**
55
+ * Contract tool names whose appearance in prose marks browser-backed UAT
56
+ * activity (requirement or evidence language). Consumed by the
57
+ * browser-evidence regexes so textual detection stays derived from the
58
+ * contract vocabulary.
59
+ */
60
+ export const BROWSER_EVIDENCE_SIGNAL_TOOL_NAMES = [
61
+ "browser_assert",
62
+ "browser_batch",
63
+ "browser_find",
64
+ "browser_verify",
65
+ "browser_snapshot_refs",
66
+ ] as const satisfies readonly BrowserContractToolName[];
@@ -55,6 +55,32 @@ function parseGsdBrowserVersion(output: string): string | null {
55
55
  return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
56
56
  }
57
57
 
58
+ function splitCommandLine(commandLine: string): string[] {
59
+ const parts = commandLine.match(/(?:"[^"]*"|'[^']*'|[^\s"']+)/g) ?? [];
60
+ return parts.map((part) => {
61
+ const quote = part[0];
62
+ if ((quote === '"' || quote === "'") && part.endsWith(quote)) {
63
+ return part.slice(1, -1);
64
+ }
65
+ return part;
66
+ });
67
+ }
68
+
69
+ function buildPathGsdBrowserVersionInvocation(platform: NodeJS.Platform): { command: string; args: string[] } {
70
+ if (platform === "win32") {
71
+ return { command: "cmd", args: ["/d", "/s", "/c", "gsd-browser", "--version"] };
72
+ }
73
+ return { command: "gsd-browser", args: ["--version"] };
74
+ }
75
+
76
+ function isRecord(value: unknown): value is Record<string, unknown> {
77
+ return !!value && typeof value === "object" && !Array.isArray(value);
78
+ }
79
+
80
+ function resolveExplicitGsdBrowserCliPath(env: NodeJS.ProcessEnv): string | undefined {
81
+ return env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim() || undefined;
82
+ }
83
+
58
84
  function resolveBundledGsdBrowserPackageVersion(): string | null {
59
85
  try {
60
86
  const requireFromHere = createRequire(import.meta.url);
@@ -66,20 +92,29 @@ function resolveBundledGsdBrowserPackageVersion(): string | null {
66
92
  }
67
93
  }
68
94
 
95
+ // The `gsd-browser --version` subprocess result cannot change mid-session (the
96
+ // engine-switch guard forbids restarting with a different engine), and both the
97
+ // availability probe and the launch-config resolution ask for it at session
98
+ // start — memoize so the up-to-2s spawn happens once per process.
99
+ let cachedPathProbeVersion: string | null | undefined;
100
+
69
101
  function resolvePathGsdBrowserVersion(env: NodeJS.ProcessEnv): string | null {
70
102
  const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
71
103
  if (explicit) return parseGsdBrowserVersion(explicit);
104
+ if (cachedPathProbeVersion !== undefined) return cachedPathProbeVersion;
72
105
 
73
106
  try {
74
- return parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
107
+ const invocation = buildPathGsdBrowserVersionInvocation(process.platform);
108
+ cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync(invocation.command, invocation.args, {
75
109
  encoding: "utf-8",
76
110
  env,
77
111
  stdio: ["ignore", "pipe", "ignore"],
78
112
  timeout: 2000,
79
113
  }));
80
114
  } catch {
81
- return null;
115
+ cachedPathProbeVersion = null;
82
116
  }
117
+ return cachedPathProbeVersion;
83
118
  }
84
119
 
85
120
  function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
@@ -91,7 +126,7 @@ function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
91
126
  }
92
127
 
93
128
  export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process.env): string | null {
94
- const explicit = env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim();
129
+ const explicit = resolveExplicitGsdBrowserCliPath(env);
95
130
  if (explicit) return explicit;
96
131
 
97
132
  try {
@@ -115,6 +150,45 @@ export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process
115
150
  return null;
116
151
  }
117
152
 
153
+ export type GsdBrowserCliAvailability =
154
+ | { available: true; via: "explicit-env" | "bundled" | "path"; detail: string }
155
+ | { available: false; detail: string };
156
+
157
+ /**
158
+ * Cheap availability probe for the gsd-browser CLI: explicit env overrides,
159
+ * then the bundled @opengsd/gsd-browser binary (filesystem checks only), then
160
+ * a PATH lookup (one short subprocess, memoized). Used by Browser Automation
161
+ * Engine resolution to decide whether the managed engine is provable before
162
+ * preferring it over legacy Playwright. `via` names the provable source, not
163
+ * necessarily the launch source — resolveGsdBrowserMcpLaunchConfig may still
164
+ * prefer a newer PATH CLI over the bundled one.
165
+ */
166
+ export function resolveGsdBrowserCliAvailability(env: NodeJS.ProcessEnv = process.env): GsdBrowserCliAvailability {
167
+ const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
168
+ if (explicitCommand) {
169
+ return { available: true, via: "explicit-env", detail: `GSD_BROWSER_MCP_COMMAND=${explicitCommand}` };
170
+ }
171
+
172
+ const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
173
+ if (explicitCliPath) {
174
+ return existsSync(explicitCliPath)
175
+ ? { available: true, via: "explicit-env", detail: `CLI at ${explicitCliPath}` }
176
+ : { available: false, detail: `configured gsd-browser CLI path does not exist: ${explicitCliPath}` };
177
+ }
178
+
179
+ const bundledCliPath = resolveBundledGsdBrowserCliPath(env);
180
+ if (bundledCliPath) {
181
+ return { available: true, via: "bundled", detail: `bundled CLI at ${bundledCliPath}` };
182
+ }
183
+
184
+ const pathVersion = resolvePathGsdBrowserVersion(env);
185
+ if (pathVersion) {
186
+ return { available: true, via: "path", detail: `gsd-browser ${pathVersion} on PATH` };
187
+ }
188
+
189
+ return { available: false, detail: "no bundled or PATH gsd-browser CLI found" };
190
+ }
191
+
118
192
  export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string): string {
119
193
  const resolvedProjectRoot = resolve(projectRoot);
120
194
  const base = sanitizeSessionSegment(basename(resolvedProjectRoot)) || "project";
@@ -123,6 +197,35 @@ export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string)
123
197
  return cleanSuffix ? `gsd-${base}-${hash}-${cleanSuffix}` : `gsd-${base}-${hash}`;
124
198
  }
125
199
 
200
+ /**
201
+ * Recognize an MCP server config (from .mcp.json / Claude settings) as a
202
+ * gsd-browser server. Paired with resolveGsdBrowserMcpLaunchConfig: this module
203
+ * writes the config shape, so it also owns recognizing it. New launch shapes
204
+ * are taught here, in one place.
205
+ */
206
+ export function isGsdBrowserMcpServerConfig(config: unknown): boolean {
207
+ if (!isRecord(config)) return false;
208
+
209
+ const command = typeof config.command === "string" ? config.command : "";
210
+ if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
211
+ return true;
212
+ }
213
+
214
+ if (isRecord(config.env)) {
215
+ const env = config.env;
216
+ if (
217
+ typeof env.GSD_BROWSER_CLI_PATH === "string"
218
+ || typeof env.GSD_BROWSER_BIN_PATH === "string"
219
+ || typeof env.GSD_BROWSER_MCP_COMMAND === "string"
220
+ ) {
221
+ return true;
222
+ }
223
+ }
224
+
225
+ const args = Array.isArray(config.args) ? config.args.filter((arg): arg is string => typeof arg === "string") : [];
226
+ return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
227
+ }
228
+
126
229
  export function resolveGsdBrowserMcpLaunchConfig(
127
230
  projectRoot: string,
128
231
  env: NodeJS.ProcessEnv = process.env,
@@ -132,8 +235,9 @@ export function resolveGsdBrowserMcpLaunchConfig(
132
235
  const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
133
236
  const explicitArgs = parseJsonEnv<unknown>(env, "GSD_BROWSER_MCP_ARGS");
134
237
  const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_BROWSER_MCP_ENV");
135
- const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
136
- const explicitCliPath = env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim();
238
+ const explicitCommandLine = env.GSD_BROWSER_MCP_COMMAND?.trim();
239
+ const [explicitCommand, ...explicitCommandArgs] = explicitCommandLine ? splitCommandLine(explicitCommandLine) : [];
240
+ const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
137
241
  const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
138
242
  const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
139
243
  ? resolveBundledGsdBrowserCliPath(env)
@@ -144,6 +248,10 @@ export function resolveGsdBrowserMcpLaunchConfig(
144
248
  // profile/cookies persist across pi sessions for the same project. gsd-browser
145
249
  // rejects --identity-scope unless --identity-key is also supplied.
146
250
  const identityKey = env.GSD_BROWSER_IDENTITY_KEY?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
251
+ // identity-project must be a safe identifier (no path separators); full paths
252
+ // cause daemon startup to fail with "invalid name".
253
+ const identityProject =
254
+ env.GSD_BROWSER_IDENTITY_PROJECT?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
147
255
  const command =
148
256
  explicitCommand
149
257
  || explicitCliPath
@@ -153,6 +261,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
153
261
  const args = Array.isArray(explicitArgs) && explicitArgs.length > 0
154
262
  ? explicitArgs.map(String)
155
263
  : [
264
+ ...explicitCommandArgs,
156
265
  ...(bundledCliPath ? [bundledCliPath] : []),
157
266
  "mcp",
158
267
  "--session",
@@ -162,7 +271,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
162
271
  "--identity-key",
163
272
  identityKey,
164
273
  "--identity-project",
165
- resolvedProjectRoot,
274
+ identityProject,
166
275
  ];
167
276
  const cwd = env.GSD_BROWSER_MCP_CWD?.trim() || resolvedProjectRoot;
168
277
 
@@ -176,3 +285,29 @@ export function resolveGsdBrowserMcpLaunchConfig(
176
285
  sessionName,
177
286
  };
178
287
  }
288
+
289
+ /**
290
+ * CLI invocation that starts the gsd-browser session daemon with the same
291
+ * session and identity flags as {@link resolveGsdBrowserMcpLaunchConfig}, so
292
+ * browser UAT can warm Chrome/CDP before the first MCP navigation.
293
+ */
294
+ export function resolveGsdBrowserDaemonStartInvocation(
295
+ projectRoot: string,
296
+ env: NodeJS.ProcessEnv = process.env,
297
+ options: GsdBrowserMcpLaunchOptions = {},
298
+ ): Pick<GsdBrowserMcpLaunchConfig, "command" | "args" | "cwd" | "env"> {
299
+ const launch = resolveGsdBrowserMcpLaunchConfig(projectRoot, env, options);
300
+ const mcpIndex = launch.args.indexOf("mcp");
301
+ if (mcpIndex < 0) {
302
+ throw new Error("gsd-browser launch config is missing mcp subcommand");
303
+ }
304
+
305
+ const prefix = launch.args.slice(0, mcpIndex);
306
+ const sessionFlags = launch.args.slice(mcpIndex + 1);
307
+ return {
308
+ command: launch.command,
309
+ args: [...prefix, "daemon", "start", ...sessionFlags],
310
+ cwd: launch.cwd,
311
+ ...(launch.env ? { env: launch.env } : {}),
312
+ };
313
+ }