gsd-pi 2.20.0 → 2.22.0

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 (279) hide show
  1. package/README.md +12 -0
  2. package/dist/cli.js +21 -18
  3. package/dist/help-text.d.ts +2 -0
  4. package/dist/help-text.js +47 -0
  5. package/dist/loader.js +2 -16
  6. package/dist/mcp-server.d.ts +18 -0
  7. package/dist/mcp-server.js +53 -0
  8. package/dist/onboarding.d.ts +0 -6
  9. package/dist/onboarding.js +0 -28
  10. package/dist/resources/agents/javascript-pro.md +280 -0
  11. package/dist/resources/agents/typescript-pro.md +255 -0
  12. package/dist/resources/extensions/bg-shell/index.ts +14 -2
  13. package/dist/resources/extensions/bg-shell/utilities.ts +14 -0
  14. package/dist/resources/extensions/browser-tools/{core.js → core.ts} +329 -190
  15. package/dist/resources/extensions/gsd/auto-dashboard.ts +2 -1
  16. package/dist/resources/extensions/gsd/auto-prompts.ts +42 -1
  17. package/dist/resources/extensions/gsd/auto-worktree.ts +35 -2
  18. package/dist/resources/extensions/gsd/auto.ts +116 -10
  19. package/dist/resources/extensions/gsd/claude-import.ts +656 -0
  20. package/dist/resources/extensions/gsd/collision-diagnostics.ts +332 -0
  21. package/dist/resources/extensions/gsd/commands.ts +60 -7
  22. package/dist/resources/extensions/gsd/diff-context.ts +220 -0
  23. package/dist/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
  24. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -1
  25. package/dist/resources/extensions/gsd/doctor.ts +12 -4
  26. package/dist/resources/extensions/gsd/file-watcher.ts +97 -0
  27. package/dist/resources/extensions/gsd/files.ts +1 -1
  28. package/dist/resources/extensions/gsd/forensics.ts +596 -0
  29. package/dist/resources/extensions/gsd/git-service.ts +2 -1
  30. package/dist/resources/extensions/gsd/github-client.ts +235 -0
  31. package/dist/resources/extensions/gsd/gitignore.ts +1 -0
  32. package/dist/resources/extensions/gsd/marketplace-discovery.ts +507 -0
  33. package/dist/resources/extensions/gsd/mcp-server.ts +87 -0
  34. package/dist/resources/extensions/gsd/namespaced-registry.ts +467 -0
  35. package/dist/resources/extensions/gsd/namespaced-resolver.ts +307 -0
  36. package/dist/resources/extensions/gsd/plugin-importer.ts +410 -0
  37. package/dist/resources/extensions/gsd/preferences.ts +14 -3
  38. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  39. package/dist/resources/extensions/gsd/prompts/forensics.md +71 -0
  40. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  41. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  42. package/dist/resources/extensions/gsd/prompts/system.md +12 -3
  43. package/dist/resources/extensions/gsd/roadmap-slices.ts +1 -1
  44. package/dist/resources/extensions/gsd/session-forensics.ts +5 -5
  45. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +351 -0
  46. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
  47. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +13 -0
  48. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
  49. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +118 -0
  50. package/dist/resources/extensions/gsd/tests/marketplace-discovery.test.ts +202 -0
  51. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
  52. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
  53. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
  54. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +105 -0
  55. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +481 -0
  56. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
  57. package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +21 -2
  58. package/dist/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +8 -1
  59. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +11 -0
  60. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +120 -0
  61. package/dist/resources/extensions/gsd/token-counter.ts +45 -0
  62. package/dist/resources/extensions/gsd/visualizer-data.ts +2 -2
  63. package/dist/resources/extensions/gsd/worktree-manager.ts +29 -1
  64. package/dist/resources/extensions/gsd/worktree.ts +3 -0
  65. package/dist/resources/extensions/mcporter/index.ts +90 -7
  66. package/dist/resources/extensions/search-the-web/native-search.ts +2 -0
  67. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +9 -1
  68. package/dist/resources/extensions/search-the-web/url-utils.ts +35 -1
  69. package/dist/resources/extensions/shared/terminal.ts +1 -1
  70. package/dist/resources/extensions/universal-config/discovery.ts +4 -0
  71. package/dist/resources/extensions/universal-config/format.ts +35 -4
  72. package/dist/resources/extensions/universal-config/index.ts +5 -3
  73. package/dist/resources/extensions/universal-config/scanners.ts +65 -2
  74. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +9 -1
  75. package/dist/resources/extensions/universal-config/tests/format.test.ts +22 -6
  76. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +18 -0
  77. package/dist/resources/extensions/universal-config/types.ts +20 -1
  78. package/dist/resources/skills/lint/SKILL.md +141 -0
  79. package/dist/resources/skills/review/SKILL.md +214 -0
  80. package/dist/resources/skills/test/SKILL.md +201 -0
  81. package/dist/tool-bootstrap.js +2 -1
  82. package/dist/wizard.js +2 -0
  83. package/package.json +12 -7
  84. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  85. package/packages/pi-ai/dist/providers/azure-openai-responses.js +12 -1
  86. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  87. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  88. package/packages/pi-ai/dist/providers/openai-responses.js +12 -1
  89. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  90. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +201 -0
  91. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +9 -0
  92. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +762 -0
  93. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +19 -0
  94. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +1 -0
  95. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +9 -0
  96. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +3 -0
  97. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +230 -0
  98. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +87 -0
  99. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +32 -0
  100. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +169 -0
  101. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +21 -0
  102. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +88 -0
  103. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +36 -0
  104. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +21 -0
  105. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +22 -0
  106. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +23 -0
  107. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +8 -0
  108. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +41 -0
  109. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +21 -0
  110. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +4 -0
  111. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +63 -0
  112. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +10 -0
  113. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +5 -0
  114. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +4 -0
  115. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +3 -0
  116. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +46 -0
  117. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +24 -0
  118. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +12 -0
  119. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +63 -0
  120. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +13 -0
  121. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +12 -0
  122. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +2 -0
  123. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +6 -0
  124. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +6 -0
  125. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +2 -0
  126. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +5 -0
  127. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +6 -0
  128. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +13 -0
  129. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +8 -0
  130. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +10 -0
  131. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +5 -0
  132. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +4 -0
  133. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +3 -0
  134. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +46 -0
  135. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +24 -0
  136. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +12 -0
  137. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +63 -0
  138. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +13 -0
  139. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +12 -0
  140. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +2 -0
  141. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +6 -0
  142. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +6 -0
  143. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +2 -0
  144. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +5 -0
  145. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +6 -0
  146. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +13 -0
  147. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +8 -0
  148. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +12 -0
  149. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +12 -0
  150. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +68 -0
  151. package/packages/pi-ai/package.json +3 -0
  152. package/packages/pi-ai/pnpm-lock.yaml +2022 -0
  153. package/packages/pi-ai/src/providers/azure-openai-responses.ts +12 -1
  154. package/packages/pi-ai/src/providers/openai-responses.ts +12 -1
  155. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  156. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  158. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  160. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  161. package/packages/pi-coding-agent/dist/core/extensions/loader.js +12 -1
  162. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  163. package/packages/pi-coding-agent/dist/core/extensions/loader.test.d.ts +2 -0
  164. package/packages/pi-coding-agent/dist/core/extensions/loader.test.d.ts.map +1 -0
  165. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +113 -0
  166. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -0
  167. package/packages/pi-coding-agent/dist/core/extensions/project-trust.d.ts +4 -0
  168. package/packages/pi-coding-agent/dist/core/extensions/project-trust.d.ts.map +1 -0
  169. package/packages/pi-coding-agent/dist/core/extensions/project-trust.js +42 -0
  170. package/packages/pi-coding-agent/dist/core/extensions/project-trust.js.map +1 -0
  171. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts +1 -0
  172. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  173. package/packages/pi-coding-agent/dist/core/resolve-config-value.js +18 -0
  174. package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.d.ts +2 -0
  176. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.d.ts.map +1 -0
  177. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +114 -0
  178. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -0
  179. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  180. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +8 -2
  181. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  182. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts +2 -0
  183. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  184. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +23 -9
  185. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.d.ts +2 -0
  187. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.d.ts.map +1 -0
  188. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +67 -0
  189. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -0
  190. package/packages/pi-coding-agent/package.json +1 -1
  191. package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
  192. package/packages/pi-coding-agent/scripts/copy-assets.cjs +24 -0
  193. package/packages/pi-coding-agent/src/core/extensions/index.ts +3 -0
  194. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +141 -0
  195. package/packages/pi-coding-agent/src/core/extensions/loader.ts +14 -1
  196. package/packages/pi-coding-agent/src/core/extensions/project-trust.ts +51 -0
  197. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +132 -0
  198. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +20 -0
  199. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +7 -2
  200. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +98 -0
  201. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +24 -9
  202. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  203. package/packages/pi-tui/dist/tui.js +2 -2
  204. package/packages/pi-tui/dist/tui.js.map +1 -1
  205. package/packages/pi-tui/package.json +3 -1
  206. package/packages/pi-tui/src/tui.ts +2 -2
  207. package/src/resources/agents/javascript-pro.md +280 -0
  208. package/src/resources/agents/typescript-pro.md +255 -0
  209. package/src/resources/extensions/bg-shell/index.ts +14 -2
  210. package/src/resources/extensions/bg-shell/utilities.ts +14 -0
  211. package/src/resources/extensions/browser-tools/{core.js → core.ts} +329 -190
  212. package/src/resources/extensions/gsd/auto-dashboard.ts +2 -1
  213. package/src/resources/extensions/gsd/auto-prompts.ts +42 -1
  214. package/src/resources/extensions/gsd/auto-worktree.ts +35 -2
  215. package/src/resources/extensions/gsd/auto.ts +116 -10
  216. package/src/resources/extensions/gsd/claude-import.ts +656 -0
  217. package/src/resources/extensions/gsd/collision-diagnostics.ts +332 -0
  218. package/src/resources/extensions/gsd/commands.ts +60 -7
  219. package/src/resources/extensions/gsd/diff-context.ts +220 -0
  220. package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
  221. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -1
  222. package/src/resources/extensions/gsd/doctor.ts +12 -4
  223. package/src/resources/extensions/gsd/file-watcher.ts +97 -0
  224. package/src/resources/extensions/gsd/files.ts +1 -1
  225. package/src/resources/extensions/gsd/forensics.ts +596 -0
  226. package/src/resources/extensions/gsd/git-service.ts +2 -1
  227. package/src/resources/extensions/gsd/github-client.ts +235 -0
  228. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  229. package/src/resources/extensions/gsd/marketplace-discovery.ts +507 -0
  230. package/src/resources/extensions/gsd/mcp-server.ts +87 -0
  231. package/src/resources/extensions/gsd/namespaced-registry.ts +467 -0
  232. package/src/resources/extensions/gsd/namespaced-resolver.ts +307 -0
  233. package/src/resources/extensions/gsd/plugin-importer.ts +410 -0
  234. package/src/resources/extensions/gsd/preferences.ts +14 -3
  235. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  236. package/src/resources/extensions/gsd/prompts/forensics.md +71 -0
  237. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  238. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  239. package/src/resources/extensions/gsd/prompts/system.md +12 -3
  240. package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
  241. package/src/resources/extensions/gsd/session-forensics.ts +5 -5
  242. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +351 -0
  243. package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
  244. package/src/resources/extensions/gsd/tests/context-compression.test.ts +13 -0
  245. package/src/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
  246. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +118 -0
  247. package/src/resources/extensions/gsd/tests/marketplace-discovery.test.ts +202 -0
  248. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
  249. package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
  250. package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
  251. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +105 -0
  252. package/src/resources/extensions/gsd/tests/plugin-importer-live.test.ts +481 -0
  253. package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
  254. package/src/resources/extensions/gsd/tests/preferences-git.test.ts +21 -2
  255. package/src/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +8 -1
  256. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +11 -0
  257. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +120 -0
  258. package/src/resources/extensions/gsd/token-counter.ts +45 -0
  259. package/src/resources/extensions/gsd/visualizer-data.ts +2 -2
  260. package/src/resources/extensions/gsd/worktree-manager.ts +29 -1
  261. package/src/resources/extensions/gsd/worktree.ts +3 -0
  262. package/src/resources/extensions/mcporter/index.ts +90 -7
  263. package/src/resources/extensions/search-the-web/native-search.ts +2 -0
  264. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +9 -1
  265. package/src/resources/extensions/search-the-web/url-utils.ts +35 -1
  266. package/src/resources/extensions/shared/terminal.ts +1 -1
  267. package/src/resources/extensions/universal-config/discovery.ts +4 -0
  268. package/src/resources/extensions/universal-config/format.ts +35 -4
  269. package/src/resources/extensions/universal-config/index.ts +5 -3
  270. package/src/resources/extensions/universal-config/scanners.ts +65 -2
  271. package/src/resources/extensions/universal-config/tests/discovery.test.ts +9 -1
  272. package/src/resources/extensions/universal-config/tests/format.test.ts +22 -6
  273. package/src/resources/extensions/universal-config/tests/scanners.test.ts +18 -0
  274. package/src/resources/extensions/universal-config/types.ts +20 -1
  275. package/src/resources/skills/lint/SKILL.md +141 -0
  276. package/src/resources/skills/review/SKILL.md +214 -0
  277. package/src/resources/skills/test/SKILL.md +201 -0
  278. package/dist/resources/extensions/browser-tools/core.d.ts +0 -205
  279. package/src/resources/extensions/browser-tools/core.d.ts +0 -205
