@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75

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 (726) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
  33. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  34. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  35. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  36. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  37. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  38. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  40. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  41. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  42. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  43. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  44. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  45. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  46. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  47. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  48. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  49. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  50. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  51. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  52. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  53. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  54. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  55. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  56. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  57. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  58. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  59. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  60. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  61. package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
  62. package/dist/resources/extensions/gsd/auto.js +56 -15
  63. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  64. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  65. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  66. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  67. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  68. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  69. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  70. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  71. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  72. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  73. package/dist/resources/extensions/gsd/captures.js +4 -6
  74. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  75. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  76. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  77. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  78. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  79. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  80. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  81. package/dist/resources/extensions/gsd/constants.js +0 -2
  82. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  83. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  84. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  85. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  86. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  87. package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
  88. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  89. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  90. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  91. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  92. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  93. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  94. package/dist/resources/extensions/gsd/files.js +33 -19
  95. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  96. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  97. package/dist/resources/extensions/gsd/guidance.js +158 -0
  98. package/dist/resources/extensions/gsd/guided-flow.js +110 -6
  99. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  100. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  101. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  102. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  103. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  104. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  105. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  106. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  107. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  108. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  109. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  110. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  111. package/dist/resources/extensions/gsd/notifications.js +12 -7
  112. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  113. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  114. package/dist/resources/extensions/gsd/paths.js +27 -0
  115. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  116. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  117. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  118. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  119. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  120. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  122. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  125. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  126. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  128. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  129. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  130. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  131. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  132. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  133. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  134. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  135. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  136. package/dist/resources/extensions/gsd/publication.js +87 -0
  137. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  138. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  139. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  140. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  141. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  142. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  143. package/dist/resources/extensions/gsd/state.js +12 -22
  144. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  145. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  148. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  150. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  151. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  153. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  158. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  159. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  160. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  173. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  174. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  175. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  176. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  177. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  178. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  179. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  180. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  187. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  188. package/dist/resources/shared/package-manager-detection.js +1 -1
  189. package/dist/resources/shared/package.json +3 -0
  190. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  191. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  192. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  193. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  195. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  196. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  197. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  198. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  199. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  200. package/dist/runtime-checks.d.ts +10 -0
  201. package/dist/runtime-checks.js +27 -0
  202. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  203. package/dist/update-check.d.ts +2 -0
  204. package/dist/update-check.js +24 -1
  205. package/dist/update-cmd.js +20 -3
  206. package/dist/web/standalone/.next/BUILD_ID +1 -1
  207. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  208. package/dist/web/standalone/.next/build-manifest.json +3 -3
  209. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  210. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  225. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  226. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  227. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/index.html +1 -1
  230. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  237. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  238. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  239. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  242. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  243. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  245. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  246. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  247. package/dist/web/standalone/package.json +1 -1
  248. package/dist/worktree-cli.js +3 -6
  249. package/dist/worktree-status-banner.js +7 -15
  250. package/package.json +3 -3
  251. package/packages/cloud-mcp-gateway/package.json +2 -2
  252. package/packages/contracts/dist/rpc.d.ts +1 -0
  253. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  254. package/packages/contracts/dist/rpc.js.map +1 -1
  255. package/packages/contracts/dist/workflow.d.ts +4 -0
  256. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  257. package/packages/contracts/dist/workflow.js.map +1 -1
  258. package/packages/contracts/package.json +1 -1
  259. package/packages/daemon/package.json +4 -4
  260. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  261. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  262. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  263. package/packages/gsd-agent-core/package.json +5 -5
  264. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  266. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  271. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  275. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  278. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  280. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  291. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  297. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  298. package/packages/gsd-agent-modes/package.json +7 -7
  299. package/packages/mcp-server/README.md +12 -3
  300. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  301. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/cli-runner.js +137 -0
  303. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  304. package/packages/mcp-server/dist/cli.js +2 -50
  305. package/packages/mcp-server/dist/cli.js.map +1 -1
  306. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  310. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  311. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  312. package/packages/mcp-server/dist/pid-registry.js +452 -0
  313. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  314. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  315. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  316. package/packages/mcp-server/dist/probe-mode.js +10 -0
  317. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  318. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  319. package/packages/mcp-server/dist/server.js +4 -0
  320. package/packages/mcp-server/dist/server.js.map +1 -1
  321. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  322. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  323. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  324. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  325. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  326. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  327. package/packages/mcp-server/dist/workflow-tools.js +178 -82
  328. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  329. package/packages/mcp-server/package.json +5 -4
  330. package/packages/native/package.json +1 -1
  331. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  332. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  333. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  334. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  335. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  336. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  337. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  338. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  339. package/packages/pi-agent-core/dist/index.js +3 -0
  340. package/packages/pi-agent-core/dist/index.js.map +1 -1
  341. package/packages/pi-agent-core/package.json +1 -1
  342. package/packages/pi-ai/README.md +1 -0
  343. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  344. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  345. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  346. package/packages/pi-ai/dist/index.d.ts +2 -0
  347. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  348. package/packages/pi-ai/dist/index.js +2 -0
  349. package/packages/pi-ai/dist/index.js.map +1 -1
  350. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  351. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/models.generated.js +46 -120
  353. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  356. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  357. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  358. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  360. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  361. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  362. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  363. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  364. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  365. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  366. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  367. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  368. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  369. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  370. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  371. package/packages/pi-ai/package.json +3 -2
  372. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  373. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  375. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  378. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  380. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  382. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  384. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  386. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  388. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/index.js +1 -1
  390. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  393. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  395. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  397. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  398. package/packages/pi-coding-agent/package.json +7 -7
  399. package/packages/pi-tui/dist/index.d.ts +1 -1
  400. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  401. package/packages/pi-tui/dist/index.js +1 -1
  402. package/packages/pi-tui/dist/index.js.map +1 -1
  403. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  404. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  405. package/packages/pi-tui/dist/terminal-image.js +54 -2
  406. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  407. package/packages/pi-tui/dist/tui.d.ts +8 -0
  408. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  409. package/packages/pi-tui/dist/tui.js +72 -18
  410. package/packages/pi-tui/dist/tui.js.map +1 -1
  411. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  412. package/packages/pi-tui/dist/utils.js +110 -36
  413. package/packages/pi-tui/dist/utils.js.map +1 -1
  414. package/packages/pi-tui/package.json +2 -2
  415. package/packages/rpc-client/package.json +2 -2
  416. package/pkg/dist/theme/theme.d.ts.map +1 -1
  417. package/pkg/dist/theme/theme.js +45 -17
  418. package/pkg/dist/theme/theme.js.map +1 -1
  419. package/pkg/package.json +1 -1
  420. package/src/resources/GSD-WORKFLOW.md +5 -4
  421. package/src/resources/extensions/ask-user-questions.ts +7 -2
  422. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  423. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  424. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  425. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  426. package/src/resources/extensions/async-jobs/index.ts +79 -0
  427. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  428. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  429. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  430. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  431. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  432. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  433. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  434. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  435. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  436. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  437. package/src/resources/extensions/browser-tools/index.ts +71 -13
  438. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  439. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  440. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  441. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
  442. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  443. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  444. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  445. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  446. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  447. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  448. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  449. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  450. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  451. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  452. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  453. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  454. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  455. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  456. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  457. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  458. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  459. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  460. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  461. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  462. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  463. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  464. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  465. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  466. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  467. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  468. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  469. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  470. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  471. package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
  472. package/src/resources/extensions/gsd/auto.ts +72 -17
  473. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  474. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  475. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  476. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  477. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  478. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  479. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  480. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  481. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  482. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  483. package/src/resources/extensions/gsd/captures.ts +4 -6
  484. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  485. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  486. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  487. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  488. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  489. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  490. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  491. package/src/resources/extensions/gsd/constants.ts +0 -3
  492. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  493. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  494. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  495. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  496. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  497. package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
  498. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  499. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  500. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  501. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  502. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  503. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  504. package/src/resources/extensions/gsd/files.ts +33 -12
  505. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  506. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  507. package/src/resources/extensions/gsd/guidance.ts +217 -0
  508. package/src/resources/extensions/gsd/guided-flow.ts +161 -26
  509. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  510. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  511. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  512. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  513. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  514. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  515. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  516. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  517. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  518. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  519. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  520. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  521. package/src/resources/extensions/gsd/notifications.ts +13 -6
  522. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  523. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  524. package/src/resources/extensions/gsd/paths.ts +33 -0
  525. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  526. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  527. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  528. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  529. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  530. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  531. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  532. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  533. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  534. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  535. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  536. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  537. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  538. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  539. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  540. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  541. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  542. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  543. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  544. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  545. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  546. package/src/resources/extensions/gsd/publication.ts +122 -0
  547. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  548. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  549. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  550. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  551. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  552. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  553. package/src/resources/extensions/gsd/state.ts +16 -22
  554. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  555. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  556. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  557. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  558. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  559. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  560. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  561. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  562. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  563. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  564. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  565. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  566. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  567. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  568. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  569. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  570. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  571. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  572. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  573. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  574. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  575. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  576. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  577. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  578. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  579. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  580. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  581. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  582. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  583. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  584. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  585. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  586. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  587. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  588. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  589. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  591. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  592. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  593. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  594. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  595. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  596. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  597. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  598. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
  599. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  600. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  601. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  602. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  603. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  605. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  606. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  607. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  609. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  610. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  611. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  612. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  613. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  614. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  615. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  616. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  617. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  618. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  619. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  620. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  621. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  622. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  624. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  625. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  626. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  627. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  628. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  629. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  630. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  632. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  633. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  634. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  635. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  636. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  637. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  638. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  639. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  640. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  641. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  642. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  643. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  644. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  645. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  646. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  647. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  648. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  649. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  650. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  651. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  652. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  653. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  654. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  655. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  656. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  657. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  658. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  659. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  660. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  661. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  662. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  663. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  664. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  665. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  666. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  667. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  668. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  669. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  670. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  671. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  672. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  673. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  674. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  675. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  676. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  677. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  678. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  679. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  680. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  681. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  682. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  683. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  684. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  685. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  686. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  687. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  688. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  689. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  690. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  691. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  692. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  693. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  694. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  695. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  696. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  697. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  698. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  699. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  700. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  701. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  702. package/src/resources/extensions/gsd/worktree.ts +7 -1
  703. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  704. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  705. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  706. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  707. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  708. package/src/resources/shared/package-manager-detection.ts +1 -1
  709. package/src/resources/shared/package.json +3 -0
  710. package/src/resources/skills/create-skill/SKILL.md +3 -0
  711. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  712. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  713. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  714. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  715. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  716. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  717. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  718. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  719. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  720. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  721. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  722. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  723. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  724. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  725. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
  726. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
