gsd-pi 2.29.0 → 2.30.0-dev.7e1bbce

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 (328) hide show
  1. package/README.md +24 -17
  2. package/dist/cli.js +51 -0
  3. package/dist/extension-registry.d.ts +63 -0
  4. package/dist/extension-registry.js +166 -0
  5. package/dist/headless.js +4 -0
  6. package/dist/help-text.js +35 -0
  7. package/dist/loader.js +10 -1
  8. package/dist/resource-loader.js +11 -1
  9. package/dist/resources/extensions/async-jobs/extension-manifest.json +13 -0
  10. package/dist/resources/extensions/bg-shell/extension-manifest.json +14 -0
  11. package/dist/resources/extensions/bg-shell/process-manager.ts +13 -0
  12. package/dist/resources/extensions/browser-tools/extension-manifest.json +37 -0
  13. package/dist/resources/extensions/context7/extension-manifest.json +12 -0
  14. package/dist/resources/extensions/google-search/extension-manifest.json +12 -0
  15. package/dist/resources/extensions/gsd/auto-dashboard.ts +31 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.ts +32 -3
  17. package/dist/resources/extensions/gsd/auto-post-unit.ts +45 -13
  18. package/dist/resources/extensions/gsd/auto-prompts.ts +40 -17
  19. package/dist/resources/extensions/gsd/auto-recovery.ts +18 -23
  20. package/dist/resources/extensions/gsd/auto-start.ts +18 -32
  21. package/dist/resources/extensions/gsd/auto-worktree.ts +21 -182
  22. package/dist/resources/extensions/gsd/auto.ts +2 -24
  23. package/dist/resources/extensions/gsd/captures.ts +4 -10
  24. package/dist/resources/extensions/gsd/commands-extensions.ts +328 -0
  25. package/dist/resources/extensions/gsd/commands-handlers.ts +22 -2
  26. package/dist/resources/extensions/gsd/commands-logs.ts +13 -14
  27. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +44 -14
  28. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
  29. package/dist/resources/extensions/gsd/commands.ts +108 -24
  30. package/dist/resources/extensions/gsd/dashboard-overlay.ts +2 -1
  31. package/dist/resources/extensions/gsd/detection.ts +2 -1
  32. package/dist/resources/extensions/gsd/doctor-checks.ts +49 -1
  33. package/dist/resources/extensions/gsd/doctor-types.ts +3 -1
  34. package/dist/resources/extensions/gsd/extension-manifest.json +18 -0
  35. package/dist/resources/extensions/gsd/forensics.ts +2 -2
  36. package/dist/resources/extensions/gsd/git-service.ts +3 -2
  37. package/dist/resources/extensions/gsd/gitignore.ts +9 -63
  38. package/dist/resources/extensions/gsd/gsd-db.ts +1 -165
  39. package/dist/resources/extensions/gsd/guided-flow.ts +8 -5
  40. package/dist/resources/extensions/gsd/index.ts +16 -3
  41. package/dist/resources/extensions/gsd/json-persistence.ts +16 -1
  42. package/dist/resources/extensions/gsd/md-importer.ts +3 -2
  43. package/dist/resources/extensions/gsd/mechanical-completion.ts +430 -0
  44. package/dist/resources/extensions/gsd/migrate/command.ts +3 -2
  45. package/dist/resources/extensions/gsd/migrate/writer.ts +2 -1
  46. package/dist/resources/extensions/gsd/migrate-external.ts +123 -0
  47. package/dist/resources/extensions/gsd/paths.ts +24 -2
  48. package/dist/resources/extensions/gsd/post-unit-hooks.ts +6 -5
  49. package/dist/resources/extensions/gsd/preferences-models.ts +7 -1
  50. package/dist/resources/extensions/gsd/preferences-validation.ts +2 -1
  51. package/dist/resources/extensions/gsd/preferences.ts +10 -5
  52. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +4 -2
  53. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +26 -2
  55. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -1
  56. package/dist/resources/extensions/gsd/prompts/workflow-start.md +28 -0
  57. package/dist/resources/extensions/gsd/queue-order.ts +10 -11
  58. package/dist/resources/extensions/gsd/repo-identity.ts +148 -0
  59. package/dist/resources/extensions/gsd/resource-version.ts +99 -0
  60. package/dist/resources/extensions/gsd/roadmap-slices.ts +22 -7
  61. package/dist/resources/extensions/gsd/session-forensics.ts +4 -3
  62. package/dist/resources/extensions/gsd/session-lock.ts +53 -4
  63. package/dist/resources/extensions/gsd/session-status-io.ts +23 -41
  64. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +2 -2
  65. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  66. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +3 -3
  67. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
  68. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
  69. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
  70. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
  71. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +5 -18
  72. package/dist/resources/extensions/gsd/tests/git-service.test.ts +10 -37
  73. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +4 -4
  74. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +356 -0
  75. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
  76. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -0
  77. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
  78. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
  79. package/dist/resources/extensions/gsd/triage-resolution.ts +2 -1
  80. package/dist/resources/extensions/gsd/types.ts +2 -0
  81. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
  82. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
  83. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
  84. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
  85. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
  86. package/dist/resources/extensions/gsd/workflow-templates/registry.json +85 -0
  87. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
  88. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
  89. package/dist/resources/extensions/gsd/workflow-templates/spike.md +69 -0
  90. package/dist/resources/extensions/gsd/workflow-templates.ts +241 -0
  91. package/dist/resources/extensions/gsd/worktree-command.ts +1 -11
  92. package/dist/resources/extensions/gsd/worktree-manager.ts +3 -2
  93. package/dist/resources/extensions/gsd/worktree.ts +42 -5
  94. package/dist/resources/extensions/mac-tools/extension-manifest.json +16 -0
  95. package/dist/resources/extensions/mcp-client/index.ts +459 -0
  96. package/dist/resources/extensions/mcporter/extension-manifest.json +12 -0
  97. package/dist/resources/extensions/remote-questions/discord-adapter.ts +8 -19
  98. package/dist/resources/extensions/remote-questions/extension-manifest.json +11 -0
  99. package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
  100. package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -17
  101. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -19
  102. package/dist/resources/extensions/search-the-web/extension-manifest.json +13 -0
  103. package/dist/resources/extensions/slash-commands/extension-manifest.json +11 -0
  104. package/dist/resources/extensions/subagent/extension-manifest.json +13 -0
  105. package/dist/resources/extensions/ttsr/extension-manifest.json +11 -0
  106. package/dist/resources/extensions/universal-config/extension-manifest.json +13 -0
  107. package/dist/resources/extensions/voice/extension-manifest.json +12 -0
  108. package/dist/resources/skills/create-gsd-extension/SKILL.md +87 -0
  109. package/dist/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
  110. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
  111. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
  112. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
  113. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
  114. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
  115. package/dist/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
  116. package/dist/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
  117. package/dist/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
  118. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
  119. package/dist/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
  120. package/dist/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
  121. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
  122. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
  123. package/dist/resources/skills/create-gsd-extension/references/state-management.md +70 -0
  124. package/dist/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
  125. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
  126. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
  127. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
  128. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
  129. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
  130. package/dist/resources/skills/create-skill/SKILL.md +184 -0
  131. package/dist/resources/skills/create-skill/references/api-security.md +226 -0
  132. package/dist/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
  133. package/dist/resources/skills/create-skill/references/common-patterns.md +595 -0
  134. package/dist/resources/skills/create-skill/references/core-principles.md +437 -0
  135. package/dist/resources/skills/create-skill/references/executable-code.md +175 -0
  136. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
  137. package/dist/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
  138. package/dist/resources/skills/create-skill/references/recommended-structure.md +168 -0
  139. package/dist/resources/skills/create-skill/references/skill-structure.md +372 -0
  140. package/dist/resources/skills/create-skill/references/use-xml-tags.md +466 -0
  141. package/dist/resources/skills/create-skill/references/using-scripts.md +113 -0
  142. package/dist/resources/skills/create-skill/references/using-templates.md +112 -0
  143. package/dist/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
  144. package/dist/resources/skills/create-skill/templates/router-skill.md +73 -0
  145. package/dist/resources/skills/create-skill/templates/simple-skill.md +33 -0
  146. package/dist/resources/skills/create-skill/workflows/add-reference.md +96 -0
  147. package/dist/resources/skills/create-skill/workflows/add-script.md +93 -0
  148. package/dist/resources/skills/create-skill/workflows/add-template.md +74 -0
  149. package/dist/resources/skills/create-skill/workflows/add-workflow.md +120 -0
  150. package/dist/resources/skills/create-skill/workflows/audit-skill.md +148 -0
  151. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
  152. package/dist/resources/skills/create-skill/workflows/get-guidance.md +121 -0
  153. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
  154. package/dist/resources/skills/create-skill/workflows/verify-skill.md +204 -0
  155. package/dist/resources/skills/react-best-practices/SKILL.md +1 -1
  156. package/dist/worktree-cli.d.ts +34 -0
  157. package/dist/worktree-cli.js +294 -0
  158. package/dist/worktree-name-gen.d.ts +7 -0
  159. package/dist/worktree-name-gen.js +44 -0
  160. package/package.json +1 -1
  161. package/packages/native/dist/native.d.ts +2 -0
  162. package/packages/native/dist/native.js +19 -5
  163. package/packages/native/src/native.ts +23 -9
  164. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/extensions/loader.js +13 -0
  166. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  167. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -0
  169. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  170. package/packages/pi-coding-agent/package.json +1 -1
  171. package/packages/pi-coding-agent/src/core/extensions/loader.ts +13 -0
  172. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -0
  173. package/pkg/package.json +1 -1
  174. package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
  175. package/src/resources/extensions/bg-shell/extension-manifest.json +14 -0
  176. package/src/resources/extensions/bg-shell/process-manager.ts +13 -0
  177. package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
  178. package/src/resources/extensions/context7/extension-manifest.json +12 -0
  179. package/src/resources/extensions/google-search/extension-manifest.json +12 -0
  180. package/src/resources/extensions/gsd/auto-dashboard.ts +31 -0
  181. package/src/resources/extensions/gsd/auto-dispatch.ts +32 -3
  182. package/src/resources/extensions/gsd/auto-post-unit.ts +45 -13
  183. package/src/resources/extensions/gsd/auto-prompts.ts +40 -17
  184. package/src/resources/extensions/gsd/auto-recovery.ts +18 -23
  185. package/src/resources/extensions/gsd/auto-start.ts +18 -32
  186. package/src/resources/extensions/gsd/auto-worktree.ts +21 -182
  187. package/src/resources/extensions/gsd/auto.ts +2 -24
  188. package/src/resources/extensions/gsd/captures.ts +4 -10
  189. package/src/resources/extensions/gsd/commands-extensions.ts +328 -0
  190. package/src/resources/extensions/gsd/commands-handlers.ts +22 -2
  191. package/src/resources/extensions/gsd/commands-logs.ts +13 -14
  192. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +44 -14
  193. package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
  194. package/src/resources/extensions/gsd/commands.ts +108 -24
  195. package/src/resources/extensions/gsd/dashboard-overlay.ts +2 -1
  196. package/src/resources/extensions/gsd/detection.ts +2 -1
  197. package/src/resources/extensions/gsd/doctor-checks.ts +49 -1
  198. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  199. package/src/resources/extensions/gsd/extension-manifest.json +18 -0
  200. package/src/resources/extensions/gsd/forensics.ts +2 -2
  201. package/src/resources/extensions/gsd/git-service.ts +3 -2
  202. package/src/resources/extensions/gsd/gitignore.ts +9 -63
  203. package/src/resources/extensions/gsd/gsd-db.ts +1 -165
  204. package/src/resources/extensions/gsd/guided-flow.ts +8 -5
  205. package/src/resources/extensions/gsd/index.ts +16 -3
  206. package/src/resources/extensions/gsd/json-persistence.ts +16 -1
  207. package/src/resources/extensions/gsd/md-importer.ts +3 -2
  208. package/src/resources/extensions/gsd/mechanical-completion.ts +430 -0
  209. package/src/resources/extensions/gsd/migrate/command.ts +3 -2
  210. package/src/resources/extensions/gsd/migrate/writer.ts +2 -1
  211. package/src/resources/extensions/gsd/migrate-external.ts +123 -0
  212. package/src/resources/extensions/gsd/paths.ts +24 -2
  213. package/src/resources/extensions/gsd/post-unit-hooks.ts +6 -5
  214. package/src/resources/extensions/gsd/preferences-models.ts +7 -1
  215. package/src/resources/extensions/gsd/preferences-validation.ts +2 -1
  216. package/src/resources/extensions/gsd/preferences.ts +10 -5
  217. package/src/resources/extensions/gsd/prompts/discuss-headless.md +4 -2
  218. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  219. package/src/resources/extensions/gsd/prompts/plan-milestone.md +26 -2
  220. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -1
  221. package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
  222. package/src/resources/extensions/gsd/queue-order.ts +10 -11
  223. package/src/resources/extensions/gsd/repo-identity.ts +148 -0
  224. package/src/resources/extensions/gsd/resource-version.ts +99 -0
  225. package/src/resources/extensions/gsd/roadmap-slices.ts +22 -7
  226. package/src/resources/extensions/gsd/session-forensics.ts +4 -3
  227. package/src/resources/extensions/gsd/session-lock.ts +53 -4
  228. package/src/resources/extensions/gsd/session-status-io.ts +23 -41
  229. package/src/resources/extensions/gsd/tests/activity-log.test.ts +2 -2
  230. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  231. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +3 -3
  232. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
  233. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
  234. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
  235. package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
  236. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +5 -18
  237. package/src/resources/extensions/gsd/tests/git-service.test.ts +10 -37
  238. package/src/resources/extensions/gsd/tests/knowledge.test.ts +4 -4
  239. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +356 -0
  240. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
  241. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -0
  242. package/src/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
  243. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
  244. package/src/resources/extensions/gsd/triage-resolution.ts +2 -1
  245. package/src/resources/extensions/gsd/types.ts +2 -0
  246. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
  247. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
  248. package/src/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
  249. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
  250. package/src/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
  251. package/src/resources/extensions/gsd/workflow-templates/registry.json +85 -0
  252. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
  253. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
  254. package/src/resources/extensions/gsd/workflow-templates/spike.md +69 -0
  255. package/src/resources/extensions/gsd/workflow-templates.ts +241 -0
  256. package/src/resources/extensions/gsd/worktree-command.ts +1 -11
  257. package/src/resources/extensions/gsd/worktree-manager.ts +3 -2
  258. package/src/resources/extensions/gsd/worktree.ts +42 -5
  259. package/src/resources/extensions/mac-tools/extension-manifest.json +16 -0
  260. package/src/resources/extensions/mcp-client/index.ts +459 -0
  261. package/src/resources/extensions/mcporter/extension-manifest.json +12 -0
  262. package/src/resources/extensions/remote-questions/discord-adapter.ts +8 -19
  263. package/src/resources/extensions/remote-questions/extension-manifest.json +11 -0
  264. package/src/resources/extensions/remote-questions/http-client.ts +76 -0
  265. package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -17
  266. package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -19
  267. package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
  268. package/src/resources/extensions/slash-commands/extension-manifest.json +11 -0
  269. package/src/resources/extensions/subagent/extension-manifest.json +13 -0
  270. package/src/resources/extensions/ttsr/extension-manifest.json +11 -0
  271. package/src/resources/extensions/universal-config/extension-manifest.json +13 -0
  272. package/src/resources/extensions/voice/extension-manifest.json +12 -0
  273. package/src/resources/skills/create-gsd-extension/SKILL.md +87 -0
  274. package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
  275. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
  276. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
  277. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
  278. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
  279. package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
  280. package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
  281. package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
  282. package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
  283. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
  284. package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
  285. package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
  286. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
  287. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
  288. package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
  289. package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
  290. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
  291. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
  292. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
  293. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
  294. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
  295. package/src/resources/skills/create-skill/SKILL.md +184 -0
  296. package/src/resources/skills/create-skill/references/api-security.md +226 -0
  297. package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
  298. package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
  299. package/src/resources/skills/create-skill/references/core-principles.md +437 -0
  300. package/src/resources/skills/create-skill/references/executable-code.md +175 -0
  301. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
  302. package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
  303. package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
  304. package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
  305. package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
  306. package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
  307. package/src/resources/skills/create-skill/references/using-templates.md +112 -0
  308. package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
  309. package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
  310. package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
  311. package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
  312. package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
  313. package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
  314. package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
  315. package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
  316. package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
  317. package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
  318. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
  319. package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
  320. package/src/resources/skills/react-best-practices/SKILL.md +1 -1
  321. package/dist/resources/extensions/gsd/auto-worktree-sync.ts +0 -198
  322. package/dist/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -205
  323. package/dist/resources/extensions/gsd/tests/worktree-db.test.ts +0 -442
  324. package/dist/resources/extensions/mcporter/index.ts +0 -525
  325. package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -198
  326. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -205
  327. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +0 -442
  328. package/src/resources/extensions/mcporter/index.ts +0 -525