@@ -0,0 +1,214 @@
1
+ # Claude Marketplace Import
2
+
3
+ This document describes the Claude marketplace import feature in GSD: what it reads, what it imports, what it persists, and what it does not translate into active GSD/Pi runtime behavior.
4
+
5
+ ---
6
+
7
+ ## What this feature does
8
+
9
+ GSD can read Claude Code marketplace catalogs, inspect the plugins they reference, and import selected Claude skills into GSD/Pi while preserving Claude-style namespace identity.
10
+
11
+ The interactive entry point is:
12
+
13
+ ```text
14
+ /gsd prefs import-claude
15
+ ```
16
+
17
+ You can also choose scope explicitly:
18
+
19
+ ```text
20
+ /gsd prefs import-claude global
21
+ /gsd prefs import-claude project
22
+ ```
23
+
24
+ ---
25
+
26
+ ## Claude Code model this feature follows
27
+
28
+ Anthropic documents Claude marketplaces as sources users add with:
29
+
30
+ ```text
31
+ /plugin marketplace add <github repo or local path>
32
+ ```
33
+
34
+ A marketplace contains a catalog at:
35
+
36
+ ```text
37
+ .claude-plugin/marketplace.json
38
+ ```
39
+
40
+ Anthropic distinguishes between:
41
+
42
+ - **Marketplace source** — where Claude fetches `marketplace.json`
43
+ - **Plugin source** — where Claude fetches each plugin listed in that marketplace
44
+ - **Installed plugin cache** — Claude copies installed plugin payloads into:
45
+
46
+ ```text
47
+ ~/.claude/plugins/cache
48
+ ```
49
+
50
+ Anthropic also documents user-added marketplace sources under:
51
+
52
+ ```text
53
+ ~/.claude/plugins/marketplaces
54
+ ```
55
+
56
+ GSD aligns its Claude import flow to that model.
57
+
58
+ ---
59
+
60
+ ## Where GSD looks
61
+
62
+ For Claude plugin and marketplace material, GSD prefers Claude-managed locations first:
63
+
64
+ 1. `~/.claude/plugins/marketplaces`
65
+ 2. `~/.claude/plugins/cache`
66
+ 3. `~/.claude/plugins`
67
+
68
+ After that, GSD still allows local clone-style convenience paths such as sibling repos or `~/repos/...` paths. Those fallbacks remain supported for developer workflows, but they are not the primary Claude storage model.
69
+
70
+ ---
71
+
72
+ ## What GSD imports
73
+
74
+ ### Imported into GSD/Pi settings
75
+
76
+ - Claude skills discovered directly from configured skill roots
77
+ - Marketplace-derived skills
78
+
79
+ Imported marketplace skills preserve canonical namespace identity, for example:
80
+
81
+ ```text
82
+ python3-development:stinkysnake
83
+ scientific-method:experiment-protocol
84
+ ```
85
+
86
+ ### Discovered, modeled, and validated
87
+
88
+ - Marketplace-derived agents
89
+
90
+ ### Discovered but not translated into active Pi-native runtime behavior
91
+
92
+ - hooks
93
+ - MCP server definitions
94
+ - LSP server definitions
95
+ - other plugin metadata that does not currently map directly into active GSD/Pi runtime surfaces
96
+
97
+ ---
98
+
99
+ ## Import flow
100
+
101
+ The import flow does the following:
102
+
103
+ 1. discover Claude skills and marketplace/plugin roots
104
+ 2. identify marketplace roots by checking for `.claude-plugin/marketplace.json`
105
+ 3. inspect discovered plugins and inventory their components
106
+ 4. let you select components to import
107
+ 5. validate the selection for canonical conflicts and ambiguity
108
+ 6. persist imported resources into GSD/Pi settings
109
+
110
+ ---
111
+
112
+ ## Namespace behavior
113
+
114
+ GSD preserves Claude plugin namespace semantics rather than flattening plugin components into anonymous global names.
115
+
116
+ ### Canonical references
117
+
118
+ Canonical references remain available for imported components:
119
+
120
+ - skills: `plugin-name:skill-name`
121
+ - agents: `plugin-name:agent-name`
122
+
123
+ ### Shorthand
124
+
125
+ GSD supports shorthand lookup when it is unambiguous.
126
+
127
+ ### Local-first resolution
128
+
129
+ When a namespaced component refers to another component by bare name, GSD tries the same plugin namespace first before broader lookup.
130
+
131
+ ---
132
+
133
+ ## Important safeguard: marketplace agent directories are not stored as package sources
134
+
135
+ Claude plugin agent directories are markdown agent-definition directories, for example:
136
+
137
+ ```text
138
+ .../plugins/python3-development/agents
139
+ ```
140
+
141
+ GSD does **not** persist imported marketplace agent directories into:
142
+
143
+ ```json
144
+ settings.packages
145
+ ```
146
+
147
+ This is intentional.
148
+
149
+ ### Why
150
+
151
+ Persisting an `.../agents` directory into `settings.packages` can cause Pi startup to treat that directory as an extension/package root. In real host validation, that produced extension loader failures such as:
152
+
153
+ ```text
154
+ Cannot find module '.../agents'
155
+ ```
156
+
157
+ GSD now avoids writing those entries.
158
+
159
+ ---
160
+
161
+ ## Settings effects
162
+
163
+ ### Skills
164
+
165
+ Imported skills are persisted into Pi skill settings. Depending on the selection path, they may also be added to GSD preferences.
166
+
167
+ ### Marketplace agents
168
+
169
+ Marketplace agents remain part of the import model and validation surface, but their `agents/` directories are not persisted as package roots.
170
+
171
+ ---
172
+
173
+ ## Diagnostics
174
+
175
+ GSD distinguishes between:
176
+
177
+ - **canonical conflicts** — hard errors
178
+ - **shorthand overlaps** — warnings when canonical names remain distinct
179
+ - **alias conflicts** — diagnostics for alias collisions or shadowing
180
+
181
+ This allows imported marketplace content to be validated without reporting valid overlap as fatal breakage.
182
+
183
+ ---
184
+
185
+ ## Verification status of this feature
186
+
187
+ This feature has been verified in three ways:
188
+
189
+ 1. **Contract/unit tests** for parsing, namespacing, resolution, diagnostics, and import behavior
190
+ 2. **Portable integration-style tests** using local or cloned marketplace fixtures
191
+ 3. **Real host validation** against the installed `gsd` binary and actual Claude-managed directories on the host machine
192
+
193
+ Real host validation included:
194
+
195
+ - clean startup of the installed `gsd` binary after fixing stale bad settings
196
+ - successful invocation of an imported skill (`/stinkysnake`)
197
+ - successful execution of `/gsd prefs import-claude global`
198
+ - verification that imported marketplace agent directories were **not** reintroduced into `settings.packages`
199
+
200
+ ---
201
+
202
+ ## Current limitations
203
+
204
+ - GSD does not yet translate every Claude plugin component type into active Pi-native runtime behavior
205
+ - marketplace-derived agents are not persisted as package roots, by design
206
+ - clone-style local fallbacks still exist for developer convenience, even though Claude-managed marketplace/plugin locations are preferred first
207
+
208
+ ---
209
+
210
+ ## References
211
+
212
+ - Anthropic: Claude Code settings
213
+ - Anthropic: Create and distribute a plugin marketplace
214
+ - Anthropic: Plugins and plugin reference
@@ -10,6 +10,7 @@ Full documentation for `~/.gsd/preferences.md` (global) and `.gsd/preferences.md
10
10
  - Prefer explicit skill names or absolute paths.
11
11
  - Use absolute paths for personal/local skills when you want zero ambiguity.
12
12
  - These preferences guide which skills GSD should load and follow; they do not override higher-priority instructions in the current conversation.
13
+ - For Claude marketplace/plugin import behavior, see `~/.gsd/agent/extensions/gsd/docs/claude-marketplace-import.md`.
13
14
 
14
15
  ---
15
16
 
@@ -123,7 +124,7 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
123
124
  - `commit_type`: string — override the conventional commit type prefix. Must be one of: `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `ci`, `build`, `style`. Default: inferred from diff content.
