gsd-pi 2.10.12 → 2.11.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 (437) hide show
  1. package/dist/bundled-extension-paths.d.ts +2 -0
  2. package/dist/bundled-extension-paths.js +10 -0
  3. package/dist/loader.js +45 -28
  4. package/dist/onboarding.js +97 -0
  5. package/dist/resource-loader.js +12 -3
  6. package/dist/resources/GSD-WORKFLOW.md +661 -0
  7. package/dist/resources/agents/researcher.md +29 -0
  8. package/dist/resources/agents/scout.md +56 -0
  9. package/dist/resources/agents/worker.md +31 -0
  10. package/dist/resources/extensions/ask-user-questions.ts +289 -0
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +211 -0
  12. package/dist/resources/extensions/async-jobs/await-tool.ts +101 -0
  13. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +34 -0
  14. package/dist/resources/extensions/async-jobs/index.ts +133 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.ts +211 -0
  16. package/dist/resources/extensions/bg-shell/index.ts +3135 -0
  17. package/dist/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  18. package/dist/resources/extensions/browser-tools/capture.ts +165 -0
  19. package/dist/resources/extensions/browser-tools/core.d.ts +205 -0
  20. package/dist/resources/extensions/browser-tools/core.js +1057 -0
  21. package/dist/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
  22. package/dist/resources/extensions/browser-tools/index.ts +51 -0
  23. package/dist/resources/extensions/browser-tools/lifecycle.ts +270 -0
  24. package/dist/resources/extensions/browser-tools/package.json +24 -0
  25. package/dist/resources/extensions/browser-tools/refs.ts +264 -0
  26. package/dist/resources/extensions/browser-tools/settle.ts +197 -0
  27. package/dist/resources/extensions/browser-tools/state.ts +408 -0
  28. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +652 -0
  29. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +614 -0
  30. package/dist/resources/extensions/browser-tools/tools/assertions.ts +342 -0
  31. package/dist/resources/extensions/browser-tools/tools/forms.ts +801 -0
  32. package/dist/resources/extensions/browser-tools/tools/inspection.ts +492 -0
  33. package/dist/resources/extensions/browser-tools/tools/intent.ts +614 -0
  34. package/dist/resources/extensions/browser-tools/tools/interaction.ts +865 -0
  35. package/dist/resources/extensions/browser-tools/tools/navigation.ts +232 -0
  36. package/dist/resources/extensions/browser-tools/tools/pages.ts +303 -0
  37. package/dist/resources/extensions/browser-tools/tools/refs.ts +541 -0
  38. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +83 -0
  39. package/dist/resources/extensions/browser-tools/tools/session.ts +400 -0
  40. package/dist/resources/extensions/browser-tools/tools/wait.ts +247 -0
  41. package/dist/resources/extensions/browser-tools/utils.ts +660 -0
  42. package/dist/resources/extensions/context7/index.ts +428 -0
  43. package/dist/resources/extensions/context7/package.json +11 -0
  44. package/dist/resources/extensions/get-secrets-from-user.ts +625 -0
  45. package/dist/resources/extensions/google-search/index.ts +336 -0
  46. package/dist/resources/extensions/google-search/package.json +9 -0
  47. package/dist/resources/extensions/gsd/activity-log.ts +116 -0
  48. package/dist/resources/extensions/gsd/auto.ts +3575 -0
  49. package/dist/resources/extensions/gsd/commands.ts +538 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.ts +105 -0
  51. package/dist/resources/extensions/gsd/dashboard-overlay.ts +564 -0
  52. package/dist/resources/extensions/gsd/dispatch-guard.ts +78 -0
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +278 -0
  54. package/dist/resources/extensions/gsd/doctor.ts +709 -0
  55. package/dist/resources/extensions/gsd/exit-command.ts +18 -0
  56. package/dist/resources/extensions/gsd/files.ts +857 -0
  57. package/dist/resources/extensions/gsd/git-service.ts +904 -0
  58. package/dist/resources/extensions/gsd/gitignore.ts +200 -0
  59. package/dist/resources/extensions/gsd/guided-flow.ts +982 -0
  60. package/dist/resources/extensions/gsd/index.ts +735 -0
  61. package/dist/resources/extensions/gsd/metrics.ts +374 -0
  62. package/dist/resources/extensions/gsd/migrate/command.ts +218 -0
  63. package/dist/resources/extensions/gsd/migrate/index.ts +42 -0
  64. package/dist/resources/extensions/gsd/migrate/parser.ts +323 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.ts +624 -0
  66. package/dist/resources/extensions/gsd/migrate/preview.ts +48 -0
  67. package/dist/resources/extensions/gsd/migrate/transformer.ts +346 -0
  68. package/dist/resources/extensions/gsd/migrate/types.ts +370 -0
  69. package/dist/resources/extensions/gsd/migrate/validator.ts +55 -0
  70. package/dist/resources/extensions/gsd/migrate/writer.ts +539 -0
  71. package/dist/resources/extensions/gsd/native-git-bridge.ts +181 -0
  72. package/dist/resources/extensions/gsd/native-parser-bridge.ts +135 -0
  73. package/dist/resources/extensions/gsd/observability-validator.ts +408 -0
  74. package/dist/resources/extensions/gsd/package.json +11 -0
  75. package/dist/resources/extensions/gsd/paths.ts +339 -0
  76. package/dist/resources/extensions/gsd/preferences.ts +796 -0
  77. package/dist/resources/extensions/gsd/prompt-loader.ts +65 -0
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +29 -0
  80. package/dist/resources/extensions/gsd/prompts/discuss.md +235 -0
  81. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
  82. package/dist/resources/extensions/gsd/prompts/execute-task.md +61 -0
  83. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -0
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -0
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +59 -0
  86. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -0
  87. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +27 -0
  88. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -0
  89. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +11 -0
  90. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  91. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +81 -0
  92. package/dist/resources/extensions/gsd/prompts/plan-slice.md +57 -0
  93. package/dist/resources/extensions/gsd/prompts/queue.md +98 -0
  94. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
  95. package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  96. package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
  97. package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
  98. package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
  99. package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
  100. package/dist/resources/extensions/gsd/prompts/system.md +190 -0
  101. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
  102. package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
  103. package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
  104. package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
  105. package/dist/resources/extensions/gsd/state.ts +569 -0
  106. package/dist/resources/extensions/gsd/templates/context.md +76 -0
  107. package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
  108. package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
  109. package/dist/resources/extensions/gsd/templates/plan.md +131 -0
  110. package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
  111. package/dist/resources/extensions/gsd/templates/project.md +31 -0
  112. package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
  113. package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
  114. package/dist/resources/extensions/gsd/templates/research.md +46 -0
  115. package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
  116. package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  117. package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
  118. package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
  119. package/dist/resources/extensions/gsd/templates/state.md +19 -0
  120. package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
  121. package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
  122. package/dist/resources/extensions/gsd/templates/uat.md +54 -0
  123. package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
  124. package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  125. package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
  126. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
  127. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
  128. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  129. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
  130. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
  131. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
  132. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
  133. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
  134. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
  135. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
  136. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
  137. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
  138. package/dist/resources/extensions/gsd/tests/doctor.test.ts +480 -0
  139. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
  140. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
  141. package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
  142. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
  143. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
  144. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
  145. package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
  146. package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
  147. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
  148. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
  149. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
  150. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
  151. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
  152. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
  153. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
  154. package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  155. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
  156. package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
  157. package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
  158. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
  159. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
  160. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
  161. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
  162. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +269 -0
  163. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
  164. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  165. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
  166. package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
  167. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
  168. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
  169. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
  170. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
  171. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
  172. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
  173. package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
  174. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
  175. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
  176. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
  177. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
  178. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
  179. package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
  180. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
  181. package/dist/resources/extensions/gsd/types.ts +187 -0
  182. package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
  183. package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
  184. package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
  185. package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
  186. package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
  187. package/dist/resources/extensions/mac-tools/index.ts +852 -0
  188. package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  189. package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  190. package/dist/resources/extensions/mcporter/index.ts +429 -0
  191. package/dist/resources/extensions/remote-questions/config.ts +81 -0
  192. package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
  193. package/dist/resources/extensions/remote-questions/format.ts +163 -0
  194. package/dist/resources/extensions/remote-questions/manager.ts +192 -0
  195. package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
  196. package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
  197. package/dist/resources/extensions/remote-questions/status.ts +31 -0
  198. package/dist/resources/extensions/remote-questions/store.ts +77 -0
  199. package/dist/resources/extensions/remote-questions/types.ts +75 -0
  200. package/dist/resources/extensions/search-the-web/cache.ts +78 -0
  201. package/dist/resources/extensions/search-the-web/command-search-provider.ts +95 -0
  202. package/dist/resources/extensions/search-the-web/format.ts +258 -0
  203. package/dist/resources/extensions/search-the-web/http.ts +238 -0
  204. package/dist/resources/extensions/search-the-web/index.ts +65 -0
  205. package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
  206. package/dist/resources/extensions/search-the-web/provider.ts +119 -0
  207. package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
  208. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +519 -0
  209. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +561 -0
  210. package/dist/resources/extensions/search-the-web/tool-search.ts +576 -0
  211. package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
  212. package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  213. package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
  214. package/dist/resources/extensions/shared/interview-ui.ts +613 -0
  215. package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
  216. package/dist/resources/extensions/shared/progress-widget.ts +282 -0
  217. package/dist/resources/extensions/shared/terminal.ts +23 -0
  218. package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
  219. package/dist/resources/extensions/shared/ui.ts +400 -0
  220. package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
  221. package/dist/resources/extensions/slash-commands/audit.ts +88 -0
  222. package/dist/resources/extensions/slash-commands/clear.ts +10 -0
  223. package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
  224. package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  225. package/dist/resources/extensions/slash-commands/index.ts +12 -0
  226. package/dist/resources/extensions/subagent/agents.ts +126 -0
  227. package/dist/resources/extensions/subagent/index.ts +1072 -0
  228. package/dist/resources/extensions/subagent/isolation.ts +498 -0
  229. package/dist/resources/extensions/ttsr/index.ts +163 -0
  230. package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
  231. package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  232. package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
  233. package/dist/resources/extensions/universal-config/discovery.ts +78 -0
  234. package/dist/resources/extensions/universal-config/format.ts +160 -0
  235. package/dist/resources/extensions/universal-config/index.ts +118 -0
  236. package/dist/resources/extensions/universal-config/package.json +11 -0
  237. package/dist/resources/extensions/universal-config/scanners.ts +579 -0
  238. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
  239. package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
  240. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
  241. package/dist/resources/extensions/universal-config/tools.ts +60 -0
  242. package/dist/resources/extensions/universal-config/types.ts +116 -0
  243. package/dist/resources/extensions/voice/index.ts +271 -0
  244. package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
  245. package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
  246. package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
  247. package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  248. package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  249. package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  250. package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  251. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  252. package/dist/resources/skills/frontend-design/SKILL.md +45 -0
  253. package/dist/resources/skills/github-workflows/SKILL.md +92 -0
  254. package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
  255. package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  256. package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  257. package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  258. package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  259. package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  260. package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  261. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  262. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  263. package/dist/resources/skills/swiftui/SKILL.md +208 -0
  264. package/dist/resources/skills/swiftui/references/animations.md +921 -0
  265. package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
  266. package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
  267. package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
  268. package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
  269. package/dist/resources/skills/swiftui/references/performance.md +1706 -0
  270. package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
  271. package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
  272. package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
  273. package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
  274. package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
  275. package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
  276. package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
  277. package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
  278. package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
  279. package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
  280. package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
  281. package/package.json +8 -6
  282. package/packages/native/dist/fd/index.d.ts +1 -0
  283. package/packages/native/dist/fd/index.js +1 -0
  284. package/packages/native/dist/grep/index.d.ts +2 -1
  285. package/packages/native/dist/grep/index.js +1 -0
  286. package/packages/native/src/__tests__/fd.test.mjs +35 -0
  287. package/packages/native/src/__tests__/grep.test.mjs +26 -9
  288. package/packages/native/src/fd/index.ts +1 -0
  289. package/packages/native/src/grep/index.ts +3 -2
  290. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  291. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  292. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
  294. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  295. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
  297. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  298. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  299. package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
  300. package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
  301. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +16 -0
  302. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/agent-session.js +68 -14
  304. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
  306. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
  308. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
  310. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
  312. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
  313. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
  314. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
  315. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
  316. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  318. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  320. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
  322. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
  324. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
  326. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
  327. package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
  328. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  330. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
  335. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
  345. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  346. package/packages/pi-coding-agent/src/core/agent-session.ts +91 -15
  347. package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
  348. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
  349. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
  350. package/packages/pi-coding-agent/src/core/index.ts +1 -0
  351. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
  352. package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
  353. package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
  354. package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
  355. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
  356. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
  357. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
  358. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  359. package/packages/pi-tui/dist/autocomplete.js +3 -4
  360. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  361. package/packages/pi-tui/dist/components/editor.d.ts +7 -0
  362. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  363. package/packages/pi-tui/dist/components/editor.js +57 -50
  364. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  365. package/packages/pi-tui/src/autocomplete.ts +3 -5
  366. package/packages/pi-tui/src/components/editor.ts +70 -49
  367. package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
  368. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  369. package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
  370. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
  371. package/pkg/dist/core/export-html/index.d.ts +37 -0
  372. package/pkg/dist/core/export-html/index.d.ts.map +1 -0
  373. package/pkg/dist/core/export-html/index.js +223 -0
  374. package/pkg/dist/core/export-html/index.js.map +1 -0
  375. package/pkg/dist/core/export-html/template.css +971 -0
  376. package/pkg/dist/core/export-html/template.html +54 -0
  377. package/pkg/dist/core/export-html/template.js +1583 -0
  378. package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
  379. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  380. package/pkg/dist/core/export-html/tool-renderer.js +70 -0
  381. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
  382. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  383. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  384. package/scripts/postinstall.js +30 -17
  385. package/src/resources/extensions/gsd/activity-log.ts +61 -14
  386. package/src/resources/extensions/gsd/auto.ts +129 -17
  387. package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
  388. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
  389. package/src/resources/extensions/gsd/files.ts +45 -1
  390. package/src/resources/extensions/gsd/git-service.ts +46 -41
  391. package/src/resources/extensions/gsd/index.ts +62 -1
  392. package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
  393. package/src/resources/extensions/gsd/paths.ts +35 -4
  394. package/src/resources/extensions/gsd/preferences.ts +40 -1
  395. package/src/resources/extensions/gsd/prompt-loader.ts +17 -2
  396. package/src/resources/extensions/gsd/state.ts +130 -18
  397. package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  398. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
  399. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
  400. package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
  401. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
  402. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
  403. package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  404. package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
  405. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
  406. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
  407. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
  408. package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
  409. package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
  410. package/src/resources/extensions/gsd/worktree.ts +5 -4
  411. package/src/resources/extensions/search-the-web/native-search.ts +32 -23
  412. package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  413. package/src/resources/extensions/subagent/index.ts +2 -1
  414. package/src/resources/skills/github-workflows/SKILL.md +5 -0
  415. package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
  416. package/dist/resources/extensions/gsd/git-service.js +0 -756
  417. package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
  418. package/dist/resources/extensions/gsd/preferences.js +0 -616
  419. package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
  420. package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
  421. package/dist/resources/extensions/remote-questions/config.js +0 -68
  422. package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
  423. package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
  424. package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
  425. package/dist/resources/extensions/remote-questions/format.js +0 -119
  426. package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
  427. package/dist/resources/extensions/remote-questions/manager.js +0 -161
  428. package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
  429. package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
  430. package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
  431. package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
  432. package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
  433. package/dist/resources/extensions/remote-questions/status.js +0 -25
  434. package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
  435. package/dist/resources/extensions/remote-questions/store.js +0 -66
  436. package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
  437. package/dist/resources/extensions/remote-questions/types.js +0 -4