@@ -28,7 +28,7 @@ export const WORKFLOW_TOOL_ALIAS_PAIRS: readonly WorkflowToolAliasPair[] =
28
28
  export const WORKFLOW_TOOL_ALIAS_TO_CANONICAL: Readonly<Record<string, string>> =
29
29
  Object.fromEntries(WORKFLOW_TOOL_ALIAS_PAIRS.map(({ alias, canonical }) => [alias, canonical]));
30
30
 
31
- const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
31
+ export const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
32
32
  "gsd_cancel",
33
33
  "gsd_captures",
34
34
  "ask_user_questions",
@@ -45,6 +45,9 @@ const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
45
45
  "gsd_status",
46
46
  ] as const;
47
47
 
48
+ /** Session-orchestration tools exposed by the workflow MCP adapter alongside the contract tools. */
49
+ export type WorkflowMcpAdapterToolName = (typeof WORKFLOW_MCP_ADAPTER_TOOL_NAMES)[number];
50
+
48
51
  export const WORKFLOW_TOOL_SURFACE_NAMES = [
49
52
  ...WORKFLOW_MCP_ADAPTER_TOOL_NAMES,
50
53
  ...DB_WORKFLOW_TOOL_NAMES,
@@ -8,8 +8,9 @@
8
8
  * git operations during worktree transitions:
9
9
  *
10
10
  * - `checkoutBranchWithStashGuard` — branch switch with stash protection,
11
- * including the stash-pop EEXIST collision recovery for `.gsd/` runtime
12
- * files (force-checkout + targeted stash drop).
11
+ * including the stash-pop EEXIST collision recovery for untracked files
12
+ * (force-checkout + targeted stash drop; #645 broadened it beyond `.gsd/`,
13
+ * guarded by "no non-.gsd unmerged entries remain").
13
14
  * - `removeMergeStateFiles` — clears SQUASH_MSG / MERGE_HEAD / etc. left by
14
15
  * a failed merge so subsequent merges don't fail on stale state.
15
16
  * - `cleanupConflictState` — merge-abort + index reset + state-file cleanup
@@ -257,23 +258,28 @@ export function checkoutBranchWithStashGuard(
257
258
  : "";
258
259
  const stashPopMessage = `${stderrText}\n${msg}`.trim();
259
260
  const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
260
- const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
261
- const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
262
261
  const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
263
262
  const stashRefForDrop = stashRefFromError(popErr);
264
- const nonGsdUnmerged = nativeConflictFiles(basePath).filter((f) => !f.startsWith(".gsd/"));
263
+ const allConflictFiles = nativeConflictFiles(basePath);
264
+ const nonGsdUnmerged = allConflictFiles.filter((f) => !f.startsWith(".gsd/"));
265
+ const gsdUnmerged = allConflictFiles.filter((f) => f.startsWith(".gsd/"));
265
266
  const gsdContentConflicts = isUntrackedRestoreFailure
266
267
  ? gsdJsonlFilesWithConflictMarkers(basePath)
267
268
  : [];
268
- const gsdConflictFiles = [...new Set([...gsdAlreadyExists, ...gsdContentConflicts])];
269
+ // Resolve ALL untracked-collision files by accepting HEAD — files in
270
+ // alreadyExists were untracked on the source branch by definition of the
271
+ // "already exists, no checkout" failure, so target HEAD is authoritative.
272
+ // gsdUnmerged: .gsd/ index conflicts left by the partial stash pop are
273
+ // also resolved via HEAD — .gsd/ runtime state is always authoritative
274
+ // on the target branch, so accepting HEAD is safe here too.
275
+ const resolvable = [...new Set([...alreadyExists, ...gsdContentConflicts, ...gsdUnmerged])];
269
276
 
270
277
  if (
271
278
  isUntrackedRestoreFailure &&
272
- gsdConflictFiles.length > 0 &&
273
- nonGsdAlreadyExists.length === 0 &&
279
+ resolvable.length > 0 &&
274
280
  nonGsdUnmerged.length === 0
275
281
  ) {
276
- for (const f of gsdConflictFiles) {
282
+ for (const f of resolvable) {
277
283
  execFileSync("git", ["checkout", "HEAD", "--", f], {
278
284
  cwd: basePath,
279
285
  stdio: ["ignore", "pipe", "pipe"],
@@ -47,6 +47,7 @@ import {
47
47
  // callers — production wiring previously injected them via deps; the seam
48
48
  // added type churn without enabling test variation.
49
49
  import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
50
+ import { isolationDegradedFallbackGuidance, worktreeCreationFailedGuidance } from "./guidance.js";
50
51
  import { invalidateAllCaches } from "./cache.js";
51
52
  import { resolveMilestoneFile } from "./paths.js";
52
53
  import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
@@ -693,10 +694,7 @@ export function _enterMilestoneCore(
693
694
  s.basePath = basePath;
694
695
  rebuildGitService(s, deps);
695
696
  invalidateAllCaches();
696
- ctx.notify(
697
- `Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
698
- "warning",
699
- );
697
+ ctx.notify(isolationDegradedFallbackGuidance(milestoneId), "warning");
700
698
  return { ok: true, mode: "branch", path: basePath };
701
699
  } catch (err) {
702
700
  debugLog("WorktreeLifecycle", {
@@ -883,10 +881,7 @@ export function _enterMilestoneCore(
883
881
  eventType: "worktree-create-failed",
884
882
  data: { milestoneId, error: msg, fallback: "project-root" },
885
883
  });
886
- ctx.notify(
887
- `Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`,
888
- "warning",
889
- );
884
+ ctx.notify(worktreeCreationFailedGuidance(milestoneId, msg), "warning");
890
885
  // Degrade isolation for the rest of this session so mergeAndExit
891
886
  // doesn't try to merge a nonexistent worktree branch (#2483)
892
887
  s.isolationDegraded = true;
@@ -656,7 +656,12 @@ export function removeWorktree(
656
656
  const resolvedPathSafe = isInsideWorktreesDir(basePath, resolvedWtPath);
657
657
 
658
658
  // If we're inside the worktree, move out first — git can't remove an in-use directory
659
- const cwd = process.cwd();
659
+ let cwd: string;
660
+ try {
661
+ cwd = process.cwd();
662
+ } catch {
663
+ cwd = basePath;
664
+ }
660
665
  const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
661
666
  if (resolvedCwd === resolvedWtPath || resolvedCwd.startsWith(resolvedWtPath + sep)) {
662
667
  process.chdir(basePath);
@@ -69,6 +69,18 @@ export function isGsdWorktreePath(path: string): boolean {
69
69
  return findWorktreeSegment(path.replaceAll("\\", "/")) !== null;
70
70
  }
71
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
+
72
84
  /**
73
85
  * When a milestone worktree lives under the external-state layout
74
86
  * (`<gsdHome>/projects/<hash>/worktrees/<MID>/`, or the `GSD_STATE_DIR`
@@ -218,52 +218,54 @@ export function createWorktreeSafetyModule(
218
218
  }
219
219
 
220
220
  let registered: readonly RegisteredWorktree[] | undefined;
221
- try {
222
- registered = deps.listRegisteredWorktrees?.(projectRoot);
223
- } catch (error) {
224
- return failure(
225
- "worktree-git-probe-failed",
226
- `Unable to list registered worktrees for project root ${projectRoot}.`,
227
- "Recover or recreate the milestone worktree before dispatching the source-writing Unit.",
228
- { projectRoot, error: errorMessage(error) },
229
- );
230
- }
231
- if (registered && !registered.some((worktree) => samePath(worktree.path, unitRoot))) {
232
- const wasPreviouslyTracked = unregisteredRecoveryFailed.has(unitRoot);
233
- let attemptedPrune = false;
221
+ if (isolationMode === "worktree") {
222
+ try {
223
+ registered = deps.listRegisteredWorktrees?.(projectRoot);
224
+ } catch (error) {
225
+ return failure(
226
+ "worktree-git-probe-failed",
227
+ `Unable to list registered worktrees for project root ${projectRoot}.`,
228
+ "Recover or recreate the milestone worktree before dispatching the source-writing Unit.",
229
+ { projectRoot, error: errorMessage(error) },
230
+ );
231
+ }
232
+ if (registered && !registered.some((worktree) => samePath(worktree.path, unitRoot))) {
233
+ const wasPreviouslyTracked = unregisteredRecoveryFailed.has(unitRoot);
234
+ let attemptedPrune = false;
234
235
 
235
- if (!wasPreviouslyTracked && deps.pruneRegisteredWorktrees) {
236
- attemptedPrune = true;
237
- try {
238
- deps.pruneRegisteredWorktrees(projectRoot);
239
- const rechecked = deps.listRegisteredWorktrees?.(projectRoot);
240
- if (rechecked?.some((worktree) => samePath(worktree.path, unitRoot))) {
241
- unregisteredRecoveryFailed.delete(unitRoot);
242
- registered = rechecked;
243
- } else {
236
+ if (!wasPreviouslyTracked && deps.pruneRegisteredWorktrees) {
237
+ attemptedPrune = true;
238
+ try {
239
+ deps.pruneRegisteredWorktrees(projectRoot);
240
+ const rechecked = deps.listRegisteredWorktrees?.(projectRoot);
241
+ if (rechecked?.some((worktree) => samePath(worktree.path, unitRoot))) {
242
+ unregisteredRecoveryFailed.delete(unitRoot);
243
+ registered = rechecked;
244
+ } else {
245
+ unregisteredRecoveryFailed.add(unitRoot);
246
+ }
247
+ } catch (error) {
244
248
  unregisteredRecoveryFailed.add(unitRoot);
249
+ return failure(
250
+ "worktree-git-probe-failed",
251
+ `Unable to recover unregistered worktree root ${unitRoot}.`,
252
+ "Run 'git worktree prune', then recreate or re-register the milestone worktree before dispatching the source-writing Unit.",
253
+ { projectRoot, unitRoot, error: errorMessage(error) },
254
+ );
245
255
  }
246
- } catch (error) {
247
- unregisteredRecoveryFailed.add(unitRoot);
256
+ }
257
+
258
+ if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
248
259
  return failure(
249
- "worktree-git-probe-failed",
250
- `Unable to recover unregistered worktree root ${unitRoot}.`,
251
- "Run 'git worktree prune', then recreate the milestone worktree before dispatching the source-writing Unit.",
252
- { projectRoot, unitRoot, error: errorMessage(error) },
260
+ "worktree-unregistered",
261
+ `Worktree root ${unitRoot} is not registered with git worktree list.`,
262
+ attemptedPrune || wasPreviouslyTracked
263
+ ? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
264
+ : "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.",
265
+ { unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) },
253
266
  );
254
267
  }
255
268
  }
256
-
257
- if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
258
- return failure(
259
- "worktree-unregistered",
260
- `Worktree root ${unitRoot} is not registered with git worktree list.`,
261
- attemptedPrune || wasPreviouslyTracked
262
- ? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
263
- : "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.",
264
- { unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) },
265
- );
266
- }
267
269
  }
268
270
 
269
271
  if (input.emptyWorktreeWithProjectContent) {
@@ -1,5 +1,5 @@
1
1
  // GSD worktree session state
2
- import { findWorktreeSegment } from "./worktree-root.js";
2
+ import { findWorktreeSegment, projectRootFromWorktreePath } from "./worktree-root.js";
3
3
 
4
4
  let originalCwd: string | null = null;
5
5
 
@@ -17,10 +17,8 @@ export function clearWorktreeOriginalCwd(): void {
17
17
 
18
18
  export function ensureWorktreeOriginalCwdFromPath(cwd: string = process.cwd()): string | null {
19
19
  if (originalCwd) return originalCwd;
20
- const segment = findWorktreeSegment(cwd.replaceAll("\\", "/"));
21
- if (segment) {
22
- originalCwd = cwd.slice(0, segment.gsdIdx);
23
- }
20
+ const root = projectRootFromWorktreePath(cwd);
21
+ if (root) originalCwd = root;
24
22
  return originalCwd;
25
23
  }
26
24
 
@@ -224,7 +224,13 @@ export function resolveGitHeadPath(dir: string): string | null {
224
224
  */
225
225
  export function nudgeGitBranchCache(previousCwd: string): void {
226
226
  const now = new Date();
227
- for (const dir of [previousCwd, process.cwd()]) {
227
+ let currentCwd: string | null = null;
228
+ try {
229
+ currentCwd = process.cwd();
230
+ } catch {
231
+ currentCwd = null;
232
+ }
233
+ for (const dir of [previousCwd, currentCwd].filter((dir): dir is string => Boolean(dir))) {
228
234
  try {
229
235
  const headPath = resolveGitHeadPath(dir);
230
236
  if (headPath) utimesSync(headPath, now, now);
@@ -105,6 +105,9 @@ const CHILD_ENV_ALLOWLIST = new Set([
105
105
 
106
106
  const MCP_STDERR_MAX_BYTES = 4096;
107
107
 
108
+ /** Short-lived stdio probes must not register/kill production MCP PIDs (see probe-mode.ts). */
109
+ export const GSD_MCP_PROBE_ENV = "GSD_MCP_PROBE";
110
+
108
111
  let cachedStatus: ManagedMcpStatus | null = null;
109
112
  let cachedStatusKey = "";
110
113
 
@@ -385,7 +388,10 @@ export async function testMcpServerConnection(
385
388
  transport = new StdioClientTransport({
386
389
  command: config.command ?? "",
387
390
  args: config.args,
388
- env: buildMcpChildEnv(config.env),
391
+ env: {
392
+ ...buildMcpChildEnv(config.env),
393
+ [GSD_MCP_PROBE_ENV]: "1",
394
+ },
389
395
  cwd: config.cwd,
390
396
  stderr: "pipe",
391
397
  });
@@ -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
+ }