gsd-pi 2.10.12 → 2.12.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 (504) 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 +100 -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 +3179 -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 +3732 -0
  49. package/dist/resources/extensions/gsd/commands.ts +544 -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 +766 -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 +1054 -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/post-unit-hooks.ts +449 -0
  77. package/dist/resources/extensions/gsd/preferences.ts +988 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.ts +92 -0
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +27 -0
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +237 -0
  82. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
  83. package/dist/resources/extensions/gsd/prompts/execute-task.md +63 -0
  84. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -0
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -0
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +61 -0
  87. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +3 -0
  88. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +29 -0
  89. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -0
  90. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +13 -0
  91. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  92. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +78 -0
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +55 -0
  94. package/dist/resources/extensions/gsd/prompts/queue.md +100 -0
  95. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
  96. package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  97. package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
  98. package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
  99. package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
  100. package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
  101. package/dist/resources/extensions/gsd/prompts/system.md +190 -0
  102. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
  103. package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
  104. package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
  105. package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
  106. package/dist/resources/extensions/gsd/state.ts +569 -0
  107. package/dist/resources/extensions/gsd/templates/context.md +76 -0
  108. package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
  109. package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
  110. package/dist/resources/extensions/gsd/templates/plan.md +131 -0
  111. package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
  112. package/dist/resources/extensions/gsd/templates/project.md +31 -0
  113. package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
  114. package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
  115. package/dist/resources/extensions/gsd/templates/research.md +46 -0
  116. package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
  117. package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  118. package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
  119. package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
  120. package/dist/resources/extensions/gsd/templates/state.md +19 -0
  121. package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
  122. package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
  123. package/dist/resources/extensions/gsd/templates/uat.md +54 -0
  124. package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
  125. package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  126. package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
  127. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
  128. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
  129. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  130. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
  131. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
  132. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
  133. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
  134. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
  135. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
  136. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
  137. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
  138. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
  139. package/dist/resources/extensions/gsd/tests/doctor.test.ts +594 -0
  140. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
  141. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
  142. package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
  143. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
  144. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
  145. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
  146. package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
  147. package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
  148. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
  149. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
  150. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
  151. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
  152. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
  153. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
  154. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
  155. package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  156. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
  157. package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
  158. package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
  159. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
  160. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
  161. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  162. package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  163. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
  164. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
  165. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +281 -0
  166. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
  167. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  168. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
  169. package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
  170. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
  171. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
  172. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
  173. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
  174. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
  175. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
  176. package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
  177. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
  178. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
  179. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
  180. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
  181. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
  182. package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
  183. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
  184. package/dist/resources/extensions/gsd/types.ts +296 -0
  185. package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
  186. package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
  187. package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
  188. package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
  189. package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
  190. package/dist/resources/extensions/mac-tools/index.ts +852 -0
  191. package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  192. package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  193. package/dist/resources/extensions/mcporter/index.ts +429 -0
  194. package/dist/resources/extensions/remote-questions/config.ts +81 -0
  195. package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
  196. package/dist/resources/extensions/remote-questions/format.ts +163 -0
  197. package/dist/resources/extensions/remote-questions/manager.ts +192 -0
  198. package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
  199. package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
  200. package/dist/resources/extensions/remote-questions/status.ts +31 -0
  201. package/dist/resources/extensions/remote-questions/store.ts +77 -0
  202. package/dist/resources/extensions/remote-questions/types.ts +75 -0
  203. package/dist/resources/extensions/search-the-web/cache.ts +78 -0
  204. package/dist/resources/extensions/search-the-web/command-search-provider.ts +99 -0
  205. package/dist/resources/extensions/search-the-web/format.ts +258 -0
  206. package/dist/resources/extensions/search-the-web/http.ts +238 -0
  207. package/dist/resources/extensions/search-the-web/index.ts +65 -0
  208. package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
  209. package/dist/resources/extensions/search-the-web/provider.ts +136 -0
  210. package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
  211. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +581 -0
  212. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +620 -0
  213. package/dist/resources/extensions/search-the-web/tool-search.ts +635 -0
  214. package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
  215. package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  216. package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
  217. package/dist/resources/extensions/shared/interview-ui.ts +613 -0
  218. package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
  219. package/dist/resources/extensions/shared/progress-widget.ts +282 -0
  220. package/dist/resources/extensions/shared/terminal.ts +23 -0
  221. package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
  222. package/dist/resources/extensions/shared/ui.ts +400 -0
  223. package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
  224. package/dist/resources/extensions/slash-commands/audit.ts +88 -0
  225. package/dist/resources/extensions/slash-commands/clear.ts +10 -0
  226. package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
  227. package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  228. package/dist/resources/extensions/slash-commands/index.ts +12 -0
  229. package/dist/resources/extensions/subagent/agents.ts +126 -0
  230. package/dist/resources/extensions/subagent/index.ts +1072 -0
  231. package/dist/resources/extensions/subagent/isolation.ts +498 -0
  232. package/dist/resources/extensions/ttsr/index.ts +163 -0
  233. package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
  234. package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  235. package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
  236. package/dist/resources/extensions/universal-config/discovery.ts +78 -0
  237. package/dist/resources/extensions/universal-config/format.ts +160 -0
  238. package/dist/resources/extensions/universal-config/index.ts +118 -0
  239. package/dist/resources/extensions/universal-config/package.json +11 -0
  240. package/dist/resources/extensions/universal-config/scanners.ts +579 -0
  241. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
  242. package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
  243. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
  244. package/dist/resources/extensions/universal-config/tools.ts +60 -0
  245. package/dist/resources/extensions/universal-config/types.ts +116 -0
  246. package/dist/resources/extensions/voice/index.ts +271 -0
  247. package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
  248. package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
  249. package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
  250. package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  251. package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  252. package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  253. package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  254. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  255. package/dist/resources/skills/frontend-design/SKILL.md +45 -0
  256. package/dist/resources/skills/github-workflows/SKILL.md +92 -0
  257. package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
  258. package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  259. package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  260. package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  261. package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  262. package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  263. package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  264. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  265. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  266. package/dist/resources/skills/swiftui/SKILL.md +208 -0
  267. package/dist/resources/skills/swiftui/references/animations.md +921 -0
  268. package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
  269. package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
  270. package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
  271. package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
  272. package/dist/resources/skills/swiftui/references/performance.md +1706 -0
  273. package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
  274. package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
  275. package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
  276. package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
  277. package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
  278. package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
  279. package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
  280. package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
  281. package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
  282. package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
  283. package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
  284. package/dist/wizard.js +1 -0
  285. package/package.json +8 -6
  286. package/packages/native/dist/fd/index.d.ts +1 -0
  287. package/packages/native/dist/fd/index.js +1 -0
  288. package/packages/native/dist/grep/index.d.ts +2 -1
  289. package/packages/native/dist/grep/index.js +1 -0
  290. package/packages/native/src/__tests__/fd.test.mjs +35 -0
  291. package/packages/native/src/__tests__/grep.test.mjs +26 -9
  292. package/packages/native/src/fd/index.ts +1 -0
  293. package/packages/native/src/grep/index.ts +3 -2
  294. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  295. package/packages/pi-agent-core/dist/agent-loop.js +169 -55
  296. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  297. package/packages/pi-agent-core/dist/agent.d.ts +13 -1
  298. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  299. package/packages/pi-agent-core/dist/agent.js +16 -0
  300. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  301. package/packages/pi-agent-core/dist/types.d.ts +91 -1
  302. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/packages/pi-agent-core/dist/types.js.map +1 -1
  304. package/packages/pi-agent-core/src/agent-loop.ts +273 -63
  305. package/packages/pi-agent-core/src/agent.ts +24 -0
  306. package/packages/pi-agent-core/src/types.ts +98 -0
  307. package/packages/pi-ai/dist/env-api-keys.js +2 -0
  308. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +314 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +236 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
  315. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
  318. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  319. package/packages/pi-ai/dist/types.d.ts +1 -1
  320. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/types.js.map +1 -1
  322. package/packages/pi-ai/src/env-api-keys.ts +2 -0
  323. package/packages/pi-ai/src/models.generated.ts +236 -0
  324. package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
  325. package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
  326. package/packages/pi-ai/src/types.ts +2 -1
  327. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/cli/args.js +1 -0
  329. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +26 -0
  331. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/agent-session.js +137 -22
  333. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
  335. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
  337. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
  339. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
  341. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
  343. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
  345. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  347. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  349. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  352. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
  354. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
  356. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
  360. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  362. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
  364. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
  367. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
  377. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  378. package/packages/pi-coding-agent/src/cli/args.ts +1 -0
  379. package/packages/pi-coding-agent/src/core/agent-session.ts +167 -22
  380. package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
  381. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
  382. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
  383. package/packages/pi-coding-agent/src/core/index.ts +1 -0
  384. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  385. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
  386. package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
  387. package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
  389. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
  390. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
  391. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
  392. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  393. package/packages/pi-tui/dist/autocomplete.js +3 -4
  394. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  395. package/packages/pi-tui/dist/components/editor.d.ts +7 -0
  396. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  397. package/packages/pi-tui/dist/components/editor.js +57 -50
  398. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  399. package/packages/pi-tui/src/autocomplete.ts +3 -5
  400. package/packages/pi-tui/src/components/editor.ts +70 -49
  401. package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
  402. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  403. package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
  404. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
  405. package/pkg/dist/core/export-html/index.d.ts +37 -0
  406. package/pkg/dist/core/export-html/index.d.ts.map +1 -0
  407. package/pkg/dist/core/export-html/index.js +223 -0
  408. package/pkg/dist/core/export-html/index.js.map +1 -0
  409. package/pkg/dist/core/export-html/template.css +971 -0
  410. package/pkg/dist/core/export-html/template.html +54 -0
  411. package/pkg/dist/core/export-html/template.js +1583 -0
  412. package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
  413. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  414. package/pkg/dist/core/export-html/tool-renderer.js +70 -0
  415. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
  416. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  417. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  418. package/scripts/postinstall.js +30 -17
  419. package/src/resources/extensions/bg-shell/index.ts +51 -7
  420. package/src/resources/extensions/gsd/activity-log.ts +61 -14
  421. package/src/resources/extensions/gsd/auto.ts +288 -19
  422. package/src/resources/extensions/gsd/commands.ts +9 -3
  423. package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
  425. package/src/resources/extensions/gsd/doctor.ts +60 -3
  426. package/src/resources/extensions/gsd/files.ts +45 -1
  427. package/src/resources/extensions/gsd/git-service.ts +46 -41
  428. package/src/resources/extensions/gsd/guided-flow.ts +81 -9
  429. package/src/resources/extensions/gsd/index.ts +62 -1
  430. package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
  431. package/src/resources/extensions/gsd/paths.ts +35 -4
  432. package/src/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  433. package/src/resources/extensions/gsd/preferences.ts +232 -1
  434. package/src/resources/extensions/gsd/prompt-loader.ts +45 -3
  435. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -3
  437. package/src/resources/extensions/gsd/prompts/discuss.md +10 -8
  438. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  439. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -1
  440. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -1
  441. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
  442. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +3 -1
  443. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +4 -2
  444. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -1
  445. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +3 -1
  446. package/src/resources/extensions/gsd/prompts/plan-milestone.md +9 -12
  447. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -3
  448. package/src/resources/extensions/gsd/prompts/queue.md +3 -1
  449. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  450. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  451. package/src/resources/extensions/gsd/state.ts +130 -18
  452. package/src/resources/extensions/gsd/templates/context.md +1 -1
  453. package/src/resources/extensions/gsd/templates/state.md +3 -3
  454. package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
  456. package/src/resources/extensions/gsd/tests/doctor.test.ts +115 -1
  457. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
  458. package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
  459. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
  460. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
  461. package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  462. package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
  463. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  464. package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  465. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
  467. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
  468. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
  469. package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
  470. package/src/resources/extensions/gsd/types.ts +109 -0
  471. package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
  472. package/src/resources/extensions/gsd/worktree.ts +5 -4
  473. package/src/resources/extensions/search-the-web/command-search-provider.ts +8 -4
  474. package/src/resources/extensions/search-the-web/native-search.ts +32 -23
  475. package/src/resources/extensions/search-the-web/provider.ts +19 -2
  476. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +62 -0
  477. package/src/resources/extensions/search-the-web/tool-llm-context.ts +62 -3
  478. package/src/resources/extensions/search-the-web/tool-search.ts +62 -3
  479. package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  480. package/src/resources/extensions/subagent/index.ts +2 -1
  481. package/src/resources/skills/github-workflows/SKILL.md +5 -0
  482. package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
  483. package/dist/resources/extensions/gsd/git-service.js +0 -756
  484. package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
  485. package/dist/resources/extensions/gsd/preferences.js +0 -616
  486. package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
  487. package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
  488. package/dist/resources/extensions/remote-questions/config.js +0 -68
  489. package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
  490. package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
  491. package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
  492. package/dist/resources/extensions/remote-questions/format.js +0 -119
  493. package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
  494. package/dist/resources/extensions/remote-questions/manager.js +0 -161
  495. package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
  496. package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
  497. package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
  498. package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
  499. package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
  500. package/dist/resources/extensions/remote-questions/status.js +0 -25
  501. package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
  502. package/dist/resources/extensions/remote-questions/store.js +0 -66
  503. package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
  504. package/dist/resources/extensions/remote-questions/types.js +0 -4
