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
@@ -9,10 +9,12 @@
9
9
  import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@gsd/pi-coding-agent";
10
10
  import { showNextAction } from "../shared/next-action-ui.js";
11
11
  import { loadFile, parseRoadmap } from "./files.js";
12
- import { loadPrompt } from "./prompt-loader.js";
12
+ import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
13
13
  import { deriveState } from "./state.js";
14
14
  import { startAuto } from "./auto.js";
15
15
  import { readCrashLock, clearLock, formatCrashInfo } from "./crash-recovery.js";
16
+ import { listUnitRuntimeRecords, clearUnitRuntimeRecord } from "./unit-runtime.js";
17
+ import { resolveExpectedArtifactPath } from "./auto.js";
16
18
  import {
17
19
  gsdRoot, milestonesDir, resolveMilestoneFile, resolveMilestonePath,
18
20
  resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile,
@@ -97,11 +99,19 @@ function dispatchWorkflow(pi: ExtensionAPI, note: string, customType = "gsd-run"
97
99
  */
98
100
  function buildDiscussPrompt(nextId: string, preamble: string, _basePath: string): string {
99
101
  const milestoneRel = `.gsd/milestones/${nextId}`;
102
+ const inlinedTemplates = [
103
+ inlineTemplate("project", "Project"),
104
+ inlineTemplate("requirements", "Requirements"),
105
+ inlineTemplate("context", "Context"),
106
+ inlineTemplate("roadmap", "Roadmap"),
107
+ inlineTemplate("decisions", "Decisions"),
108
+ ].join("\n\n---\n\n");
100
109
  return loadPrompt("discuss", {
101
110
  milestoneId: nextId,
102
111
  preamble,
103
112
  contextPath: `${milestoneRel}/${nextId}-CONTEXT.md`,
104
113
  roadmapPath: `${milestoneRel}/${nextId}-ROADMAP.md`,
114
+ inlinedTemplates,
105
115
  });
106
116
  }
107
117
 
@@ -234,11 +244,13 @@ export async function showQueue(
234
244
  ].join(" ");
235
245
 
236
246
  // ── Dispatch the queue prompt ───────────────────────────────────────
247
+ const queueInlinedTemplates = inlineTemplate("context", "Context");
237
248
  const prompt = loadPrompt("queue", {
238
249
  preamble,
239
250
  nextId,
240
251
  nextIdPlus1,
241
252
  existingMilestonesContext: existingContext,
253
+ inlinedTemplates: queueInlinedTemplates,
242
254
  });
243
255
 
244
256
  pi.sendMessage(
@@ -415,6 +427,7 @@ async function buildDiscussSlicePrompt(
415
427
  const sliceDirPath = `.gsd/milestones/${mid}/slices/${sid}`;
416
428
  const sliceContextPath = `${sliceDirPath}/${sid}-CONTEXT.md`;
417
429
 
430
+ const inlinedTemplates = inlineTemplate("slice-context", "Slice Context");
418
431
  return loadPrompt("guided-discuss-slice", {
419
432
  milestoneId: mid,
420
433
  sliceId: sid,
@@ -423,6 +436,7 @@ async function buildDiscussSlicePrompt(
423
436
  sliceDirPath,
424
437
  contextPath: sliceContextPath,
425
438
  projectRoot: base,
439
+ inlinedTemplates,
426
440
  });
427
441
  }
428
442
 
@@ -506,6 +520,42 @@ export async function showDiscuss(
506
520
  /**
507
521
  * The one wizard. Reads state, shows contextual options, dispatches into the workflow doc.
508
522
  */
523
+ /**
524
+ * Self-heal: scan runtime records and clear stale ones left behind when
525
+ * auto-mode crashed mid-unit. auto.ts has its own selfHealRuntimeRecords()
526
+ * but guided-flow (manual /gsd mode) never called it — meaning stale records
527
+ * persisted until the next /gsd auto run. This ensures the wizard always
528
+ * starts from a clean state regardless of how the previous session ended.
529
+ */
530
+ function selfHealRuntimeRecords(basePath: string, ctx: ExtensionContext): { cleared: number } {
531
+ try {
532
+ const records = listUnitRuntimeRecords(basePath);
533
+ let cleared = 0;
534
+ for (const record of records) {
535
+ const { unitType, unitId, phase } = record;
536
+ // Clear records whose expected artifact already exists (completed but not cleaned up)
537
+ const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
538
+ if (artifactPath && existsSync(artifactPath)) {
539
+ clearUnitRuntimeRecord(basePath, unitType, unitId);
540
+ cleared++;
541
+ continue;
542
+ }
543
+ // Clear records stuck in dispatched or timeout phase (process died mid-unit)
544
+ if (phase === "dispatched" || phase === "timeout") {
545
+ clearUnitRuntimeRecord(basePath, unitType, unitId);
546
+ cleared++;
547
+ }
548
+ }
549
+ if (cleared > 0) {
550
+ ctx.ui.notify(`Self-heal: cleared ${cleared} stale runtime record(s) from a previous session.`, "info");
551
+ }
552
+ return { cleared };
553
+ } catch {
554
+ // Non-fatal — self-heal should never block the wizard
555
+ return { cleared: 0 };
556
+ }
557
+ }
558
+
509
559
  export async function showSmartEntry(
510
560
  ctx: ExtensionCommandContext,
511
561
  pi: ExtensionAPI,
@@ -544,6 +594,9 @@ export async function showSmartEntry(
544
594
  }
545
595
  }
546
596
 
597
+ // ── Self-heal stale runtime records from crashed auto-mode sessions ──
598
+ selfHealRuntimeRecords(basePath, ctx);
599
+
547
600
  // Check for crash from previous auto-mode session
548
601
  const crashLock = readCrashLock(basePath);
549
602
  if (crashLock) {
@@ -683,8 +736,9 @@ export async function showSmartEntry(
683
736
  });
684
737
 
685
738
  if (choice === "discuss_draft") {
739
+ const discussMilestoneTemplates = inlineTemplate("context", "Context");
686
740
  const basePrompt = loadPrompt("guided-discuss-milestone", {
687
- milestoneId, milestoneTitle,
741
+ milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates,
688
742
  });
689
743
  const seed = draftContent
690
744
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
@@ -692,9 +746,10 @@ export async function showSmartEntry(
692
746
  pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
693
747
  dispatchWorkflow(pi, seed, "gsd-discuss");
694
748
  } else if (choice === "discuss_fresh") {
749
+ const discussMilestoneTemplates = inlineTemplate("context", "Context");
695
750
  pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
696
751
  dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
697
- milestoneId, milestoneTitle,
752
+ milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates,
698
753
  }), "gsd-discuss");
699
754
  } else if (choice === "skip_milestone") {
700
755
  const milestoneIds = findMilestoneIds(basePath);
@@ -753,13 +808,20 @@ export async function showSmartEntry(
753
808
  });
754
809
 
755
810
  if (choice === "plan") {
811
+ const planMilestoneTemplates = [
812
+ inlineTemplate("roadmap", "Roadmap"),
813
+ inlineTemplate("plan", "Slice Plan"),
814
+ inlineTemplate("task-plan", "Task Plan"),
815
+ inlineTemplate("secrets-manifest", "Secrets Manifest"),
816
+ ].join("\n\n---\n\n");
756
817
  const secretsOutputPath = relMilestoneFile(basePath, milestoneId, "SECRETS");
757
818
  dispatchWorkflow(pi, loadPrompt("guided-plan-milestone", {
758
- milestoneId, milestoneTitle, secretsOutputPath,
819
+ milestoneId, milestoneTitle, secretsOutputPath, inlinedTemplates: planMilestoneTemplates,
759
820
  }));
760
821
  } else if (choice === "discuss") {
822
+ const discussMilestoneTemplates = inlineTemplate("context", "Context");
761
823
  dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
762
- milestoneId, milestoneTitle,
824
+ milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates,
763
825
  }));
764
826
  } else if (choice === "skip_milestone") {
765
827
  const milestoneIds = findMilestoneIds(basePath);
@@ -866,14 +928,19 @@ export async function showSmartEntry(
866
928
  });