@@ -0,0 +1,2 @@
1
+ export declare function serializeBundledExtensionPaths(paths: readonly string[], pathDelimiter?: ";" | ":"): string;
2
+ export declare function parseBundledExtensionPaths(value: string | undefined, pathDelimiter?: ";" | ":"): string[];
@@ -0,0 +1,10 @@
1
+ import { delimiter } from "node:path";
2
+ export function serializeBundledExtensionPaths(paths, pathDelimiter = delimiter) {
3
+ return paths.filter(Boolean).join(pathDelimiter);
4
+ }
5
+ export function parseBundledExtensionPaths(value, pathDelimiter = delimiter) {
6
+ return (value ?? "")
7
+ .split(pathDelimiter)
8
+ .map((segment) => segment.trim())
9
+ .filter(Boolean);
10
+ }
package/dist/loader.js CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { fileURLToPath } from 'url';
3
- import { dirname, resolve, join } from 'path';
4
- import { existsSync, readFileSync, mkdirSync, symlinkSync } from 'fs';
3
+ import { dirname, resolve, join, delimiter } from 'path';
4
+ import { existsSync, readFileSync, readdirSync, mkdirSync, symlinkSync } from 'fs';
5
5
  import { agentDir, appRoot } from './app-paths.js';
6
+ import { serializeBundledExtensionPaths } from './bundled-extension-paths.js';
6
7
  import { renderLogo } from './logo.js';
