@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.8e6112e9

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 (631) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  15. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  16. package/dist/resources/extensions/async-jobs/index.js +65 -0
  17. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  18. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  19. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  20. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  21. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  23. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  24. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  25. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  26. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  27. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  28. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  29. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  31. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  33. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  34. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  35. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  36. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  37. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  38. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  39. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  40. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  42. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  43. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  44. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  45. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  46. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  47. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  48. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  49. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  50. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  51. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  52. package/dist/resources/extensions/gsd/auto.js +52 -2
  53. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  54. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  55. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  56. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  57. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
  58. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  59. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  62. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  63. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  64. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  65. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  66. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  67. package/dist/resources/extensions/gsd/constants.js +0 -2
  68. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  69. package/dist/resources/extensions/gsd/db/engine.js +5 -3
  70. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  71. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  72. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  73. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  74. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  75. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  76. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  77. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  78. package/dist/resources/extensions/gsd/files.js +33 -19
  79. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  80. package/dist/resources/extensions/gsd/gsd-db.js +11 -8
  81. package/dist/resources/extensions/gsd/guidance.js +60 -0
  82. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  83. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  84. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  85. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  86. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  87. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  88. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  89. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  90. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  91. package/dist/resources/extensions/gsd/notifications.js +12 -7
  92. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  93. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  94. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  95. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  96. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  107. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  108. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  111. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  112. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  113. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  114. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  115. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  116. package/dist/resources/extensions/gsd/state.js +11 -2
  117. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  118. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  119. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  120. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  121. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  122. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  123. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  124. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  125. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  126. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  127. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  128. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  129. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  132. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  133. package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
  134. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  135. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  136. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  137. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  138. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  139. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  140. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  141. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  142. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  143. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  144. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  145. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  146. package/dist/resources/extensions/gsd/worktree.js +8 -1
  147. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  148. package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
  149. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  150. package/dist/resources/shared/package-manager-detection.js +1 -1
  151. package/dist/resources/shared/package.json +3 -0
  152. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  153. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  154. package/dist/runtime-checks.d.ts +10 -0
  155. package/dist/runtime-checks.js +27 -0
  156. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  157. package/dist/update-check.d.ts +2 -0
  158. package/dist/update-check.js +24 -1
  159. package/dist/update-cmd.js +20 -3
  160. package/dist/web/standalone/.next/BUILD_ID +1 -1
  161. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  162. package/dist/web/standalone/.next/build-manifest.json +3 -3
  163. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  164. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/index.html +1 -1
  184. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  191. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  192. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  195. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  196. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  197. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  198. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  199. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  200. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  201. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  202. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  203. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  204. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  205. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  206. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  207. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  208. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  209. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  210. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  211. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  212. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  213. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  214. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  215. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  216. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  217. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  218. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  219. package/package.json +3 -3
  220. package/packages/cloud-mcp-gateway/package.json +2 -2
  221. package/packages/contracts/dist/rpc.d.ts +1 -0
  222. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  223. package/packages/contracts/dist/rpc.js.map +1 -1
  224. package/packages/contracts/package.json +1 -1
  225. package/packages/daemon/package.json +4 -4
  226. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  227. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  228. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  229. package/packages/gsd-agent-core/package.json +5 -5
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  250. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  263. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/package.json +7 -7
  265. package/packages/mcp-server/README.md +12 -3
  266. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  267. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  268. package/packages/mcp-server/dist/cli-runner.js +137 -0
  269. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  270. package/packages/mcp-server/dist/cli.js +2 -53
  271. package/packages/mcp-server/dist/cli.js.map +1 -1
  272. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  273. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  275. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  276. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  277. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/pid-registry.js +452 -0
  279. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  280. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  281. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  282. package/packages/mcp-server/dist/probe-mode.js +10 -0
  283. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  284. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  285. package/packages/mcp-server/dist/server.js +4 -0
  286. package/packages/mcp-server/dist/server.js.map +1 -1
  287. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  288. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  289. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  290. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  291. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  292. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  293. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  294. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  295. package/packages/mcp-server/package.json +5 -4
  296. package/packages/native/package.json +1 -1
  297. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  298. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  299. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  302. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  303. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  304. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  305. package/packages/pi-agent-core/dist/index.js +3 -0
  306. package/packages/pi-agent-core/dist/index.js.map +1 -1
  307. package/packages/pi-agent-core/package.json +1 -1
  308. package/packages/pi-ai/README.md +1 -0
  309. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  310. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  311. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  312. package/packages/pi-ai/dist/index.d.ts +2 -0
  313. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/index.js +2 -0
  315. package/packages/pi-ai/dist/index.js.map +1 -1
  316. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  317. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/models.generated.js +460 -261
  319. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  322. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  323. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  324. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  326. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  327. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  329. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  330. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  331. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  332. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  333. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  334. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  336. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  337. package/packages/pi-ai/package.json +3 -2
  338. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  339. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  341. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  344. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  346. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  348. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  350. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  352. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  354. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/index.js +1 -1
  356. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  359. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  361. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  363. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  364. package/packages/pi-coding-agent/package.json +7 -7
  365. package/packages/pi-tui/dist/index.d.ts +1 -1
  366. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  367. package/packages/pi-tui/dist/index.js +1 -1
  368. package/packages/pi-tui/dist/index.js.map +1 -1
  369. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  370. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/terminal-image.js +54 -2
  372. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  373. package/packages/pi-tui/dist/tui.d.ts +8 -0
  374. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  375. package/packages/pi-tui/dist/tui.js +63 -18
  376. package/packages/pi-tui/dist/tui.js.map +1 -1
  377. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  378. package/packages/pi-tui/dist/utils.js +110 -36
  379. package/packages/pi-tui/dist/utils.js.map +1 -1
  380. package/packages/pi-tui/package.json +2 -2
  381. package/packages/rpc-client/package.json +2 -2
  382. package/pkg/dist/theme/theme.d.ts.map +1 -1
  383. package/pkg/dist/theme/theme.js +45 -17
  384. package/pkg/dist/theme/theme.js.map +1 -1
  385. package/pkg/package.json +1 -1
  386. package/src/resources/GSD-WORKFLOW.md +5 -4
  387. package/src/resources/extensions/ask-user-questions.ts +7 -2
  388. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  389. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  390. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  391. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  392. package/src/resources/extensions/async-jobs/index.ts +79 -0
  393. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  394. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  395. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  396. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  397. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  398. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  399. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  400. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  401. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  402. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  403. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  404. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  405. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  406. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  407. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  408. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  409. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  410. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  411. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  412. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  413. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  414. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  415. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  416. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  417. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  418. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  419. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  420. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  421. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  422. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  423. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  424. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  425. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  426. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  427. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  428. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  429. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  430. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  431. package/src/resources/extensions/gsd/auto.ts +64 -2
  432. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  433. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  434. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  435. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  436. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
  437. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  440. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  441. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  442. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  443. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  444. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  445. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  446. package/src/resources/extensions/gsd/constants.ts +0 -3
  447. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  448. package/src/resources/extensions/gsd/db/engine.ts +5 -3
  449. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  450. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  451. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  452. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  453. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  454. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  455. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  456. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  457. package/src/resources/extensions/gsd/files.ts +33 -12
  458. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  459. package/src/resources/extensions/gsd/gsd-db.ts +13 -10
  460. package/src/resources/extensions/gsd/guidance.ts +78 -0
  461. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  462. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  463. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  464. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  465. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  466. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  467. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  468. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  469. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  470. package/src/resources/extensions/gsd/notifications.ts +13 -6
  471. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  472. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  473. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  474. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  475. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  476. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  477. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  478. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  479. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  483. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  484. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  485. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  486. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  487. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  488. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  489. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  490. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  492. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  493. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  494. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  495. package/src/resources/extensions/gsd/state.ts +12 -1
  496. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  498. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  499. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  500. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  501. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  503. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  504. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  505. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  506. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  507. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  508. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  509. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  510. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  511. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  512. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  513. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  514. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  515. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  516. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  517. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  518. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  519. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  520. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  521. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  522. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  523. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  525. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  526. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  527. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  528. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  529. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  530. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  531. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  532. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  533. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  534. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  535. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  536. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  537. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  538. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  540. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  541. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  542. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  543. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  544. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  545. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  546. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  547. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  549. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  551. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  552. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  554. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  556. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  557. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  558. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  559. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  560. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  561. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  562. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  563. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  564. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +45 -2
  565. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  566. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  567. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  568. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  569. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  570. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  571. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  572. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  573. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  575. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  576. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  577. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  578. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  579. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  580. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  582. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  583. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  584. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  585. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  587. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  588. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  589. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  590. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  591. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  592. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  593. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  594. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  595. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  596. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  597. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  598. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  599. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  600. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  601. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  602. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  603. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  604. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  605. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  606. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  607. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  608. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  609. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  610. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  611. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  612. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  613. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  614. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  615. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  616. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  617. package/src/resources/extensions/gsd/worktree.ts +7 -1
  618. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  619. package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
  620. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  621. package/src/resources/shared/package-manager-detection.ts +1 -1
  622. package/src/resources/shared/package.json +3 -0
  623. package/src/resources/skills/create-skill/SKILL.md +3 -0
  624. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  625. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  626. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  627. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  628. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  629. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  630. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  631. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -1,8 +1,13 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