124
125
  - `main_branch`: string — the primary branch name for new git repos (e.g., `"main"`, `"master"`, `"trunk"`). Also used by `getMainBranch()` as the preferred branch when auto-detection is ambiguous. Default: `"main"`.
125
126
  - `merge_strategy`: `"squash"` or `"merge"` — controls how worktree branches are merged back. `"squash"` combines all commits into one; `"merge"` preserves individual commits. Default: `"squash"`.
126
- - `isolation`: `"worktree"` or `"branch"` — controls auto-mode git isolation strategy. `"worktree"` creates a milestone worktree for isolated work; `"branch"` works directly in the project root (useful for submodule-heavy repos). Default: `"worktree"`.
127
+ - `isolation`: `"worktree"`, `"branch"`, or `"none"` — controls auto-mode git isolation strategy. `"worktree"` creates a milestone worktree for isolated work; `"branch"` works directly in the project root but creates a milestone branch (useful for submodule-heavy repos); `"none"` works directly on the current branch with no worktree or milestone branch (ideal for step-mode with hot reloads). Default: `"worktree"`.
127
128
  - `commit_docs`: boolean — when `false`, prevents GSD from committing `.gsd/` planning artifacts to git. The `.gsd/` folder is added to `.gitignore` and kept local-only. Useful for teams where only some members use GSD, or when company policy requires a clean repository. Default: `true`.
