@opengsd/gsd-pi 1.0.2-dev.e70300c → 1.0.2-dev.fb7ddf1

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 (480) hide show
  1. package/README.md +63 -12
  2. package/dist/headless-answers.js +2 -1
  3. package/dist/headless-events.d.ts +1 -0
  4. package/dist/headless-events.js +8 -1
  5. package/dist/onboarding.js +22 -3
  6. package/dist/resource-loader.d.ts +7 -0
  7. package/dist/resource-loader.js +44 -9
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
  10. package/dist/resources/extensions/context7/index.js +12 -2
  11. package/dist/resources/extensions/get-secrets-from-user.js +16 -16
  12. package/dist/resources/extensions/google-cli/index.js +30 -0
  13. package/dist/resources/extensions/google-cli/models.js +55 -0
  14. package/dist/resources/extensions/google-cli/package.json +11 -0
  15. package/dist/resources/extensions/google-cli/readiness.js +12 -0
  16. package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +81 -1
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
  19. package/dist/resources/extensions/gsd/auto/phases.js +38 -1
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
  21. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
  23. package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
  24. package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
  25. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +232 -49
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
  28. package/dist/resources/extensions/gsd/auto-verification.js +14 -2
  29. package/dist/resources/extensions/gsd/auto-worktree.js +34 -1
  30. package/dist/resources/extensions/gsd/auto.js +40 -2
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
  32. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
  33. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
  36. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  38. package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
  40. package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
  41. package/dist/resources/extensions/gsd/commands-usage.js +105 -1
  42. package/dist/resources/extensions/gsd/config-overlay.js +20 -14
  43. package/dist/resources/extensions/gsd/context-overlay.js +22 -16
  44. package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
  45. package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
  46. package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
  47. package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
  48. package/dist/resources/extensions/gsd/doctor.js +7 -2
  49. package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
  50. package/dist/resources/extensions/gsd/guided-flow.js +5 -6
  51. package/dist/resources/extensions/gsd/key-manager.js +45 -13
  52. package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
  53. package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
  54. package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
  55. package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
  56. package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
  57. package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
  58. package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
  59. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
  60. package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
  61. package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
  62. package/dist/resources/extensions/gsd/preferences.js +14 -2
  63. package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
  65. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  67. package/dist/resources/extensions/gsd/prompts/system.md +3 -20
  68. package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
  69. package/dist/resources/extensions/gsd/repo-identity.js +36 -6
  70. package/dist/resources/extensions/gsd/repository-registry.js +3 -1
  71. package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
  72. package/dist/resources/extensions/gsd/skill-activation.js +233 -0
  73. package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
  74. package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
  75. package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
  76. package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
  77. package/dist/resources/extensions/gsd/skill-scope.js +52 -0
  78. package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
  79. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  80. package/dist/resources/extensions/gsd/skills.js +60 -0
  81. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
  82. package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
  83. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
  84. package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
  85. package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
  86. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
  87. package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
  88. package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
  89. package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
  90. package/dist/resources/extensions/gsd/vision-ask.js +22 -0
  91. package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
  92. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
  93. package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
  94. package/dist/resources/extensions/search-the-web/native-search.js +57 -8
  95. package/dist/resources/extensions/shared/confirm-ui.js +9 -6
  96. package/dist/resources/extensions/shared/dialog-frame.js +42 -0
  97. package/dist/resources/extensions/shared/interview-ui.js +42 -30
  98. package/dist/resources/extensions/shared/next-action-ui.js +6 -6
  99. package/dist/resources/extensions/subagent/index.js +8 -15
  100. package/dist/resources/shared/package-manager-detection.js +36 -0
  101. package/dist/resources/skills/agent-browser/SKILL.md +1 -1
  102. package/dist/resources/skills/api-design/SKILL.md +1 -1
  103. package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
  104. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  105. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  106. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  107. package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  108. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  109. package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
  110. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  111. package/dist/resources/skills/forensics/SKILL.md +2 -2
  112. package/dist/resources/skills/grill-me/SKILL.md +1 -1
  113. package/dist/resources/skills/handoff/SKILL.md +1 -1
  114. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  115. package/dist/resources/skills/observability/SKILL.md +1 -1
  116. package/dist/resources/skills/security-review/SKILL.md +1 -1
  117. package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
  118. package/dist/resources/skills/tdd/SKILL.md +1 -1
  119. package/dist/resources/skills/write-docs/SKILL.md +1 -1
  120. package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
  121. package/dist/update-check.d.ts +6 -2
  122. package/dist/update-check.js +7 -3
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  125. package/dist/web/standalone/.next/build-manifest.json +2 -2
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/index.html +1 -1
  145. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  152. package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
  153. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  155. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  156. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  157. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  158. package/package.json +5 -2
  159. package/packages/cloud-mcp-gateway/package.json +2 -2
  160. package/packages/contracts/dist/rpc.test.js +5 -0
  161. package/packages/contracts/dist/rpc.test.js.map +1 -1
  162. package/packages/contracts/dist/workflow.d.ts +15 -0
  163. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  164. package/packages/contracts/dist/workflow.js +16 -0
  165. package/packages/contracts/dist/workflow.js.map +1 -1
  166. package/packages/contracts/dist/workflow.test.js +1 -0
  167. package/packages/contracts/dist/workflow.test.js.map +1 -1
  168. package/packages/contracts/package.json +1 -1
  169. package/packages/daemon/package.json +4 -4
  170. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
  171. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  172. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
  173. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  174. package/packages/gsd-agent-core/package.json +5 -5
  175. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
  176. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
  178. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
  179. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  180. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
  182. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
  184. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
  186. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  214. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
  223. package/packages/gsd-agent-modes/package.json +7 -7
  224. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  225. package/packages/mcp-server/dist/server.js +7 -1
  226. package/packages/mcp-server/dist/server.js.map +1 -1
  227. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  228. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  229. package/packages/mcp-server/dist/workflow-tools.js +47 -8
  230. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  231. package/packages/mcp-server/package.json +3 -3
  232. package/packages/native/package.json +1 -1
  233. package/packages/pi-agent-core/dist/agent-loop.js +16 -14
  234. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  235. package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  236. package/packages/pi-agent-core/dist/harness/skills.js +6 -0
  237. package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
  238. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
  239. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  240. package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
  241. package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  242. package/packages/pi-agent-core/package.json +1 -1
  243. package/packages/pi-ai/dist/models.generated.d.ts +48 -206
  244. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  245. package/packages/pi-ai/dist/models.generated.js +67 -220
  246. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  247. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  248. package/packages/pi-ai/dist/providers/anthropic.js +50 -0
  249. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  250. package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
  252. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  253. package/packages/pi-ai/dist/types.d.ts +2 -0
  254. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  255. package/packages/pi-ai/dist/types.js.map +1 -1
  256. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
  257. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
  258. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
  259. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
  261. package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
  262. package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
  263. package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
  264. package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
  265. package/packages/pi-ai/package.json +1 -1
  266. package/packages/pi-coding-agent/README.md +1 -1
  267. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
  268. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  271. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  274. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
  276. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/skills.js +3 -0
  278. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
  281. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
  285. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
  288. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  289. package/packages/pi-coding-agent/package.json +8 -8
  290. package/packages/pi-tui/package.json +1 -1
  291. package/packages/rpc-client/package.json +2 -2
  292. package/pkg/package.json +1 -1
  293. package/scripts/install/detect-existing.js +17 -3
  294. package/scripts/install/npm-global.js +103 -33
  295. package/scripts/install.js +1 -0
  296. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
  297. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
  298. package/src/resources/extensions/context7/index.ts +15 -2
  299. package/src/resources/extensions/get-secrets-from-user.ts +17 -16
  300. package/src/resources/extensions/google-cli/index.ts +34 -0
  301. package/src/resources/extensions/google-cli/models.ts +57 -0
  302. package/src/resources/extensions/google-cli/package.json +11 -0
  303. package/src/resources/extensions/google-cli/readiness.ts +15 -0
  304. package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
  305. package/src/resources/extensions/gsd/auto/loop.ts +96 -1
  306. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
  307. package/src/resources/extensions/gsd/auto/phases.ts +47 -1
  308. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
  309. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  310. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
  311. package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
  312. package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
  313. package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
  314. package/src/resources/extensions/gsd/auto-start.ts +307 -56
  315. package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
  316. package/src/resources/extensions/gsd/auto-verification.ts +18 -2
  317. package/src/resources/extensions/gsd/auto-worktree.ts +45 -1
  318. package/src/resources/extensions/gsd/auto.ts +50 -2
  319. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
  320. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
  321. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
  322. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
  323. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
  324. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
  325. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  326. package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
  327. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
  328. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  329. package/src/resources/extensions/gsd/commands-usage.ts +110 -5
  330. package/src/resources/extensions/gsd/config-overlay.ts +19 -16
  331. package/src/resources/extensions/gsd/context-overlay.ts +24 -19
  332. package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
  333. package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
  334. package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
  335. package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
  336. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  337. package/src/resources/extensions/gsd/doctor.ts +7 -2
  338. package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
  339. package/src/resources/extensions/gsd/guided-flow.ts +5 -6
  340. package/src/resources/extensions/gsd/key-manager.ts +57 -14
  341. package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
  342. package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
  343. package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
  344. package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
  345. package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
  346. package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
  347. package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
  348. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
  349. package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
  350. package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
  351. package/src/resources/extensions/gsd/preferences.ts +17 -2
  352. package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
  353. package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
  354. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  355. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  356. package/src/resources/extensions/gsd/prompts/system.md +3 -20
  357. package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
  358. package/src/resources/extensions/gsd/repo-identity.ts +35 -7
  359. package/src/resources/extensions/gsd/repository-registry.ts +3 -1
  360. package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
  361. package/src/resources/extensions/gsd/skill-activation.ts +292 -0
  362. package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
  363. package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
  364. package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
  365. package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
  366. package/src/resources/extensions/gsd/skill-scope.ts +63 -0
  367. package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
  368. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  369. package/src/resources/extensions/gsd/skills.ts +75 -0
  370. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
  371. package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
  372. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
  373. package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
  374. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
  375. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
  376. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
  377. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
  378. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
  379. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
  380. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
  381. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
  382. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
  383. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
  384. package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
  385. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
  386. package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
  387. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
  388. package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
  389. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
  390. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
  391. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
  392. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
  393. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
  394. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
  395. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
  396. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
  397. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
  398. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
  399. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
  400. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
  401. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
  402. package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
  403. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
  404. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
  405. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
  406. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
  407. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
  408. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
  409. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
  410. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
  411. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
  412. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
  413. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
  414. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
  415. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
  416. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
  417. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
  418. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
  419. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
  420. package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
  421. package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
  422. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
  423. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
  424. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
  425. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
  426. package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
  427. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
  428. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
  429. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
  430. package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
  431. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
  432. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
  433. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
  434. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
  435. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
  436. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
  437. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
  438. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
  439. package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
  440. package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
  441. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
  442. package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
  443. package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
  444. package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
  445. package/src/resources/extensions/gsd/vision-ask.ts +28 -0
  446. package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
  447. package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
  448. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
  449. package/src/resources/extensions/search-the-web/native-search.ts +60 -8
  450. package/src/resources/extensions/shared/confirm-ui.ts +8 -12
  451. package/src/resources/extensions/shared/dialog-frame.ts +71 -0
  452. package/src/resources/extensions/shared/interview-ui.ts +43 -42
  453. package/src/resources/extensions/shared/next-action-ui.ts +6 -6
  454. package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
  455. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
  456. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
  457. package/src/resources/extensions/subagent/index.ts +8 -15
  458. package/src/resources/shared/package-manager-detection.ts +39 -0
  459. package/src/resources/skills/agent-browser/SKILL.md +1 -1
  460. package/src/resources/skills/api-design/SKILL.md +1 -1
  461. package/src/resources/skills/code-optimizer/SKILL.md +6 -11
  462. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  463. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  464. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  465. package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  466. package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  467. package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
  468. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  469. package/src/resources/skills/forensics/SKILL.md +2 -2
  470. package/src/resources/skills/grill-me/SKILL.md +1 -1
  471. package/src/resources/skills/handoff/SKILL.md +1 -1
  472. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  473. package/src/resources/skills/observability/SKILL.md +1 -1
  474. package/src/resources/skills/security-review/SKILL.md +1 -1
  475. package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
  476. package/src/resources/skills/tdd/SKILL.md +1 -1
  477. package/src/resources/skills/write-docs/SKILL.md +1 -1
  478. package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
  479. /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
  480. /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