7
8
  // pkg/ is a shim directory: contains gsd's piConfig (package.json) and pi's
8
9
  // theme assets (dist/modes/interactive/theme/) without a src/ directory.
@@ -41,9 +42,9 @@ process.env.GSD_CODING_AGENT_DIR = agentDir;
41
42
  // Prepending gsd's node_modules to NODE_PATH fixes this for all extensions.
42
43
  const gsdRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
43
44
  const gsdNodeModules = join(gsdRoot, 'node_modules');
44
- process.env.NODE_PATH = process.env.NODE_PATH
45
- ? `${gsdNodeModules}:${process.env.NODE_PATH}`
46
- : gsdNodeModules;
45
+ process.env.NODE_PATH = [gsdNodeModules, process.env.NODE_PATH]
46
+ .filter(Boolean)
47
+ .join(delimiter);
47
48
  // Force Node to re-evaluate module search paths with the updated NODE_PATH.
48
49
  // Must happen synchronously before cli.js imports → extension loading.
49
50
  // eslint-disable-next-line @typescript-eslint/no-require-imports
@@ -61,30 +62,46 @@ catch {
61
62
  // to spawn gsd instead of pi when dispatching workflow tasks
62
63
  process.env.GSD_BIN_PATH = process.argv[1];
63
64
  // GSD_WORKFLOW_PATH — absolute path to bundled GSD-WORKFLOW.md, used by patched gsd extension
64
- // when dispatching workflow prompts (dist/loader.js ../src/resources/GSD-WORKFLOW.md)
65
- const resourcesDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'src', 'resources');
65
+ // when dispatching workflow prompts. Prefers dist/resources/ (stable, set at build time)
66
+ // over src/resources/ (live working tree) see resource-loader.ts for rationale.
67
+ const loaderPackageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
68
+ const distRes = join(loaderPackageRoot, 'dist', 'resources');
69
+ const srcRes = join(loaderPackageRoot, 'src', 'resources');
70
+ const resourcesDir = existsSync(distRes) ? distRes : srcRes;
66
71
  process.env.GSD_WORKFLOW_PATH = join(resourcesDir, 'GSD-WORKFLOW.md');
