@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.9ad8ae33

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 (460) hide show
  1. package/dist/headless-events.js +7 -5
  2. package/dist/mcp-server.js +2 -1
  3. package/dist/resource-loader.d.ts +10 -5
  4. package/dist/resource-loader.js +121 -6
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +5 -4
  7. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  8. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  9. package/dist/resources/extensions/async-jobs/index.js +65 -0
  10. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  11. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  12. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  13. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  14. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  15. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  16. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  17. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  18. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  19. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  20. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  21. package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
  22. package/dist/resources/extensions/gsd/auto/phases.js +49 -6
  23. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  26. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  28. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  29. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  30. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  31. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  32. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  33. package/dist/resources/extensions/gsd/auto-worktree.js +14 -1
  34. package/dist/resources/extensions/gsd/auto.js +37 -1
  35. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  36. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  37. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
  38. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  39. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
  40. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  41. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  42. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  43. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  44. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  45. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  46. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  47. package/dist/resources/extensions/gsd/constants.js +0 -2
  48. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  49. package/dist/resources/extensions/gsd/db/queries.js +26 -0
  50. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  51. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  52. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  53. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  54. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  55. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  56. package/dist/resources/extensions/gsd/files.js +33 -19
  57. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  58. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  59. package/dist/resources/extensions/gsd/guidance.js +60 -0
  60. package/dist/resources/extensions/gsd/guided-flow.js +6 -3
  61. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  62. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  63. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  64. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  65. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  66. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  67. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  68. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  69. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  70. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  71. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  72. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  73. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  80. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  83. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  84. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  85. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  86. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  87. package/dist/resources/extensions/gsd/state.js +5 -0
  88. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  89. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  90. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  91. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  92. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  93. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  94. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  95. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  96. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  97. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  98. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  99. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  100. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  101. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  102. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  103. package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
  104. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  105. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  106. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  107. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  108. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  109. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  110. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  111. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  112. package/dist/resources/extensions/gsd/worktree.js +8 -1
  113. package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
  114. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  115. package/dist/resources/shared/package-manager-detection.js +1 -1
  116. package/dist/resources/shared/package.json +3 -0
  117. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  118. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  119. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  120. package/dist/update-check.d.ts +2 -0
  121. package/dist/update-check.js +24 -1
  122. package/dist/update-cmd.js +20 -3
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  125. package/dist/web/standalone/.next/build-manifest.json +3 -3
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/index.html +1 -1
  147. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  154. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  155. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  158. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  159. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  160. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  161. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  162. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  163. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  164. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  165. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  166. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  167. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  168. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  169. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  170. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  171. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  172. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  173. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  174. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  175. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  176. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  177. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  178. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  179. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  180. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  181. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  182. package/package.json +2 -2
  183. package/packages/cloud-mcp-gateway/package.json +2 -2
  184. package/packages/contracts/dist/rpc.d.ts +1 -0
  185. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  186. package/packages/contracts/dist/rpc.js.map +1 -1
  187. package/packages/contracts/package.json +1 -1
  188. package/packages/daemon/package.json +4 -4
  189. package/packages/gsd-agent-core/package.json +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  194. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  196. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  198. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  202. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  205. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  206. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  208. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  209. package/packages/gsd-agent-modes/package.json +7 -7
  210. package/packages/mcp-server/dist/cli.js +10 -5
  211. package/packages/mcp-server/dist/cli.js.map +1 -1
  212. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  213. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  214. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  215. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  216. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  217. package/packages/mcp-server/dist/server.js +4 -0
  218. package/packages/mcp-server/dist/server.js.map +1 -1
  219. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  220. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  221. package/packages/mcp-server/dist/workflow-tools.js +99 -38
  222. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  223. package/packages/mcp-server/package.json +5 -4
  224. package/packages/native/package.json +1 -1
  225. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  226. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  227. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  228. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  229. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  230. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  231. package/packages/pi-agent-core/dist/index.js +3 -0
  232. package/packages/pi-agent-core/dist/index.js.map +1 -1
  233. package/packages/pi-agent-core/package.json +1 -1
  234. package/packages/pi-ai/README.md +1 -0
  235. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  236. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  237. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  238. package/packages/pi-ai/dist/index.d.ts +2 -0
  239. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  240. package/packages/pi-ai/dist/index.js +2 -0
  241. package/packages/pi-ai/dist/index.js.map +1 -1
  242. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  243. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/models.generated.js +460 -261
  245. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  246. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  247. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  248. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  249. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  250. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  252. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  253. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  254. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  255. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  256. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  257. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  258. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  259. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  260. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  262. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  263. package/packages/pi-ai/package.json +3 -2
  264. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  265. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  267. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  270. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  272. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  274. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  276. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/index.js +1 -1
  278. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  280. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  282. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  283. package/packages/pi-coding-agent/package.json +7 -7
  284. package/packages/pi-tui/package.json +2 -2
  285. package/packages/rpc-client/package.json +2 -2
  286. package/pkg/package.json +1 -1
  287. package/src/resources/GSD-WORKFLOW.md +5 -4
  288. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  289. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  290. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  291. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  292. package/src/resources/extensions/async-jobs/index.ts +79 -0
  293. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  294. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  295. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  296. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  297. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  298. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  299. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  300. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  301. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  302. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  303. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  304. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  305. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  306. package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
  307. package/src/resources/extensions/gsd/auto/phases.ts +65 -26
  308. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  309. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  310. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  311. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  312. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  313. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  314. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  315. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  316. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  317. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  318. package/src/resources/extensions/gsd/auto-worktree.ts +14 -1
  319. package/src/resources/extensions/gsd/auto.ts +44 -1
  320. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  321. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  322. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
  323. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  324. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
  325. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  326. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  327. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  328. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  329. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  330. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  331. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  332. package/src/resources/extensions/gsd/constants.ts +0 -3
  333. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  334. package/src/resources/extensions/gsd/db/queries.ts +37 -0
  335. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  336. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  337. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  338. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  339. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  340. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  341. package/src/resources/extensions/gsd/files.ts +33 -12
  342. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  343. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  344. package/src/resources/extensions/gsd/guidance.ts +78 -0
  345. package/src/resources/extensions/gsd/guided-flow.ts +21 -26
  346. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  348. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  349. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  350. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  351. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  352. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  353. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  354. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  355. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  356. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  357. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  358. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  359. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  360. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  361. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  362. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  363. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  364. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  365. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  366. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  367. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  368. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  369. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  370. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  371. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  372. package/src/resources/extensions/gsd/state.ts +5 -0
  373. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  374. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  375. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  376. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  377. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  378. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  379. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  380. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  381. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  382. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  383. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  384. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  385. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  386. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  387. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  388. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  389. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  390. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  391. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  392. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  393. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  394. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  395. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  396. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  397. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  398. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  399. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  400. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  401. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  402. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  403. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  404. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  405. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  406. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  407. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +19 -1
  408. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  409. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +41 -0
  410. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  411. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  412. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  413. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  414. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  415. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  416. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  417. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  418. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  419. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  420. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  421. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  422. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  423. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  424. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  425. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  426. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  427. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  428. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  429. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  430. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  431. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  432. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  433. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  434. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  435. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  436. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  437. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  438. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  439. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  440. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  441. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  442. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  443. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  444. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  445. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  446. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  447. package/src/resources/extensions/gsd/worktree.ts +7 -1
  448. package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
  449. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  450. package/src/resources/shared/package-manager-detection.ts +1 -1
  451. package/src/resources/shared/package.json +3 -0
  452. package/src/resources/skills/create-skill/SKILL.md +3 -0
  453. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  454. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  455. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  456. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  457. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  458. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  459. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
  460. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