@@ -2,26 +2,23 @@
2
2
  * GSD Skill Discovery
3
3
  *
4
4
  * Detects skills installed during auto-mode by comparing the current
5
- * skills directory against a snapshot taken at auto-mode start.
5
+ * installed catalog and skill directories against a snapshot taken at auto-mode start.
6
6
  *
7
- * New skills are injected into the system prompt via before_agent_start,
8
- * making them visible to all subsequent units without requiring a reload.
7
+ * New skills are surfaced via resource reload when possible, with a fallback
8
+ * prompt block when reload fails before the next agent turn.
9
9
  */
10
10
  import { existsSync, readdirSync, readFileSync } from "node:fs";
11
- import { join } from "node:path";
12
11
  import { homedir } from "node:os";
12
+ import { join } from "node:path";
13
13
  import { gsdHome } from "./gsd-home.js";
14
- /** Skills directories GSD bundled, skills.sh ecosystem, and Claude Code official */
15
- const GSD_SKILLS_DIR = join(gsdHome(), "agent", "skills");
16
- const SKILLS_DIR = join(homedir(), ".agents", "skills");
17
- const CLAUDE_SKILLS_DIR = join(homedir(), ".claude", "skills");
18
- /** Snapshot of skill names at auto-mode start */
14
+ import { getInstalledSkills, normalizeSkillName } from "./skills.js";
15
+ /** Snapshot of normalized skill names at auto-mode start */
19
16
  let baselineSkills = null;