@@ -1,616 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { isAbsolute, join } from "node:path";
4
- import { getAgentDir } from "@gsd/pi-coding-agent";
5
- import { VALID_BRANCH_NAME } from "./git-service.js";
6
- const GLOBAL_PREFERENCES_PATH = join(homedir(), ".gsd", "preferences.md");
7
- const LEGACY_GLOBAL_PREFERENCES_PATH = join(homedir(), ".pi", "agent", "gsd-preferences.md");
8
- const PROJECT_PREFERENCES_PATH = join(process.cwd(), ".gsd", "preferences.md");
9
- // Bootstrap in gitignore.ts historically created PREFERENCES.md (uppercase) by mistake.
10
- // Check uppercase as a fallback so those files aren't silently ignored.
11
- const GLOBAL_PREFERENCES_PATH_UPPERCASE = join(homedir(), ".gsd", "PREFERENCES.md");
12
- const PROJECT_PREFERENCES_PATH_UPPERCASE = join(process.cwd(), ".gsd", "PREFERENCES.md");
13
- const SKILL_ACTIONS = new Set(["use", "prefer", "avoid"]);
14
- export function getGlobalGSDPreferencesPath() {
15
- return GLOBAL_PREFERENCES_PATH;
16
- }
17
- export function getLegacyGlobalGSDPreferencesPath() {
18
- return LEGACY_GLOBAL_PREFERENCES_PATH;
19
- }
20
- export function getProjectGSDPreferencesPath() {
21
- return PROJECT_PREFERENCES_PATH;
22
- }
23
- export function loadGlobalGSDPreferences() {
24
- return loadPreferencesFile(GLOBAL_PREFERENCES_PATH, "global")
25
- ?? loadPreferencesFile(GLOBAL_PREFERENCES_PATH_UPPERCASE, "global")
26
- ?? loadPreferencesFile(LEGACY_GLOBAL_PREFERENCES_PATH, "global");
27
- }
28
- export function loadProjectGSDPreferences() {
29
- return loadPreferencesFile(PROJECT_PREFERENCES_PATH, "project")
30
- ?? loadPreferencesFile(PROJECT_PREFERENCES_PATH_UPPERCASE, "project");
31
- }
32
- export function loadEffectiveGSDPreferences() {
33
- const globalPreferences = loadGlobalGSDPreferences();
34
- const projectPreferences = loadProjectGSDPreferences();
35
- if (!globalPreferences && !projectPreferences)
36
- return null;
37
- if (!globalPreferences)
38
- return projectPreferences;
39
- if (!projectPreferences)
40
- return globalPreferences;
41
- return {
42
- path: projectPreferences.path,
43
- scope: "project",
44
- preferences: mergePreferences(globalPreferences.preferences, projectPreferences.preferences),
45
- };
46
- }
47
- /**
48
- * Known skill directories, in priority order.
49
- * User skills (~/.gsd/agent/skills/) take precedence over project skills.
50
- */
51
- function getSkillSearchDirs(cwd) {
52
- return [
53
- { dir: join(getAgentDir(), "skills"), method: "user-skill" },
54
- { dir: join(cwd, ".pi", "agent", "skills"), method: "project-skill" },
55
- ];
56
- }
57
- /**
58
- * Resolve a single skill reference to an absolute path.
59
- *
60
- * Resolution order:
61
- * 1. Absolute path to a file → check existsSync
62
- * 2. Absolute path to a directory → check for SKILL.md inside
63
- * 3. Bare name → scan known skill directories for <name>/SKILL.md
64
- */
65
- function resolveSkillReference(ref, cwd) {
66
- const trimmed = ref.trim();
67
- // Expand tilde
68
- const expanded = trimmed.startsWith("~/")
69
- ? join(homedir(), trimmed.slice(2))
70
- : trimmed;
71
- // Absolute path
72
- if (isAbsolute(expanded)) {
73
- // Direct file reference
74
- if (existsSync(expanded)) {
75
- // Check if it's a directory — look for SKILL.md inside
76
- try {
77
- const stat = statSync(expanded);
78
- if (stat.isDirectory()) {
79
- const skillFile = join(expanded, "SKILL.md");
80
- if (existsSync(skillFile)) {
81
- return { original: ref, resolvedPath: skillFile, method: "absolute-dir" };
82
- }
83
- return { original: ref, resolvedPath: null, method: "unresolved" };
84
- }
85
- }
86
- catch { /* fall through */ }
87
- return { original: ref, resolvedPath: expanded, method: "absolute-path" };
88
- }
89
- // Maybe it's a directory path without SKILL.md suffix
90
- const withSkillMd = join(expanded, "SKILL.md");
91
- if (existsSync(withSkillMd)) {
92
- return { original: ref, resolvedPath: withSkillMd, method: "absolute-dir" };
93
- }
94
- return { original: ref, resolvedPath: null, method: "unresolved" };
95
- }
96
- // Bare name — scan known skill directories
97
- for (const { dir, method } of getSkillSearchDirs(cwd)) {
98
- if (!existsSync(dir))
99
- continue;
100
- try {
101
- const entries = readdirSync(dir, { withFileTypes: true });
102
- for (const entry of entries) {
103
- if (!entry.isDirectory())
104
- continue;
105
- if (entry.name === expanded) {
106
- const skillFile = join(dir, entry.name, "SKILL.md");
107
- if (existsSync(skillFile)) {
108
- return { original: ref, resolvedPath: skillFile, method };
109
- }
110
- }
111
- }
112
- }
113
- catch { /* directory not readable — skip */ }
114
- }
115
- return { original: ref, resolvedPath: null, method: "unresolved" };
116
- }
117
- /**
118
- * Resolve all skill references in a preferences object.
119
- * Caches resolution per reference string to avoid redundant filesystem scans.
120
- */
121
- export function resolveAllSkillReferences(preferences, cwd) {
122
- const validated = validatePreferences(preferences).preferences;
123
- preferences = validated;
124
- const resolutions = new Map();
125
- const warnings = [];
126
- function resolve(ref) {
127
- const existing = resolutions.get(ref);
128
- if (existing)
129
- return existing;
130
- const result = resolveSkillReference(ref, cwd);
131
- resolutions.set(ref, result);
132
- if (result.method === "unresolved") {
133
- warnings.push(ref);
134
- }
135
- return result;
136
- }
137
- // Resolve all skill lists
138
- for (const skill of preferences.always_use_skills ?? [])
139
- resolve(skill);
140
- for (const skill of preferences.prefer_skills ?? [])
141
- resolve(skill);
142
- for (const skill of preferences.avoid_skills ?? [])
143
- resolve(skill);
144
- // Resolve skill rules
145
- for (const rule of preferences.skill_rules ?? []) {
146
- for (const skill of rule.use ?? [])
147
- resolve(skill);
148
- for (const skill of rule.prefer ?? [])
149
- resolve(skill);
150
- for (const skill of rule.avoid ?? [])
151
- resolve(skill);
152
- }
153
- return { resolutions, warnings };
154
- }
155
- /**
156
- * Format a skill reference for the system prompt.
157
- * If resolved, shows the path so the agent knows exactly where to read.
158
- * If unresolved, marks it clearly.
159
- */
160
- function formatSkillRef(ref, resolutions) {
161
- const resolution = resolutions.get(ref);
162
- if (!resolution || resolution.method === "unresolved") {
163
- return `${ref} (⚠ not found — check skill name or path)`;
164
- }
165
- // For absolute paths where SKILL.md is just appended, don't clutter the output
166
- if (resolution.method === "absolute-path" || resolution.method === "absolute-dir") {
167
- return ref;
168
- }
169
- // For bare names resolved from skill directories, show the resolved path
170
- return `${ref} → \`${resolution.resolvedPath}\``;
171
- }
172
- // ─── System Prompt Rendering ──────────────────────────────────────────────────
173
- export function renderPreferencesForSystemPrompt(preferences, resolutions) {
174
- const validated = validatePreferences(preferences);
175
- const lines = ["## GSD Skill Preferences"];
176
- if (validated.errors.length > 0) {
177
- lines.push("- Validation: some preference values were ignored because they were invalid.");
178
- }
179
- preferences = validated.preferences;
180
- lines.push("- Treat these as explicit skill-selection policy for GSD work.", "- If a listed skill exists and is relevant, load and follow it instead of treating it as a vague suggestion.", "- Current user instructions still override these defaults.");
181
- const fmt = (ref) => resolutions ? formatSkillRef(ref, resolutions) : ref;
182
- if (preferences.always_use_skills && preferences.always_use_skills.length > 0) {
183
- lines.push("- Always use these skills when relevant:");
184
- for (const skill of preferences.always_use_skills) {
185
- lines.push(` - ${fmt(skill)}`);
186
- }
187
- }
188
- if (preferences.prefer_skills && preferences.prefer_skills.length > 0) {
189
- lines.push("- Prefer these skills when relevant:");
190
- for (const skill of preferences.prefer_skills) {
191
- lines.push(` - ${fmt(skill)}`);
192
- }
193
- }
194
- if (preferences.avoid_skills && preferences.avoid_skills.length > 0) {
195
- lines.push("- Avoid these skills unless clearly needed:");
196
- for (const skill of preferences.avoid_skills) {
197
- lines.push(` - ${fmt(skill)}`);
198
- }
199
- }
200
- if (preferences.skill_rules && preferences.skill_rules.length > 0) {
201
- lines.push("- Situational rules:");
202
- for (const rule of preferences.skill_rules) {
203
- lines.push(` - When ${rule.when}:`);
204
- if (rule.use && rule.use.length > 0) {
205
- lines.push(` - use: ${rule.use.map(fmt).join(", ")}`);
206
- }
207
- if (rule.prefer && rule.prefer.length > 0) {
208
- lines.push(` - prefer: ${rule.prefer.map(fmt).join(", ")}`);
209
- }
210
- if (rule.avoid && rule.avoid.length > 0) {
211
- lines.push(` - avoid: ${rule.avoid.map(fmt).join(", ")}`);
212
- }
213
- }
214
- }
215
- if (preferences.custom_instructions && preferences.custom_instructions.length > 0) {
216
- lines.push("- Additional instructions:");
217
- for (const instruction of preferences.custom_instructions) {
218
- lines.push(` - ${instruction}`);
219
- }
220
- }
221
- return lines.join("\n");
222
- }
223
- function loadPreferencesFile(path, scope) {
224
- if (!existsSync(path))
225
- return null;
226
- const raw = readFileSync(path, "utf-8");
227
- const preferences = parsePreferencesMarkdown(raw);
228
- if (!preferences)
229
- return null;
230
- return {
231
- path,
232
- scope,
233
- preferences,
234
- };
235
- }
236
- function parsePreferencesMarkdown(content) {
237
- const match = content.match(/^---\n([\s\S]*?)\n---/);
238
- if (!match)
239
- return null;
240
- return parseFrontmatterBlock(match[1]);
241
- }
242
- function parseFrontmatterBlock(frontmatter) {
243
- const root = {};
244
- const stack = [{ indent: -1, value: root }];
245
- const lines = frontmatter.split(/\r?\n/);
246
- for (let i = 0; i < lines.length; i++) {
247
- const line = lines[i];
248
- if (!line.trim())
249
- continue;
250
- const indent = line.match(/^\s*/)?.[0].length ?? 0;
251
- const trimmed = line.trim();
252
- while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
253
- stack.pop();
254
- }
255
- const current = stack[stack.length - 1].value;
256
- const keyMatch = trimmed.match(/^([A-Za-z0-9_]+):(.*)$/);
257
- if (!keyMatch)
258
- continue;
259
- const [, key, remainder] = keyMatch;
260
- const valuePart = remainder.trim();
261
- if (valuePart === "") {
262
- const nextLine = lines[i + 1] ?? "";
263
- const nextTrimmed = nextLine.trim();
264
- if (nextTrimmed.startsWith("- ")) {
265
- const items = [];
266
- let j = i + 1;
267
- while (j < lines.length) {
268
- const candidate = lines[j];
269
- const candidateIndent = candidate.match(/^\s*/)?.[0].length ?? 0;
270
- const candidateTrimmed = candidate.trim();
271
- if (!candidateTrimmed) {
272
- j++;
273
- continue;
274
- }
275
- if (candidateIndent <= indent || !candidateTrimmed.startsWith("- "))
276
- break;
277
- const itemText = candidateTrimmed.slice(2).trim();
278
- const nextCandidate = lines[j + 1] ?? "";
279
- const nextCandidateIndent = nextCandidate.match(/^\s*/)?.[0].length ?? 0;
280
- const nextCandidateTrimmed = nextCandidate.trim();
281
- if (itemText.includes(":") || (nextCandidateTrimmed && nextCandidateIndent > candidateIndent)) {
282
- const obj = {};
283
- const firstMatch = itemText.match(/^([A-Za-z0-9_]+):(.*)$/);
284
- if (firstMatch) {
285
- obj[firstMatch[1]] = parseScalar(firstMatch[2].trim());
286
- }
287
- j++;
288
- while (j < lines.length) {
289
- const nested = lines[j];
290
- const nestedIndent = nested.match(/^\s*/)?.[0].length ?? 0;
291
- const nestedTrimmed = nested.trim();
292
- if (!nestedTrimmed) {
293
- j++;
294
- continue;
295
- }
296
- if (nestedIndent <= candidateIndent)
297
- break;
298
- const nestedMatch = nestedTrimmed.match(/^([A-Za-z0-9_]+):(.*)$/);
299
- if (nestedMatch) {
300
- const nestedValue = nestedMatch[2].trim();
301
- if (nestedValue === "") {
302
- const nestedItems = [];
303
- j++;
304
- while (j < lines.length) {
305
- const nestedArrayLine = lines[j];
306
- const nestedArrayIndent = nestedArrayLine.match(/^\s*/)?.[0].length ?? 0;
307
- const nestedArrayTrimmed = nestedArrayLine.trim();
308
- if (!nestedArrayTrimmed) {
309
- j++;
310
- continue;
311
- }
312
- if (nestedArrayIndent <= nestedIndent || !nestedArrayTrimmed.startsWith("- "))
313
- break;
314
- nestedItems.push(String(parseScalar(nestedArrayTrimmed.slice(2).trim())));
315
- j++;
316
- }
317
- obj[nestedMatch[1]] = nestedItems;
318
- continue;
319
- }
320
- obj[nestedMatch[1]] = parseScalar(nestedValue);
321
- }
322
- j++;
323
- }
324
- items.push(obj);
325
- continue;
326
- }
327
- items.push(parseScalar(itemText));
328
- j++;
329
- }
330
- current[key] = items;
331
- i = j - 1;
332
- }
333
- else {
334
- const obj = {};
335
- current[key] = obj;
336
- stack.push({ indent, value: obj });
337
- }
338
- continue;
339
- }
340
- current[key] = parseScalar(valuePart);
341
- }
342
- return root;
343
- }
344
- function parseScalar(value) {
345
- if (value === "true")
346
- return true;
347
- if (value === "false")
348
- return false;
349
- if (/^-?\d+$/.test(value)) {
350
- const n = Number(value);
351
- // Keep large integers (e.g. Discord channel IDs) as strings to avoid precision loss
352
- if (Number.isSafeInteger(n))
353
- return n;
354
- return value;
355
- }
356
- return value.replace(/^['\"]|['\"]$/g, "");
357
- }
358
- /**
359
- * Resolve the skill discovery mode from effective preferences.
360
- * Defaults to "suggest" — skills are identified during research but not installed automatically.
361
- */
362
- export function resolveSkillDiscoveryMode() {
363
- const prefs = loadEffectiveGSDPreferences();
364
- return prefs?.preferences.skill_discovery ?? "suggest";
365
- }
366
- /**
367
- * Resolve which model ID to use for a given auto-mode unit type.
368
- * Returns undefined if no model preference is set for this unit type.
369
- */
370
- export function resolveModelForUnit(unitType) {
371
- const resolved = resolveModelWithFallbacksForUnit(unitType);
372
- return resolved?.primary;
373
- }
374
- /**
375
- * Resolve model and fallbacks for a given auto-mode unit type.
376
- * Returns the primary model and ordered fallbacks, or undefined if not configured.
377
- *
378
- * Supports both legacy string format and extended object format:
379
- * - Legacy: `planning: claude-opus-4-6`
380
- * - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
381
- */
382
- export function resolveModelWithFallbacksForUnit(unitType) {
383
- const prefs = loadEffectiveGSDPreferences();
384
- if (!prefs?.preferences.models)
385
- return undefined;
386
- const m = prefs.preferences.models;
387
- let phaseConfig;
388
- switch (unitType) {
389
- case "research-milestone":
390
- case "research-slice":
391
- phaseConfig = m.research;
392
- break;
393
- case "plan-milestone":
394
- case "plan-slice":
395
- case "replan-slice":
396
- phaseConfig = m.planning;
397
- break;
398
- case "execute-task":
399
- phaseConfig = m.execution;
400
- break;
401
- case "complete-slice":
402
- case "run-uat":
403
- phaseConfig = m.completion;
404
- break;
405
- default:
406
- return undefined;
407
- }
408
- if (!phaseConfig)
409
- return undefined;
410
- // Normalize: string -> { model, fallbacks: [] }
411
- if (typeof phaseConfig === "string") {
412
- return { primary: phaseConfig, fallbacks: [] };
413
- }
414
- return {
415
- primary: phaseConfig.model,
416
- fallbacks: phaseConfig.fallbacks ?? [],
417
- };
418
- }
419
- export function resolveAutoSupervisorConfig() {
420
- const prefs = loadEffectiveGSDPreferences();
421
- const configured = prefs?.preferences.auto_supervisor ?? {};
422
- return {
423
- soft_timeout_minutes: configured.soft_timeout_minutes ?? 20,
424
- idle_timeout_minutes: configured.idle_timeout_minutes ?? 10,
425
- hard_timeout_minutes: configured.hard_timeout_minutes ?? 30,
426
- ...(configured.model ? { model: configured.model } : {}),
427
- };
428
- }
429
- function mergePreferences(base, override) {
430
- return {
431
- version: override.version ?? base.version,
432
- always_use_skills: mergeStringLists(base.always_use_skills, override.always_use_skills),
433
- prefer_skills: mergeStringLists(base.prefer_skills, override.prefer_skills),
434
- avoid_skills: mergeStringLists(base.avoid_skills, override.avoid_skills),
435
- skill_rules: [...(base.skill_rules ?? []), ...(override.skill_rules ?? [])],
436
- custom_instructions: mergeStringLists(base.custom_instructions, override.custom_instructions),
437
- models: { ...(base.models ?? {}), ...(override.models ?? {}) },
438
- skill_discovery: override.skill_discovery ?? base.skill_discovery,
439
- auto_supervisor: { ...(base.auto_supervisor ?? {}), ...(override.auto_supervisor ?? {}) },
440
- uat_dispatch: override.uat_dispatch ?? base.uat_dispatch,
441
- unique_milestone_ids: override.unique_milestone_ids ?? base.unique_milestone_ids,
442
- budget_ceiling: override.budget_ceiling ?? base.budget_ceiling,
443
- remote_questions: override.remote_questions
444
- ? { ...(base.remote_questions ?? {}), ...override.remote_questions }
445
- : base.remote_questions,
446
- git: (base.git || override.git)
447
- ? { ...(base.git ?? {}), ...(override.git ?? {}) }
448
- : undefined,
449
- };
450
- }
451
- function validatePreferences(preferences) {
452
- const errors = [];
453
- const validated = {};
454
- if (preferences.version !== undefined) {
455
- if (preferences.version === 1) {
456
- validated.version = 1;
457
- }
458
- else {
459
- errors.push(`unsupported version ${preferences.version}`);
460
- }
461
- }
462
- const validDiscoveryModes = new Set(["auto", "suggest", "off"]);
463
- if (preferences.skill_discovery) {
464
- if (validDiscoveryModes.has(preferences.skill_discovery)) {
465
- validated.skill_discovery = preferences.skill_discovery;
466
- }
467
- else {
468
- errors.push(`invalid skill_discovery value: ${preferences.skill_discovery}`);
469
- }
470
- }
471
- validated.always_use_skills = normalizeStringList(preferences.always_use_skills);
472
- validated.prefer_skills = normalizeStringList(preferences.prefer_skills);
473
- validated.avoid_skills = normalizeStringList(preferences.avoid_skills);
474
- validated.custom_instructions = normalizeStringList(preferences.custom_instructions);
475
- if (preferences.skill_rules) {
476
- const validRules = [];
477
- for (const rule of preferences.skill_rules) {
478
- if (!rule || typeof rule !== "object") {
479
- errors.push("invalid skill_rules entry");
480
- continue;
481
- }
482
- const when = typeof rule.when === "string" ? rule.when.trim() : "";
483
- if (!when) {
484
- errors.push("skill_rules entry missing when");
485
- continue;
486
- }
487
- const validatedRule = { when };
488
- for (const action of SKILL_ACTIONS) {
489
- const values = normalizeStringList(rule[action]);
490
- if (values.length > 0) {
491
- validatedRule[action] = values;
492
- }
493
- }
494
- if (!validatedRule.use && !validatedRule.prefer && !validatedRule.avoid) {
495
- errors.push(`skill rule has no actions: ${when}`);
496
- continue;
497
- }
498
- validRules.push(validatedRule);
499
- }
500
- if (validRules.length > 0) {
501
- validated.skill_rules = validRules;
502
- }
503
- }
504
- for (const key of ["always_use_skills", "prefer_skills", "avoid_skills", "custom_instructions"]) {
505
- if (validated[key] && validated[key].length === 0) {
506
- delete validated[key];
507
- }
508
- }
509
- if (preferences.uat_dispatch !== undefined) {
510
- validated.uat_dispatch = !!preferences.uat_dispatch;
511
- }
512
- if (preferences.unique_milestone_ids !== undefined) {
513
- validated.unique_milestone_ids = !!preferences.unique_milestone_ids;
514
- }
515
- if (preferences.budget_ceiling !== undefined) {
516
- const raw = preferences.budget_ceiling;
517
- if (typeof raw === "number" && Number.isFinite(raw)) {
518
- validated.budget_ceiling = raw;
519
- }
520
- else if (typeof raw === "string" && Number.isFinite(Number(raw))) {
521
- validated.budget_ceiling = Number(raw);
522
- }
523
- else {
524
- errors.push("budget_ceiling must be a finite number");
525
- }
526
- }
527
- // ─── Git Preferences ───────────────────────────────────────────────────
528
- if (preferences.git && typeof preferences.git === "object") {
529
- const git = {};
530
- const g = preferences.git;
531
- if (g.auto_push !== undefined) {
532
- if (typeof g.auto_push === "boolean")
533
- git.auto_push = g.auto_push;
534
- else
535
- errors.push("git.auto_push must be a boolean");
536
- }
537
- if (g.push_branches !== undefined) {
538
- if (typeof g.push_branches === "boolean")
539
- git.push_branches = g.push_branches;
540
- else
541
- errors.push("git.push_branches must be a boolean");
542
- }
543
- if (g.remote !== undefined) {
544
- if (typeof g.remote === "string" && g.remote.trim() !== "")
545
- git.remote = g.remote.trim();
546
- else
547
- errors.push("git.remote must be a non-empty string");
548
- }
549
- if (g.snapshots !== undefined) {
550
- if (typeof g.snapshots === "boolean")
551
- git.snapshots = g.snapshots;
552
- else
553
- errors.push("git.snapshots must be a boolean");
554
- }
555
- if (g.pre_merge_check !== undefined) {
556
- if (typeof g.pre_merge_check === "boolean") {
557
- git.pre_merge_check = g.pre_merge_check;
558
- }
559
- else if (typeof g.pre_merge_check === "string" && g.pre_merge_check.trim() !== "") {
560
- git.pre_merge_check = g.pre_merge_check.trim();
561
- }
562
- else {
563
- errors.push("git.pre_merge_check must be a boolean or a non-empty string command");
564
- }
565
- }
566
- if (g.commit_type !== undefined) {
567
- const validCommitTypes = new Set([
568
- "feat", "fix", "refactor", "docs", "test", "chore", "perf", "ci", "build", "style",
569
- ]);
570
- if (typeof g.commit_type === "string" && validCommitTypes.has(g.commit_type)) {
571
- git.commit_type = g.commit_type;
572
- }
573
- else {
574
- errors.push(`git.commit_type must be one of: feat, fix, refactor, docs, test, chore, perf, ci, build, style`);
575
- }
576
- }
577
- if (g.merge_strategy !== undefined) {
578
- const validStrategies = new Set(["squash", "merge"]);
579
- if (typeof g.merge_strategy === "string" && validStrategies.has(g.merge_strategy)) {
580
- git.merge_strategy = g.merge_strategy;
581
- }
582
- else {
583
- errors.push("git.merge_strategy must be one of: squash, merge");
584
- }
585
- }
586
- if (g.main_branch !== undefined) {
587
- if (typeof g.main_branch === "string" && g.main_branch.trim() !== "" && VALID_BRANCH_NAME.test(g.main_branch)) {
588
- git.main_branch = g.main_branch;
589
- }
590
- else {
591
- errors.push("git.main_branch must be a valid branch name (alphanumeric, _, -, /, .)");
592
- }
593
- }
594
- if (Object.keys(git).length > 0) {
595
- validated.git = git;
596
- }
597
- }
598
- return { preferences: validated, errors };
599
- }
600
- function mergeStringLists(base, override) {
601
- const merged = [
602
- ...normalizeStringList(base),
603
- ...normalizeStringList(override),
604
- ]
605
- .map((item) => item.trim())
606
- .filter(Boolean);
607
- return merged.length > 0 ? Array.from(new Set(merged)) : undefined;
608
- }
609
- function normalizeStringList(value) {
610
- if (!Array.isArray(value))
611
- return [];
612
- return value
613
- .filter((item) => typeof item === "string")
614
- .map((item) => item.trim())
615
- .filter(Boolean);
616
- }