@@ -0,0 +1,273 @@
1
+ import { execFileSync } from 'node:child_process'
2
+ import { chmodSync, copyFileSync, existsSync, lstatSync, readlinkSync, realpathSync } from 'node:fs'
3
+ import { homedir } from 'node:os'
4
+ import { dirname, isAbsolute, join, delimiter as pathDelimiter, resolve as resolvePath } from 'node:path'
5
+ import { isPnpmInstall, pathStartsWith } from './package-manager-detection.js'
6
+
7
+ export interface GsdBrowserPathReconcileResult {
8
+ action: 'none' | 'synced' | 'shadowed'
9
+ pathCli?: string
10
+ installedCli?: string
11
+ syncTarget?: string
12
+ message?: string
13
+ }
14
+
15
+ function isBunGlobalInstall(argv1: string | undefined, env: NodeJS.ProcessEnv): boolean {
16
+ if ('bun' in process.versions) return true
17
+ if (!argv1) return false
18
+
19
+ const bunBinDirs: string[] = []
20
+ if (env.BUN_INSTALL) bunBinDirs.push(join(env.BUN_INSTALL, 'bin'))
21
+ bunBinDirs.push(join(homedir(), '.bun', 'bin'))
22
+
23
+ return bunBinDirs.some((dir) => pathStartsWith(argv1, dir))
24
+ }
25
+
26
+ function gsdBrowserBinaryName(platform: NodeJS.Platform): string {
27
+ return platform === 'win32' ? 'gsd-browser.cmd' : 'gsd-browser'
28
+ }
29
+
30
+ function tryResolveFromBinDir(binDir: string, platform: NodeJS.Platform): string | null {
31
+ const primary = join(binDir, gsdBrowserBinaryName(platform))
32
+ if (existsSync(primary)) return primary
33
+
34
+ if (platform === 'win32') {
35
+ const fallback = join(binDir, 'gsd-browser')
36
+ if (existsSync(fallback)) return fallback
37
+ }
38
+
39
+ return null
40
+ }
41
+
42
+ function tryResolveFromPackageRoot(
43
+ rootDir: string,
44
+ platform: NodeJS.Platform,
45
+ ): string | null {
46
+ const candidate = join(rootDir, '@opengsd', 'gsd-browser', 'bin', gsdBrowserBinaryName(platform))
47
+ if (existsSync(candidate)) return candidate
48
+
49
+ if (platform === 'win32') {
50
+ const fallback = join(rootDir, '@opengsd', 'gsd-browser', 'bin', 'gsd-browser')
51
+ if (existsSync(fallback)) return fallback
52
+ }
53
+
54
+ return null
55
+ }
56
+
57
+ function tryExecLookup(
58
+ command: string,
59
+ args: string[],
60
+ env: NodeJS.ProcessEnv,
61
+ platform: NodeJS.Platform,
62
+ resolve: (dir: string, platform: NodeJS.Platform) => string | null,
63
+ ): string | null {
64
+ try {
65
+ const dir = execFileSync(command, args, {
66
+ encoding: 'utf-8',
67
+ env,
68
+ stdio: ['ignore', 'pipe', 'ignore'],
69
+ timeout: 5000,
70
+ }).trim()
71
+ return resolve(dir, platform)
72
+ } catch {
73
+ return null
74
+ }
75
+ }
76
+
77
+ function resolvePathBinary(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string | null {
78
+ if (platform === 'win32') {
79
+ try {
80
+ const out = execFileSync('where', ['gsd-browser'], {
81
+ encoding: 'utf-8',
82
+ env,
83
+ stdio: ['ignore', 'pipe', 'ignore'],
84
+ timeout: 5000,
85
+ }).trim()
86
+ const first = out.split(/\r?\n/).map((line) => line.trim()).find(Boolean)
87
+ return first && existsSync(first) ? first : null
88
+ } catch {
89
+ return null
90
+ }
91
+ }
92
+
93
+ for (const entry of (env.PATH ?? '').split(pathDelimiter)) {
94
+ if (!entry) continue
95
+ const candidate = join(entry, 'gsd-browser')
96
+ if (existsSync(candidate)) return candidate
97
+ }
98
+
99
+ return null
100
+ }
101
+
102
+ function resolveRealPath(pathValue: string): string {
103
+ try {
104
+ return realpathSync(pathValue)
105
+ } catch {
106
+ return resolvePath(pathValue)
107
+ }
108
+ }
109
+
110
+ function resolveSymlinkTarget(pathCli: string): string {
111
+ try {
112
+ const stat = lstatSync(pathCli)
113
+ if (!stat.isSymbolicLink()) return pathCli
114
+
115
+ const target = readlinkSync(pathCli)
116
+ return isAbsolute(target) ? target : resolvePath(dirname(pathCli), target)
117
+ } catch {
118
+ // PATH entry vanished or is inaccessible between resolution and sync.
119
+ // Fall back to the original path; subsequent sync will surface a useful
120
+ // error rather than escaping as an unhandled throw.
121
+ return pathCli
122
+ }
123
+ }
124
+
125
+ function resolveHomeDir(env: NodeJS.ProcessEnv): string {
126
+ const fromEnv = env.HOME?.trim() || env.USERPROFILE?.trim()
127
+ return resolvePath(fromEnv || homedir())
128
+ }
129
+
130
+ function canAutoSyncTarget(targetPath: string, env: NodeJS.ProcessEnv): boolean {
131
+ const home = resolveHomeDir(env)
132
+ const resolved = resolvePath(targetPath)
133
+ return pathStartsWith(resolved, home)
134
+ }
135
+
136
+ function syncBinary(installedCli: string, targetPath: string, platform: NodeJS.Platform): void {
137
+ const source = resolveRealPath(installedCli)
138
+ copyFileSync(source, targetPath)
139
+ if (platform !== 'win32') {
140
+ chmodSync(targetPath, 0o755)
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Resolve the gsd-browser binary installed by the active global package manager.
146
+ */
147
+ export function resolveGlobalGsdBrowserCliPath(
148
+ options: { env?: NodeJS.ProcessEnv; argv1?: string; platform?: NodeJS.Platform } = {},
149
+ ): string | null {
150
+ const env = options.env ?? process.env
151
+ const argv1 = options.argv1 ?? process.argv[1]
152
+ const platform = options.platform ?? process.platform
153
+
154
+ if (isBunGlobalInstall(argv1, env)) {
155
+ return (
156
+ tryExecLookup('bun', ['pm', 'bin', '-g'], env, platform, tryResolveFromBinDir)
157
+ ?? (env.BUN_INSTALL ? tryResolveFromBinDir(join(env.BUN_INSTALL, 'bin'), platform) : null)
158
+ ?? tryResolveFromBinDir(join(homedir(), '.bun', 'bin'), platform)
159
+ )
160
+ }
161
+
162
+ if (isPnpmInstall(argv1, env)) {
163
+ return (
164
+ tryExecLookup('pnpm', ['bin', '-g'], env, platform, tryResolveFromBinDir)
165
+ ?? tryExecLookup('pnpm', ['root', '-g'], env, platform, tryResolveFromPackageRoot)
166
+ )
167
+ }
168
+
169
+ return (
170
+ tryExecLookup('npm', ['bin', '-g'], env, platform, tryResolveFromBinDir)
171
+ ?? tryExecLookup('npm', ['root', '-g'], env, platform, tryResolveFromPackageRoot)
172
+ )
173
+ }
174
+
175
+ /**
176
+ * Resolve the gsd-browser binary that wins on PATH (`command -v` / `where`).
177
+ */
178
+ export function resolveGsdBrowserOnPath(
179
+ env: NodeJS.ProcessEnv = process.env,
180
+ platform: NodeJS.Platform = process.platform,
181
+ ): string | null {
182
+ return resolvePathBinary(env, platform)
183
+ }
184
+
185
+ /**
186
+ * After a global gsd-browser install, ensure the PATH-resolved binary matches
187
+ * the freshly installed global binary when an older copy is shadowing it.
188
+ */
189
+ export function reconcileGsdBrowserPathAfterInstall(
190
+ options: {
191
+ latestVersion: string
192
+ compareSemver: (a: string, b: string) => number
193
+ resolvePathVersion: (env: NodeJS.ProcessEnv) => string | null
194
+ env?: NodeJS.ProcessEnv
195
+ argv1?: string
196
+ platform?: NodeJS.Platform
197
+ },
198
+ ): GsdBrowserPathReconcileResult {
199
+ const env = options.env ?? process.env
200
+ const argv1 = options.argv1 ?? process.argv[1]
201
+ const platform = options.platform ?? process.platform
202
+
203
+ const installedCli = resolveGlobalGsdBrowserCliPath({ env, argv1, platform })
204
+ if (!installedCli) {
205
+ return { action: 'none' }
206
+ }
207
+
208
+ const pathCli = resolveGsdBrowserOnPath(env, platform)
209
+ const installedReal = resolveRealPath(installedCli)
210
+ if (pathCli && resolveRealPath(pathCli) === installedReal) {
211
+ return { action: 'none', pathCli, installedCli }
212
+ }
213
+
214
+ const pathVersion = options.resolvePathVersion(env)
215
+ if (pathVersion && options.compareSemver(pathVersion, options.latestVersion) >= 0) {
216
+ return { action: 'none', pathCli: pathCli ?? undefined, installedCli }
217
+ }
218
+
219
+ if (!pathCli) {
220
+ return {
221
+ action: 'shadowed',
222
+ installedCli,
223
+ message:
224
+ 'Installed gsd-browser globally, but no gsd-browser was found on PATH. Add your package manager global bin directory to PATH.',
225
+ }
226
+ }
227
+
228
+ const syncTarget = resolveSymlinkTarget(pathCli)
229
+ if (!canAutoSyncTarget(syncTarget, env)) {
230
+ return {
231
+ action: 'shadowed',
232
+ pathCli,
233
+ installedCli,
234
+ syncTarget,
235
+ message:
236
+ `PATH resolves gsd-browser to ${pathCli}, but the updated global install is at ${installedCli}. ` +
237
+ 'Move your package manager global bin directory ahead of the stale location on PATH, or update the stale binary manually.',
238
+ }
239
+ }
240
+
241
+ let syncSucceeded = false
242
+ try {
243
+ syncBinary(installedCli, syncTarget, platform)
244
+ syncSucceeded = true
245
+ } catch {
246
+ // Fall through to shadowed guidance.
247
+ }
248
+
249
+ if (syncSucceeded) {
250
+ const refreshedVersion = options.resolvePathVersion(env)
251
+ const verified = refreshedVersion !== null
252
+ && options.compareSemver(refreshedVersion, options.latestVersion) >= 0
253
+ return {
254
+ action: 'synced',
255
+ pathCli,
256
+ installedCli,
257
+ syncTarget,
258
+ message: verified
259
+ ? `Synced PATH-resolved gsd-browser at ${syncTarget} to the updated global install.`
260
+ : `Synced PATH-resolved gsd-browser at ${syncTarget} to the updated global install. Could not verify the new version on PATH; restart your shell or rerun if it still reports the old version.`,
261
+ }
262
+ }
263
+
264
+ return {
265
+ action: 'shadowed',
266
+ pathCli,
267
+ installedCli,
268
+ syncTarget,
269
+ message:
270
+ `PATH resolves gsd-browser to ${pathCli}, but the updated global install is at ${installedCli}. ` +
271
+ 'Move your package manager global bin directory ahead of the stale location on PATH, or update the stale binary manually.',
272
+ }
273
+ }
@@ -12,7 +12,7 @@ function hasPnpmPath(value: string | undefined): boolean {
12
12
  )
13
13
  }
14
14
 
15
- function pathStartsWith(pathValue: string | undefined, dir: string): boolean {
15
+ export function pathStartsWith(pathValue: string | undefined, dir: string): boolean {
16
16
  if (!pathValue) return false
17
17
  const resolvedPath = resolvePath(pathValue)
18
18
  const resolvedDir = resolvePath(dir)
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -174,6 +174,9 @@ description: ... # What it does AND when to use it (third person)
174
174
  ---
175
175
  ```
176
176
 
177
+ Frontmatter must parse as YAML. Quote description values containing `:` or use
178
+ a folded block (`description: >`) for longer trigger descriptions.
179
+
177
180
  Name conventions: `create-*`, `manage-*`, `setup-*`, `generate-*`, `build-*`
178
181
  </yaml_requirements>
179
182
 
@@ -109,6 +109,7 @@ description: What it does and when to use it (third person, specific triggers)
109
109
  - No XML tags
110
110
  - Third person (never first or second person)
111
111
  - Include what it does AND when to use it
112
+ - Must parse as YAML; quote values containing `:` or use `description: >`
112
113
 
113
114
  **Critical rule**: Always write in third person.
114
115
  - ✅ "Processes Excel files and generates reports"
@@ -1,218 +0,0 @@
1
- const USER_APPROVAL_UNIT_TYPES = new Set([
2
- "discuss-project",
3
- "discuss-requirements",
4
- "discuss-milestone",
5
- "research-decision",
6
- ]);
7
- const REMOTE_QUESTION_FAILURE_RE = /(?:Remote (?:auth failed|questions failed|channel configured but returned no result|questions timed out|questions timed out or failed)|Failed to send questions via)/i;
8
- const APPROVAL_WAIT_RE = /\bwait(?:ing)?\s+for\s+(?:your\s+)?(?:confirmation|approval|input|response|answer)\b/i;
9
- const APPROVAL_QUESTION_RE = /\b(?:confirm|confirmation|approve|approval|approved|captured|correct|correctly|happy\s+with|ready\s+to\s+(?:write|save|proceed|ship)|(?:want|need)\s+to\s+adjust|should\s+I\s+(?:write|save|proceed)|do\s+you\s+want\s+me\s+to\s+(?:write|save|proceed)|ship\s+it)\b/i;
10
- const APPROVAL_RIGHT_QUESTION_RE = /\b(?:does|do|is|are|was|were|did)\b[^\n?]{0,120}\bright\b/i;
11
- const APPROVAL_CHANGE_QUESTION_RE = /\b(?:anything\s+else|anything|something)\s+to\s+(?:adjust|add|remove|reclassify)\b/i;
12
- const RESEARCH_DECISION_QUESTION_RE = /\b(?:research|skip)\b/i;
13
- function extractVisibleTextFromMessage(msg) {
14
- if (!msg || typeof msg !== "object")
15
- return "";
16
- const content = msg.content;
17
- if (typeof content === "string")
18
- return content;
19
- if (!Array.isArray(content))
20
- return "";
21
- const parts = [];
22
- for (const block of content) {
23
- if (!block || typeof block !== "object")
24
- continue;
25
- const typed = block;
26
- if (typed.type === "text" && typeof typed.text === "string") {
27
- parts.push(typed.text);
28
- }
29
- // thinking blocks intentionally excluded — they are internal reasoning, not user-visible
30
- }
31
- return parts.join("\n");
32
- }
33
- function extractTextFromMessage(msg) {
34
- if (!msg || typeof msg !== "object")
35
- return "";
36
- const content = msg.content;
37
- if (typeof content === "string")
38
- return content;
39
- if (!Array.isArray(content))
40
- return "";
41
- const parts = [];
42
- for (const block of content) {
43
- if (!block || typeof block !== "object")
44
- continue;
45
- const typed = block;
46
- if (typed.type === "text" && typeof typed.text === "string") {
47
- parts.push(typed.text);
48
- }
49
- if (typed.type === "thinking" && typeof typed.thinking === "string") {
50
- parts.push(typed.thinking);
51
- }
52
- }
53
- return parts.join("\n");
54
- }
55
- export function lastAssistantText(messages) {
56
- if (!Array.isArray(messages))
57
- return "";
58
- for (let i = messages.length - 1; i >= 0; i--) {
59
- const msg = messages[i];
60
- if (!msg || typeof msg !== "object")
61
- continue;
62
- if (msg.role !== "assistant")
63
- continue;
64
- const text = extractTextFromMessage(msg).trim();
65
- if (text)
66
- return text;
67
- }
68
- return "";
69
- }
70
- function lastAssistantVisibleText(messages) {
71
- if (!Array.isArray(messages))
72
- return "";
73
- for (let i = messages.length - 1; i >= 0; i--) {
74
- const msg = messages[i];
75
- if (!msg || typeof msg !== "object")
76
- continue;
77
- if (msg.role !== "assistant")
78
- continue;
79
- const text = extractVisibleTextFromMessage(msg).trim();
80
- if (text)
81
- return text;
82
- }
83
- return "";
84
- }
85
- function anyMessageMatches(messages, pattern) {
86
- if (!Array.isArray(messages))
87
- return false;
88
- return messages.some((msg) => {
89
- if (!msg || typeof msg !== "object")
90
- return false;
91
- if (msg.role === "user")
92
- return false;
93
- return pattern.test(extractVisibleTextFromMessage(msg));
94
- });
95
- }
96
- function hasApprovalQuestion(text) {
97
- for (let i = 0; i < text.length; i++) {
98
- if (text[i] !== "?")
99
- continue;
100
- const previousBreak = Math.max(text.lastIndexOf("\n", i), text.lastIndexOf(".", i), text.lastIndexOf("!", i), text.lastIndexOf("?", i - 1));
101
- const fragment = text.slice(previousBreak + 1, i + 1);
102
- if (APPROVAL_QUESTION_RE.test(fragment))
103
- return true;
104
- if (APPROVAL_RIGHT_QUESTION_RE.test(fragment))
105
- return true;
106
- if (APPROVAL_CHANGE_QUESTION_RE.test(fragment))
107
- return true;
108
- }
109
- return false;
110
- }
111
- function hasResearchDecisionQuestion(text) {
112
- for (let i = 0; i < text.length; i++) {
113
- if (text[i] !== "?")
114
- continue;
115
- const previousBreak = Math.max(text.lastIndexOf("\n", i), text.lastIndexOf(".", i), text.lastIndexOf("!", i), text.lastIndexOf("?", i - 1));
116
- const fragment = text.slice(previousBreak + 1, i + 1);
117
- if (RESEARCH_DECISION_QUESTION_RE.test(fragment))
118
- return true;
119
- }
120
- return false;
121
- }
122
- export function approvalGateIdForUnit(unitType, unitId) {
123
- if (!unitType)
124
- return null;
125
- if (unitType === "discuss-project")
126
- return "depth_verification_project_confirm";
127
- if (unitType === "discuss-requirements")
128
- return "depth_verification_requirements_confirm";
129
- if (unitType === "research-decision")
130
- return "depth_verification_research_decision_confirm";
131
- if (unitType === "discuss-milestone") {
132
- const safeUnitId = typeof unitId === "string" && /^[A-Za-z0-9_-]+$/.test(unitId)
133
- ? unitId
134
- : "milestone";
135
- return `depth_verification_${safeUnitId}_confirm`;
136
- }
137
- return null;
138
- }
139
- const CHANGE_REQUEST_RESPONSE_RE = /\b(?:no|nope|nah|not\s+yet|don't|do\s+not|change|add|remove|reclassify|adjust|clarify|missing|instead|but|however|wait|hold)\b/i;
140
- const APPROVAL_RESPONSE_RE = /^(?:y|yes|yeah|yep|approve|approved|confirm|confirmed|correct|right|looks\s+(?:good|right)|sounds\s+good|all\s+good|ok|okay|go\s+ahead|proceed|write\s+it|save\s+it|do\s+it)\b/i;
141
- const RESEARCH_DECISION_RESPONSE_RE = /^(?:research|run\s+research|do\s+research|skip|skip\s+research|no\s+research)\b/i;
142
- export function isExplicitApprovalResponse(input, pendingGateId) {
143
- const text = input?.trim() ?? "";
144
- if (!text)
145
- return false;
146
- if (pendingGateId?.includes("research_decision")) {
147
- return RESEARCH_DECISION_RESPONSE_RE.test(text);
148
- }
149
- if (CHANGE_REQUEST_RESPONSE_RE.test(text))
150
- return false;
151
- return APPROVAL_RESPONSE_RE.test(text);
152
- }
153
- export function isAwaitingUserInput(messages) {
154
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i))
155
- return true;
156
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE))
157
- return true;
158
- const text = lastAssistantVisibleText(messages);
159
- if (!text)
160
- return false;
161
- if (APPROVAL_WAIT_RE.test(text))
162
- return true;
163
- const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
164
- if (lines.some((line) => line.endsWith("?")))
165
- return true;
166
- return hasApprovalQuestion(text);
167
- }
168
- export function isAwaitingApprovalBoundary(messages) {
169
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i))
170
- return true;
171
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE))
172
- return true;
173
- const text = lastAssistantVisibleText(messages);
174
- if (!text)
175
- return false;
176
- if (APPROVAL_WAIT_RE.test(text))
177
- return true;
178
- return hasApprovalQuestion(text);
179
- }
180
- /** True when an assistant message already has an in-flight ask_user_questions tool call. */
181
- export function messageHasPendingAskUserQuestionsTool(message) {
182
- if (!message || typeof message !== "object")
183
- return false;
184
- const content = message.content;
185
- if (!Array.isArray(content))
186
- return false;
187
- return content.some((block) => {
188
- if (!block || typeof block !== "object")
189
- return false;
190
- // Claude Code marks completion by attaching externalResult, not by setting state.
191
- // Streaming blocks often carry no state; serverToolUse is the claude-code-cli MCP path.
192
- const tool = block;
193
- if (tool.type !== "toolCall" && tool.type !== "serverToolUse")
194
- return false;
195
- const name = String(tool.name ?? "").toLowerCase();
196
- if (!name.includes("ask_user_questions"))
197
- return false;
198
- if (tool.externalResult !== undefined)
199
- return false;
200
- return tool.state !== "completed" && tool.state !== "done";
201
- });
202
- }
203
- export function shouldPauseForUserApprovalQuestion(unitType, messages) {
204
- if (!unitType || !USER_APPROVAL_UNIT_TYPES.has(unitType))
205
- return false;
206
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i))
207
- return true;
208
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE))
209
- return true;
210
- const text = lastAssistantVisibleText(messages);
211
- if (!text)
212
- return false;
213
- if (APPROVAL_WAIT_RE.test(text))
214
- return true;
215
- if (unitType === "research-decision")
216
- return hasResearchDecisionQuestion(text);
217
- return hasApprovalQuestion(text);
218
- }
@@ -1,41 +0,0 @@
1
- ---
2
- name: gsd-browser
3
- description: "Use gsd-browser for browser automation and UAT: navigating local apps, inspecting pages, clicking or filling controls, taking screenshots, asserting UI behavior, collecting console/network diagnostics, visual diffing, and creating evidence bundles. Prefer this over legacy Playwright browser tooling when both are available."
4
- allowed-tools: Bash(gsd-browser:*), Bash(gsd-browser *)
5
- ---
6
-
7
- # gsd-browser
8
-
9
- Use `gsd-browser` as the default browser surface for automated UAT and real UI verification.
10
-
11
- ## MCP First
12
-
13
- When MCP tools are available, prefer the `gsd-browser` server:
14
-
15
- - Discovery: `browser_snapshot_refs`, `browser_find`, `browser_get_accessibility_tree`
16
- - Actions: `browser_act`, `browser_batch`, `browser_click_ref`, `browser_fill_ref`
17
- - Verification: `browser_assert`, `browser_screenshot`, `browser_visual_diff`
18
- - Diagnostics: `browser_get_console_logs`, `browser_get_network_logs`, `browser_debug_bundle`
19
-
20
- If the host namespaces MCP tools, use names like `mcp__gsd-browser__browser_snapshot_refs`.
21
-
22
- ## CLI Fallback
23
-
24
- The daemon starts automatically on first browser command.
25
-
26
- ```bash
27
- gsd-browser navigate http://localhost:3000
28
- gsd-browser snapshot
29
- gsd-browser click-ref @v1:e1
30
- gsd-browser wait-for --condition network_idle
31
- gsd-browser assert --checks '[{"kind":"url_contains","text":"dashboard"}]'
32
- gsd-browser screenshot --output /tmp/gsd-browser-uat.png --format png
33
- ```
34
-
35
- After any navigation, submit, or dynamic DOM change, take a fresh snapshot before using refs again. Refs are versioned, such as `@v1:e1` and `@v2:e3`, and old refs can become stale.
36
-
37
- Use `--json` when parsing output programmatically. Use named sessions for parallel or project-specific work:
38
-
39
- ```bash
40
- gsd-browser --session gsd-pi navigate http://localhost:3000
41
- ```