128
129
  - `worktree_post_create`: string — script to run after a worktree is created (both auto-mode and manual `/worktree`). Receives `SOURCE_DIR` and `WORKTREE_DIR` as environment variables. Can be absolute or relative to project root. Runs with 30-second timeout. Failure is non-fatal (logged as warning). Default: none.
129
130
 
@@ -5,7 +5,7 @@ import { loadFile, parsePlan, parseRoadmap, parseSummary, saveFile, parseTaskPla
5
5
  import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTaskFiles, resolveTasksDir, milestonesDir, gsdRoot, relMilestoneFile, relSliceFile, relTaskFile, relSlicePath, relGsdRootFile, resolveGsdRootFile } from "./paths.js";
6
6
  import { deriveState, isMilestoneComplete } from "./state.js";
7
7
  import { loadEffectiveGSDPreferences, type GSDPreferences } from "./preferences.js";
8
- import { listWorktrees } from "./worktree-manager.js";
8
+ import { listWorktrees, resolveGitDir } from "./worktree-manager.js";
9
9
  import { abortAndReset } from "./git-self-heal.js";
10
10
  import { RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
11
11
  import { nativeIsRepo, nativeWorktreeRemove, nativeBranchList, nativeBranchDelete, nativeLsFiles, nativeRmCached } from "./native-git-bridge.js";
@@ -474,15 +474,19 @@ async function checkGitHealth(
474
474
  issues: DoctorIssue[],
475
475
  fixesApplied: string[],
476
476
  shouldFix: (code: DoctorIssueCode) => boolean,
477
+ isolationMode: "none" | "worktree" | "branch" = "worktree",
477
478
  ): Promise<void> {
478
479
  // Degrade gracefully if not a git repo
479
480
  if (!nativeIsRepo(basePath)) {
480
481
  return; // Not a git repo — skip all git health checks
481
482
  }
482
483
 
483
- const gitDir = join(basePath, ".git");
484
+ const gitDir = resolveGitDir(basePath);
484
485
 
485
- // ── Orphaned auto-worktrees ──────────────────────────────────────────
486
+ // ── Orphaned auto-worktrees & Stale milestone branches ────────────────
487
+ // These checks only apply in worktree/branch modes — skip in none mode
488
+ // where no milestone worktrees or branches are created.
489
+ if (isolationMode !== "none") {
486
490
  try {
487
491
  const worktrees = listWorktrees(basePath);
488
492
  const milestoneWorktrees = worktrees.filter(wt => wt.branch.startsWith("milestone/"));
@@ -576,6 +580,7 @@ async function checkGitHealth(
576
580
  } catch {
577
581
  // listWorktrees or deriveState failed — skip worktree/branch checks
578
582
  }
583
+ } // end isolationMode !== "none"
579
584
 
580
585
  // ── Corrupt merge state ────────────────────────────────────────────────
581
586
  try {
@@ -976,7 +981,10 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
976
981
  }
977
982
 
978
983
  // Git health checks (orphaned worktrees, stale branches, corrupt merge state, tracked runtime files)
979
- await checkGitHealth(basePath, issues, fixesApplied, shouldFix);
984
+ const isolationMode: "none" | "worktree" | "branch" =
985
+ prefs?.preferences?.git?.isolation === "none" ? "none" :
986
+ prefs?.preferences?.git?.isolation === "branch" ? "branch" : "worktree";
987
+ await checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode);
980
988
 
981
989
  // Runtime health checks (crash locks, completed-units, hook state, activity logs, STATE.md, gitignore)
982
990
  await checkRuntimeHealth(basePath, issues, fixesApplied, shouldFix);
@@ -0,0 +1,97 @@
1
+ import type { FSWatcher } from "chokidar";
2
+ import type { EventBus } from "@gsd/pi-coding-agent";
3
+ import { relative } from "node:path";
4
+
5
+ let watcher: FSWatcher | null = null;
6
+
7
+ const EVENT_MAP: Record<string, string> = {
8
+ "settings.json": "settings-changed",
9
+ "auth.json": "auth-changed",
10
+ "models.json": "models-changed",
11
+ };
12
+
13
+ const EXTENSIONS_DIR = "extensions";
14
+
15
+ const IGNORED_PATTERNS = [
16
+ "**/sessions/**",
17
+ "**/*.tmp",
18
+ "**/*.swp",
19
+ "**/*~",
20
+ "**/.DS_Store",
21
+ ];
22
+
23
+ const DEBOUNCE_MS = 300;
24
+
25
+ /**
26
+ * Start watching `agentDir` (e.g. `~/.gsd/agent/`) for config changes.
27
+ * Emits events on the supplied EventBus when watched files are modified.
28
+ */
29
+ export async function startFileWatcher(
30
+ agentDir: string,
31
+ eventBus: EventBus,
32
+ ): Promise<void> {
33
+ if (watcher) {
34
+ await watcher.close();
35
+ }
36
+
37
+ const { watch } = await import("chokidar");
38
+
39
+ const pending = new Map<string, ReturnType<typeof setTimeout>>();
40
+
41
+ function debounceEmit(event: string): void {
42
+ const existing = pending.get(event);
43
+ if (existing) clearTimeout(existing);
44
+ pending.set(
45
+ event,
46
+ setTimeout(() => {
47
+ pending.delete(event);
48
+ eventBus.emit(event, { timestamp: Date.now() });
49
+ }, DEBOUNCE_MS),
50
+ );
51
+ }
52
+
53
+ function resolveEvent(filePath: string): string | null {
54
+ const rel = relative(agentDir, filePath);
55
+ if (rel.startsWith("..")) return null;
56
+
57
+ // Check direct file matches
58
+ for (const [file, event] of Object.entries(EVENT_MAP)) {
59
+ if (rel === file) return event;
60
+ }
61
+
62
+ // Check extensions directory
63
+ if (rel.startsWith(EXTENSIONS_DIR + "/") || rel === EXTENSIONS_DIR) {
64
+ return "extensions-changed";
65
+ }
66
+
67
+ return null;
68
+ }
69
+
70
+ watcher = watch(agentDir, {
71
+ ignoreInitial: true,
72
+ depth: 2,
73
+ ignored: IGNORED_PATTERNS,
74
+ });
75
+
76
+ for (const eventType of ["add", "change", "unlink"] as const) {
77
+ watcher.on(eventType, (filePath: string) => {
78
+ const event = resolveEvent(filePath);
79
+ if (event) debounceEmit(event);
80
+ });
81
+ }
82
+
83
+ // Wait for watcher to be ready
84
+ await new Promise<void>((resolve) => {
85
+ watcher!.on("ready", resolve);
86
+ });
87
+ }
88
+
89
+ /**
90
+ * Stop the file watcher and clean up resources.
91
+ */
92
+ export async function stopFileWatcher(): Promise<void> {
93
+ if (watcher) {
94
+ await watcher.close();
95
+ watcher = null;
96
+ }
97
+ }
@@ -436,7 +436,7 @@ function _parsePlanImpl(content: string): SlicePlan {
436
436
  let currentTask: TaskPlanEntry | null = null;
437
437
 
438
438
  for (const line of taskLines) {
439
- const cbMatch = line.match(/^-\s+\[([ xX])\]\s+\*\*(\w+):\s+(.+?)\*\*\s*(.*)/);
439
+ const cbMatch = line.match(/^-\s+\[([ xX])\]\s+\*\*([\w.]+):\s+(.+?)\*\*\s*(.*)/);
440
440
  if (cbMatch) {
441
441
  if (currentTask) tasks.push(currentTask);
442
442