@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.822c9439

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 (688) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.d.ts +9 -5
  10. package/dist/resource-loader.js +116 -20
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  14. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  15. package/dist/resources/extensions/async-jobs/index.js +65 -0
  16. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  17. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  18. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  19. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  20. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  21. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  23. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  24. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  25. package/dist/resources/extensions/browser-tools/index.js +69 -12
  26. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  27. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  28. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  29. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  30. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  31. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  33. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  34. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  35. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  36. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  37. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  38. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  39. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  40. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  41. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  42. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  43. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  44. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  45. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  46. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  47. package/dist/resources/extensions/gsd/auto-worktree.js +49 -353
  48. package/dist/resources/extensions/gsd/auto.js +45 -21
  49. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  51. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  52. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  55. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  56. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  57. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  58. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  59. package/dist/resources/extensions/gsd/captures.js +5 -15
  60. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  61. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  62. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  63. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  64. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  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 +12 -15
  69. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  70. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  71. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  72. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  73. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  74. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  75. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  76. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  77. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  78. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  79. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  80. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  81. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  82. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  83. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  84. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  85. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  86. package/dist/resources/extensions/gsd/files.js +33 -19
  87. package/dist/resources/extensions/gsd/git-service.js +1 -0
  88. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  89. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  90. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  91. package/dist/resources/extensions/gsd/guidance.js +158 -0
  92. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  93. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  94. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  95. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  96. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  97. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  98. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  99. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  100. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  101. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  102. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  103. package/dist/resources/extensions/gsd/model-router.js +3 -0
  104. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  105. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  106. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  107. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  108. package/dist/resources/extensions/gsd/paths.js +37 -24
  109. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  110. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  111. package/dist/resources/extensions/gsd/preferences.js +14 -0
  112. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  113. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  114. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  115. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  117. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  118. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  119. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  120. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  121. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  125. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  126. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  128. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  129. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  130. package/dist/resources/extensions/gsd/publication.js +87 -0
  131. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  132. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  133. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  134. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  135. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  136. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  137. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  138. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  139. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  140. package/dist/resources/extensions/gsd/state.js +6 -20
  141. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  142. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  143. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  144. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  145. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  146. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  148. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  150. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  151. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  152. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  153. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  154. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  155. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  158. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  159. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  160. package/dist/resources/extensions/gsd/undo.js +8 -7
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  173. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  174. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  175. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  176. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  177. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  178. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  179. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  180. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  184. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  185. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  186. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  187. package/dist/resources/shared/package-manager-detection.js +1 -1
  188. package/dist/resources/shared/package.json +3 -0
  189. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  190. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  191. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  192. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  193. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  194. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  195. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  196. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  197. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  198. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  199. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  200. package/dist/update-check.d.ts +2 -0
  201. package/dist/update-check.js +24 -1
  202. package/dist/update-cmd.js +20 -3
  203. package/dist/web/standalone/.next/BUILD_ID +1 -1
  204. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  205. package/dist/web/standalone/.next/build-manifest.json +3 -3
  206. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  207. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  217. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/index.html +1 -1
  261. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  263. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  264. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  265. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  267. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  268. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  269. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  270. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  271. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  274. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  275. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  276. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  277. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  278. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  279. package/dist/web/standalone/package.json +1 -1
  280. package/dist/worktree-cli.js +3 -6
  281. package/dist/worktree-status-banner.js +7 -11
  282. package/package.json +1 -1
  283. package/packages/cloud-mcp-gateway/package.json +2 -2
  284. package/packages/contracts/dist/rpc.d.ts +1 -0
  285. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  286. package/packages/contracts/dist/rpc.js.map +1 -1
  287. package/packages/contracts/dist/workflow.d.ts +4 -0
  288. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  289. package/packages/contracts/dist/workflow.js.map +1 -1
  290. package/packages/contracts/package.json +1 -1
  291. package/packages/daemon/package.json +4 -4
  292. package/packages/gsd-agent-core/package.json +5 -5
  293. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  296. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  299. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  300. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  302. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  303. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  304. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  305. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  306. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  307. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  308. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  309. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  310. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  311. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  312. package/packages/gsd-agent-modes/package.json +7 -7
  313. package/packages/mcp-server/dist/cli.js +9 -1
  314. package/packages/mcp-server/dist/cli.js.map +1 -1
  315. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  316. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  317. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  318. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  319. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  320. package/packages/mcp-server/dist/server.js +4 -0
  321. package/packages/mcp-server/dist/server.js.map +1 -1
  322. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  323. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  324. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  325. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  326. package/packages/mcp-server/package.json +5 -4
  327. package/packages/native/package.json +1 -1
  328. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  329. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  330. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  331. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  332. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  333. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  334. package/packages/pi-agent-core/dist/index.js +3 -0
  335. package/packages/pi-agent-core/dist/index.js.map +1 -1
  336. package/packages/pi-agent-core/package.json +1 -1
  337. package/packages/pi-ai/README.md +1 -0
  338. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  339. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  340. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  341. package/packages/pi-ai/dist/index.d.ts +2 -0
  342. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/index.js +2 -0
  344. package/packages/pi-ai/dist/index.js.map +1 -1
  345. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  346. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  347. package/packages/pi-ai/dist/models.generated.js +132 -17
  348. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  349. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  350. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  351. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  352. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  353. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  354. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  355. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  356. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  357. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  358. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  359. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  360. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  362. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  363. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  364. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  365. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  366. package/packages/pi-ai/package.json +3 -2
  367. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  368. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  370. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  373. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  378. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  380. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  382. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/index.js +1 -1
  384. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  386. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  388. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  389. package/packages/pi-coding-agent/package.json +7 -7
  390. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/tui.js +9 -0
  392. package/packages/pi-tui/dist/tui.js.map +1 -1
  393. package/packages/pi-tui/package.json +2 -2
  394. package/packages/rpc-client/package.json +2 -2
  395. package/pkg/package.json +1 -1
  396. package/src/resources/GSD-WORKFLOW.md +5 -4
  397. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  398. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  399. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  400. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  401. package/src/resources/extensions/async-jobs/index.ts +79 -0
  402. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  403. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  404. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  405. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  406. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  407. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  408. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  409. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  410. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  411. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  412. package/src/resources/extensions/browser-tools/index.ts +71 -13
  413. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  414. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  415. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  416. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  417. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  418. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  419. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  420. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  421. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  422. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  423. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  424. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  425. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  426. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  427. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  428. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  429. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  430. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  431. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  432. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  433. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  434. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  435. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  436. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  437. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  438. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  439. package/src/resources/extensions/gsd/auto-worktree.ts +55 -365
  440. package/src/resources/extensions/gsd/auto.ts +64 -25
  441. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  442. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  443. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  444. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  445. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  446. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  447. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  448. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  449. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  450. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  451. package/src/resources/extensions/gsd/captures.ts +5 -16
  452. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  453. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  454. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  455. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  456. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  457. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  458. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  459. package/src/resources/extensions/gsd/constants.ts +0 -3
  460. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  461. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  462. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  463. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  464. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  465. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  466. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  467. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  468. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  469. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  470. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  471. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  472. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  473. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  474. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  475. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  476. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  477. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  478. package/src/resources/extensions/gsd/files.ts +33 -12
  479. package/src/resources/extensions/gsd/git-service.ts +1 -0
  480. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  481. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  482. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  483. package/src/resources/extensions/gsd/guidance.ts +217 -0
  484. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  485. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  486. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  487. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  488. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  489. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  490. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  491. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  492. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  493. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  494. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  495. package/src/resources/extensions/gsd/model-router.ts +3 -0
  496. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  497. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  498. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  499. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  500. package/src/resources/extensions/gsd/paths.ts +42 -22
  501. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  502. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  503. package/src/resources/extensions/gsd/preferences.ts +18 -0
  504. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  505. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  506. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  509. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  510. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  511. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  512. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  513. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  514. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  515. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  516. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  517. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  518. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  519. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  520. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  521. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  522. package/src/resources/extensions/gsd/publication.ts +122 -0
  523. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  524. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  525. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  526. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  527. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  528. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  529. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  530. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  531. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  532. package/src/resources/extensions/gsd/state.ts +9 -21
  533. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  534. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  535. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  536. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  537. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  538. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  539. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  540. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  541. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  542. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  543. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  544. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  545. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  546. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  547. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  548. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  549. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  550. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  551. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  552. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  553. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  554. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  555. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  556. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  557. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  558. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  559. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  560. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  561. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  562. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  563. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  564. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  565. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  566. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  567. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  568. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  569. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  570. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  571. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  572. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  573. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  574. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  575. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  576. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  577. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  578. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  579. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  580. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  581. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  582. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  583. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  584. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  585. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  586. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  587. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  588. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  589. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  590. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  591. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  592. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  593. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  594. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  595. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  596. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  597. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  598. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  599. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  600. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  601. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  602. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  603. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  604. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  605. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  606. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  607. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  608. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  609. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  610. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  611. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  612. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  613. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  614. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  615. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  616. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  617. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  618. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  619. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  620. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  621. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  622. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  623. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  624. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  625. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  626. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  627. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  628. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  629. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  630. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  631. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  632. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  633. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  634. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  635. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  636. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  637. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  638. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  639. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  640. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  641. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  642. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  643. package/src/resources/extensions/gsd/undo.ts +9 -8
  644. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  645. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  646. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  647. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  648. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  649. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  650. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  651. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  652. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  653. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  654. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  655. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  656. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  657. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  658. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  659. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  660. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  661. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  662. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  663. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  664. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  665. package/src/resources/extensions/gsd/worktree.ts +7 -1
  666. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  667. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  668. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  669. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  670. package/src/resources/shared/package-manager-detection.ts +1 -1
  671. package/src/resources/shared/package.json +3 -0
  672. package/src/resources/skills/create-skill/SKILL.md +3 -0
  673. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  674. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  675. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  676. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  677. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  678. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  679. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  680. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  681. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  682. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  683. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  684. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  685. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  686. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  687. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
  688. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