867
929
 
868
930
  if (choice === "plan") {
931
+ const planSliceTemplates = [
932
+ inlineTemplate("plan", "Slice Plan"),
933
+ inlineTemplate("task-plan", "Task Plan"),
934
+ ].join("\n\n---\n\n");
869
935
  dispatchWorkflow(pi, loadPrompt("guided-plan-slice", {
870
- milestoneId, sliceId, sliceTitle,
936
+ milestoneId, sliceId, sliceTitle, inlinedTemplates: planSliceTemplates,
871
937
  }));
872
938
  } else if (choice === "discuss") {
873
939
  dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath));
874
940
  } else if (choice === "research") {
941
+ const researchTemplates = inlineTemplate("research", "Research");
875
942
  dispatchWorkflow(pi, loadPrompt("guided-research-slice", {
876
- milestoneId, sliceId, sliceTitle,
943
+ milestoneId, sliceId, sliceTitle, inlinedTemplates: researchTemplates,
877
944
  }));
878
945
  } else if (choice === "status") {
879
946
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -904,8 +971,12 @@ export async function showSmartEntry(
904
971
  });
905
972
 
906
973
  if (choice === "complete") {
974
+ const completeSliceTemplates = [
975
+ inlineTemplate("slice-summary", "Slice Summary"),
976
+ inlineTemplate("uat", "UAT"),
977
+ ].join("\n\n---\n\n");
907
978
  dispatchWorkflow(pi, loadPrompt("guided-complete-slice", {
908
- milestoneId, sliceId, sliceTitle,
979
+ milestoneId, sliceId, sliceTitle, inlinedTemplates: completeSliceTemplates,
909
980
  }));
910
981
  } else if (choice === "status") {
911
982
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -965,8 +1036,9 @@ export async function showSmartEntry(
965
1036
  milestoneId, sliceId,
966
1037
  }));