67
- // GSD_BUNDLED_EXTENSION_PATHS — colon-joined list of all bundled extension entry point absolute
68
- // paths, used by patched subagent to pass --extension <path> to spawned gsd processes.
69
- // IMPORTANT: paths point to agentDir (~/.gsd/agent/extensions/) NOT src/resources/extensions/.
70
- // initResources() syncs bundled extensions to agentDir before any extension loading occurs,
71
- // so these paths are always valid at runtime. Using agentDir paths matches what buildResourceLoader
72
- // discovers (it scans agentDir), so pi's deduplication works correctly and extensions are not
73
- // double-loaded in subagent child processes.
74
- // Note: shared/ is NOT included — it's a library imported by gsd and ask-user-questions, not an entry point.
75
- process.env.GSD_BUNDLED_EXTENSION_PATHS = [
76
- join(agentDir, 'extensions', 'gsd', 'index.ts'),
77
- join(agentDir, 'extensions', 'bg-shell', 'index.ts'),
78
- join(agentDir, 'extensions', 'browser-tools', 'index.ts'),
79
- join(agentDir, 'extensions', 'context7', 'index.ts'),
80
- join(agentDir, 'extensions', 'search-the-web', 'index.ts'),
81
- join(agentDir, 'extensions', 'slash-commands', 'index.ts'),
82
- join(agentDir, 'extensions', 'subagent', 'index.ts'),
83
- join(agentDir, 'extensions', 'mac-tools', 'index.ts'),
84
- join(agentDir, 'extensions', 'async-jobs', 'index.ts'),
85
- join(agentDir, 'extensions', 'ask-user-questions.ts'),
86
- join(agentDir, 'extensions', 'get-secrets-from-user.ts'),
87
- ].join(':');
72
+ // GSD_BUNDLED_EXTENSION_PATHS — dynamically discovered bundled extension entry points.
73
+ // Scans the bundled resources directory to find all extensions, then maps paths to
74
+ // agentDir (~/.gsd/agent/extensions/) where initResources() will sync them.
75
+ //
76
+ // Discovery rules (mirroring resource-loader.ts discoverExtensionEntryPaths):
77
+ // - Top-level .ts/.js files extension entry point
78
+ // - Directories with index.ts or index.js → extension entry point
79
+ // - Directories without either (e.g. shared/, remote-questions/) skipped
80
+ //
81
+ // Previously this was a hardcoded list that required manual updates whenever
82
+ // extensions were added or removed — causing merge conflicts in forks and
83
+ // falling out of sync with what buildResourceLoader() discovers at runtime.
84
+ const bundledExtDir = join(resourcesDir, 'extensions');
85
+ const agentExtDir = join(agentDir, 'extensions');
86
+ const discoveredExtensionPaths = [];
87
+ if (existsSync(bundledExtDir)) {
88
+ for (const entry of readdirSync(bundledExtDir, { withFileTypes: true })) {
89
+ if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {
90
+ discoveredExtensionPaths.push(join(agentExtDir, entry.name));
91
+ }
92
+ else if (entry.isDirectory()) {
93
+ const srcIndex = existsSync(join(bundledExtDir, entry.name, 'index.ts'))
94
+ ? 'index.ts'
95
+ : existsSync(join(bundledExtDir, entry.name, 'index.js'))
96
+ ? 'index.js'
97
+ : null;
98
+ if (srcIndex) {
99
+ discoveredExtensionPaths.push(join(agentExtDir, entry.name, srcIndex));
100
+ }
101
+ }
102
+ }
103
+ }
104
+ process.env.GSD_BUNDLED_EXTENSION_PATHS = serializeBundledExtensionPaths(discoveredExtensionPaths);
88
105
  // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars for all outbound requests.
