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

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