@@ -55,6 +55,32 @@ function parseGsdBrowserVersion(output: string): string | null {
55
55
  return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
56
56
  }
57
57
 
58
+ function splitCommandLine(commandLine: string): string[] {
59
+ const parts = commandLine.match(/(?:"[^"]*"|'[^']*'|[^\s"']+)/g) ?? [];
60
+ return parts.map((part) => {
61
+ const quote = part[0];
62
+ if ((quote === '"' || quote === "'") && part.endsWith(quote)) {
63
+ return part.slice(1, -1);
64
+ }
65
+ return part;
66
+ });
67
+ }
68
+
69
+ function buildPathGsdBrowserVersionInvocation(platform: NodeJS.Platform): { command: string; args: string[] } {
70
+ if (platform === "win32") {
71
+ return { command: "cmd", args: ["/d", "/s", "/c", "gsd-browser", "--version"] };
72
+ }
73
+ return { command: "gsd-browser", args: ["--version"] };
74
+ }
75
+
76
+ function isRecord(value: unknown): value is Record<string, unknown> {
77
+ return !!value && typeof value === "object" && !Array.isArray(value);
78
+ }
79
+
80
+ function resolveExplicitGsdBrowserCliPath(env: NodeJS.ProcessEnv): string | undefined {
81
+ return env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim() || undefined;
82
+ }
83
+
58
84
  function resolveBundledGsdBrowserPackageVersion(): string | null {
59
85
  try {
60
86
  const requireFromHere = createRequire(import.meta.url);
@@ -66,20 +92,29 @@ function resolveBundledGsdBrowserPackageVersion(): string | null {
66
92
  }
67
93
  }
68
94
 
95
+ // The `gsd-browser --version` subprocess result cannot change mid-session (the
96
+ // engine-switch guard forbids restarting with a different engine), and both the
97
+ // availability probe and the launch-config resolution ask for it at session
98
+ // start — memoize so the up-to-2s spawn happens once per process.
99
+ let cachedPathProbeVersion: string | null | undefined;
100
+
69
101
  function resolvePathGsdBrowserVersion(env: NodeJS.ProcessEnv): string | null {
70
102
  const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
71
103
  if (explicit) return parseGsdBrowserVersion(explicit);
104
+ if (cachedPathProbeVersion !== undefined) return cachedPathProbeVersion;
72
105
 
73
106
  try {
74
- return parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
107
+ const invocation = buildPathGsdBrowserVersionInvocation(process.platform);
108
+ cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync(invocation.command, invocation.args, {
75
109
  encoding: "utf-8",
76
110
  env,
77
111
  stdio: ["ignore", "pipe", "ignore"],
78
112
  timeout: 2000,
79
113
  }));
80
114
  } catch {
81
- return null;
115
+ cachedPathProbeVersion = null;
82
116
  }
117
+ return cachedPathProbeVersion;
83
118
  }
84
119
 
85
120
  function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
@@ -91,7 +126,7 @@ function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
91
126
  }