@@ -0,0 +1,294 @@
1
+ /**
2
+ * GSD Worktree CLI — standalone subcommand and -w flag handling.
3
+ *
4
+ * Manages the full worktree lifecycle from the command line:
5
+ * gsd -w Create auto-named worktree, start interactive session
6
+ * gsd -w my-feature Create/resume named worktree
7
+ * gsd worktree list List worktrees with status
8
+ * gsd worktree merge [name] Squash-merge a worktree into main
9
+ * gsd worktree clean Remove all merged/empty worktrees
10
+ * gsd worktree remove <n> Remove a specific worktree
11
+ *
12
+ * On session exit (via session_shutdown event), auto-commits dirty work
13
+ * so nothing is lost. The GSD extension reads GSD_CLI_WORKTREE to know
14
+ * when a session was launched via -w.
15
+ */
16
+ import chalk from 'chalk';
17
+ import { createWorktree, listWorktrees, removeWorktree, mergeWorktreeToMain, diffWorktreeAll, diffWorktreeNumstat, worktreeBranchName, } from './resources/extensions/gsd/worktree-manager.js';
18
+ import { runWorktreePostCreateHook } from './resources/extensions/gsd/auto-worktree.js';
19
+ import { generateWorktreeName } from './worktree-name-gen.js';
20
+ import { nativeHasChanges, nativeDetectMainBranch, nativeCommitCountBetween, } from './resources/extensions/gsd/native-git-bridge.js';
21
+ import { inferCommitType } from './resources/extensions/gsd/git-service.js';
22
+ import { existsSync } from 'node:fs';
23
+ // ─── Status Helpers ─────────────────────────────────────────────────────────
24
+ function getWorktreeStatus(basePath, name, wtPath) {
25
+ const diff = diffWorktreeAll(basePath, name);
26
+ const numstat = diffWorktreeNumstat(basePath, name);
27
+ const filesChanged = diff.added.length + diff.modified.length + diff.removed.length;
28
+ let linesAdded = 0;
29
+ let linesRemoved = 0;
30
+ for (const s of numstat) {
31
+ linesAdded += s.added;
32
+ linesRemoved += s.removed;
33
+ }
34
+ let uncommitted = false;
35
+ try {
36
+ uncommitted = existsSync(wtPath) && nativeHasChanges(wtPath);
37
+ }
38
+ catch { /* */ }
39
+ let commits = 0;
40
+ try {
41
+ const mainBranch = nativeDetectMainBranch(basePath);
42
+ commits = nativeCommitCountBetween(basePath, mainBranch, worktreeBranchName(name));
43
+ }
44
+ catch { /* */ }
45
+ return {
46
+ name,
47
+ path: wtPath,
48
+ branch: worktreeBranchName(name),
49
+ exists: existsSync(wtPath),
50
+ filesChanged,
51
+ linesAdded,
52
+ linesRemoved,
53
+ uncommitted,
54
+ commits,
55
+ };
56
+ }
57
+ // ─── Formatters ─────────────────────────────────────────────────────────────
58
+ function formatStatus(s) {
59
+ const lines = [];
60
+ const badge = s.uncommitted
61
+ ? chalk.yellow(' (uncommitted)')
62
+ : s.filesChanged > 0
63
+ ? chalk.cyan(' (unmerged)')
64
+ : chalk.green(' (clean)');
65
+ lines.push(` ${chalk.bold.cyan(s.name)}${badge}`);
66
+ lines.push(` ${chalk.dim('branch')} ${chalk.magenta(s.branch)}`);
67
+ lines.push(` ${chalk.dim('path')} ${chalk.dim(s.path)}`);
68
+ if (s.filesChanged > 0) {
69
+ lines.push(` ${chalk.dim('diff')} ${s.filesChanged} files, ${chalk.green(`+${s.linesAdded}`)} ${chalk.red(`-${s.linesRemoved}`)}, ${s.commits} commit${s.commits === 1 ? '' : 's'}`);
70
+ }
71
+ return lines.join('\n');
72
+ }
73
+ // ─── Subcommand: list ───────────────────────────────────────────────────────
74
+ function handleList(basePath) {
75
+ const worktrees = listWorktrees(basePath);
76
+ if (worktrees.length === 0) {
77
+ process.stderr.write(chalk.dim('No worktrees. Create one with: gsd -w <name>\n'));
78
+ return;
79
+ }
80
+ process.stderr.write(chalk.bold('\nWorktrees\n\n'));
81
+ for (const wt of worktrees) {
82
+ const status = getWorktreeStatus(basePath, wt.name, wt.path);
83
+ process.stderr.write(formatStatus(status) + '\n\n');
84
+ }
85
+ }
86
+ // ─── Subcommand: merge ──────────────────────────────────────────────────────
87
+ async function handleMerge(basePath, args) {
88
+ const name = args[0];
89
+ if (!name) {
90
+ // If only one worktree exists, merge it
91
+ const worktrees = listWorktrees(basePath);
92
+ if (worktrees.length === 1) {
93
+ await doMerge(basePath, worktrees[0].name);
94
+ return;
95
+ }
96
+ process.stderr.write(chalk.red('Usage: gsd worktree merge <name>\n'));
97
+ process.stderr.write(chalk.dim('Run gsd worktree list to see worktrees.\n'));
98
+ process.exit(1);
99
+ }
100
+ await doMerge(basePath, name);
101
+ }
102
+ async function doMerge(basePath, name) {
103
+ const worktrees = listWorktrees(basePath);
104
+ const wt = worktrees.find(w => w.name === name);
105
+ if (!wt) {
106
+ process.stderr.write(chalk.red(`Worktree "${name}" not found.\n`));
107
+ process.exit(1);
108
+ }
109
+ const status = getWorktreeStatus(basePath, name, wt.path);
110
+ if (status.filesChanged === 0 && !status.uncommitted) {
111
+ process.stderr.write(chalk.dim(`Worktree "${name}" has no changes to merge.\n`));
112
+ // Clean up empty worktree
113
+ removeWorktree(basePath, name, { deleteBranch: true });
114
+ process.stderr.write(chalk.green(`Removed empty worktree ${chalk.bold(name)}.\n`));
115
+ return;
116
+ }
117
+ // Auto-commit dirty work before merge
118
+ if (status.uncommitted) {
119
+ try {
120
+ const { autoCommitCurrentBranch } = await import('./resources/extensions/gsd/worktree.js');
121
+ autoCommitCurrentBranch(wt.path, 'worktree-merge', name);
122
+ process.stderr.write(chalk.dim(' Auto-committed dirty work before merge.\n'));
123
+ }
124
+ catch { /* best-effort */ }
125
+ }
126
+ const commitType = inferCommitType(name);
127
+ const commitMessage = `${commitType}(${name}): merge worktree ${name}`;
128
+ process.stderr.write(`\nMerging ${chalk.bold.cyan(name)} → ${chalk.magenta(nativeDetectMainBranch(basePath))}\n`);
129
+ process.stderr.write(chalk.dim(` ${status.filesChanged} files, ${chalk.green(`+${status.linesAdded}`)} ${chalk.red(`-${status.linesRemoved}`)}\n\n`));
130
+ try {
131
+ mergeWorktreeToMain(basePath, name, commitMessage);
132
+ removeWorktree(basePath, name, { deleteBranch: true });
133
+ process.stderr.write(chalk.green(`✓ Merged and cleaned up ${chalk.bold(name)}\n`));
134
+ process.stderr.write(chalk.dim(` commit: ${commitMessage}\n`));
135
+ }
136
+ catch (err) {
137
+ const msg = err instanceof Error ? err.message : String(err);
138
+ process.stderr.write(chalk.red(`✗ Merge failed: ${msg}\n`));
139
+ process.stderr.write(chalk.dim(' Resolve conflicts manually, then run gsd worktree merge again.\n'));
140
+ process.exit(1);
141
+ }
142
+ }
143
+ // ─── Subcommand: clean ──────────────────────────────────────────────────────
144
+ function handleClean(basePath) {
145
+ const worktrees = listWorktrees(basePath);
146
+ if (worktrees.length === 0) {
147
+ process.stderr.write(chalk.dim('No worktrees to clean.\n'));
148
+ return;
149
+ }
150
+ let cleaned = 0;
151
+ for (const wt of worktrees) {
152
+ const status = getWorktreeStatus(basePath, wt.name, wt.path);
153
+ if (status.filesChanged === 0 && !status.uncommitted) {
154
+ try {
155
+ removeWorktree(basePath, wt.name, { deleteBranch: true });
156
+ process.stderr.write(chalk.green(` ✓ Removed ${chalk.bold(wt.name)} (clean)\n`));
157
+ cleaned++;
158
+ }
159
+ catch {
160
+ process.stderr.write(chalk.yellow(` ✗ Failed to remove ${wt.name}\n`));
161
+ }
162
+ }
163
+ else {
164
+ process.stderr.write(chalk.dim(` ─ Kept ${chalk.bold(wt.name)} (${status.filesChanged} changed files)\n`));
165
+ }
166
+ }
167
+ process.stderr.write(chalk.dim(`\nCleaned ${cleaned} worktree${cleaned === 1 ? '' : 's'}.\n`));
168
+ }
169
+ // ─── Subcommand: remove ─────────────────────────────────────────────────────
170
+ function handleRemove(basePath, args) {
171
+ const name = args[0];
172
+ if (!name) {
173
+ process.stderr.write(chalk.red('Usage: gsd worktree remove <name>\n'));
174
+ process.exit(1);
175
+ }
176
+ const worktrees = listWorktrees(basePath);
177
+ const wt = worktrees.find(w => w.name === name);
178
+ if (!wt) {
179
+ process.stderr.write(chalk.red(`Worktree "${name}" not found.\n`));
180
+ process.exit(1);
181
+ }
182
+ const status = getWorktreeStatus(basePath, name, wt.path);
183
+ if (status.filesChanged > 0 || status.uncommitted) {
184
+ process.stderr.write(chalk.yellow(`⚠ Worktree "${name}" has unmerged changes (${status.filesChanged} files).\n`));
185
+ process.stderr.write(chalk.yellow(' Use --force to remove anyway, or merge first: gsd worktree merge ' + name + '\n'));
186
+ if (!process.argv.includes('--force')) {
187
+ process.exit(1);
188
+ }
189
+ }
190
+ removeWorktree(basePath, name, { deleteBranch: true });
191
+ process.stderr.write(chalk.green(`✓ Removed worktree ${chalk.bold(name)}\n`));
192
+ }
193
+ // ─── Subcommand: status (default when no args) ─────────────────────────────
194
+ function handleStatusBanner(basePath) {
195
+ const worktrees = listWorktrees(basePath);
196
+ if (worktrees.length === 0)
197
+ return;
198
+ const withChanges = worktrees.filter(wt => {
199
+ try {
200
+ const diff = diffWorktreeAll(basePath, wt.name);
201
+ return diff.added.length + diff.modified.length + diff.removed.length > 0;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ });
207
+ if (withChanges.length === 0)
208
+ return;
209
+ const names = withChanges.map(w => chalk.cyan(w.name)).join(', ');
210
+ process.stderr.write(chalk.dim('[gsd] ') +
211
+ chalk.yellow(`${withChanges.length} worktree${withChanges.length === 1 ? '' : 's'} with unmerged changes: `) +
212
+ names + '\n' +
213
+ chalk.dim('[gsd] ') +
214
+ chalk.dim('Resume: gsd -w <name> | Merge: gsd worktree merge <name> | List: gsd worktree list\n\n'));
215
+ }
216
+ // ─── -w flag: create/resume worktree for interactive session ────────────────
217
+ function handleWorktreeFlag(worktreeFlag) {
218
+ const basePath = process.cwd();
219
+ // gsd -w (no name) — resume most recent worktree with changes, or create new
220
+ if (worktreeFlag === true) {
221
+ const existing = listWorktrees(basePath);
222
+ const withChanges = existing.filter(wt => {
223
+ try {
224
+ const diff = diffWorktreeAll(basePath, wt.name);
225
+ return diff.added.length + diff.modified.length + diff.removed.length > 0;
226
+ }
227
+ catch {
228
+ return false;
229
+ }
230
+ });
231
+ if (withChanges.length === 1) {
232
+ // Single active worktree — resume it
233
+ const wt = withChanges[0];
234
+ process.chdir(wt.path);
235
+ process.env.GSD_CLI_WORKTREE = wt.name;
236
+ process.env.GSD_CLI_WORKTREE_BASE = basePath;
237
+ process.stderr.write(chalk.green(`✓ Resumed worktree ${chalk.bold(wt.name)}\n`));
238
+ process.stderr.write(chalk.dim(` path ${wt.path}\n`));
239
+ process.stderr.write(chalk.dim(` branch ${wt.branch}\n\n`));
240
+ return;
241
+ }
242
+ if (withChanges.length > 1) {
243
+ // Multiple active worktrees — show them and ask user to pick
244
+ process.stderr.write(chalk.yellow(`${withChanges.length} worktrees have unmerged changes:\n\n`));
245
+ for (const wt of withChanges) {
246
+ const status = getWorktreeStatus(basePath, wt.name, wt.path);
247
+ process.stderr.write(formatStatus(status) + '\n\n');
248
+ }
249
+ process.stderr.write(chalk.dim('Specify which one: gsd -w <name>\n'));
250
+ process.exit(0);
251
+ }
252
+ // No active worktrees — create a new one
253
+ const name = generateWorktreeName();
254
+ createAndEnter(basePath, name);
255
+ return;
256
+ }
257
+ // gsd -w <name> — create or resume named worktree
258
+ const name = worktreeFlag;
259
+ const existing = listWorktrees(basePath);
260
+ const found = existing.find(wt => wt.name === name);
261
+ if (found) {
262
+ process.chdir(found.path);
263
+ process.env.GSD_CLI_WORKTREE = name;
264
+ process.env.GSD_CLI_WORKTREE_BASE = basePath;
265
+ process.stderr.write(chalk.green(`✓ Resumed worktree ${chalk.bold(name)}\n`));
266
+ process.stderr.write(chalk.dim(` path ${found.path}\n`));
267
+ process.stderr.write(chalk.dim(` branch ${found.branch}\n\n`));
268
+ }
269
+ else {
270
+ createAndEnter(basePath, name);
271
+ }
272
+ }
273
+ function createAndEnter(basePath, name) {
274
+ try {
275
+ const info = createWorktree(basePath, name);
276
+ const hookError = runWorktreePostCreateHook(basePath, info.path);
277
+ if (hookError) {
278
+ process.stderr.write(chalk.yellow(`[gsd] ${hookError}\n`));
279
+ }
280
+ process.chdir(info.path);
281
+ process.env.GSD_CLI_WORKTREE = name;
282
+ process.env.GSD_CLI_WORKTREE_BASE = basePath;
283
+ process.stderr.write(chalk.green(`✓ Created worktree ${chalk.bold(name)}\n`));
284
+ process.stderr.write(chalk.dim(` path ${info.path}\n`));
285
+ process.stderr.write(chalk.dim(` branch ${info.branch}\n\n`));
286
+ }
287
+ catch (err) {
288
+ const msg = err instanceof Error ? err.message : String(err);
289
+ process.stderr.write(chalk.red(`[gsd] Failed to create worktree: ${msg}\n`));
290
+ process.exit(1);
291
+ }
292
+ }
293
+ // ─── Exports ────────────────────────────────────────────────────────────────
294
+ export { handleList, handleMerge, handleClean, handleRemove, handleStatusBanner, handleWorktreeFlag, getWorktreeStatus, };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Random worktree name generator.
3
+ *
4
+ * Produces names in the pattern: adjective-verbing-noun
5
+ * e.g. "noble-roaming-karp", "swift-whistling-matsumoto"
6
+ */
7
+ export declare function generateWorktreeName(): string;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Random worktree name generator.
3
+ *
4
+ * Produces names in the pattern: adjective-verbing-noun
5
+ * e.g. "noble-roaming-karp", "swift-whistling-matsumoto"
6
+ */
7
+ const ADJECTIVES = [
8
+ 'agile', 'bold', 'brave', 'bright', 'calm', 'clear', 'cool', 'crisp',
9
+ 'dapper', 'eager', 'fair', 'fast', 'fierce', 'fine', 'fleet', 'fond',
10
+ 'gentle', 'glad', 'grand', 'happy', 'keen', 'kind', 'lively', 'lucid',
11
+ 'mellow', 'merry', 'mighty', 'neat', 'nimble', 'noble', 'plucky', 'polite',
12
+ 'proud', 'quiet', 'rapid', 'ready', 'serene', 'sharp', 'sleek', 'sleepy',
13
+ 'smooth', 'snappy', 'steady', 'sturdy', 'sunny', 'sure', 'swift', 'tidy',
14
+ 'tough', 'tranquil', 'vivid', 'warm', 'wise', 'witty', 'zesty',
15
+ ];
16
+ const VERBS = [
17
+ 'baking', 'bouncing', 'building', 'carving', 'chasing', 'climbing',
18
+ 'coding', 'crafting', 'dancing', 'dashing', 'diving', 'drawing',
19
+ 'dreaming', 'drifting', 'drumming', 'exploring', 'fishing', 'floating',
20
+ 'flying', 'forging', 'gliding', 'growing', 'hiking', 'humming',
21
+ 'jumping', 'juggling', 'knitting', 'laughing', 'leaping', 'mapping',
22
+ 'mixing', 'painting', 'planting', 'playing', 'racing', 'reading',
23
+ 'riding', 'roaming', 'rowing', 'running', 'sailing', 'singing',
24
+ 'skating', 'sketching', 'spinning', 'squishing', 'surfing', 'swimming',
25
+ 'thinking', 'threading', 'tracing', 'walking', 'weaving', 'whistling',
26
+ 'writing',
27
+ ];
28
+ const NOUNS = [
29
+ 'atlas', 'aurora', 'balloon', 'beacon', 'bolt', 'brook', 'canyon',
30
+ 'cedar', 'comet', 'cook', 'coral', 'cosmos', 'crest', 'dawn', 'delta',
31
+ 'echo', 'ember', 'falcon', 'fern', 'flare', 'frost', 'gale', 'glacier',
32
+ 'grove', 'harbor', 'hawk', 'horizon', 'iris', 'jade', 'karp', 'lantern',
33
+ 'lark', 'luna', 'maple', 'marsh', 'matsumoto', 'mesa', 'nebula', 'oasis',
34
+ 'orbit', 'otter', 'pebble', 'phoenix', 'pine', 'prism', 'puppy', 'quartz',
35
+ 'raven', 'reef', 'ridge', 'river', 'sage', 'shore', 'sierra', 'spark',
36
+ 'sprout', 'stone', 'summit', 'thorn', 'tide', 'topaz', 'trail', 'vale',
37
+ 'violet', 'wave', 'willow', 'zenith',
38
+ ];
39
+ function pick(arr) {
40
+ return arr[Math.floor(Math.random() * arr.length)];
41
+ }
42
+ export function generateWorktreeName() {
43
+ return `${pick(ADJECTIVES)}-${pick(VERBS)}-${pick(NOUNS)}`;
44
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-pi",
3
- "version": "2.29.0",
3
+ "version": "2.30.0-dev.7e1bbce",
4
4
  "description": "GSD — Get Shit Done coding agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -55,3 +55,5 @@ export declare const native: {
55
55
  parseStreamingJson: (text: string) => unknown;
56
56
  xxHash32: (input: string, seed: number) => number;
57
57
  };
58
+ /** True when the native addon loaded successfully. False on unsupported platforms. */
59
+ export declare const nativeAvailable = false;
@@ -22,12 +22,14 @@ const platformPackageMap = {
22
22
  "linux-arm64": "linux-arm64-gnu",
23
23
  "win32-x64": "win32-x64-msvc",
24
24
  };
25
+ let _loadedSuccessfully = false;
25
26
  function loadNative() {
26
27
  const errors = [];
27
28
  // 1. Try the platform-specific npm optional dependency
28
29
  const packageSuffix = platformPackageMap[platformTag];
29
30
  if (packageSuffix) {
30
31
  try {
32
+ _loadedSuccessfully = true;
31
33
  return require(`@gsd-build/engine-${packageSuffix}`);
32
34
  }
33
35
  catch (err) {
@@ -38,6 +40,7 @@ function loadNative() {
38
40
  // 2. Try local release build (native/addon/gsd_engine.{platform}.node)
39
41
  const releasePath = path.join(addonDir, `gsd_engine.${platformTag}.node`);
40
42
  try {
43
+ _loadedSuccessfully = true;
41
44
  return require(releasePath);
42
45
  }
43
46
  catch (err) {
@@ -47,6 +50,7 @@ function loadNative() {
47
50
  // 3. Try local dev build (native/addon/gsd_engine.dev.node)
48
51
  const devPath = path.join(addonDir, "gsd_engine.dev.node");
49
52
  try {
53
+ _loadedSuccessfully = true;
50
54
  return require(devPath);
51
55
  }
52
56
  catch (err) {
@@ -55,10 +59,20 @@ function loadNative() {
55
59
  }
56
60
  const details = errors.map((e) => ` - ${e}`).join("\n");
57
61
  const supportedPlatforms = Object.keys(platformPackageMap);
58
- throw new Error(`Failed to load gsd_engine native addon for ${platformTag}.\n\n` +
59
- `Tried:\n${details}\n\n` +
60
- `Supported platforms: ${supportedPlatforms.join(", ")}\n` +
61
- `If your platform is listed, try reinstalling: npm i -g gsd-pi\n` +
62
- `Otherwise, please open an issue: https://github.com/gsd-build/gsd-2/issues`);
62
+ // Graceful fallback: on unsupported platforms (e.g., win32-arm64), return a
63
+ // proxy that throws on individual function calls rather than crashing the
64
+ // entire import chain at startup (#1223). Consumers with JS fallbacks
65
+ // (parseRoadmap, parsePlan, fuzzyFind, etc.) catch these and degrade gracefully.
66
+ process.stderr.write(`[gsd] Native addon not available for ${platformTag}. Falling back to JS implementations (slower).\n` +
67
+ ` Supported native platforms: ${supportedPlatforms.join(", ")}\n`);
68
+ return new Proxy({}, {
69
+ get(_target, prop) {
70
+ return (..._args) => {
71
+ throw new Error(`Native function '${String(prop)}' is not available on ${platformTag}`);
72
+ };
73
+ },
74
+ });
63
75
  }
64
76
  export const native = loadNative();
77
+ /** True when the native addon loaded successfully. False on unsupported platforms. */
78
+ export const nativeAvailable = _loadedSuccessfully;
@@ -27,6 +27,8 @@ const platformPackageMap: Record<string, string> = {
27
27
  "win32-x64": "win32-x64-msvc",
28
28
  };
29
29
 
30
+ let _loadedSuccessfully = false;
31
+
30
32
  function loadNative(): Record<string, unknown> {
31
33
  const errors: string[] = [];
32
34
 
@@ -34,7 +36,7 @@ function loadNative(): Record<string, unknown> {
34
36
  const packageSuffix = platformPackageMap[platformTag];
35
37
  if (packageSuffix) {
36
38
  try {
37
- return require(`@gsd-build/engine-${packageSuffix}`) as Record<string, unknown>;
39
+ _loadedSuccessfully = true; return require(`@gsd-build/engine-${packageSuffix}`) as Record<string, unknown>;
38
40
  } catch (err) {
39
41
  const message = err instanceof Error ? err.message : String(err);
40
42
  errors.push(`@gsd-build/engine-${packageSuffix}: ${message}`);
@@ -44,7 +46,7 @@ function loadNative(): Record<string, unknown> {
44
46
  // 2. Try local release build (native/addon/gsd_engine.{platform}.node)
45
47
  const releasePath = path.join(addonDir, `gsd_engine.${platformTag}.node`);
46
48
  try {
47
- return require(releasePath) as Record<string, unknown>;
49
+ _loadedSuccessfully = true; return require(releasePath) as Record<string, unknown>;
48
50
  } catch (err) {
49
51
  const message = err instanceof Error ? err.message : String(err);
50
52
  errors.push(`${releasePath}: ${message}`);
@@ -53,7 +55,7 @@ function loadNative(): Record<string, unknown> {
53
55
  // 3. Try local dev build (native/addon/gsd_engine.dev.node)
54
56
  const devPath = path.join(addonDir, "gsd_engine.dev.node");
55
57
  try {
56
- return require(devPath) as Record<string, unknown>;
58
+ _loadedSuccessfully = true; return require(devPath) as Record<string, unknown>;
57
59
  } catch (err) {
58
60
  const message = err instanceof Error ? err.message : String(err);
59
61
  errors.push(`${devPath}: ${message}`);
@@ -61,13 +63,22 @@ function loadNative(): Record<string, unknown> {
61
63
 
62
64
  const details = errors.map((e) => ` - ${e}`).join("\n");
63
65
  const supportedPlatforms = Object.keys(platformPackageMap);
64
- throw new Error(
65
- `Failed to load gsd_engine native addon for ${platformTag}.\n\n` +
66
- `Tried:\n${details}\n\n` +
67
- `Supported platforms: ${supportedPlatforms.join(", ")}\n` +
68
- `If your platform is listed, try reinstalling: npm i -g gsd-pi\n` +
69
- `Otherwise, please open an issue: https://github.com/gsd-build/gsd-2/issues`,
66
+
67
+ // Graceful fallback: on unsupported platforms (e.g., win32-arm64), return a
68
+ // proxy that throws on individual function calls rather than crashing the
69
+ // entire import chain at startup (#1223). Consumers with JS fallbacks
70
+ // (parseRoadmap, parsePlan, fuzzyFind, etc.) catch these and degrade gracefully.
71
+ process.stderr.write(
72
+ `[gsd] Native addon not available for ${platformTag}. Falling back to JS implementations (slower).\n` +
73
+ ` Supported native platforms: ${supportedPlatforms.join(", ")}\n`,
70
74
  );
75
+ return new Proxy({} as Record<string, unknown>, {
76
+ get(_target, prop) {
77
+ return (..._args: unknown[]) => {
78
+ throw new Error(`Native function '${String(prop)}' is not available on ${platformTag}`);
79
+ };
80
+ },
81
+ });
71
82
  }
72
83
 
73
84
  export const native = loadNative() as {
@@ -140,3 +151,6 @@ export const native = loadNative() as {
140
151
  parseStreamingJson: (text: string) => unknown;
141
152
  xxHash32: (input: string, seed: number) => number;
142
153
  };
154
+
155
+ /** True when the native addon loaded successfully. False on unsupported platforms. */
156
+ export const nativeAvailable = _loadedSuccessfully;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AA6FpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAkCzD;AA6LD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA+GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAuGpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAkCzD;AA6LD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA+GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B"}
@@ -18,6 +18,9 @@ import * as _bundledPiTui from "@gsd/pi-tui";
18
18
  // The virtualModules option then makes them available to extensions.
19
19
  import * as _bundledTypebox from "@sinclair/typebox";
20
20
  import * as _bundledYaml from "yaml";
21
+ import * as _bundledMcpClient from "@modelcontextprotocol/sdk/client";
22
+ import * as _bundledMcpStdio from "@modelcontextprotocol/sdk/client/stdio.js";
23
+ import * as _bundledMcpStreamableHttp from "@modelcontextprotocol/sdk/client/streamableHttp.js";
21
24
  import { getAgentDir, isBunBinary } from "../../config.js";
22
25
  // NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,
23
26
  // avoiding a circular dependency. Extensions can import from @gsd/pi-coding-agent.
@@ -35,6 +38,11 @@ const VIRTUAL_MODULES = {
35
38
  "@gsd/pi-ai/oauth": _bundledPiAiOauth,
36
39
  "@gsd/pi-coding-agent": _bundledPiCodingAgent,
37
40
  "yaml": _bundledYaml,
41
+ "@modelcontextprotocol/sdk/client": _bundledMcpClient,
42
+ "@modelcontextprotocol/sdk/client/stdio": _bundledMcpStdio,
43
+ "@modelcontextprotocol/sdk/client/stdio.js": _bundledMcpStdio,
44
+ "@modelcontextprotocol/sdk/client/streamableHttp": _bundledMcpStreamableHttp,
45
+ "@modelcontextprotocol/sdk/client/streamableHttp.js": _bundledMcpStreamableHttp,
38
46
  // Aliases for external PI ecosystem packages that import from the original scope
39
47
  "@mariozechner/pi-agent-core": _bundledPiAgentCore,
40
48
  "@mariozechner/pi-tui": _bundledPiTui,
@@ -73,6 +81,11 @@ function getAliases() {
73
81
  "@gsd/pi-ai/oauth": resolveWorkspaceOrImport("ai/dist/oauth.js", "@gsd/pi-ai/oauth"),
74
82
  "@sinclair/typebox": typeboxRoot,
75
83
  "yaml": yamlRoot,
84
+ "@modelcontextprotocol/sdk/client": require.resolve("@modelcontextprotocol/sdk/client"),
85
+ "@modelcontextprotocol/sdk/client/stdio": require.resolve("@modelcontextprotocol/sdk/client/stdio.js"),
86
+ "@modelcontextprotocol/sdk/client/stdio.js": require.resolve("@modelcontextprotocol/sdk/client/stdio.js"),
87
+ "@modelcontextprotocol/sdk/client/streamableHttp": require.resolve("@modelcontextprotocol/sdk/client/streamableHttp.js"),
88
+ "@modelcontextprotocol/sdk/client/streamableHttp.js": require.resolve("@modelcontextprotocol/sdk/client/streamableHttp.js"),
76
89
  // Aliases for external PI ecosystem packages that import from the original scope
77
90
  "@mariozechner/pi-coding-agent": packageIndex,
78
91
  "@mariozechner/pi-agent-core": resolveWorkspaceOrImport("agent/dist/index.js", "@gsd/pi-agent-core"),