3
- import { join } from "node:path";
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFileSync, existsSync } from "node:fs";
4
3
  import { atomicWriteSync } from "./atomic-write.js";
5
4
  import { withFileLockSync } from "./file-lock.js";
5
+ import {
6
+ appendWorkflowEvent,
7
+ workflowEventArchivePath,
8
+ workflowEventLogPath,
9
+ type WorkflowEventInput,
10
+ } from "./workflow-event-ledger.js";
6
11
  import { logWarning } from "./workflow-logger.js";
7
12
 
8
13
  // ─── Session ID ───────────────────────────────────────────────────────────
@@ -40,22 +45,9 @@ export interface WorkflowEvent {
40
45
  */
41
46
  export function appendEvent(
42
47
  basePath: string,
43
- event: Omit<WorkflowEvent, "hash" | "session_id"> & { actor_name?: string; trigger_reason?: string },
48
+ event: WorkflowEventInput,
44
49
  ): void {
45
- const hash = createHash("sha256")
46
- .update(JSON.stringify({ cmd: event.cmd, params: event.params }))
47
- .digest("hex")
48
- .slice(0, 16);
49
-
50
- const fullEvent: WorkflowEvent = {
51
- v: 2,
52
- ...event,
53
- hash,
54
- session_id: ENGINE_SESSION_ID,
55
- };
56
- const dir = join(basePath, ".gsd");
57
- mkdirSync(dir, { recursive: true });
58
- appendFileSync(join(dir, "event-log.jsonl"), JSON.stringify(fullEvent) + "\n", "utf-8");
50
+ appendWorkflowEvent(basePath, event, ENGINE_SESSION_ID);
59
51
  }
60
52
 
61
53
  // ─── readEvents ──────────────────────────────────────────────────────────
@@ -125,8 +117,8 @@ export function compactMilestoneEvents(
125
117
  basePath: string,
126
118
  milestoneId: string,
127
119
  ): { archived: number } {
128
- const logPath = join(basePath, ".gsd", "event-log.jsonl");
129
- const archivePath = join(basePath, ".gsd", `event-log-${milestoneId}.jsonl.archived`);
120
+ const logPath = workflowEventLogPath(basePath);
121
+ const archivePath = workflowEventArchivePath(basePath, milestoneId);
130
122
 
131
123
  return withFileLockSync(logPath, () => {
132
124
  const allEvents = readEvents(logPath);
@@ -4,6 +4,7 @@ import {
4
4
  type EnsureProjectWorkflowMcpConfigResult,
5
5
  ensureProjectWorkflowMcpConfig,
6
6
  } from "./mcp-project-config.js";
7
+ import { warmWorkflowMcpProbeInBackground } from "./workflow-mcp-readiness-cache.js";
7
8
  import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
8
9
 
9
10
  interface WorkflowMcpAutoPrepContext {
@@ -75,6 +76,7 @@ export function prepareWorkflowMcpForProject(
75
76
  if (result.status !== "unchanged") {
76
77
  prepCtx.ui?.notify?.(`GSD MCP Server Prepared at ${result.configPath}`, "info");
77
78
  }
79
+ warmWorkflowMcpProbeInBackground(projectRoot);
78
80
  return result;
79
81
  } catch (err) {
80
82
  prepCtx.ui?.notify?.(
@@ -0,0 +1,150 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Share recent workflow MCP probe results across guided-flow and Claude Code SDK preflight.
3
+
4
+ import { testMcpServerConnection } from "../mcp-client/manager.js";
5
+ import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
6
+ import {
7
+ detectWorkflowMcpLaunchConfig,
8
+ resolveWorkflowMcpProjectRoot,
9
+ } from "./workflow-mcp.js";
10
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
11
+
12
+ /** Reuse a recent successful probe instead of spawning another stdio server. */
13
+ export const WORKFLOW_MCP_PROBE_CACHE_TTL_MS = 120_000;
14
+ /** Per-probe connect + tools/list budget (server typically ready in ~1–2s). */
15
+ export const WORKFLOW_MCP_PROBE_TIMEOUT_MS = 5_000;
16
+
17
+ export interface WorkflowMcpProbeCacheEntry {
18
+ serverName: string;
19
+ tools: readonly string[];
20
+ probedAt: number;
21
+ }
22
+
23
+ type WorkflowMcpProbeResult = {
24
+ ok: boolean;
25
+ tools: readonly string[];
26
+ serverName?: string;
27
+ error?: string;
28
+ };
29
+
30
+ const cacheByProject = new Map<string, WorkflowMcpProbeCacheEntry>();
31
+ const probeInFlightByProject = new Map<string, Promise<WorkflowMcpProbeResult>>();
32
+ let activeWorkflowMcpSdkSessions = 0;
33
+
34
+ function cacheKey(projectRoot: string): string {
35
+ return resolveWorkflowMcpProjectRoot(projectRoot);
36
+ }
37
+
38
+ export function beginWorkflowMcpSdkSession(): void {
39
+ activeWorkflowMcpSdkSessions++;
40
+ }
41
+
42
+ export function endWorkflowMcpSdkSession(): void {
43
+ activeWorkflowMcpSdkSessions = Math.max(0, activeWorkflowMcpSdkSessions - 1);
44
+ }
45
+
46
+ export function getCachedWorkflowMcpProbe(projectRoot: string): WorkflowMcpProbeCacheEntry | null {
47
+ const entry = cacheByProject.get(cacheKey(projectRoot));
48
+ if (!entry) return null;
49
+ if (Date.now() - entry.probedAt > WORKFLOW_MCP_PROBE_CACHE_TTL_MS) {
50
+ cacheByProject.delete(cacheKey(projectRoot));
51
+ return null;
52
+ }
53
+ return entry;
54
+ }
55
+
56
+ export function recordWorkflowMcpProbe(
57
+ projectRoot: string,
58
+ serverName: string,
59
+ tools: readonly string[],
60
+ ): void {
61
+ cacheByProject.set(cacheKey(projectRoot), {
62
+ serverName,
63
+ tools: [...tools],
64
+ probedAt: Date.now(),
65
+ });
66
+ }
67
+
68
+ export function clearWorkflowMcpProbeCache(projectRoot?: string): void {
69
+ if (projectRoot === undefined) {
70
+ cacheByProject.clear();
71
+ probeInFlightByProject.clear();
72
+ activeWorkflowMcpSdkSessions = 0;
73
+ return;
74
+ }
75
+ const key = cacheKey(projectRoot);
76
+ cacheByProject.delete(key);
77
+ probeInFlightByProject.delete(key);
78
+ }
79
+
80
+ export function workflowMcpProbeAdvertisesSurface(tools: readonly string[]): boolean {
81
+ return tools.some((tool) => isWorkflowToolSurfaceName(tool));
82
+ }
83
+
84
+ export function cachedWorkflowMcpCoversRequired(
85
+ projectRoot: string,
86
+ serverName: string,
87
+ required: readonly string[],
88
+ ): boolean {
89
+ const entry = getCachedWorkflowMcpProbe(projectRoot);
90
+ if (!entry || entry.serverName !== serverName) return false;
91
+ return required.every((tool) =>
92
+ entry.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
93
+ );
94
+ }
95
+
96
+ async function runProbeAndCacheWorkflowMcp(
97
+ projectRoot: string,
98
+ options: { timeoutMs?: number } = {},
99
+ ): Promise<WorkflowMcpProbeResult> {
100
+ const root = cacheKey(projectRoot);
101
+ const launch = detectWorkflowMcpLaunchConfig(root);
102
+ const serverName = launch?.name ?? "gsd-workflow";
103
+
104
+ const cached = getCachedWorkflowMcpProbe(projectRoot);
105
+ if (cached && workflowMcpProbeAdvertisesSurface(cached.tools)) {
106
+ return { ok: true, tools: cached.tools, serverName: cached.serverName };
107
+ }
108
+
109
+ const result = await testMcpServerConnection(serverName, {
110
+ projectDir: root,
111
+ timeoutMs: options.timeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS,
112
+ });
113
+ if (result.ok && workflowMcpProbeAdvertisesSurface(result.tools)) {
114
+ recordWorkflowMcpProbe(projectRoot, serverName, result.tools);
115
+ }
116
+ return {
117
+ ok: result.ok,
118
+ tools: result.tools,
119
+ serverName,
120
+ error: result.error,
121
+ };
122
+ }
123
+
124
+ export async function probeAndCacheWorkflowMcp(
125
+ projectRoot: string,
126
+ options: { timeoutMs?: number } = {},
127
+ ): Promise<WorkflowMcpProbeResult> {
128
+ const key = cacheKey(projectRoot);
129
+ const inFlight = probeInFlightByProject.get(key);
130
+ if (inFlight) return inFlight;
131
+
132
+ const promise = runProbeAndCacheWorkflowMcp(projectRoot, options).finally(() => {
133
+ probeInFlightByProject.delete(key);
134
+ });
135
+ probeInFlightByProject.set(key, promise);
136
+ return promise;
137
+ }
138
+
139
+ /** Fire-and-forget probe so /gsd dispatch often hits a warm cache. */
140
+ export function warmWorkflowMcpProbeInBackground(projectRoot: string): void {
141
+ if (activeWorkflowMcpSdkSessions > 0) return;
142
+
143
+ const key = cacheKey(projectRoot);
144
+ if (getCachedWorkflowMcpProbe(projectRoot)) return;
145
+ if (probeInFlightByProject.has(key)) return;
146
+
147
+ void probeAndCacheWorkflowMcp(projectRoot).catch(() => {
148
+ // Background warm is best-effort.
149
+ });
150
+ }
@@ -3,6 +3,16 @@ import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
3
3
  import { logWarning, logError } from "./workflow-logger.js";
4
4
  import { readEvents, findForkPoint, getSessionId } from "./workflow-events.js";
5
5
  import type { WorkflowEvent } from "./workflow-events.js";
6
+ import {
7
+ normalizeWorkflowEventCommand,
8
+ workflowEventEntityKey,
9
+ } from "./workflow-event-vocabulary.js";
10
+ import {
11
+ readWorktreeEventLogPath,
12
+ workflowEventLogPath,
13
+ writeWorkflowEventLog,
14
+ writeWorktreeEventLog,
15
+ } from "./workflow-event-ledger.js";
6
16
  import {
7
17
  transaction,
8
18
  updateTaskStatus,
@@ -82,14 +92,11 @@ function replayEvents(events: WorkflowEvent[]): void {
82
92
  transaction(() => {
83
93
  for (const event of events) {
84
94
  const p = event.params;
85
- // Normalize cmd format: completion tools write hyphens ("complete-task"),
86
- // legacy logs use underscores ("complete_task"). Accept both formats.
87
- // Type guard: malformed event lines with non-string cmd are skipped.
88
- if (typeof event.cmd !== "string") {
95
+ const cmd = normalizeWorkflowEventCommand(event.cmd);
96
+ if (!cmd) {
89
97
  logWarning("reconcile", `Event with non-string cmd skipped: ${JSON.stringify(event.cmd)}`);
90
98
  continue;
91
99
  }
92
- const cmd = event.cmd.replace(/-/g, "_");
93
100
  switch (cmd) {
94
101
  case "complete_task": {
95
102
  const milestoneId = p["milestoneId"] as string;
@@ -235,48 +242,7 @@ function replayEvents(events: WorkflowEvent[]): void {
235
242
  export function extractEntityKey(
236
243
  event: WorkflowEvent,
237
244
  ): { type: string; id: string } | null {
238
- const p = event.params;
239
- // Normalize cmd format: accept both hyphens and underscores
240
- if (typeof event.cmd !== "string") return null;
241
- const cmd = event.cmd.replace(/-/g, "_");
242
-
243
- switch (cmd) {
244
- case "complete_task":
245
- case "start_task":
246
- case "skip_task":
247
- case "report_blocker":
248
- case "record_verification":
249
- case "plan_task":
250
- return typeof p["taskId"] === "string"
251
- ? { type: "task", id: p["taskId"] }
252
- : null;
253
-
254
- case "complete_slice":
255
- case "replan_slice":
256
- return typeof p["sliceId"] === "string"
257
- ? { type: "slice", id: p["sliceId"] }
258
- : null;
259
-
260
- case "plan_slice":
261
- return typeof p["sliceId"] === "string"
262
- ? { type: "slice_plan", id: p["sliceId"] }
263
- : null;
264
-
265
- case "complete_milestone":
266
- case "plan_milestone":
267
- return typeof p["milestoneId"] === "string"
268
- ? { type: "milestone", id: p["milestoneId"] }
269
- : null;
270
-
271
- case "save_decision":
272
- if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
273
- return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
274
- }
275
- return null;
276
-
277
- default:
278
- return null;
279
- }
245
+ return workflowEventEntityKey(event);
280
246
  }
281
247
 
282
248
  // ─── detectConflicts ──────────────────────────────────────────────────────────
@@ -360,13 +326,6 @@ function rewriteDivergedEventsForEntity(
360
326
  return rewritten;
361
327
  }
362
328
 
363
- function writeEventLog(basePath: string, events: WorkflowEvent[]): void {
364
- const dir = join(basePath, ".gsd");
365
- mkdirSync(dir, { recursive: true });
366
- const content = events.map((e) => JSON.stringify(e)).join("\n") + (events.length > 0 ? "\n" : "");
367
- atomicWriteSync(join(dir, "event-log.jsonl"), content);
368
- }
369
-
370
329
  // ─── writeConflictsFile ───────────────────────────────────────────────────────
371
330
 
372
331
  /**
@@ -450,12 +409,18 @@ function _reconcileWorktreeLogsInner(
450
409
  worktreeBasePath: string,
451
410
  ): ReconcileResult {
452
411
  // Step 1: Read both logs
453
- const mainLogPath = join(mainBasePath, ".gsd", "event-log.jsonl");
454
- const wtLogPath = join(worktreeBasePath, ".gsd", "event-log.jsonl");
412
+ const mainLogPath = workflowEventLogPath(mainBasePath);
413
+ const wtLogPath = readWorktreeEventLogPath(worktreeBasePath);
455
414
 
456
415
  const mainEvents = readEvents(mainLogPath);
457
416
  const wtEvents = readEvents(wtLogPath);
458
417
 
418
+ // Canonical worktree appends are already durable in the project ledger.
419
+ // Empty/missing worktree shards are legacy-only absence, not divergence.
420
+ if (wtEvents.length === 0) {
421
+ return { autoMerged: 0, conflicts: [] };
422
+ }
423
+
459
424
  // Step 2: Find fork point
460
425
  const forkPoint = findForkPoint(mainEvents, wtEvents);
461
426
 
@@ -495,9 +460,7 @@ function _reconcileWorktreeLogsInner(
495
460
 
496
461
  const baseEvents = mainEvents.slice(0, forkPoint + 1);
497
462
  const mergedLog = baseEvents.concat(merged);
498
- const logContent = mergedLog.map((e) => JSON.stringify(e)).join("\n") + (mergedLog.length > 0 ? "\n" : "");
499
- mkdirSync(join(mainBasePath, ".gsd"), { recursive: true });
500
- atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
463
+ writeWorkflowEventLog(mainBasePath, mergedLog);
501
464
 
502
465
  // Step 8: Replay into DB (wrapped in a transaction by replayEvents)
503
466
  openWorkflowDatabasePath(resolveGsdPathContract(mainBasePath).projectDb);
@@ -636,8 +599,8 @@ export function resolveConflict(
636
599
  const conflict = conflicts[idx]!;
637
600
  const eventsToReplay = pick === "main" ? conflict.mainSideEvents : conflict.worktreeSideEvents;
638
601
 
639
- const mainLogPath = join(basePath, ".gsd", "event-log.jsonl");
640
- const wtLogPath = join(worktreeBasePath, ".gsd", "event-log.jsonl");
602
+ const mainLogPath = workflowEventLogPath(basePath);
603
+ const wtLogPath = readWorktreeEventLogPath(worktreeBasePath);
641
604
  const mainEvents = readEvents(mainLogPath);
642
605
  const wtEvents = readEvents(wtLogPath);
643
606
  const forkPoint = findForkPoint(mainEvents, wtEvents);
@@ -652,7 +615,11 @@ export function resolveConflict(
652
615
 
653
616
  const targetBasePath = pick === "main" ? worktreeBasePath : basePath;
654
617
  const targetBaseEvents = pick === "main" ? wtBaseEvents : mainBaseEvents;
655
- writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
618
+ if (pick === "main") {
619
+ writeWorktreeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
620
+ } else {
621
+ writeWorkflowEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
622
+ }
656
623
 
657
624
  // Replay resolved events through the DB (updates DB state)
658
625
  openWorkflowDatabasePath(resolveGsdPathContract(basePath).projectDb);
@@ -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);
@@ -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) {
@@ -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
  });
@@ -55,6 +55,24 @@ 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
+
58
76
  function isRecord(value: unknown): value is Record<string, unknown> {
59
77
  return !!value && typeof value === "object" && !Array.isArray(value);
60
78
  }
@@ -86,7 +104,8 @@ function resolvePathGsdBrowserVersion(env: NodeJS.ProcessEnv): string | null {
86
104
  if (cachedPathProbeVersion !== undefined) return cachedPathProbeVersion;
87
105
 
88
106
  try {
89
- cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
107
+ const invocation = buildPathGsdBrowserVersionInvocation(process.platform);
108
+ cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync(invocation.command, invocation.args, {
90
109
  encoding: "utf-8",
91
110
  env,
92
111
  stdio: ["ignore", "pipe", "ignore"],
@@ -216,7 +235,8 @@ export function resolveGsdBrowserMcpLaunchConfig(
216
235
  const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
217
236
  const explicitArgs = parseJsonEnv<unknown>(env, "GSD_BROWSER_MCP_ARGS");
218
237
  const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_BROWSER_MCP_ENV");
219
- const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
238
+ const explicitCommandLine = env.GSD_BROWSER_MCP_COMMAND?.trim();
239
+ const [explicitCommand, ...explicitCommandArgs] = explicitCommandLine ? splitCommandLine(explicitCommandLine) : [];
220
240
  const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
221
241
  const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
222
242
  const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
@@ -228,6 +248,10 @@ export function resolveGsdBrowserMcpLaunchConfig(
228
248
  // profile/cookies persist across pi sessions for the same project. gsd-browser
229
249
  // rejects --identity-scope unless --identity-key is also supplied.
230
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);
231
255
  const command =
232
256
  explicitCommand
233
257
  || explicitCliPath
@@ -237,6 +261,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
237
261
  const args = Array.isArray(explicitArgs) && explicitArgs.length > 0
238
262
  ? explicitArgs.map(String)
239
263
  : [
264
+ ...explicitCommandArgs,
240
265
  ...(bundledCliPath ? [bundledCliPath] : []),
241
266
  "mcp",
242
267
  "--session",
@@ -246,7 +271,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
246
271
  "--identity-key",
247
272
  identityKey,
248
273
  "--identity-project",
249
- resolvedProjectRoot,
274
+ identityProject,
250
275
  ];
251
276
  const cwd = env.GSD_BROWSER_MCP_CWD?.trim() || resolvedProjectRoot;
252
277
 
@@ -260,3 +285,29 @@ export function resolveGsdBrowserMcpLaunchConfig(
260
285
  sessionName,
261
286
  };
262
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
+ }