92
127
 
93
128
  export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process.env): string | null {
94
- const explicit = env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim();
129
+ const explicit = resolveExplicitGsdBrowserCliPath(env);
95
130
  if (explicit) return explicit;
96
131
 
97
132
  try {
@@ -115,6 +150,45 @@ export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process
115
150
  return null;
116
151
  }
117
152
 
153
+ export type GsdBrowserCliAvailability =
154
+ | { available: true; via: "explicit-env" | "bundled" | "path"; detail: string }
155
+ | { available: false; detail: string };
156
+
157
+ /**
158
+ * Cheap availability probe for the gsd-browser CLI: explicit env overrides,
159
+ * then the bundled @opengsd/gsd-browser binary (filesystem checks only), then
160
+ * a PATH lookup (one short subprocess, memoized). Used by Browser Automation
161
+ * Engine resolution to decide whether the managed engine is provable before
162
+ * preferring it over legacy Playwright. `via` names the provable source, not
163
+ * necessarily the launch source — resolveGsdBrowserMcpLaunchConfig may still
164
+ * prefer a newer PATH CLI over the bundled one.
165
+ */
166
+ export function resolveGsdBrowserCliAvailability(env: NodeJS.ProcessEnv = process.env): GsdBrowserCliAvailability {
167
+ const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
168
+ if (explicitCommand) {
169
+ return { available: true, via: "explicit-env", detail: `GSD_BROWSER_MCP_COMMAND=${explicitCommand}` };
170
+ }
171
+
172
+ const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
173
+ if (explicitCliPath) {
174
+ return existsSync(explicitCliPath)
175
+ ? { available: true, via: "explicit-env", detail: `CLI at ${explicitCliPath}` }
176
+ : { available: false, detail: `configured gsd-browser CLI path does not exist: ${explicitCliPath}` };
177
+ }
178
+
179
+ const bundledCliPath = resolveBundledGsdBrowserCliPath(env);
180
+ if (bundledCliPath) {
181
+ return { available: true, via: "bundled", detail: `bundled CLI at ${bundledCliPath}` };
182
+ }
183
+
184
+ const pathVersion = resolvePathGsdBrowserVersion(env);
185
+ if (pathVersion) {
186
+ return { available: true, via: "path", detail: `gsd-browser ${pathVersion} on PATH` };
187
+ }
188
+
189
+ return { available: false, detail: "no bundled or PATH gsd-browser CLI found" };
190
+ }
191
+
118
192
  export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string): string {
119
193
  const resolvedProjectRoot = resolve(projectRoot);
120
194
  const base = sanitizeSessionSegment(basename(resolvedProjectRoot)) || "project";
@@ -123,6 +197,35 @@ export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string)
123
197
  return cleanSuffix ? `gsd-${base}-${hash}-${cleanSuffix}` : `gsd-${base}-${hash}`;