89
106
  // pi-coding-agent's cli.ts sets this, but GSD bypasses that entry point — so we
90
107
  // must set it here before any SDK clients are created.
@@ -10,7 +10,10 @@
10
10
  * All steps are skippable. All errors are recoverable. Never crashes boot.
11
11
  */
12
12
  import { exec } from 'node:child_process';
13
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
14
+ import { dirname, join } from 'node:path';
13
15
  import { renderLogo } from './logo.js';
16
+ import { agentDir } from './app-paths.js';
14
17
  // ─── Constants ────────────────────────────────────────────────────────────────
15
18
  const TOOL_KEYS = [
16
19
  {
@@ -45,6 +48,7 @@ const LLM_PROVIDER_IDS = [
45
48
  'xai',
46
49
  'openrouter',
47
50
  'mistral',
51
+ 'custom-openai',
48
52
  ];
49
53
  /** API key prefix validation — loose checks to catch obvious mistakes */
50
54
  const API_KEY_PREFIXES = {
@@ -57,6 +61,7 @@ const OTHER_PROVIDERS = [
57
61
  { value: 'xai', label: 'xAI (Grok)' },
58
62
  { value: 'openrouter', label: 'OpenRouter' },
59
63
  { value: 'mistral', label: 'Mistral' },
64
+ { value: 'custom-openai', label: 'Custom (OpenAI-compatible)' },
60
65
  ];
61
66
  // ─── Dynamic imports ──────────────────────────────────────────────────────────
62
67
  /**
@@ -276,6 +281,9 @@ async function runLlmStep(p, pc, authStorage) {
276
281
  });
277
282
  if (p.isCancel(provider))
278
283
  return false;
284
+ if (provider === 'custom-openai') {
285
+ return await runCustomOpenAIFlow(p, pc, authStorage);
286
+ }
279
287
  const label = provider === 'anthropic' ? 'Anthropic'
280
288
  : provider === 'openai' ? 'OpenAI'
281
289
  : OTHER_PROVIDERS.find(op => op.value === provider)?.label ?? String(provider);
@@ -365,6 +373,94 @@ async function runApiKeyFlow(p, pc, authStorage, providerId, providerLabel) {
365
373
  p.log.success(`API key saved for ${pc.green(providerLabel)}`);
366
374
  return true;
367
375
  }
376
+ // ─── Custom OpenAI-compatible Flow ────────────────────────────────────────────
377
+ async function runCustomOpenAIFlow(p, pc, authStorage) {
378
+ // Prompt for base URL
379
+ const baseUrl = await p.text({
380
+ message: 'Base URL of your OpenAI-compatible endpoint:',
381
+ placeholder: 'https://my-proxy.example.com/v1',
382
+ validate: (val) => {
383
+ const trimmed = val?.trim();
384
+ if (!trimmed)
385
+ return 'Base URL is required';
386
+ try {
387
+ new URL(trimmed);
388
+ }
389
+ catch {
390
+ return 'Must be a valid URL (e.g. https://my-proxy.example.com/v1)';
391
+ }
392
+ },
393
+ });
394
+ if (p.isCancel(baseUrl) || !baseUrl)
395
+ return false;
396
+ const trimmedUrl = baseUrl.trim();
397
+ // Prompt for API key
398
+ const apiKey = await p.password({
399
+ message: 'API key for this endpoint:',
400
+ mask: '●',
401
+ });
402
+ if (p.isCancel(apiKey) || !apiKey)
403
+ return false;
404
+ const trimmedKey = apiKey.trim();
405
+ if (!trimmedKey)
406
+ return false;
407
+ // Prompt for model ID
408
+ const modelId = await p.text({
409
+ message: 'Model ID to use:',
410
+ placeholder: 'gpt-4o',
411
+ validate: (val) => {
412
+ if (!val?.trim())
413
+ return 'Model ID is required';
414
+ },
415
+ });
416
+ if (p.isCancel(modelId) || !modelId)
417
+ return false;
418
+ const trimmedModelId = modelId.trim();
419
+ // Save API key to auth storage
420
+ authStorage.set('custom-openai', { type: 'api_key', key: trimmedKey });
421
+ // Write or merge into models.json
422
+ const modelsJsonPath = join(agentDir, 'models.json');
423
+ let config = { providers: {} };
424
+ if (existsSync(modelsJsonPath)) {
425
+ try {
426
+ config = JSON.parse(readFileSync(modelsJsonPath, 'utf-8'));
427
+ if (!config.providers)
428
+ config.providers = {};
429
+ }
430
+ catch {
431
+ // If existing file is corrupt, start fresh
432
+ config = { providers: {} };
433
+ }
434
+ }
435
+ config.providers['custom-openai'] = {
436
+ baseUrl: trimmedUrl,
437
+ apiKey: `env:CUSTOM_OPENAI_API_KEY`,
438
+ api: 'openai-completions',
439
+ models: [
440
+ {
441
+ id: trimmedModelId,
442
+ name: trimmedModelId,
443
+ reasoning: false,
444
+ input: ['text'],
445
+ contextWindow: 128000,
446
+ maxTokens: 16384,
447
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
448
+ },
449
+ ],
450
+ };
451
+ // Ensure parent directory exists
452
+ const dir = dirname(modelsJsonPath);
453
+ if (!existsSync(dir)) {
454
+ mkdirSync(dir, { recursive: true });
455
+ }
456
+ writeFileSync(modelsJsonPath, JSON.stringify(config, null, 2), 'utf-8');
457
+ // Also set env var so the current session picks up the key via fallback resolver
458
+ process.env.CUSTOM_OPENAI_API_KEY = trimmedKey;
459
+ p.log.success(`Custom endpoint saved: ${pc.green(trimmedUrl)}`);
460
+ p.log.info(`Model: ${pc.cyan(trimmedModelId)}`);
461
+ p.log.info(`Config written to ${pc.dim(modelsJsonPath)}`);
462
+ return true;
463
+ }
368
464
  // ─── Web Search Provider Step ─────────────────────────────────────────────────
369
465
  async function runWebSearchStep(p, pc, authStorage, isAnthropicAuth) {
370
466
  // Check which LLM provider was configured
@@ -659,6 +755,7 @@ export function loadStoredEnvKeys(authStorage) {
659
755
  ['slack_bot', 'SLACK_BOT_TOKEN'],
660
756
  ['discord_bot', 'DISCORD_BOT_TOKEN'],
661
757
  ['groq', 'GROQ_API_KEY'],
758
+ ['custom-openai', 'CUSTOM_OPENAI_API_KEY'],
662
759
  ];
663
760
  for (const [provider, envVar] of providers) {
664
761
  if (!process.env[envVar]) {
@@ -3,9 +3,18 @@ import { homedir } from 'node:os';
3
3
  import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync } from 'node:fs';
4
4
  import { dirname, join, relative, resolve } from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
- // Resolves to the bundled src/resources/ inside the npm package at runtime:
7
- // dist/resource-loader.js .. package root src/resources/
8
- const resourcesDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'src', 'resources');
6
+ // Resolve resources directory prefer dist/resources/ (stable, set at build time)
7
+ // over src/resources/ (live working tree, changes with git branch).
8
+ //
9
+ // Why this matters: with `npm link`, src/resources/ points into the gsd-2 repo's
10
+ // working tree. Switching branches there changes src/resources/ for ALL projects
11
+ // that use gsd — causing stale/broken extensions to be synced to ~/.gsd/agent/.
12
+ // dist/resources/ is populated by the build step (`npm run copy-resources`) and
13
+ // reflects the built state, not the currently checked-out branch.
14
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
15
+ const distResources = join(packageRoot, 'dist', 'resources');
16
+ const srcResources = join(packageRoot, 'src', 'resources');
17
+ const resourcesDir = existsSync(distResources) ? distResources : srcResources;
9
18
  const bundledExtensionsDir = join(resourcesDir, 'extensions');
10
19
  function isExtensionFile(name) {
11
20
  return name.endsWith('.ts') || name.endsWith('.js');