967
1038
  } else {
1039
+ const executeTaskTemplates = inlineTemplate("task-summary", "Task Summary");
968
1040
  dispatchWorkflow(pi, loadPrompt("guided-execute-task", {
969
- milestoneId, sliceId, taskId, taskTitle,
1041
+ milestoneId, sliceId, taskId, taskTitle, inlinedTemplates: executeTaskTemplates,
970
1042
  }));
971
1043
  }
972
1044
  } else if (choice === "status") {
@@ -39,6 +39,8 @@ import {
39
39
  loadEffectiveGSDPreferences,
40
40
  renderPreferencesForSystemPrompt,
41
41
  resolveAllSkillReferences,
42
+ resolveModelWithFallbacksForUnit,
43
+ getNextFallbackModel,
42
44
  } from "./preferences.js";
43
45
  import { hasSkillSnapshot, detectNewSkills, formatSkillsXml } from "./skill-discovery.js";
44
46
  import {
@@ -339,12 +341,71 @@ export default function (pi: ExtensionAPI) {
339
341
  "errorMessage" in lastMsg && lastMsg.errorMessage
340
342
  ? `: ${lastMsg.errorMessage}`
341
343
  : "";
344
+
345
+ const dash = getAutoDashboardData();
346
+ if (dash.currentUnit) {
347
+ const modelConfig = resolveModelWithFallbacksForUnit(dash.currentUnit.type);
348
+ if (modelConfig && modelConfig.fallbacks.length > 0) {
349
+ const availableModels = ctx.modelRegistry.getAvailable();
350
+ const currentModelId = ctx.model?.id;
351
+
352
+ const nextModelId = getNextFallbackModel(currentModelId, modelConfig);
353
+
354
+ if (nextModelId) {
355
+ let modelToSet;
356
+ const slashIdx = nextModelId.indexOf("/");
357
+ if (slashIdx !== -1) {
358
+ const provider = nextModelId.substring(0, slashIdx);
359
+ const id = nextModelId.substring(slashIdx + 1);
360
+ modelToSet = availableModels.find(
361
+ m => m.provider.toLowerCase() === provider.toLowerCase()
362
+ && m.id.toLowerCase() === id.toLowerCase()
363
+ );
364
+ } else {
365
+ const currentProvider = ctx.model?.provider;
366
+ const exactProviderMatch = availableModels.find(
367
+ m => m.id === nextModelId && m.provider === currentProvider
368
+ );
369
+ modelToSet = exactProviderMatch ?? availableModels.find(m => m.id === nextModelId);
370
+ }
371
+
372
+ if (modelToSet) {
373
+ const ok = await pi.setModel(modelToSet, { persist: false });
374
+ if (ok) {
375
+ ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${nextModelId} and resuming.`, "warning");
376
+ // Trigger a generic "Continue execution" to resume the task since the previous attempt failed
377
+ pi.sendMessage(
378
+ { customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false },
379
+ { triggerTurn: true }
380
+ );
381
+ return;
382
+ }
383
+ }
384
+ }
385
+ }
386
+ }
387
+
342
388
  (ctx as any).log(`Auto-mode paused due to provider error${errorDetail}`);
343
389
  await pauseAuto(ctx, pi);
344
390
  return;
345
391
  }
346
392
 
347
- await handleAgentEnd(ctx, pi);
393
+ try {
394
+ await handleAgentEnd(ctx, pi);
395
+ } catch (err) {
396
+ // Safety net: if handleAgentEnd throws despite its internal try-catch,
397
+ // ensure auto-mode stops gracefully instead of silently stalling (#381).
398
+ const message = err instanceof Error ? err.message : String(err);
399
+ ctx.ui.notify(
400
+ `Auto-mode error in agent_end handler: ${message}. Stopping auto-mode.`,
401
+ "error",
402
+ );
403
+ try {
404
+ await pauseAuto(ctx, pi);
405
+ } catch {
406
+ // Last resort — at least log
407
+ }
408
+ }
348
409
  });
349
410
 
350
411
  // ── session_before_compact ────────────────────────────────────────────────
@@ -0,0 +1,181 @@
1
+ // Native Git Bridge
2
+ // Provides fast READ-ONLY git operations backed by libgit2 via the Rust native module.
3
+ // Falls back to execSync git commands when the native module is unavailable.
4
+ //
5
+ // Only READ operations are native — WRITE operations (commit, merge, checkout, push)
6
+ // remain as execSync calls in git-service.ts.
7
+
8
+ import { execSync } from "node:child_process";
9
+
10
+ /** Env overlay that suppresses interactive git credential prompts and git-svn noise. */
11
+ const GIT_NO_PROMPT_ENV = {
12
+ ...process.env,
13
+ GIT_TERMINAL_PROMPT: "0",
14
+ GIT_ASKPASS: "",
15
+ GIT_SVN_ID: "",
16
+ };
17
+
18
+ let nativeModule: {
19
+ gitCurrentBranch: (repoPath: string) => string | null;
20
+ gitMainBranch: (repoPath: string) => string;
21
+ gitBranchExists: (repoPath: string, branch: string) => boolean;
22
+ gitHasMergeConflicts: (repoPath: string) => boolean;
23
+ gitWorkingTreeStatus: (repoPath: string) => string;
24
+ gitHasChanges: (repoPath: string) => boolean;
25
+ gitCommitCountBetween: (repoPath: string, fromRef: string, toRef: string) => number;
26
+ } | null = null;
27
+
28
+ let loadAttempted = false;
29
+
30
+ function loadNative(): typeof nativeModule {
31
+ if (loadAttempted) return nativeModule;
32
+ loadAttempted = true;
33
+
34
+ try {
35
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
36
+ const mod = require("@gsd/native");
37
+ if (mod.gitCurrentBranch && mod.gitHasChanges) {
38
+ nativeModule = mod;
39
+ }
40
+ } catch {
41
+ // Native module not available — all functions fall back to git CLI
42
+ }
43
+
44
+ return nativeModule;
45
+ }
46
+
47
+ /** Run a git command via execSync. Returns trimmed stdout. */
48
+ function gitExec(basePath: string, args: string[], allowFailure = false): string {
49
+ try {
50
+ return execSync(`git ${args.join(" ")}`, {
51
+ cwd: basePath,
52
+ stdio: ["ignore", "pipe", "pipe"],
53
+ encoding: "utf-8",
54
+ env: GIT_NO_PROMPT_ENV,
55
+ }).trim();
56
+ } catch {
57
+ if (allowFailure) return "";
58
+ throw new Error(`git ${args.join(" ")} failed in ${basePath}`);
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Get the current branch name.
64
+ * Native: reads HEAD symbolic ref via libgit2.
65
+ * Fallback: `git branch --show-current`.
66
+ */
67
+ export function nativeGetCurrentBranch(basePath: string): string {
68
+ const native = loadNative();
69
+ if (native) {
70
+ const branch = native.gitCurrentBranch(basePath);
71
+ return branch ?? "";
72
+ }
73
+ return gitExec(basePath, ["branch", "--show-current"]);
74
+ }
75
+
76
+ /**
77
+ * Detect the repo-level main branch (origin/HEAD → main → master → current).
78
+ * Native: checks refs via libgit2.
79
+ * Fallback: `git symbolic-ref` + `git show-ref` chain.
80
+ *
81
+ * Note: milestone integration branch and worktree detection are handled
82
+ * by the caller (GitServiceImpl.getMainBranch) — this only covers the
83
+ * repo-level default detection that spawned multiple git processes.
84
+ */
85
+ export function nativeDetectMainBranch(basePath: string): string {
86
+ const native = loadNative();
87
+ if (native) {
88
+ return native.gitMainBranch(basePath);
89
+ }
90
+
91
+ // Fallback: same logic as GitServiceImpl.getMainBranch() repo-level detection
92
+ const symbolic = gitExec(basePath, ["symbolic-ref", "refs/remotes/origin/HEAD"], true);
93
+ if (symbolic) {
94
+ const match = symbolic.match(/refs\/remotes\/origin\/(.+)$/);
95
+ if (match) return match[1]!;
96
+ }
97
+
98
+ const mainExists = gitExec(basePath, ["show-ref", "--verify", "refs/heads/main"], true);
99
+ if (mainExists) return "main";
100
+
101
+ const masterExists = gitExec(basePath, ["show-ref", "--verify", "refs/heads/master"], true);
102
+ if (masterExists) return "master";
103
+
104
+ return gitExec(basePath, ["branch", "--show-current"]);
105
+ }
106
+
107
+ /**
108
+ * Check if a local branch exists.
109
+ * Native: checks refs/heads/<name> via libgit2.
110
+ * Fallback: `git show-ref --verify`.
111
+ */
112
+ export function nativeBranchExists(basePath: string, branch: string): boolean {
113
+ const native = loadNative();
114
+ if (native) {
115
+ return native.gitBranchExists(basePath, branch);
116
+ }
117
+ const result = gitExec(basePath, ["show-ref", "--verify", `refs/heads/${branch}`], true);
118
+ return result !== "";
119
+ }
120
+
121
+ /**
122
+ * Check if the index has unmerged entries (merge conflicts).
123
+ * Native: reads index conflict state via libgit2.
124
+ * Fallback: `git diff --name-only --diff-filter=U`.
125
+ */
126
+ export function nativeHasMergeConflicts(basePath: string): boolean {
127
+ const native = loadNative();
128
+ if (native) {
129
+ return native.gitHasMergeConflicts(basePath);
130
+ }
131
+ const result = gitExec(basePath, ["diff", "--name-only", "--diff-filter=U"], true);
132
+ return result !== "";
133
+ }
134
+
135
+ /**
136
+ * Get working tree status (porcelain format).
137
+ * Native: reads status via libgit2.
138
+ * Fallback: `git status --porcelain`.
139
+ */
140
+ export function nativeWorkingTreeStatus(basePath: string): string {
141
+ const native = loadNative();
142
+ if (native) {
143
+ return native.gitWorkingTreeStatus(basePath);
144
+ }
145
+ return gitExec(basePath, ["status", "--porcelain"], true);
146
+ }
147
+
148
+ /**
149
+ * Quick check: any staged or unstaged changes?
150
+ * Native: libgit2 status check (single syscall).
151
+ * Fallback: `git status --short`.
152
+ */
153
+ export function nativeHasChanges(basePath: string): boolean {
154
+ const native = loadNative();
155
+ if (native) {
156
+ return native.gitHasChanges(basePath);
157
+ }
158
+ const result = gitExec(basePath, ["status", "--short"], true);
159
+ return result !== "";
160
+ }
161
+
162
+ /**
163
+ * Count commits between two refs (from..to).
164
+ * Native: libgit2 revwalk.
165
+ * Fallback: `git rev-list --count from..to`.
166
+ */
167
+ export function nativeCommitCountBetween(basePath: string, fromRef: string, toRef: string): number {
168
+ const native = loadNative();
169
+ if (native) {
170
+ return native.gitCommitCountBetween(basePath, fromRef, toRef);
171
+ }
172
+ const result = gitExec(basePath, ["rev-list", "--count", `${fromRef}..${toRef}`], true);
173
+ return parseInt(result, 10) || 0;
174
+ }
175
+
176
+ /**
177
+ * Check if the native git module is available.
178
+ */
179
+ export function isNativeGitAvailable(): boolean {
180
+ return loadNative() !== null;
181
+ }
@@ -9,9 +9,40 @@
9
9
  * via prefix matching, so existing projects work without migration.
10
10
  */
11
11
 
12
- import { readdirSync, existsSync } from "node:fs";
12
+ import { readdirSync, existsSync, Dirent } from "node:fs";
13
13
  import { join } from "node:path";
14
14
 
15
+ // ─── Directory Listing Cache ──────────────────────────────────────────────────
16
+
17
+ const dirEntryCache = new Map<string, Dirent[]>();
18
+ const dirListCache = new Map<string, string[]>();
19
+
20
+ function cachedReaddirWithTypes(dirPath: string): Dirent[] {
21
+ const cached = dirEntryCache.get(dirPath);
22
+ if (cached) return cached;
23
+ const entries = readdirSync(dirPath, { withFileTypes: true });
24
+ dirEntryCache.set(dirPath, entries);
25
+ return entries;
26
+ }
27
+
28
+ function cachedReaddir(dirPath: string): string[] {
29
+ const cached = dirListCache.get(dirPath);
30
+ if (cached) return cached;
31
+ const entries = readdirSync(dirPath);
32
+ dirListCache.set(dirPath, entries);
33
+ return entries;
34
+ }
35
+
36
+ /**
37
+ * Clear the directory listing cache.
38
+ * Call after milestone transitions, file creation in planning directories,
39
+ * or at the start/end of a dispatch cycle.
40
+ */
41
+ export function clearPathCache(): void {
42
+ dirEntryCache.clear();
43
+ dirListCache.clear();
44
+ }
45
+
15
46
  // ─── Name Builders ─────────────────────────────────────────────────────────
16
47
 
17
48
  /**
@@ -58,7 +89,7 @@ export function buildTaskFileName(taskId: string, suffix: string): string {
58
89
  export function resolveDir(parentDir: string, idPrefix: string): string | null {
59
90
  if (!existsSync(parentDir)) return null;
60
91
  try {
61
- const entries = readdirSync(parentDir, { withFileTypes: true });
92
+ const entries = cachedReaddirWithTypes(parentDir);
62
93
  // Exact match first (current convention: bare ID)
63
94
  const exact = entries.find(e => e.isDirectory() && e.name === idPrefix);
64
95
  if (exact) return exact.name;
@@ -83,7 +114,7 @@ export function resolveFile(dir: string, idPrefix: string, suffix: string): stri
83
114
  if (!existsSync(dir)) return null;
84
115
  const target = `${idPrefix}-${suffix}.md`.toUpperCase();
85
116
  try {
86
- const entries = readdirSync(dir);
117
+ const entries = cachedReaddir(dir);
87
118
  // Direct match: ID-SUFFIX.md
88
119
  const direct = entries.find(e => e.toUpperCase() === target);
89
120
  if (direct) return direct;
@@ -113,7 +144,7 @@ export function resolveTaskFiles(tasksDir: string, suffix: string): string[] {
113
144
  const currentPattern = new RegExp(`^T\\d+-${suffix}\\.md$`, "i");
114
145
  // Legacy convention: T01-INSTALL-PACKAGES-PLAN.md
115
146
  const legacyPattern = new RegExp(`^T\\d+-.*-${suffix}\\.md$`, "i");
116
- return readdirSync(tasksDir)
147
+ return cachedReaddir(tasksDir)
117
148
  .filter(f => currentPattern.test(f) || legacyPattern.test(f))
118
149
  .sort();
119
150
  } catch {