124
198
  }
125
199
 
200
+ /**
201
+ * Recognize an MCP server config (from .mcp.json / Claude settings) as a
202
+ * gsd-browser server. Paired with resolveGsdBrowserMcpLaunchConfig: this module
203
+ * writes the config shape, so it also owns recognizing it. New launch shapes
204
+ * are taught here, in one place.
205
+ */
206
+ export function isGsdBrowserMcpServerConfig(config: unknown): boolean {
207
+ if (!isRecord(config)) return false;
208
+
209
+ const command = typeof config.command === "string" ? config.command : "";
210
+ if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
211
+ return true;
212
+ }
213
+
214
+ if (isRecord(config.env)) {
215
+ const env = config.env;
216
+ if (
217
+ typeof env.GSD_BROWSER_CLI_PATH === "string"
218
+ || typeof env.GSD_BROWSER_BIN_PATH === "string"
219
+ || typeof env.GSD_BROWSER_MCP_COMMAND === "string"
220
+ ) {
221
+ return true;
222
+ }
223
+ }
224
+
225
+ const args = Array.isArray(config.args) ? config.args.filter((arg): arg is string => typeof arg === "string") : [];
226
+ return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
227
+ }
228
+
126
229
  export function resolveGsdBrowserMcpLaunchConfig(
127
230
  projectRoot: string,
128
231
  env: NodeJS.ProcessEnv = process.env,
@@ -132,8 +235,9 @@ export function resolveGsdBrowserMcpLaunchConfig(
132
235
  const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
133
236
  const explicitArgs = parseJsonEnv<unknown>(env, "GSD_BROWSER_MCP_ARGS");
134
237
  const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_BROWSER_MCP_ENV");
135
- const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
136
- const explicitCliPath = env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim();
238
+ const explicitCommandLine = env.GSD_BROWSER_MCP_COMMAND?.trim();
239
+ const [explicitCommand, ...explicitCommandArgs] = explicitCommandLine ? splitCommandLine(explicitCommandLine) : [];
240
+ const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
137
241
  const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
138
242
  const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
139
243
  ? resolveBundledGsdBrowserCliPath(env)
@@ -144,6 +248,10 @@ export function resolveGsdBrowserMcpLaunchConfig(
144
248
  // profile/cookies persist across pi sessions for the same project. gsd-browser
145
249
  // rejects --identity-scope unless --identity-key is also supplied.
146
250
  const identityKey = env.GSD_BROWSER_IDENTITY_KEY?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
251
+ // identity-project must be a safe identifier (no path separators); full paths
252
+ // cause daemon startup to fail with "invalid name".
253
+ const identityProject =
254
+ env.GSD_BROWSER_IDENTITY_PROJECT?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
147
255
  const command =
148
256
  explicitCommand
149
257
  || explicitCliPath
@@ -153,6 +261,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
153
261
  const args = Array.isArray(explicitArgs) && explicitArgs.length > 0
154
262
  ? explicitArgs.map(String)
155
263
  : [
264
+ ...explicitCommandArgs,
156
265
  ...(bundledCliPath ? [bundledCliPath] : []),
157
266
  "mcp",
158
267
  "--session",
@@ -162,7 +271,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
162
271
  "--identity-key",
163
272
  identityKey,
164
273
  "--identity-project",
165
- resolvedProjectRoot,
274
+ identityProject,
166
275
  ];
167
276
  const cwd = env.GSD_BROWSER_MCP_CWD?.trim() || resolvedProjectRoot;
168
277
 
@@ -176,3 +285,29 @@ export function resolveGsdBrowserMcpLaunchConfig(
176
285
  sessionName,
177
286
  };
178
287
  }
288
+
289
+ /**
290
+ * CLI invocation that starts the gsd-browser session daemon with the same
291
+ * session and identity flags as {@link resolveGsdBrowserMcpLaunchConfig}, so
292
+ * browser UAT can warm Chrome/CDP before the first MCP navigation.
293
+ */
294
+ export function resolveGsdBrowserDaemonStartInvocation(
295
+ projectRoot: string,
296
+ env: NodeJS.ProcessEnv = process.env,
297
+ options: GsdBrowserMcpLaunchOptions = {},
298
+ ): Pick<GsdBrowserMcpLaunchConfig, "command" | "args" | "cwd" | "env"> {
299
+ const launch = resolveGsdBrowserMcpLaunchConfig(projectRoot, env, options);
300
+ const mcpIndex = launch.args.indexOf("mcp");
301
+ if (mcpIndex < 0) {
302
+ throw new Error("gsd-browser launch config is missing mcp subcommand");
303
+ }
304
+
305
+ const prefix = launch.args.slice(0, mcpIndex);
306
+ const sessionFlags = launch.args.slice(mcpIndex + 1);
307
+ return {
308
+ command: launch.command,
309
+ args: [...prefix, "daemon", "start", ...sessionFlags],
310
+ cwd: launch.cwd,
311
+ ...(launch.env ? { env: launch.env } : {}),
312
+ };
313
+ }
@@ -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
 
@@ -45,7 +45,7 @@ skill-name/
45
45
  **Reference pattern**: In SKILL.md, reference scripts using the `scripts/` path:
46
46
 
47
47
  ```bash
48
- python ~/.claude/skills/skill-name/scripts/analyze.py input.har
48
+ python ~/.agents/skills/skill-name/scripts/analyze.py input.har
49
49
  ```
50
50
  </scripts_directory>
51
51
  </file_organization>
@@ -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"
@@ -10,16 +10,21 @@
10
10
  ## Step 1: Select the Skill
11
11
 
12
12
  ```bash
13
- ls ~/.claude/skills/
13
+ # User-global skills
14
+ ls ~/.agents/skills/ 2>/dev/null
15
+ # Project-local skills
16
+ ls .agents/skills/ 2>/dev/null
14
17
  ```
15
18
 
16
19
  Present numbered list, ask: "Which skill needs a new reference?"
17
20
 
21
+ Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
22
+
18
23
  ## Step 2: Analyze Current Structure
19
24
 
20
25
  ```bash
21
- cat ~/.claude/skills/{skill-name}/SKILL.md
22
- ls ~/.claude/skills/{skill-name}/references/ 2>/dev/null
26
+ cat {skill-path}/SKILL.md
27
+ ls {skill-path}/references/ 2>/dev/null
23
28
  ```
24
29
 
25
30
  Determine:
@@ -12,6 +12,8 @@ Ask (if not already provided):
12
12
  - Which skill needs a script?
13
13
  - What operation should the script perform?
14
14
 
15
+ Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
16
+
15
17
  ## Step 2: Analyze Script Need
16
18
 
17
19
  Confirm this is a good script candidate:
@@ -24,7 +26,7 @@ If not a good fit, suggest alternatives (inline code in workflow, reference exam
24
26
  ## Step 3: Create Scripts Directory
25
27
 
26
28
  ```bash
27
- mkdir -p ~/.claude/skills/{skill-name}/scripts
29
+ mkdir -p {skill-path}/scripts
28
30
  ```
29
31
 
30
32
  ## Step 4: Design Script
@@ -58,7 +60,7 @@ set -euo pipefail
58
60
  ## Step 6: Make Executable (if bash)
59
61
 
60
62
  ```bash
61
- chmod +x ~/.claude/skills/{skill-name}/scripts/{script-name}.sh
63
+ chmod +x {skill-path}/scripts/{script-name}.sh
62
64
  ```
63
65
 
64
66
  ## Step 7: Update Workflow to Use Script
@@ -12,6 +12,8 @@ Ask (if not already provided):
12
12
  - Which skill needs a template?
13
13
  - What output does this template structure?
14
14
 
15
+ Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
16
+
15
17
  ## Step 2: Analyze Template Need
16
18
 
17
19
  Confirm this is a good template candidate:
@@ -24,7 +26,7 @@ If not a good fit, suggest alternatives (workflow guidance, reference examples).
24
26
  ## Step 3: Create Templates Directory
25
27
 
26
28
  ```bash
27
- mkdir -p ~/.claude/skills/{skill-name}/templates
29
+ mkdir -p {skill-path}/templates
28
30
  ```
29
31
 
30
32
  ## Step 4: Design Template Structure
@@ -12,17 +12,22 @@
12
12
  **DO NOT use AskUserQuestion** - there may be many skills.
13
13
 
14
14
  ```bash
15
- ls ~/.claude/skills/
15
+ # User-global skills
16
+ ls ~/.agents/skills/ 2>/dev/null
17
+ # Project-local skills
18
+ ls .agents/skills/ 2>/dev/null
16
19
  ```
17
20
 
18
21
  Present numbered list, ask: "Which skill needs a new workflow?"
19
22
 
23
+ Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
24
+
20
25
  ## Step 2: Analyze Current Structure
21
26
 
22
27
  Read the skill:
23
28
  ```bash
24
- cat ~/.claude/skills/{skill-name}/SKILL.md
25
- ls ~/.claude/skills/{skill-name}/workflows/ 2>/dev/null
29
+ cat {skill-path}/SKILL.md
30
+ ls {skill-path}/workflows/ 2>/dev/null
26
31
  ```
27
32
 
28
33
  Determine:
@@ -10,17 +10,22 @@
10
10
  ## Step 1: Select the Skill
11
11
 
12
12
  ```bash
13
- ls ~/.claude/skills/
13
+ # User-global skills
14
+ ls ~/.agents/skills/ 2>/dev/null
15
+ # Project-local skills
16
+ ls .agents/skills/ 2>/dev/null
14
17
  ```
15
18
 
16
19
  Present numbered list, ask: "Which skill should be upgraded to the router pattern?"
17
20
 
21
+ Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
22
+
18
23
  ## Step 2: Verify It Needs Upgrading
19
24
 
20
25
  Read the skill:
21
26
  ```bash
22
- cat ~/.claude/skills/{skill-name}/SKILL.md
23
- ls ~/.claude/skills/{skill-name}/
27
+ cat {skill-path}/SKILL.md
28
+ ls {skill-path}/
24
29
  ```
25
30
 
26
31
  **Already a router?** (has workflows/ and intake question)
@@ -65,8 +70,8 @@ Ask: "Does this breakdown look right? Any adjustments?"
65
70
  ## Step 4: Create Directory Structure
66
71
 
67
72
  ```bash
68
- mkdir -p ~/.claude/skills/{skill-name}/workflows
69
- mkdir -p ~/.claude/skills/{skill-name}/references
73
+ mkdir -p {skill-path}/workflows
74
+ mkdir -p {skill-path}/references
70
75
  ```
71
76
 
72
77
  ## Step 5: Extract Workflows