20
17
  /**
21
- * Snapshot the current skills directory. Call at auto-mode start.
18
+ * Snapshot the current installed skill catalog. Call at auto-mode start.
22
19
  */
23
20
  export function snapshotSkills() {
24
- baselineSkills = new Set(listSkillDirs());
21
+ baselineSkills = snapshotCurrentSkillNames();
25
22
  }
26
23
  /**
27
24
  * Clear the snapshot. Call when auto-mode stops.
@@ -37,80 +34,140 @@ export function hasSkillSnapshot() {
37
34
  }
38
35
  /**
39
36
  * Detect skills installed since the snapshot was taken.
40
- * Returns skill metadata for any new skills found.
37
+ * Returns skill metadata for any new skills found in the loader catalog or on disk.
41
38
  */
42
39
  export function detectNewSkills() {
43
40
  if (!baselineSkills)
44
41
  return [];
45
- const current = listSkillDirs();
46
42
  const newSkills = [];
47
- for (const dir of current) {
48
- if (baselineSkills.has(dir))
49
- continue;
50
- // Check both skill directories for the SKILL.md file
51
- const skillMdPath = resolveSkillMdPath(dir);
52
- if (!skillMdPath)
43
+ for (const skill of getCurrentSkillsForDiscovery()) {
44
+ const normalized = normalizeSkillName(skill.name);
45
+ if (baselineSkills.has(normalized))
53
46
  continue;
54
- const meta = parseSkillFrontmatter(skillMdPath);
55
- if (meta) {
56
- newSkills.push({
57
- name: meta.name || dir,
58
- description: meta.description || `Skill: ${dir}`,
59
- location: skillMdPath,
60
- });
61
- }
47
+ newSkills.push(skill);
62
48
  }
63
49
  return newSkills;
64
50
  }
65
51
  /**
66
- * Format discovered skills as an XML block matching pi's <available_skills> format.
67
- * This can be appended to the system prompt so the LLM sees them naturally.
52
+ * Reload the skill catalog when auto-mode detects newly installed skills.
53
+ * Returns discovered skills even if reload fails so callers can surface them
54
+ * in the prompt. Updates the snapshot baseline only after a successful reload
55
+ * so detection is retried after failures.
68
56
  */
69
- export function formatSkillsXml(skills) {
70
- if (skills.length === 0)
71
- return "";
72
- const entries = skills.map(s => ` <skill>
73
- <name>${escapeXml(s.name)}</name>
74
- <description>${escapeXml(s.description)}</description>
75
- <location>${escapeXml(s.location)}</location>
76
- </skill>`).join("\n");
77
- return `\n<newly_discovered_skills>
78
- The following skills were installed during this auto-mode session.
79
- Use the read tool to load a skill's file when the task matches its description.
80
-
81
- ${entries}
82
- </newly_discovered_skills>`;
57
+ export async function refreshCatalogForNewSkills(options) {
58
+ const newSkills = detectNewSkills();
59
+ if (newSkills.length === 0)
60
+ return [];
61
+ if (options?.reload) {
62
+ try {
63
+ await options.reload();
64
+ }
65
+ catch (error) {
66
+ const message = error instanceof Error ? error.message : String(error);
67
+ options.notify?.(`GSD: failed to reload skill catalog: ${message}`, "warning");
68
+ return newSkills;
69
+ }
70
+ }
71
+ snapshotSkills();
72
+ const names = newSkills.map((skill) => skill.name).join(", ");
73
+ options?.notify?.(`GSD: loaded new skills: ${names}`, "info");
74
+ return newSkills;
75
+ }
76
+ export function appendDiscoveredSkillsFallback(systemPrompt, skills) {
77
+ const missingSkills = skills.filter(skill => !systemPrompt.includes(skill.location));
78
+ if (missingSkills.length === 0)
79
+ return systemPrompt;
80
+ return `${systemPrompt}\n\n${formatDiscoveredSkillsXml(missingSkills)}`;
83
81
  }
84
82
  // ─── Internals ────────────────────────────────────────────────────────────────
85
- function listSkillDirsFrom(dir) {
86
- if (!existsSync(dir))
87
- return [];
88
- try {
89
- return readdirSync(dir, { withFileTypes: true })
90
- .filter(d => d.isDirectory())
91
- .map(d => d.name);
83
+ function formatDiscoveredSkillsXml(skills) {
84
+ const lines = [
85
+ "<newly_discovered_skills>",
86
+ " <note>These skills were detected after this session started and may be absent from &lt;available_skills&gt;. If relevant, read the skill file at its location before using it.</note>",
87
+ ];
88
+ for (const skill of skills) {
89
+ lines.push(" <skill>", ` <name>${escapeXml(skill.name)}</name>`, ` <description>${escapeXml(skill.description)}</description>`, ` <location>${escapeXml(skill.location)}</location>`, " </skill>");
92
90
  }
93
- catch {
94
- return [];
91
+ lines.push("</newly_discovered_skills>");
92
+ return lines.join("\n");
93
+ }
94
+ function escapeXml(value) {
95
+ return value.replace(/[<>&'"]/g, (char) => {
96
+ switch (char) {
97
+ case "<": return "&lt;";
98
+ case ">": return "&gt;";
99
+ case "&": return "&amp;";
100
+ case "'": return "&apos;";
101
+ case "\"": return "&quot;";
102
+ default: return char;
103
+ }
104
+ });
105
+ }
106
+ function skillSearchDirs() {
107
+ return [
108
+ join(gsdHome(), "agent", "skills"),
109
+ join(homedir(), ".agents", "skills"),
110
+ join(homedir(), ".claude", "skills"),
111
+ ];
112
+ }
113
+ function snapshotCurrentSkillNames() {
114
+ return new Set(getCurrentSkillsForDiscovery().map(skill => normalizeSkillName(skill.name)));
115
+ }
116
+ function getCurrentSkillsForDiscovery() {
117
+ const skills = new Map();
118
+ for (const skill of getInstalledSkills()) {
119
+ const normalized = normalizeSkillName(skill.name);
120
+ skills.set(normalized, {
121
+ name: skill.name,
122
+ description: skill.description || `Skill: ${skill.name}`,
123
+ location: skill.filePath,
124
+ });
95
125
  }
126
+ for (const skill of getDiskSkills()) {
127
+ const normalized = normalizeSkillName(skill.name);
128
+ if (!skills.has(normalized))
129
+ skills.set(normalized, skill);
130
+ }
131
+ return [...skills.values()];
96
132
  }
97
- function listSkillDirs() {
98
- const names = new Set();
99
- for (const name of listSkillDirsFrom(GSD_SKILLS_DIR))
100
- names.add(name);
101
- for (const name of listSkillDirsFrom(SKILLS_DIR))
102
- names.add(name);
103
- for (const name of listSkillDirsFrom(CLAUDE_SKILLS_DIR))
104
- names.add(name);
105
- return [...names];
133
+ function getDiskSkills() {
134
+ const skills = new Map();
135
+ for (const dir of skillSearchDirs()) {
136
+ if (!existsSync(dir))
137
+ continue;
138
+ let entries;
139
+ try {
140
+ entries = readdirSync(dir, { withFileTypes: true });
141
+ }
142
+ catch {
143
+ continue;
144
+ }
145
+ for (const entry of entries) {
146
+ if (!entry.isDirectory() && !entry.isSymbolicLink())
147
+ continue;
148
+ const skillMdPath = join(dir, entry.name, "SKILL.md");
149
+ if (!existsSync(skillMdPath))
150
+ continue;
151
+ const meta = parseSkillFrontmatter(skillMdPath);
152
+ const name = meta?.name || entry.name;
153
+ const normalized = normalizeSkillName(name);
154
+ if (skills.has(normalized))
155
+ continue;
156
+ skills.set(normalized, {
157
+ name,
158
+ description: meta?.description || `Skill: ${name}`,
159
+ location: skillMdPath,
160
+ });
161
+ }
162
+ }
163
+ return [...skills.values()];
106
164
  }
107
165
  function parseSkillFrontmatter(path) {
108
166
  try {
109
167
  const content = readFileSync(path, "utf-8");
110
- // Use indexOf instead of [\s\S]*? regex to avoid backtracking (#468)
111
- if (!content.startsWith('---\n'))
168
+ if (!content.startsWith("---\n"))
112
169
  return null;
113
- const endIdx = content.indexOf('\n---', 4);
170
+ const endIdx = content.indexOf("\n---", 4);
114
171
  if (endIdx === -1)
115
172
  return null;
116
173
  const fm = content.slice(4, endIdx);
@@ -127,18 +184,3 @@ function parseSkillFrontmatter(path) {
127
184
  return null;
128
185
  }
129
186
  }
130
- function resolveSkillMdPath(skillName) {
131
- for (const dir of [GSD_SKILLS_DIR, SKILLS_DIR, CLAUDE_SKILLS_DIR]) {
132
- const candidate = join(dir, skillName, "SKILL.md");
133
- if (existsSync(candidate))
134
- return candidate;
135
- }
136
- return null;
137
- }
138
- function escapeXml(text) {
139
- return text
140
- .replace(/&/g, "&amp;")
141
- .replace(/</g, "&lt;")
142
- .replace(/>/g, "&gt;")
143
- .replace(/"/g, "&quot;");
144
- }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Per-unit skill catalog scoping for GSD auto and workflow dispatch.
3
+ */
4
+ import { resolveSkillManifest } from "./skill-manifest.js";
5
+ import { normalizeSkillName } from "./skills.js";
6
+ import { resolveManifest } from "./unit-context-manifest.js";
7
+ /**
8
+ * Resolve which skill names should appear in `<available_skills>` for a unit.
9
+ * Returns `undefined` for full catalog, `[]` for suppressed catalog, or a
10
+ * name list for allowlist mode.
11
+ */
12
+ export function resolveVisibleSkillNames(unitType) {
13
+ if (!unitType)
14
+ return undefined;
15
+ const unitManifest = resolveManifest(unitType);
16
+ if (unitManifest) {
17
+ switch (unitManifest.skills.mode) {
18
+ case "none":
19
+ return [];
20
+ case "all":
21
+ return undefined;
22
+ case "allowlist":
23
+ return [...unitManifest.skills.skills];
24
+ }
25
+ }
26
+ const legacyAllowlist = resolveSkillManifest(unitType);
27
+ return legacyAllowlist ?? undefined;
28
+ }
29
+ /** Whether this unit narrows or suppresses the skill catalog (not mode "all"). */
30
+ export function unitHasSkillManifest(unitType) {
31
+ if (!unitType)
32
+ return false;
33
+ const unitManifest = resolveManifest(unitType);
34
+ if (unitManifest) {
35
+ return unitManifest.skills.mode !== "all";
36
+ }
37
+ return resolveSkillManifest(unitType) !== null;
38
+ }
39
+ /** Apply unit manifest skill policy via setVisibleSkills. */
40
+ export function applyUnitSkillVisibility(pi, unitType) {
41
+ pi.setVisibleSkills(resolveVisibleSkillNames(unitType));
42
+ }
43
+ /** Installed skill names visible for a unit per manifest policy. */
44
+ export function effectiveSkillNamesForUnit(unitType, installed) {
45
+ const visible = resolveVisibleSkillNames(unitType);
46
+ if (visible === undefined)
47
+ return installed;
48
+ if (visible.length === 0)
49
+ return [];
50
+ const allowed = new Set(visible.map(normalizeSkillName));
51
+ return installed.filter((name) => allowed.has(normalizeSkillName(name)));
52
+ }
@@ -6,14 +6,11 @@
6
6
  * "actively loaded" skills (read via tool calls during execution).
7
7
  *
8
8
  * Data flow:
9
- * 1. At dispatch, captureAvailableSkills() records skills from the system prompt
9
+ * 1. At dispatch, captureAvailableSkills(names) records catalog skill names
10
10
  * 2. During execution, recordSkillRead() tracks explicit SKILL.md reads
11
11
  * 3. At unit completion, getAndClearSkills() returns the loaded list for metrics
12
12
  */
13
- import { existsSync, readdirSync } from "node:fs";
14
- import { join } from "node:path";
15
- import { gsdHome } from "./gsd-home.js";
16
- import { homedir } from "node:os";
13
+ import { getInstalledSkillNames } from "./skills.js";
17
14
  // ─── In-memory state ──────────────────────────────────────────────────────────
18
15
  /** Skills available in the system prompt for the current unit */
19
16
  let availableSkills = [];
@@ -22,17 +19,10 @@ const activelyLoadedSkills = new Set();
22
19
  // ─── Public API ───────────────────────────────────────────────────────────────
23
20
  /**
24
21
  * Capture the list of available skill names at dispatch time.
25
- * Called before each unit starts.
22
+ * Callers should pass names from resourceLoader / {@link getInstalledSkillNames}.
26
23
  */
27
- export function captureAvailableSkills() {
28
- const gsdSkillsDir = join(gsdHome(), "agent", "skills");
29
- const skillsDir = join(homedir(), ".agents", "skills");
30
- const claudeSkillsDir = join(homedir(), ".claude", "skills");
31
- const gsdNames = listSkillNames(gsdSkillsDir);
32
- const names = listSkillNames(skillsDir);
33
- const claudeNames = listSkillNames(claudeSkillsDir);
34
- const all = new Set([...gsdNames, ...names, ...claudeNames]);
35
- availableSkills = [...all];
24
+ export function captureAvailableSkills(skillNames) {
25
+ availableSkills = [...skillNames];
36
26
  activelyLoadedSkills.clear();
37
27
  }
38
28
  /**
@@ -91,16 +81,7 @@ export function detectStaleSkills(units, thresholdDays) {
91
81
  const lastUsed = getSkillLastUsed(units);
92
82
  const cutoff = Date.now() - (thresholdDays * 24 * 60 * 60 * 1000);
93
83
  const stale = [];
94
- // Check all installed skills, not just those with usage data
95
- const gsdSkillsDir = join(gsdHome(), "agent", "skills");
96
- const skillsDir = join(homedir(), ".agents", "skills");
97
- const claudeSkillsDir = join(homedir(), ".claude", "skills");
98
- const installedSet = new Set([
99
- ...listSkillNames(gsdSkillsDir),
100
- ...listSkillNames(skillsDir),
101
- ...listSkillNames(claudeSkillsDir),
102
- ]);
103
- const installed = [...installedSet];
84
+ const installed = getInstalledSkillNames();
104
85
  for (const skill of installed) {
105
86
  const lastTs = lastUsed.get(skill);
106
87
  if (lastTs === undefined || lastTs < cutoff) {
@@ -109,17 +90,3 @@ export function detectStaleSkills(units, thresholdDays) {
109
90
  }
110
91
  return stale;
111
92
  }
112
- // ─── Internals ────────────────────────────────────────────────────────────────
113
- function listSkillNames(skillsDir) {
114
- if (!existsSync(skillsDir))
115
- return [];
116
- try {
117
- return readdirSync(skillsDir, { withFileTypes: true })
118
- .filter(d => d.isDirectory() && !d.name.startsWith("."))
119
- .filter(d => existsSync(join(skillsDir, d.name, "SKILL.md")))
120
- .map(d => d.name);
121
- }
122
- catch {
123
- return [];
124
- }
125
- }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: gsd-headless
3
- description: Orchestrate GSD (Git Ship Done) projects programmatically via headless CLI. Use when an agent needs to create milestones from specs, execute software development workflows, monitor task progress, check project status, or control GSD execution (pause/stop/skip/steer). Triggers on requests to "run gsd", "create milestone", "execute project", "check gsd status", "orchestrate development", "run headless workflow", or any programmatic interaction with the GSD project management system. Essential for building orchestrators that coordinate multiple GSD workers.
3
+ description: Orchestrate GSD (Git Ship Done) projects programmatically via headless CLI. Use when an agent needs to create milestones from specs, execute dev workflows, monitor progress, check status, or control execution (pause/stop/skip/steer). Triggers on "run gsd", "create milestone", "execute project", "check gsd status", "orchestrate development", "run headless workflow", or building orchestrators that coordinate multiple GSD workers.
4
4
  ---
5
5
 
6
6
  # GSD Headless Orchestration
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Canonical skill access for GSD extension code.
3
+ *
4
+ * Prefer {@link getInstalledSkills} (ResourceLoader / getLoadedSkills cache)
5
+ * over ad-hoc directory scans.
6
+ */
7
+ import { getLoadedSkills } from "@gsd/pi-coding-agent";
8
+ import { resolveSkillReference } from "./preferences-skills.js";
9
+ /** Normalize a skill reference the same way preference matching does. */
10
+ export function normalizeSkillName(ref) {
11
+ return ref.trim().toLowerCase();
12
+ }
13
+ /** Installed skills from the pi loader cache, or an explicit override (tests). */
14
+ export function getInstalledSkills(override) {
15
+ if (override)
16
+ return override;
17
+ return typeof getLoadedSkills === "function" ? getLoadedSkills() : [];
18
+ }
19
+ /** Skill names from the installed catalog. */
20
+ export function getInstalledSkillNames(skills) {
21
+ return getInstalledSkills(skills).map((skill) => skill.name);
22
+ }
23
+ /** Snapshot normalized skill names for auto-mode diffing. */
24
+ export function snapshotInstalledSkillNames(skills) {
25
+ return new Set(getInstalledSkillNames(skills).map(normalizeSkillName));
26
+ }
27
+ /** Names present now but absent from `baseline`. */
28
+ export function detectNewlyInstalledSkills(baseline, skills) {
29
+ const current = snapshotInstalledSkillNames(skills);
30
+ return [...current].filter((name) => !baseline.has(name));
31
+ }
32
+ /**
33
+ * Resolve a preference skill reference to a path, validating against the
34
+ * installed catalog when loader data is available.
35
+ */
36
+ export function resolveInstalledSkill(ref, cwd, skills) {
37
+ const resolution = resolveSkillReference(ref, cwd);
38
+ const installed = getInstalledSkills(skills);
39
+ if (installed.length === 0) {
40
+ return resolution;
41
+ }
42
+ const byName = new Map(installed.map((skill) => [normalizeSkillName(skill.name), skill]));
43
+ const normalizedRef = normalizeSkillName(ref);
44
+ const byRef = byName.get(normalizedRef);
45
+ if (byRef) {
46
+ return {
47
+ ...resolution,
48
+ resolvedPath: byRef.filePath,
49
+ method: resolution.method === "unresolved" ? "user-skill" : resolution.method,
50
+ skill: byRef,
51
+ };
52
+ }
53
+ if (resolution.resolvedPath) {
54
+ const match = installed.find((skill) => skill.filePath === resolution.resolvedPath);
55
+ if (match) {
56
+ return { ...resolution, skill: match };
57
+ }
58
+ }
59
+ return resolution;
60
+ }