gsd-pi 2.33.1-dev.29a8268 → 2.33.1-dev.9bafd68

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 (744) hide show
  1. package/dist/cli.js +16 -0
  2. package/dist/resource-loader.d.ts +2 -0
  3. package/dist/resource-loader.js +36 -3
  4. package/dist/resources/extensions/ask-user-questions.js +217 -0
  5. package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
  6. package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
  7. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
  8. package/dist/resources/extensions/async-jobs/index.js +119 -0
  9. package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
  10. package/dist/resources/extensions/aws-auth/index.js +138 -0
  11. package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
  12. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
  13. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
  14. package/dist/resources/extensions/bg-shell/index.js +41 -0
  15. package/dist/resources/extensions/bg-shell/interaction.js +160 -0
  16. package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
  17. package/dist/resources/extensions/bg-shell/overlay.js +378 -0
  18. package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
  19. package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
  20. package/dist/resources/extensions/bg-shell/types.js +96 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +50 -0
  22. package/dist/resources/extensions/browser-tools/capture.js +179 -0
  23. package/dist/resources/extensions/browser-tools/core.js +899 -0
  24. package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
  25. package/dist/resources/extensions/browser-tools/index.js +123 -0
  26. package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
  27. package/dist/resources/extensions/browser-tools/refs.js +254 -0
  28. package/dist/resources/extensions/browser-tools/settle.js +173 -0
  29. package/dist/resources/extensions/browser-tools/state.js +126 -0
  30. package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
  31. package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
  32. package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
  33. package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
  34. package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
  35. package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
  36. package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
  37. package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
  38. package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
  39. package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
  40. package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
  41. package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
  42. package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
  43. package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
  44. package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
  45. package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
  46. package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
  47. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
  48. package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
  49. package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
  50. package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
  51. package/dist/resources/extensions/browser-tools/utils.js +490 -0
  52. package/dist/resources/extensions/context7/index.js +337 -0
  53. package/dist/resources/extensions/get-secrets-from-user.js +492 -0
  54. package/dist/resources/extensions/google-search/index.js +373 -0
  55. package/dist/resources/extensions/gsd/activity-log.js +146 -0
  56. package/dist/resources/extensions/gsd/atomic-write.js +38 -0
  57. package/dist/resources/extensions/gsd/auto/session.js +187 -0
  58. package/dist/resources/extensions/gsd/auto-budget.js +30 -0
  59. package/dist/resources/extensions/gsd/{auto-constants.ts → auto-constants.js} +0 -1
  60. package/dist/resources/extensions/gsd/auto-dashboard.js +509 -0
  61. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +180 -0
  62. package/dist/resources/extensions/gsd/auto-dispatch.js +382 -0
  63. package/dist/resources/extensions/gsd/auto-idempotency.js +106 -0
  64. package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
  65. package/dist/resources/extensions/gsd/auto-observability.js +54 -0
  66. package/dist/resources/extensions/gsd/auto-post-unit.js +495 -0
  67. package/dist/resources/extensions/gsd/auto-prompts.js +1121 -0
  68. package/dist/resources/extensions/gsd/auto-recovery.js +550 -0
  69. package/dist/resources/extensions/gsd/auto-start.js +393 -0
  70. package/dist/resources/extensions/gsd/auto-stuck-detection.js +165 -0
  71. package/dist/resources/extensions/gsd/{auto-supervisor.ts → auto-supervisor.js} +25 -33
  72. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
  73. package/dist/resources/extensions/gsd/auto-timers.js +181 -0
  74. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  75. package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
  76. package/dist/resources/extensions/gsd/auto-verification.js +209 -0
  77. package/dist/resources/extensions/gsd/auto-worktree.js +594 -0
  78. package/dist/resources/extensions/gsd/auto.js +1485 -0
  79. package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
  80. package/dist/resources/extensions/gsd/captures.js +348 -0
  81. package/dist/resources/extensions/gsd/claude-import.js +540 -0
  82. package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
  83. package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
  84. package/dist/resources/extensions/gsd/commands-config.js +89 -0
  85. package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
  86. package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
  87. package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
  88. package/dist/resources/extensions/gsd/commands-logs.js +468 -0
  89. package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
  90. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
  91. package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
  92. package/dist/resources/extensions/gsd/commands.js +1024 -0
  93. package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
  94. package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
  95. package/dist/resources/extensions/gsd/context-budget.js +187 -0
  96. package/dist/resources/extensions/gsd/context-store.js +165 -0
  97. package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
  98. package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
  99. package/dist/resources/extensions/gsd/db-writer.js +298 -0
  100. package/dist/resources/extensions/gsd/debug-logger.js +161 -0
  101. package/dist/resources/extensions/gsd/detection.js +373 -0
  102. package/dist/resources/extensions/gsd/diff-context.js +168 -0
  103. package/dist/resources/extensions/gsd/dispatch-guard.js +76 -0
  104. package/dist/resources/extensions/gsd/doctor-checks.js +563 -0
  105. package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
  106. package/dist/resources/extensions/gsd/doctor-format.js +71 -0
  107. package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
  108. package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
  109. package/dist/resources/extensions/gsd/doctor-types.js +12 -0
  110. package/dist/resources/extensions/gsd/doctor.js +672 -0
  111. package/dist/resources/extensions/gsd/error-utils.js +6 -0
  112. package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
  113. package/dist/resources/extensions/gsd/exit-command.js +11 -0
  114. package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
  115. package/dist/resources/extensions/gsd/export.js +268 -0
  116. package/dist/resources/extensions/gsd/file-watcher.js +76 -0
  117. package/dist/resources/extensions/gsd/files.js +937 -0
  118. package/dist/resources/extensions/gsd/forensics.js +511 -0
  119. package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
  120. package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
  121. package/dist/resources/extensions/gsd/git-service.js +460 -0
  122. package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
  123. package/dist/resources/extensions/gsd/gsd-db.js +590 -0
  124. package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
  125. package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
  126. package/dist/resources/extensions/gsd/health-widget.js +141 -0
  127. package/dist/resources/extensions/gsd/history.js +118 -0
  128. package/dist/resources/extensions/gsd/index.js +1250 -0
  129. package/dist/resources/extensions/gsd/init-wizard.js +479 -0
  130. package/dist/resources/extensions/gsd/json-persistence.js +62 -0
  131. package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
  132. package/dist/resources/extensions/gsd/key-manager.js +829 -0
  133. package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
  134. package/dist/resources/extensions/gsd/md-importer.js +440 -0
  135. package/dist/resources/extensions/gsd/mechanical-completion.js +351 -0
  136. package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
  137. package/dist/resources/extensions/gsd/memory-store.js +351 -0
  138. package/dist/resources/extensions/gsd/metrics.js +377 -0
  139. package/dist/resources/extensions/gsd/migrate/command.js +157 -0
  140. package/dist/resources/extensions/gsd/migrate/index.js +7 -0
  141. package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
  142. package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
  143. package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
  144. package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
  145. package/dist/resources/extensions/gsd/migrate/types.js +4 -0
  146. package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
  147. package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
  148. package/dist/resources/extensions/gsd/migrate-external.js +130 -0
  149. package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
  150. package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
  151. package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
  152. package/dist/resources/extensions/gsd/model-router.js +187 -0
  153. package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
  154. package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
  155. package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
  156. package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
  157. package/dist/resources/extensions/gsd/notifications.js +58 -0
  158. package/dist/resources/extensions/gsd/observability-validator.js +398 -0
  159. package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
  160. package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
  161. package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
  162. package/dist/resources/extensions/gsd/paths.js +414 -0
  163. package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
  164. package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
  165. package/dist/resources/extensions/gsd/preferences-models.js +294 -0
  166. package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
  167. package/dist/resources/extensions/gsd/preferences-types.js +73 -0
  168. package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
  169. package/dist/resources/extensions/gsd/preferences.js +325 -0
  170. package/dist/resources/extensions/gsd/progress-score.js +197 -0
  171. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
  172. package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
  173. package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
  174. package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
  175. package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
  176. package/dist/resources/extensions/gsd/queue-order.js +178 -0
  177. package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
  178. package/dist/resources/extensions/gsd/quick.js +230 -0
  179. package/dist/resources/extensions/gsd/repo-identity.js +187 -0
  180. package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
  181. package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
  182. package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
  183. package/dist/resources/extensions/gsd/routing-history.js +210 -0
  184. package/dist/resources/extensions/gsd/safe-fs.js +52 -0
  185. package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
  186. package/dist/resources/extensions/gsd/session-forensics.js +427 -0
  187. package/dist/resources/extensions/gsd/session-lock.js +384 -0
  188. package/dist/resources/extensions/gsd/session-status-io.js +134 -0
  189. package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
  190. package/dist/resources/extensions/gsd/skill-health.js +324 -0
  191. package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
  192. package/dist/resources/extensions/gsd/state.js +653 -0
  193. package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
  194. package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
  195. package/dist/resources/extensions/gsd/token-counter.js +54 -0
  196. package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
  197. package/dist/resources/extensions/gsd/triage-ui.js +125 -0
  198. package/dist/resources/extensions/gsd/types.js +4 -0
  199. package/dist/resources/extensions/gsd/undo.js +210 -0
  200. package/dist/resources/extensions/gsd/unit-id.js +7 -0
  201. package/dist/resources/extensions/gsd/unit-runtime.js +130 -0
  202. package/dist/resources/extensions/gsd/validate-directory.js +143 -0
  203. package/dist/resources/extensions/gsd/verification-evidence.js +123 -0
  204. package/dist/resources/extensions/gsd/verification-gate.js +543 -0
  205. package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
  206. package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
  207. package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
  208. package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
  209. package/dist/resources/extensions/gsd/workspace-index.js +139 -0
  210. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
  211. package/dist/resources/extensions/gsd/worktree-command.js +676 -0
  212. package/dist/resources/extensions/gsd/worktree-manager.js +359 -0
  213. package/dist/resources/extensions/gsd/worktree.js +236 -0
  214. package/dist/resources/extensions/mac-tools/index.js +768 -0
  215. package/dist/resources/extensions/mcp-client/index.js +363 -0
  216. package/dist/resources/extensions/package.json +3 -0
  217. package/dist/resources/extensions/remote-questions/config.js +70 -0
  218. package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
  219. package/dist/resources/extensions/remote-questions/format.js +234 -0
  220. package/dist/resources/extensions/remote-questions/http-client.js +43 -0
  221. package/dist/resources/extensions/remote-questions/manager.js +156 -0
  222. package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
  223. package/dist/resources/extensions/remote-questions/notify.js +89 -0
  224. package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
  225. package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
  226. package/dist/resources/extensions/remote-questions/status.js +25 -0
  227. package/dist/resources/extensions/remote-questions/store.js +70 -0
  228. package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
  229. package/dist/resources/extensions/remote-questions/types.js +5 -0
  230. package/dist/resources/extensions/search-the-web/cache.js +74 -0
  231. package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
  232. package/dist/resources/extensions/search-the-web/format.js +161 -0
  233. package/dist/resources/extensions/search-the-web/http.js +178 -0
  234. package/dist/resources/extensions/search-the-web/index.js +41 -0
  235. package/dist/resources/extensions/search-the-web/native-search.js +166 -0
  236. package/dist/resources/extensions/search-the-web/provider.js +143 -0
  237. package/dist/resources/extensions/search-the-web/tavily.js +82 -0
  238. package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
  239. package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
  240. package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
  241. package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
  242. package/dist/resources/extensions/shared/confirm-ui.js +96 -0
  243. package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
  244. package/dist/resources/extensions/shared/frontmatter.js +109 -0
  245. package/dist/resources/extensions/shared/interview-ui.js +569 -0
  246. package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
  247. package/dist/resources/extensions/shared/next-action-ui.js +168 -0
  248. package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
  249. package/dist/resources/extensions/shared/sanitize.js +17 -0
  250. package/dist/resources/extensions/shared/terminal.js +21 -0
  251. package/dist/resources/extensions/shared/ui.js +245 -0
  252. package/dist/resources/extensions/shared/wizard-ui.js +478 -0
  253. package/dist/resources/extensions/slash-commands/audit.js +72 -0
  254. package/dist/resources/extensions/slash-commands/clear.js +8 -0
  255. package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
  256. package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
  257. package/dist/resources/extensions/slash-commands/index.js +10 -0
  258. package/dist/resources/extensions/subagent/agents.js +103 -0
  259. package/dist/resources/extensions/subagent/index.js +905 -0
  260. package/dist/resources/extensions/subagent/isolation.js +384 -0
  261. package/dist/resources/extensions/subagent/worker-registry.js +73 -0
  262. package/dist/resources/extensions/ttsr/index.js +144 -0
  263. package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
  264. package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
  265. package/dist/resources/extensions/universal-config/discovery.js +94 -0
  266. package/dist/resources/extensions/universal-config/format.js +178 -0
  267. package/dist/resources/extensions/universal-config/index.js +99 -0
  268. package/dist/resources/extensions/universal-config/scanners.js +574 -0
  269. package/dist/resources/extensions/universal-config/tools.js +57 -0
  270. package/dist/resources/extensions/universal-config/types.js +8 -0
  271. package/dist/resources/extensions/voice/index.js +247 -0
  272. package/dist/startup-timings.d.ts +2 -0
  273. package/dist/startup-timings.js +22 -0
  274. package/package.json +1 -1
  275. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  276. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  278. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  280. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  282. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  284. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/index.js +1 -1
  286. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  287. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
  288. package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
  289. package/packages/pi-coding-agent/src/index.ts +1 -0
  290. package/src/resources/extensions/bg-shell/index.ts +41 -46
  291. package/src/resources/extensions/browser-tools/index.ts +156 -67
  292. package/src/resources/extensions/gsd/auto-verification.ts +20 -2
  293. package/src/resources/extensions/gsd/auto-worktree.ts +3 -2
  294. package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
  295. package/src/resources/extensions/gsd/commands.ts +39 -31
  296. package/src/resources/extensions/gsd/git-service.ts +7 -0
  297. package/src/resources/extensions/gsd/guided-flow.ts +22 -11
  298. package/src/resources/extensions/gsd/index.ts +93 -32
  299. package/src/resources/extensions/gsd/quick.ts +52 -3
  300. package/src/resources/extensions/gsd/repo-identity.ts +56 -22
  301. package/src/resources/extensions/gsd/session-lock.ts +6 -0
  302. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +1 -4
  303. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
  304. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
  305. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +65 -0
  306. package/src/resources/extensions/gsd/types.ts +4 -0
  307. package/src/resources/extensions/gsd/verification-evidence.ts +1 -1
  308. package/src/resources/extensions/gsd/verification-gate.ts +23 -2
  309. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  310. package/src/resources/extensions/gsd/worktree-command.ts +17 -11
  311. package/src/resources/extensions/package.json +3 -0
  312. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  313. package/src/resources/extensions/search-the-web/index.ts +35 -52
  314. package/src/resources/extensions/search-the-web/tavily.ts +1 -1
  315. package/dist/resources/extensions/ask-user-questions.ts +0 -290
  316. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
  317. package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
  318. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
  319. package/dist/resources/extensions/async-jobs/index.ts +0 -141
  320. package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
  321. package/dist/resources/extensions/aws-auth/index.ts +0 -144
  322. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
  323. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
  324. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
  325. package/dist/resources/extensions/bg-shell/index.ts +0 -59
  326. package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
  327. package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
  328. package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
  329. package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
  330. package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
  331. package/dist/resources/extensions/bg-shell/types.ts +0 -303
  332. package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
  333. package/dist/resources/extensions/browser-tools/capture.ts +0 -199
  334. package/dist/resources/extensions/browser-tools/core.ts +0 -1196
  335. package/dist/resources/extensions/browser-tools/index.ts +0 -71
  336. package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
  337. package/dist/resources/extensions/browser-tools/refs.ts +0 -264
  338. package/dist/resources/extensions/browser-tools/settle.ts +0 -197
  339. package/dist/resources/extensions/browser-tools/state.ts +0 -408
  340. package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
  341. package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
  342. package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
  343. package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
  344. package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
  345. package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
  346. package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
  347. package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
  348. package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
  349. package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
  350. package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
  351. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
  352. package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
  353. package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
  354. package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
  355. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
  356. package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
  357. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
  358. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
  359. package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
  360. package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
  361. package/dist/resources/extensions/browser-tools/utils.ts +0 -660
  362. package/dist/resources/extensions/context7/index.ts +0 -428
  363. package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
  364. package/dist/resources/extensions/google-search/index.ts +0 -466
  365. package/dist/resources/extensions/gsd/activity-log.ts +0 -162
  366. package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
  367. package/dist/resources/extensions/gsd/auto/session.ts +0 -236
  368. package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
  369. package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
  370. package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
  371. package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
  372. package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
  373. package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
  374. package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
  375. package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
  376. package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
  377. package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
  378. package/dist/resources/extensions/gsd/auto-start.ts +0 -483
  379. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  380. package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
  381. package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
  382. package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
  383. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  384. package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
  385. package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
  386. package/dist/resources/extensions/gsd/auto.ts +0 -1834
  387. package/dist/resources/extensions/gsd/captures.ts +0 -427
  388. package/dist/resources/extensions/gsd/claude-import.ts +0 -656
  389. package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  390. package/dist/resources/extensions/gsd/commands-config.ts +0 -102
  391. package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
  392. package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
  393. package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
  394. package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
  395. package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
  396. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
  397. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  398. package/dist/resources/extensions/gsd/commands.ts +0 -1149
  399. package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
  400. package/dist/resources/extensions/gsd/context-budget.ts +0 -266
  401. package/dist/resources/extensions/gsd/context-store.ts +0 -195
  402. package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
  403. package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
  404. package/dist/resources/extensions/gsd/db-writer.ts +0 -360
  405. package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
  406. package/dist/resources/extensions/gsd/detection.ts +0 -470
  407. package/dist/resources/extensions/gsd/diff-context.ts +0 -214
  408. package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
  409. package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
  410. package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
  411. package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
  412. package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
  413. package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
  414. package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
  415. package/dist/resources/extensions/gsd/doctor.ts +0 -722
  416. package/dist/resources/extensions/gsd/error-utils.ts +0 -6
  417. package/dist/resources/extensions/gsd/exit-command.ts +0 -18
  418. package/dist/resources/extensions/gsd/export.ts +0 -317
  419. package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
  420. package/dist/resources/extensions/gsd/files.ts +0 -1058
  421. package/dist/resources/extensions/gsd/forensics.ts +0 -629
  422. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
  423. package/dist/resources/extensions/gsd/git-service.ts +0 -586
  424. package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
  425. package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
  426. package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
  427. package/dist/resources/extensions/gsd/health-widget.ts +0 -167
  428. package/dist/resources/extensions/gsd/history.ts +0 -143
  429. package/dist/resources/extensions/gsd/index.ts +0 -1401
  430. package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
  431. package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
  432. package/dist/resources/extensions/gsd/key-manager.ts +0 -996
  433. package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  434. package/dist/resources/extensions/gsd/md-importer.ts +0 -527
  435. package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
  436. package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
  437. package/dist/resources/extensions/gsd/memory-store.ts +0 -441
  438. package/dist/resources/extensions/gsd/metrics.ts +0 -532
  439. package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
  440. package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
  441. package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
  442. package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
  443. package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
  444. package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
  445. package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
  446. package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
  447. package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
  448. package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
  449. package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
  450. package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
  451. package/dist/resources/extensions/gsd/model-router.ts +0 -256
  452. package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
  453. package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  454. package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
  455. package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  456. package/dist/resources/extensions/gsd/notifications.ts +0 -87
  457. package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
  458. package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
  459. package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
  460. package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
  461. package/dist/resources/extensions/gsd/paths.ts +0 -449
  462. package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
  463. package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
  464. package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
  465. package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
  466. package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
  467. package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
  468. package/dist/resources/extensions/gsd/preferences.ts +0 -416
  469. package/dist/resources/extensions/gsd/progress-score.ts +0 -273
  470. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  471. package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
  472. package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
  473. package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
  474. package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
  475. package/dist/resources/extensions/gsd/queue-order.ts +0 -230
  476. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
  477. package/dist/resources/extensions/gsd/quick.ts +0 -212
  478. package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
  479. package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
  480. package/dist/resources/extensions/gsd/routing-history.ts +0 -286
  481. package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
  482. package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
  483. package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
  484. package/dist/resources/extensions/gsd/session-lock.ts +0 -426
  485. package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
  486. package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
  487. package/dist/resources/extensions/gsd/skill-health.ts +0 -417
  488. package/dist/resources/extensions/gsd/state.ts +0 -727
  489. package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
  490. package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
  491. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
  492. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
  493. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
  494. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  495. package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
  496. package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  497. package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
  498. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
  499. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
  500. package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  501. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
  502. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
  503. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  504. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
  505. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
  506. package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  507. package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
  508. package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
  509. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
  510. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
  511. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  512. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  513. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
  514. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  515. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  516. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  517. package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
  518. package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
  519. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
  520. package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
  521. package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
  522. package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
  523. package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  524. package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
  525. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
  526. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
  527. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
  528. package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
  529. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  530. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  531. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
  532. package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
  533. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  534. package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
  535. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
  536. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
  537. package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
  538. package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
  539. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
  540. package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
  541. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  542. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
  543. package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  544. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
  545. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  546. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
  547. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
  548. package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1181
  549. package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
  550. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
  551. package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
  552. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  553. package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
  554. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
  555. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  556. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
  557. package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  558. package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
  559. package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
  560. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
  561. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
  562. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
  563. package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  564. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
  565. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  566. package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
  567. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  568. package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
  569. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  570. package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
  571. package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
  572. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
  573. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
  574. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
  575. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
  576. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
  577. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
  578. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
  579. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
  580. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  581. package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
  582. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
  583. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  584. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  585. package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  586. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  587. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
  588. package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
  589. package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
  590. package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
  591. package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
  592. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
  593. package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
  594. package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
  595. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
  596. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
  597. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
  598. package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
  599. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
  600. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
  601. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
  602. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
  603. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  604. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
  605. package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
  606. package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  607. package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  608. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  609. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  610. package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
  611. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  612. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
  613. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
  614. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
  615. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
  616. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  617. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
  618. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  619. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
  620. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  621. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
  622. package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
  623. package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
  624. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
  625. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
  626. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
  627. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
  628. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  629. package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
  630. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
  631. package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  632. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  633. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
  634. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
  635. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
  636. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  637. package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
  638. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  639. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  640. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
  641. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  642. package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
  643. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
  644. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
  645. package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
  646. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
  647. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
  648. package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  649. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
  650. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
  651. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
  652. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
  653. package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
  654. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
  655. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
  656. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
  657. package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
  658. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
  659. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  660. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
  661. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
  662. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
  663. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
  664. package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  665. package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
  666. package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
  667. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
  668. package/dist/resources/extensions/gsd/token-counter.ts +0 -65
  669. package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
  670. package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
  671. package/dist/resources/extensions/gsd/types.ts +0 -425
  672. package/dist/resources/extensions/gsd/undo.ts +0 -223
  673. package/dist/resources/extensions/gsd/unit-id.ts +0 -14
  674. package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
  675. package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
  676. package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
  677. package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
  678. package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
  679. package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  680. package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
  681. package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
  682. package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
  683. package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
  684. package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
  685. package/dist/resources/extensions/gsd/worktree.ts +0 -257
  686. package/dist/resources/extensions/mac-tools/index.ts +0 -852
  687. package/dist/resources/extensions/mcp-client/index.ts +0 -459
  688. package/dist/resources/extensions/remote-questions/config.ts +0 -83
  689. package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
  690. package/dist/resources/extensions/remote-questions/format.ts +0 -315
  691. package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
  692. package/dist/resources/extensions/remote-questions/manager.ts +0 -184
  693. package/dist/resources/extensions/remote-questions/notify.ts +0 -90
  694. package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
  695. package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
  696. package/dist/resources/extensions/remote-questions/status.ts +0 -31
  697. package/dist/resources/extensions/remote-questions/store.ts +0 -81
  698. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
  699. package/dist/resources/extensions/remote-questions/types.ts +0 -102
  700. package/dist/resources/extensions/search-the-web/cache.ts +0 -78
  701. package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
  702. package/dist/resources/extensions/search-the-web/format.ts +0 -258
  703. package/dist/resources/extensions/search-the-web/http.ts +0 -238
  704. package/dist/resources/extensions/search-the-web/index.ts +0 -65
  705. package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
  706. package/dist/resources/extensions/search-the-web/provider.ts +0 -148
  707. package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
  708. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
  709. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
  710. package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
  711. package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
  712. package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
  713. package/dist/resources/extensions/shared/frontmatter.ts +0 -117
  714. package/dist/resources/extensions/shared/interview-ui.ts +0 -613
  715. package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
  716. package/dist/resources/extensions/shared/sanitize.ts +0 -19
  717. package/dist/resources/extensions/shared/terminal.ts +0 -23
  718. package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
  719. package/dist/resources/extensions/shared/ui.ts +0 -400
  720. package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
  721. package/dist/resources/extensions/slash-commands/audit.ts +0 -88
  722. package/dist/resources/extensions/slash-commands/clear.ts +0 -10
  723. package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
  724. package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  725. package/dist/resources/extensions/slash-commands/index.ts +0 -12
  726. package/dist/resources/extensions/subagent/agents.ts +0 -126
  727. package/dist/resources/extensions/subagent/index.ts +0 -1121
  728. package/dist/resources/extensions/subagent/isolation.ts +0 -501
  729. package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
  730. package/dist/resources/extensions/ttsr/index.ts +0 -168
  731. package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
  732. package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
  733. package/dist/resources/extensions/universal-config/discovery.ts +0 -104
  734. package/dist/resources/extensions/universal-config/format.ts +0 -191
  735. package/dist/resources/extensions/universal-config/index.ts +0 -120
  736. package/dist/resources/extensions/universal-config/scanners.ts +0 -642
  737. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
  738. package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
  739. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
  740. package/dist/resources/extensions/universal-config/tools.ts +0 -60
  741. package/dist/resources/extensions/universal-config/types.ts +0 -135
  742. package/dist/resources/extensions/voice/index.ts +0 -272
  743. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
  744. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
@@ -0,0 +1,1121 @@
1
+ /**
2
+ * Auto-mode Prompt Builders — construct dispatch prompts for each unit type.
3
+ *
4
+ * Pure async functions that load templates and inline file content. No module-level
5
+ * state, no globals — every dependency is passed as a parameter or imported as a
6
+ * utility.
7
+ */
8
+ import { loadFile, parseContinue, parsePlan, parseRoadmap, parseSummary, extractUatType, loadActiveOverrides, formatOverridesSection } from "./files.js";
9
+ import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
10
+ import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, resolveTaskFiles, resolveTaskFile, relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath, resolveGsdRootFile, relGsdRootFile, } from "./paths.js";
11
+ import { resolveSkillDiscoveryMode, resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
12
+ import { join } from "node:path";
13
+ import { existsSync } from "node:fs";
14
+ import { computeBudgets, resolveExecutorContextWindow } from "./context-budget.js";
15
+ import { compressToTarget } from "./prompt-compressor.js";
16
+ import { distillSummaries } from "./summary-distiller.js";
17
+ import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
18
+ import { chunkByRelevance, formatChunks } from "./semantic-chunker.js";
19
+ // ─── Executor Constraints ─────────────────────────────────────────────────────
20
+ /**
21
+ * Format executor context constraints for injection into the plan-slice prompt.
22
+ * Uses the budget engine to compute task count ranges and inline context budgets
23
+ * based on the configured executor model's context window.
24
+ */
25
+ function formatExecutorConstraints() {
26
+ let windowTokens;
27
+ try {
28
+ const prefs = loadEffectiveGSDPreferences();
29
+ windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
30
+ }
31
+ catch {
32
+ windowTokens = 200_000; // safe default
33
+ }
34
+ const budgets = computeBudgets(windowTokens);
35
+ const { min, max } = budgets.taskCountRange;
36
+ const execWindowK = Math.round(windowTokens / 1000);
37
+ const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
38
+ return [
39
+ `## Executor Context Constraints`,
40
+ ``,
41
+ `The agent that executes each task has a **${execWindowK}K token** context window.`,
42
+ `- Recommended task count for this slice: **${min}–${max} tasks**`,
43
+ `- Each task gets ~${perTaskBudgetK}K chars of inline context (plans, code, decisions)`,
44
+ `- Keep individual tasks completable within a single context window — if a task needs more context than fits, split it`,
45
+ ].join("\n");
46
+ }
47
+ // ─── Inline Helpers ───────────────────────────────────────────────────────
48
+ /**
49
+ * Load a file and format it for inlining into a prompt.
50
+ * Returns the content wrapped with a source path header, or a fallback
51
+ * message if the file doesn't exist. This eliminates tool calls — the LLM
52
+ * gets the content directly instead of "Read this file:".
53
+ */
54
+ export async function inlineFile(absPath, relPath, label) {
55
+ const content = absPath ? await loadFile(absPath) : null;
56
+ if (!content) {
57
+ return `### ${label}\nSource: \`${relPath}\`\n\n_(not found — file does not exist yet)_`;
58
+ }
59
+ return `### ${label}\nSource: \`${relPath}\`\n\n${content.trim()}`;
60
+ }
61
+ /**
62
+ * Load a file for inlining, returning null if it doesn't exist.
63
+ * Use when the file is optional and should be omitted entirely if absent.
64
+ */
65
+ export async function inlineFileOptional(absPath, relPath, label) {
66
+ const content = absPath ? await loadFile(absPath) : null;
67
+ if (!content)
68
+ return null;
69
+ return `### ${label}\nSource: \`${relPath}\`\n\n${content.trim()}`;
70
+ }
71
+ /**
72
+ * Smart file inlining — for large files, use semantic chunking to include
73
+ * only the most relevant portions based on the task context.
74
+ * Falls back to full content for small files or when no query is provided.
75
+ *
76
+ * @param absPath Absolute file path
77
+ * @param relPath Relative display path
78
+ * @param label Section label
79
+ * @param query Task description for relevance scoring (optional)
80
+ * @param threshold Character threshold for chunking (default: 3000)
81
+ */
82
+ export async function inlineFileSmart(absPath, relPath, label, query, threshold = 3000) {
83
+ const content = absPath ? await loadFile(absPath) : null;
84
+ if (!content) {
85
+ return `### ${label}\nSource: \`${relPath}\`\n\n_(not found — file does not exist yet)_`;
86
+ }
87
+ // For small files or no query, include full content
88
+ if (content.length <= threshold || !query) {
89
+ return `### ${label}\nSource: \`${relPath}\`\n\n${content.trim()}`;
90
+ }
91
+ // Use semantic chunking for large files
92
+ const result = chunkByRelevance(content, query, { maxChunks: 5, minScore: 0.05 });
93
+ // If chunking didn't save much (< 20%), just include full content
94
+ if (result.savingsPercent < 20) {
95
+ return `### ${label}\nSource: \`${relPath}\`\n\n${content.trim()}`;
96
+ }
97
+ const formatted = formatChunks(result, relPath);
98
+ return `### ${label} (${result.omittedChunks} sections omitted for relevance)\nSource: \`${relPath}\`\n\n${formatted}`;
99
+ }
100
+ /**
101
+ * Load and inline dependency slice summaries (full content, not just paths).
102
+ */
103
+ export async function inlineDependencySummaries(mid, sid, base, budgetChars) {
104
+ const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
105
+ const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
106
+ if (!roadmapContent)
107
+ return "- (no dependencies)";
108
+ const roadmap = parseRoadmap(roadmapContent);
109
+ const sliceEntry = roadmap.slices.find(s => s.id === sid);
110
+ if (!sliceEntry || sliceEntry.depends.length === 0)
111
+ return "- (no dependencies)";
112
+ const sections = [];
113
+ const seen = new Set();
114
+ for (const dep of sliceEntry.depends) {
115
+ if (seen.has(dep))
116
+ continue;
117
+ seen.add(dep);
118
+ const summaryFile = resolveSliceFile(base, mid, dep, "SUMMARY");
119
+ const summaryContent = summaryFile ? await loadFile(summaryFile) : null;
120
+ const relPath = relSliceFile(base, mid, dep, "SUMMARY");
121
+ if (summaryContent) {
122
+ sections.push(`#### ${dep} Summary\nSource: \`${relPath}\`\n\n${summaryContent.trim()}`);
123
+ }
124
+ else {
125
+ sections.push(`- \`${relPath}\` _(not found)_`);
126
+ }
127
+ }
128
+ const result = sections.join("\n\n");
129
+ if (budgetChars !== undefined && result.length > budgetChars) {
130
+ // For 3+ summaries, try distillation first (preserves more information)
131
+ if (sections.length >= 3) {
132
+ const rawSummaries = sections.map(s => {
133
+ // Extract content after the header line
134
+ const lines = s.split("\n");
135
+ const contentStart = lines.findIndex(l => l.startsWith("Source:"));
136
+ return contentStart >= 0 ? lines.slice(contentStart + 1).join("\n").trim() : s;
137
+ });
138
+ const distilled = distillSummaries(rawSummaries, budgetChars);
139
+ if (distilled.content.length <= budgetChars) {
140
+ return distilled.content;
141
+ }
142
+ }
143
+ // Fall back to section-boundary truncation
144
+ const { truncateAtSectionBoundary } = await import("./context-budget.js");
145
+ return truncateAtSectionBoundary(result, budgetChars).content;
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * Load a well-known .gsd/ root file for optional inlining.
151
+ * Handles the existsSync check internally.
152
+ */
153
+ export async function inlineGsdRootFile(base, filename, label) {
154
+ const key = filename.replace(/\.md$/i, "").toUpperCase();
155
+ const absPath = resolveGsdRootFile(base, key);
156
+ if (!existsSync(absPath))
157
+ return null;
158
+ return inlineFileOptional(absPath, relGsdRootFile(key), label);
159
+ }
160
+ // ─── DB-Aware Inline Helpers ──────────────────────────────────────────────
161
+ /**
162
+ * Shared DB-fallback pattern: attempt a DB query via the context-store, format
163
+ * the result, and fall back to the filesystem file when the DB is unavailable
164
+ * or the query yields no results.
165
+ *
166
+ * @param base Project root for filesystem fallback
167
+ * @param label Section heading (e.g. "Decisions")
168
+ * @param filename Filesystem fallback file (e.g. "decisions.md")
169
+ * @param queryDb Async callback receiving the dynamically-imported
170
+ * context-store module. Returns formatted markdown or null.
171
+ */
172
+ async function inlineFromDbOrFile(base, label, filename, queryDb) {
173
+ try {
174
+ const { isDbAvailable } = await import("./gsd-db.js");
175
+ if (isDbAvailable()) {
176
+ const contextStore = await import("./context-store.js");
177
+ const content = queryDb(contextStore);
178
+ if (content) {
179
+ return `### ${label}\nSource: \`.gsd/${filename.toUpperCase().replace(/\.MD$/i, "")}.md\`\n\n${content}`;
180
+ }
181
+ }
182
+ }
183
+ catch {
184
+ // DB not available — fall through to filesystem
185
+ }
186
+ return inlineGsdRootFile(base, filename, label);
187
+ }
188
+ /**
189
+ * Inline decisions with optional milestone scoping from the DB.
190
+ * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
191
+ */
192
+ export async function inlineDecisionsFromDb(base, milestoneId, scope, level) {
193
+ const inlineLevel = level ?? resolveInlineLevel();
194
+ return inlineFromDbOrFile(base, "Decisions", "decisions.md", (cs) => {
195
+ const decisions = cs.queryDecisions({ milestoneId, scope });
196
+ if (decisions.length === 0)
197
+ return null;
198
+ return inlineLevel !== "full"
199
+ ? formatDecisionsCompact(decisions)
200
+ : cs.formatDecisionsForPrompt(decisions);
201
+ });
202
+ }
203
+ /**
204
+ * Inline requirements with optional slice scoping from the DB.
205
+ * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
206
+ */
207
+ export async function inlineRequirementsFromDb(base, sliceId, level) {
208
+ const inlineLevel = level ?? resolveInlineLevel();
209
+ return inlineFromDbOrFile(base, "Requirements", "requirements.md", (cs) => {
210
+ const requirements = cs.queryRequirements({ sliceId });
211
+ if (requirements.length === 0)
212
+ return null;
213
+ return inlineLevel !== "full"
214
+ ? formatRequirementsCompact(requirements)
215
+ : cs.formatRequirementsForPrompt(requirements);
216
+ });
217
+ }
218
+ /**
219
+ * Inline project context from the DB.
220
+ * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
221
+ */
222
+ export async function inlineProjectFromDb(base) {
223
+ return inlineFromDbOrFile(base, "Project", "project.md", (cs) => {
224
+ return cs.queryProject();
225
+ });
226
+ }
227
+ // ─── Skill Discovery ──────────────────────────────────────────────────────
228
+ /**
229
+ * Build the skill discovery template variables for research prompts.
230
+ * Returns { skillDiscoveryMode, skillDiscoveryInstructions } for template substitution.
231
+ */
232
+ export function buildSkillDiscoveryVars() {
233
+ const mode = resolveSkillDiscoveryMode();
234
+ if (mode === "off") {
235
+ return {
236
+ skillDiscoveryMode: "off",
237
+ skillDiscoveryInstructions: " Skill discovery is disabled. Skip this step.",
238
+ };
239
+ }
240
+ const autoInstall = mode === "auto";
241
+ const instructions = `
242
+ Identify the key technologies, frameworks, and services this work depends on (e.g. Stripe, Clerk, Supabase, JUCE, SwiftUI).
243
+ For each, check if a professional agent skill already exists:
244
+ - First check \`<available_skills>\` in your system prompt — a skill may already be installed.
245
+ - For technologies without an installed skill, run: \`npx skills find "<technology>"\`
246
+ - Only consider skills that are **directly relevant** to core technologies — not tangentially related.
247
+ - Evaluate results by install count and relevance to the actual work.${autoInstall
248
+ ? `
249
+ - Install relevant skills: \`npx skills add <owner/repo@skill> -g -y\`
250
+ - Record installed skills in the "Skills Discovered" section of your research output.
251
+ - Installed skills will automatically appear in subsequent units' system prompts — no manual steps needed.`
252
+ : `
253
+ - Note promising skills in your research output with their install commands, but do NOT install them.
254
+ - The user will decide which to install.`}`;
255
+ return {
256
+ skillDiscoveryMode: mode,
257
+ skillDiscoveryInstructions: instructions,
258
+ };
259
+ }
260
+ // ─── Text Helpers ──────────────────────────────────────────────────────────
261
+ export function extractMarkdownSection(content, heading) {
262
+ const match = new RegExp(`^## ${escapeRegExp(heading)}\\s*$`, "m").exec(content);
263
+ if (!match)
264
+ return null;
265
+ const start = match.index + match[0].length;
266
+ const rest = content.slice(start);
267
+ const nextHeading = rest.match(/^##\s+/m);
268
+ const end = nextHeading?.index ?? rest.length;
269
+ return rest.slice(0, end).trim();
270
+ }
271
+ export function escapeRegExp(value) {
272
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
273
+ }
274
+ function oneLine(text) {
275
+ return text.replace(/\s+/g, " ").trim();
276
+ }
277
+ /** Build the standard inlined-context section used by all prompt builders. */
278
+ function buildInlinedContextSection(inlined) {
279
+ return `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
280
+ }
281
+ /** Build the formatted list of available GSD source files for planners to read on demand. */
282
+ function buildSourceFileList(base, opts) {
283
+ const paths = [];
284
+ if (opts?.includeProject && existsSync(resolveGsdRootFile(base, "PROJECT")))
285
+ paths.push(`- **Project**: \`${relGsdRootFile("PROJECT")}\``);
286
+ if (existsSync(resolveGsdRootFile(base, "REQUIREMENTS")))
287
+ paths.push(`- **Requirements**: \`${relGsdRootFile("REQUIREMENTS")}\``);
288
+ if (existsSync(resolveGsdRootFile(base, "DECISIONS")))
289
+ paths.push(`- **Decisions**: \`${relGsdRootFile("DECISIONS")}\``);
290
+ if (paths.length === 0) {
291
+ const types = opts?.includeProject ? "project/requirements/decisions" : "requirements/decisions";
292
+ return `_No ${types} files found._`;
293
+ }
294
+ return paths.join("\n");
295
+ }
296
+ // ─── Section Builders ──────────────────────────────────────────────────────
297
+ export function buildResumeSection(continueContent, legacyContinueContent, continueRelPath, legacyContinueRelPath) {
298
+ const resolvedContent = continueContent ?? legacyContinueContent;
299
+ const resolvedRelPath = continueContent ? continueRelPath : legacyContinueRelPath;
300
+ if (!resolvedContent || !resolvedRelPath) {
301
+ return ["## Resume State", "- No continue file present. Start from the top of the task plan."].join("\n");
302
+ }
303
+ const cont = parseContinue(resolvedContent);
304
+ const lines = [
305
+ "## Resume State",
306
+ `Source: \`${resolvedRelPath}\``,
307
+ `- Status: ${cont.frontmatter.status || "in_progress"}`,
308
+ ];
309
+ if (cont.frontmatter.step && cont.frontmatter.totalSteps) {
310
+ lines.push(`- Progress: step ${cont.frontmatter.step} of ${cont.frontmatter.totalSteps}`);
311
+ }
312
+ if (cont.completedWork)
313
+ lines.push(`- Completed: ${oneLine(cont.completedWork)}`);
314
+ if (cont.remainingWork)
315
+ lines.push(`- Remaining: ${oneLine(cont.remainingWork)}`);
316
+ if (cont.decisions)
317
+ lines.push(`- Decisions: ${oneLine(cont.decisions)}`);
318
+ if (cont.nextAction)
319
+ lines.push(`- Next action: ${oneLine(cont.nextAction)}`);
320
+ return lines.join("\n");
321
+ }
322
+ export async function buildCarryForwardSection(priorSummaryPaths, base) {
323
+ if (priorSummaryPaths.length === 0) {
324
+ return ["## Carry-Forward Context", "- No prior task summaries in this slice."].join("\n");
325
+ }
326
+ const items = await Promise.all(priorSummaryPaths.map(async (relPath) => {
327
+ const absPath = join(base, relPath);
328
+ const content = await loadFile(absPath);
329
+ if (!content)
330
+ return `- \`${relPath}\``;
331
+ const summary = parseSummary(content);
332
+ const provided = summary.frontmatter.provides.slice(0, 2).join("; ");
333
+ const decisions = summary.frontmatter.key_decisions.slice(0, 2).join("; ");
334
+ const patterns = summary.frontmatter.patterns_established.slice(0, 2).join("; ");
335
+ const keyFiles = summary.frontmatter.key_files.slice(0, 3).join("; ");
336
+ const diagnostics = extractMarkdownSection(content, "Diagnostics");
337
+ const parts = [summary.title || relPath];
338
+ if (summary.oneLiner)
339
+ parts.push(summary.oneLiner);
340
+ if (provided)
341
+ parts.push(`provides: ${provided}`);
342
+ if (decisions)
343
+ parts.push(`decisions: ${decisions}`);
344
+ if (patterns)
345
+ parts.push(`patterns: ${patterns}`);
346
+ if (keyFiles)
347
+ parts.push(`key_files: ${keyFiles}`);
348
+ if (diagnostics)
349
+ parts.push(`diagnostics: ${oneLine(diagnostics)}`);
350
+ return `- \`${relPath}\` — ${parts.join(" | ")}`;
351
+ }));
352
+ return ["## Carry-Forward Context", ...items].join("\n");
353
+ }
354
+ export function extractSliceExecutionExcerpt(content, relPath) {
355
+ if (!content) {
356
+ return [
357
+ "## Slice Plan Excerpt",
358
+ `Slice plan not found at dispatch time. Read \`${relPath}\` before running slice-level verification.`,
359
+ ].join("\n");
360
+ }
361
+ const lines = content.split("\n");
362
+ const goalLine = lines.find(l => l.startsWith("**Goal:**"))?.trim();
363
+ const demoLine = lines.find(l => l.startsWith("**Demo:**"))?.trim();
364
+ const verification = extractMarkdownSection(content, "Verification");
365
+ const observability = extractMarkdownSection(content, "Observability / Diagnostics");
366
+ const parts = ["## Slice Plan Excerpt", `Source: \`${relPath}\``];
367
+ if (goalLine)
368
+ parts.push(goalLine);
369
+ if (demoLine)
370
+ parts.push(demoLine);
371
+ if (verification) {
372
+ parts.push("", "### Slice Verification", verification.trim());
373
+ }
374
+ if (observability) {
375
+ parts.push("", "### Slice Observability / Diagnostics", observability.trim());
376
+ }
377
+ return parts.join("\n");
378
+ }
379
+ // ─── Prior Task Summaries ──────────────────────────────────────────────────
380
+ export async function getPriorTaskSummaryPaths(mid, sid, currentTid, base) {
381
+ const tDir = resolveTasksDir(base, mid, sid);
382
+ if (!tDir)
383
+ return [];
384
+ const summaryFiles = resolveTaskFiles(tDir, "SUMMARY");
385
+ const currentNum = parseInt(currentTid.replace(/^T/, ""), 10);
386
+ const sRel = relSlicePath(base, mid, sid);
387
+ return summaryFiles
388
+ .filter(f => {
389
+ const num = parseInt(f.replace(/^T/, ""), 10);
390
+ return num < currentNum;
391
+ })
392
+ .map(f => `${sRel}/tasks/${f}`);
393
+ }
394
+ // ─── Adaptive Replanning Checks ────────────────────────────────────────────
395
+ /**
396
+ * Check if the most recently completed slice needs reassessment.
397
+ * Returns { sliceId } if reassessment is needed, null otherwise.
398
+ *
399
+ * Skips reassessment when:
400
+ * - No roadmap exists yet
401
+ * - No slices are completed
402
+ * - The last completed slice already has an assessment file
403
+ * - All slices are complete (milestone done — no point reassessing)
404
+ */
405
+ export async function checkNeedsReassessment(base, mid, state) {
406
+ const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
407
+ const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
408
+ if (!roadmapContent)
409
+ return null;
410
+ const roadmap = parseRoadmap(roadmapContent);
411
+ const completedSlices = roadmap.slices.filter(s => s.done);
412
+ const incompleteSlices = roadmap.slices.filter(s => !s.done);
413
+ // No completed slices or all slices done — skip
414
+ if (completedSlices.length === 0 || incompleteSlices.length === 0)
415
+ return null;
416
+ // Check the last completed slice
417
+ const lastCompleted = completedSlices[completedSlices.length - 1];
418
+ const assessmentFile = resolveSliceFile(base, mid, lastCompleted.id, "ASSESSMENT");
419
+ const hasAssessment = !!(assessmentFile && await loadFile(assessmentFile));
420
+ if (hasAssessment)
421
+ return null;
422
+ // Fallback: check the expected path directly via existsSync.
423
+ // resolveSliceFile relies on directory listing (readdirSync) which may not
424
+ // reflect a freshly written file in git worktree directories on some
425
+ // filesystems (observed on macOS APFS). A direct existsSync on the
426
+ // constructed path bypasses directory listing entirely. (#1112)
427
+ const sliceDir = resolveSlicePath(base, mid, lastCompleted.id);
428
+ if (sliceDir) {
429
+ const directPath = join(sliceDir, `${lastCompleted.id}-ASSESSMENT.md`);
430
+ if (existsSync(directPath))
431
+ return null;
432
+ }
433
+ // Also need a summary to reassess against
434
+ const summaryFile = resolveSliceFile(base, mid, lastCompleted.id, "SUMMARY");
435
+ const hasSummary = !!(summaryFile && await loadFile(summaryFile));
436
+ if (!hasSummary)
437
+ return null;
438
+ return { sliceId: lastCompleted.id };
439
+ }
440
+ /**
441
+ * Check if the most recently completed slice needs a UAT run.
442
+ * Returns { sliceId, uatType } if UAT should be dispatched, null otherwise.
443
+ *
444
+ * Skips when:
445
+ * - No roadmap or no completed slices
446
+ * - All slices are done (milestone complete path — reassessment handles it)
447
+ * - uat_dispatch preference is not enabled
448
+ * - No UAT file exists for the slice
449
+ * - UAT result file already exists (idempotent — already ran)
450
+ */
451
+ export async function checkNeedsRunUat(base, mid, state, prefs) {
452
+ const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
453
+ const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
454
+ if (!roadmapContent)
455
+ return null;
456
+ const roadmap = parseRoadmap(roadmapContent);
457
+ const completedSlices = roadmap.slices.filter(s => s.done);
458
+ const incompleteSlices = roadmap.slices.filter(s => !s.done);
459
+ // No completed slices — nothing to UAT yet
460
+ if (completedSlices.length === 0)
461
+ return null;
462
+ // All slices done — milestone complete path, skip (reassessment handles)
463
+ if (incompleteSlices.length === 0)
464
+ return null;
465
+ // uat_dispatch must be opted in
466
+ if (!prefs?.uat_dispatch)
467
+ return null;
468
+ // Take the last completed slice
469
+ const lastCompleted = completedSlices[completedSlices.length - 1];
470
+ const sid = lastCompleted.id;
471
+ // UAT file must exist
472
+ const uatFile = resolveSliceFile(base, mid, sid, "UAT");
473
+ if (!uatFile)
474
+ return null;
475
+ const uatContent = await loadFile(uatFile);
476
+ if (!uatContent)
477
+ return null;
478
+ // If a UAT result already exists, the UAT unit has already run and must not
479
+ // be re-dispatched. PASS means progression can continue; any non-PASS verdict
480
+ // must be handled by the dispatch table's verdict gate, which stops progression
481
+ // with a human-action message instead of replaying the same run-uat unit.
482
+ const uatResultFile = resolveSliceFile(base, mid, sid, "UAT-RESULT");
483
+ if (uatResultFile) {
484
+ const resultContent = await loadFile(uatResultFile);
485
+ if (resultContent)
486
+ return null;
487
+ }
488
+ // Classify UAT type; skip non-artifact-driven types — auto-mode can only
489
+ // execute mechanical checks. Non-artifact UATs are tracked in the dashboard
490
+ // but don't block auto-mode progression.
491
+ const uatType = extractUatType(uatContent) ?? "human-experience";
492
+ if (uatType !== "artifact-driven")
493
+ return null;
494
+ return { sliceId: sid, uatType };
495
+ }
496
+ // ─── Prompt Builders ──────────────────────────────────────────────────────
497
+ export async function buildResearchMilestonePrompt(mid, midTitle, base) {
498
+ const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
499
+ const contextRel = relMilestoneFile(base, mid, "CONTEXT");
500
+ const inlined = [];
501
+ inlined.push(await inlineFile(contextPath, contextRel, "Milestone Context"));
502
+ const projectInline = await inlineProjectFromDb(base);
503
+ if (projectInline)
504
+ inlined.push(projectInline);
505
+ const requirementsInline = await inlineRequirementsFromDb(base);
506
+ if (requirementsInline)
507
+ inlined.push(requirementsInline);
508
+ const decisionsInline = await inlineDecisionsFromDb(base, mid);
509
+ if (decisionsInline)
510
+ inlined.push(decisionsInline);
511
+ const knowledgeInlineRM = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
512
+ if (knowledgeInlineRM)
513
+ inlined.push(knowledgeInlineRM);
514
+ inlined.push(inlineTemplate("research", "Research"));
515
+ const inlinedContext = buildInlinedContextSection(inlined);
516
+ const outputRelPath = relMilestoneFile(base, mid, "RESEARCH");
517
+ return loadPrompt("research-milestone", {
518
+ workingDirectory: base,
519
+ milestoneId: mid, milestoneTitle: midTitle,
520
+ milestonePath: relMilestonePath(base, mid),
521
+ contextPath: contextRel,
522
+ outputPath: join(base, outputRelPath),
523
+ inlinedContext,
524
+ ...buildSkillDiscoveryVars(),
525
+ });
526
+ }
527
+ export async function buildPlanMilestonePrompt(mid, midTitle, base, level) {
528
+ const inlineLevel = level ?? resolveInlineLevel();
529
+ const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
530
+ const contextRel = relMilestoneFile(base, mid, "CONTEXT");
531
+ const researchPath = resolveMilestoneFile(base, mid, "RESEARCH");
532
+ const researchRel = relMilestoneFile(base, mid, "RESEARCH");
533
+ const inlined = [];
534
+ inlined.push(await inlineFile(contextPath, contextRel, "Milestone Context"));
535
+ const researchInline = await inlineFileOptional(researchPath, researchRel, "Milestone Research");
536
+ if (researchInline)
537
+ inlined.push(researchInline);
538
+ const { inlinePriorMilestoneSummary } = await import("./files.js");
539
+ const priorSummaryInline = await inlinePriorMilestoneSummary(mid, base);
540
+ if (priorSummaryInline)
541
+ inlined.push(priorSummaryInline);
542
+ const sourceFilePaths = buildSourceFileList(base, { includeProject: true });
543
+ const knowledgeInlinePM = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
544
+ if (knowledgeInlinePM)
545
+ inlined.push(knowledgeInlinePM);
546
+ inlined.push(inlineTemplate("roadmap", "Roadmap"));
547
+ if (inlineLevel === "full") {
548
+ inlined.push(inlineTemplate("decisions", "Decisions"));
549
+ inlined.push(inlineTemplate("plan", "Slice Plan"));
550
+ inlined.push(inlineTemplate("task-plan", "Task Plan"));
551
+ inlined.push(inlineTemplate("secrets-manifest", "Secrets Manifest"));
552
+ }
553
+ else if (inlineLevel === "standard") {
554
+ inlined.push(inlineTemplate("decisions", "Decisions"));
555
+ inlined.push(inlineTemplate("plan", "Slice Plan"));
556
+ inlined.push(inlineTemplate("task-plan", "Task Plan"));
557
+ }
558
+ const inlinedContext = buildInlinedContextSection(inlined);
559
+ const outputRelPath = relMilestoneFile(base, mid, "ROADMAP");
560
+ const secretsOutputPath = join(base, relMilestoneFile(base, mid, "SECRETS"));
561
+ const researchOutputRelPath = relMilestoneFile(base, mid, "RESEARCH");
562
+ return loadPrompt("plan-milestone", {
563
+ workingDirectory: base,
564
+ milestoneId: mid, milestoneTitle: midTitle,
565
+ milestonePath: relMilestonePath(base, mid),
566
+ contextPath: contextRel,
567
+ researchPath: researchRel,
568
+ outputPath: join(base, outputRelPath),
569
+ secretsOutputPath,
570
+ inlinedContext,
571
+ sourceFilePaths,
572
+ researchOutputPath: join(base, researchOutputRelPath),
573
+ ...buildSkillDiscoveryVars(),
574
+ });
575
+ }
576
+ export async function buildResearchSlicePrompt(mid, _midTitle, sid, sTitle, base) {
577
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
578
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
579
+ const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
580
+ const contextRel = relMilestoneFile(base, mid, "CONTEXT");
581
+ const milestoneResearchPath = resolveMilestoneFile(base, mid, "RESEARCH");
582
+ const milestoneResearchRel = relMilestoneFile(base, mid, "RESEARCH");
583
+ const inlined = [];
584
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
585
+ const contextInline = await inlineFileOptional(contextPath, contextRel, "Milestone Context");
586
+ if (contextInline)
587
+ inlined.push(contextInline);
588
+ const researchInline = await inlineFileOptional(milestoneResearchPath, milestoneResearchRel, "Milestone Research");
589
+ if (researchInline)
590
+ inlined.push(researchInline);
591
+ const decisionsInline = await inlineDecisionsFromDb(base, mid);
592
+ if (decisionsInline)
593
+ inlined.push(decisionsInline);
594
+ const requirementsInline = await inlineRequirementsFromDb(base, sid);
595
+ if (requirementsInline)
596
+ inlined.push(requirementsInline);
597
+ const knowledgeInlineRS = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
598
+ if (knowledgeInlineRS)
599
+ inlined.push(knowledgeInlineRS);
600
+ inlined.push(inlineTemplate("research", "Research"));
601
+ const depContent = await inlineDependencySummaries(mid, sid, base);
602
+ const activeOverrides = await loadActiveOverrides(base);
603
+ const overridesInline = formatOverridesSection(activeOverrides);
604
+ if (overridesInline)
605
+ inlined.unshift(overridesInline);
606
+ const inlinedContext = buildInlinedContextSection(inlined);
607
+ const outputRelPath = relSliceFile(base, mid, sid, "RESEARCH");
608
+ return loadPrompt("research-slice", {
609
+ workingDirectory: base,
610
+ milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
611
+ slicePath: relSlicePath(base, mid, sid),
612
+ roadmapPath: roadmapRel,
613
+ contextPath: contextRel,
614
+ milestoneResearchPath: milestoneResearchRel,
615
+ outputPath: join(base, outputRelPath),
616
+ inlinedContext,
617
+ dependencySummaries: depContent,
618
+ ...buildSkillDiscoveryVars(),
619
+ });
620
+ }
621
+ export async function buildPlanSlicePrompt(mid, _midTitle, sid, sTitle, base, level) {
622
+ const inlineLevel = level ?? resolveInlineLevel();
623
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
624
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
625
+ const researchPath = resolveSliceFile(base, mid, sid, "RESEARCH");
626
+ const researchRel = relSliceFile(base, mid, sid, "RESEARCH");
627
+ const inlined = [];
628
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
629
+ const researchInline = await inlineFileOptional(researchPath, researchRel, "Slice Research");
630
+ if (researchInline)
631
+ inlined.push(researchInline);
632
+ const sliceSourceFilePaths = buildSourceFileList(base);
633
+ const knowledgeInlinePS = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
634
+ if (knowledgeInlinePS)
635
+ inlined.push(knowledgeInlinePS);
636
+ inlined.push(inlineTemplate("plan", "Slice Plan"));
637
+ if (inlineLevel === "full") {
638
+ inlined.push(inlineTemplate("task-plan", "Task Plan"));
639
+ }
640
+ const depContent = await inlineDependencySummaries(mid, sid, base);
641
+ const planActiveOverrides = await loadActiveOverrides(base);
642
+ const planOverridesInline = formatOverridesSection(planActiveOverrides);
643
+ if (planOverridesInline)
644
+ inlined.unshift(planOverridesInline);
645
+ const inlinedContext = buildInlinedContextSection(inlined);
646
+ // Build executor context constraints from the budget engine
647
+ const executorContextConstraints = formatExecutorConstraints();
648
+ const outputRelPath = relSliceFile(base, mid, sid, "PLAN");
649
+ const commitInstruction = "Do not commit planning artifacts — .gsd/ is managed externally.";
650
+ return loadPrompt("plan-slice", {
651
+ workingDirectory: base,
652
+ milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
653
+ slicePath: relSlicePath(base, mid, sid),
654
+ roadmapPath: roadmapRel,
655
+ researchPath: researchRel,
656
+ outputPath: join(base, outputRelPath),
657
+ inlinedContext,
658
+ dependencySummaries: depContent,
659
+ executorContextConstraints,
660
+ commitInstruction,
661
+ sourceFilePaths: sliceSourceFilePaths,
662
+ });
663
+ }
664
+ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base, level) {
665
+ const inlineLevel = level ?? resolveInlineLevel();
666
+ const priorSummaries = await getPriorTaskSummaryPaths(mid, sid, tid, base);
667
+ const priorLines = priorSummaries.length > 0
668
+ ? priorSummaries.map(p => `- \`${p}\``).join("\n")
669
+ : "- (no prior tasks)";
670
+ const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
671
+ const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
672
+ const taskPlanRelPath = relSlicePath(base, mid, sid) + `/tasks/${tid}-PLAN.md`;
673
+ const taskPlanInline = taskPlanContent
674
+ ? [
675
+ "## Inlined Task Plan (authoritative local execution contract)",
676
+ `Source: \`${taskPlanRelPath}\``,
677
+ "",
678
+ taskPlanContent.trim(),
679
+ ].join("\n")
680
+ : [
681
+ "## Inlined Task Plan (authoritative local execution contract)",
682
+ `Task plan not found at dispatch time. Read \`${taskPlanRelPath}\` before executing.`,
683
+ ].join("\n");
684
+ const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
685
+ const slicePlanContent = slicePlanPath ? await loadFile(slicePlanPath) : null;
686
+ const slicePlanExcerpt = extractSliceExecutionExcerpt(slicePlanContent, relSliceFile(base, mid, sid, "PLAN"));
687
+ // Check for continue file (new naming or legacy)
688
+ const continueFile = resolveSliceFile(base, mid, sid, "CONTINUE");
689
+ const legacyContinueDir = resolveSlicePath(base, mid, sid);
690
+ const legacyContinuePath = legacyContinueDir ? join(legacyContinueDir, "continue.md") : null;
691
+ const continueContent = continueFile ? await loadFile(continueFile) : null;
692
+ const legacyContinueContent = !continueContent && legacyContinuePath ? await loadFile(legacyContinuePath) : null;
693
+ const continueRelPath = relSliceFile(base, mid, sid, "CONTINUE");
694
+ const resumeSection = buildResumeSection(continueContent, legacyContinueContent, continueRelPath, legacyContinuePath ? `${relSlicePath(base, mid, sid)}/continue.md` : null);
695
+ // For minimal inline level, only carry forward the most recent prior summary
696
+ const effectivePriorSummaries = inlineLevel === "minimal" && priorSummaries.length > 1
697
+ ? priorSummaries.slice(-1)
698
+ : priorSummaries;
699
+ const carryForwardSection = await buildCarryForwardSection(effectivePriorSummaries, base);
700
+ // Inline project knowledge if available (smart-chunked for relevance)
701
+ const knowledgeAbsPath = resolveGsdRootFile(base, "KNOWLEDGE");
702
+ const knowledgeInlineET = existsSync(knowledgeAbsPath)
703
+ ? await inlineFileSmart(knowledgeAbsPath, relGsdRootFile("KNOWLEDGE"), "Project Knowledge", `${tTitle} ${sTitle}`)
704
+ : null;
705
+ // Only include if it has content (not a "not found" result)
706
+ const knowledgeContent = knowledgeInlineET && !knowledgeInlineET.includes("not found") ? knowledgeInlineET : null;
707
+ const inlinedTemplates = inlineLevel === "minimal"
708
+ ? inlineTemplate("task-summary", "Task Summary")
709
+ : [
710
+ inlineTemplate("task-summary", "Task Summary"),
711
+ inlineTemplate("decisions", "Decisions"),
712
+ ...(knowledgeContent ? [knowledgeContent] : []),
713
+ ].join("\n\n---\n\n");
714
+ const taskSummaryPath = join(base, `${relSlicePath(base, mid, sid)}/tasks/${tid}-SUMMARY.md`);
715
+ const activeOverrides = await loadActiveOverrides(base);
716
+ const overridesSection = formatOverridesSection(activeOverrides);
717
+ // Compute verification budget for the executor's context window (issue #707)
718
+ const prefs = loadEffectiveGSDPreferences();
719
+ const contextWindow = resolveExecutorContextWindow(undefined, prefs?.preferences);
720
+ const budgets = computeBudgets(contextWindow);
721
+ const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
722
+ // Compress carry-forward section when it exceeds 40% of inline context budget.
723
+ // Only compress when compression_strategy is "compress" (budget/balanced profiles).
724
+ const carryForwardBudget = Math.floor(budgets.inlineContextBudgetChars * 0.4);
725
+ let finalCarryForward = carryForwardSection;
726
+ if (carryForwardSection.length > carryForwardBudget) {
727
+ const { resolveCompressionStrategy } = await import("./preferences.js");
728
+ if (resolveCompressionStrategy() === "compress") {
729
+ finalCarryForward = compressToTarget(carryForwardSection, carryForwardBudget).content;
730
+ }
731
+ }
732
+ return loadPrompt("execute-task", {
733
+ overridesSection,
734
+ workingDirectory: base,
735
+ milestoneId: mid, sliceId: sid, sliceTitle: sTitle, taskId: tid, taskTitle: tTitle,
736
+ planPath: join(base, relSliceFile(base, mid, sid, "PLAN")),
737
+ slicePath: relSlicePath(base, mid, sid),
738
+ taskPlanPath: taskPlanRelPath,
739
+ taskPlanInline,
740
+ slicePlanExcerpt,
741
+ carryForwardSection: finalCarryForward,
742
+ resumeSection,
743
+ priorTaskLines: priorLines,
744
+ taskSummaryPath,
745
+ inlinedTemplates,
746
+ verificationBudget,
747
+ });
748
+ }
749
+ export async function buildCompleteSlicePrompt(mid, _midTitle, sid, sTitle, base, level) {
750
+ const inlineLevel = level ?? resolveInlineLevel();
751
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
752
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
753
+ const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
754
+ const slicePlanRel = relSliceFile(base, mid, sid, "PLAN");
755
+ const inlined = [];
756
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
757
+ inlined.push(await inlineFile(slicePlanPath, slicePlanRel, "Slice Plan"));
758
+ if (inlineLevel !== "minimal") {
759
+ const requirementsInline = await inlineRequirementsFromDb(base, sid, inlineLevel);
760
+ if (requirementsInline)
761
+ inlined.push(requirementsInline);
762
+ }
763
+ const knowledgeInlineCS = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
764
+ if (knowledgeInlineCS)
765
+ inlined.push(knowledgeInlineCS);
766
+ // Inline all task summaries for this slice
767
+ const tDir = resolveTasksDir(base, mid, sid);
768
+ if (tDir) {
769
+ const summaryFiles = resolveTaskFiles(tDir, "SUMMARY").sort();
770
+ for (const file of summaryFiles) {
771
+ const absPath = join(tDir, file);
772
+ const content = await loadFile(absPath);
773
+ const sRel = relSlicePath(base, mid, sid);
774
+ const relPath = `${sRel}/tasks/${file}`;
775
+ if (content) {
776
+ inlined.push(`### Task Summary: ${file.replace(/-SUMMARY\.md$/i, "")}\nSource: \`${relPath}\`\n\n${content.trim()}`);
777
+ }
778
+ }
779
+ }
780
+ inlined.push(inlineTemplate("slice-summary", "Slice Summary"));
781
+ if (inlineLevel !== "minimal") {
782
+ inlined.push(inlineTemplate("uat", "UAT"));
783
+ }
784
+ const completeActiveOverrides = await loadActiveOverrides(base);
785
+ const completeOverridesInline = formatOverridesSection(completeActiveOverrides);
786
+ if (completeOverridesInline)
787
+ inlined.unshift(completeOverridesInline);
788
+ const inlinedContext = buildInlinedContextSection(inlined);
789
+ const sliceRel = relSlicePath(base, mid, sid);
790
+ const sliceSummaryPath = join(base, `${sliceRel}/${sid}-SUMMARY.md`);
791
+ const sliceUatPath = join(base, `${sliceRel}/${sid}-UAT.md`);
792
+ return loadPrompt("complete-slice", {
793
+ workingDirectory: base,
794
+ milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
795
+ slicePath: sliceRel,
796
+ roadmapPath: join(base, roadmapRel),
797
+ inlinedContext,
798
+ sliceSummaryPath,
799
+ sliceUatPath,
800
+ });
801
+ }
802
+ export async function buildCompleteMilestonePrompt(mid, midTitle, base, level) {
803
+ const inlineLevel = level ?? resolveInlineLevel();
804
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
805
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
806
+ const inlined = [];
807
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
808
+ // Inline all slice summaries (deduplicated by slice ID)
809
+ const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
810
+ if (roadmapContent) {
811
+ const roadmap = parseRoadmap(roadmapContent);
812
+ const seenSlices = new Set();
813
+ for (const slice of roadmap.slices) {
814
+ if (seenSlices.has(slice.id))
815
+ continue;
816
+ seenSlices.add(slice.id);
817
+ const summaryPath = resolveSliceFile(base, mid, slice.id, "SUMMARY");
818
+ const summaryRel = relSliceFile(base, mid, slice.id, "SUMMARY");
819
+ inlined.push(await inlineFile(summaryPath, summaryRel, `${slice.id} Summary`));
820
+ }
821
+ }
822
+ // Inline root GSD files (skip for minimal — completion can read these if needed)
823
+ if (inlineLevel !== "minimal") {
824
+ const requirementsInline = await inlineRequirementsFromDb(base, undefined, inlineLevel);
825
+ if (requirementsInline)
826
+ inlined.push(requirementsInline);
827
+ const decisionsInline = await inlineDecisionsFromDb(base, mid, undefined, inlineLevel);
828
+ if (decisionsInline)
829
+ inlined.push(decisionsInline);
830
+ const projectInline = await inlineProjectFromDb(base);
831
+ if (projectInline)
832
+ inlined.push(projectInline);
833
+ }
834
+ const knowledgeInlineCM = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
835
+ if (knowledgeInlineCM)
836
+ inlined.push(knowledgeInlineCM);
837
+ // Inline milestone context file (milestone-level, not GSD root)
838
+ const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
839
+ const contextRel = relMilestoneFile(base, mid, "CONTEXT");
840
+ const contextInline = await inlineFileOptional(contextPath, contextRel, "Milestone Context");
841
+ if (contextInline)
842
+ inlined.push(contextInline);
843
+ inlined.push(inlineTemplate("milestone-summary", "Milestone Summary"));
844
+ const inlinedContext = buildInlinedContextSection(inlined);
845
+ const milestoneSummaryPath = join(base, `${relMilestonePath(base, mid)}/${mid}-SUMMARY.md`);
846
+ return loadPrompt("complete-milestone", {
847
+ workingDirectory: base,
848
+ milestoneId: mid,
849
+ milestoneTitle: midTitle,
850
+ roadmapPath: roadmapRel,
851
+ inlinedContext,
852
+ milestoneSummaryPath,
853
+ });
854
+ }
855
+ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
856
+ const inlineLevel = level ?? resolveInlineLevel();
857
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
858
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
859
+ const inlined = [];
860
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
861
+ // Inline all slice summaries and UAT results
862
+ const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
863
+ if (roadmapContent) {
864
+ const roadmap = parseRoadmap(roadmapContent);
865
+ const seenSlices = new Set();
866
+ for (const slice of roadmap.slices) {
867
+ if (seenSlices.has(slice.id))
868
+ continue;
869
+ seenSlices.add(slice.id);
870
+ const summaryPath = resolveSliceFile(base, mid, slice.id, "SUMMARY");
871
+ const summaryRel = relSliceFile(base, mid, slice.id, "SUMMARY");
872
+ inlined.push(await inlineFile(summaryPath, summaryRel, `${slice.id} Summary`));
873
+ const uatPath = resolveSliceFile(base, mid, slice.id, "UAT-RESULT");
874
+ const uatRel = relSliceFile(base, mid, slice.id, "UAT-RESULT");
875
+ const uatInline = await inlineFileOptional(uatPath, uatRel, `${slice.id} UAT Result`);
876
+ if (uatInline)
877
+ inlined.push(uatInline);
878
+ }
879
+ }
880
+ // Inline existing VALIDATION file if this is a re-validation round
881
+ const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
882
+ const validationRel = relMilestoneFile(base, mid, "VALIDATION");
883
+ const validationContent = validationPath ? await loadFile(validationPath) : null;
884
+ let remediationRound = 0;
885
+ if (validationContent) {
886
+ const roundMatch = validationContent.match(/remediation_round:\s*(\d+)/);
887
+ remediationRound = roundMatch ? parseInt(roundMatch[1], 10) + 1 : 1;
888
+ inlined.push(`### Previous Validation (re-validation round ${remediationRound})\nSource: \`${validationRel}\`\n\n${validationContent.trim()}`);
889
+ }
890
+ // Inline root GSD files
891
+ if (inlineLevel !== "minimal") {
892
+ const requirementsInline = await inlineRequirementsFromDb(base, undefined, inlineLevel);
893
+ if (requirementsInline)
894
+ inlined.push(requirementsInline);
895
+ const decisionsInline = await inlineDecisionsFromDb(base, mid, undefined, inlineLevel);
896
+ if (decisionsInline)
897
+ inlined.push(decisionsInline);
898
+ const projectInline = await inlineProjectFromDb(base);
899
+ if (projectInline)
900
+ inlined.push(projectInline);
901
+ }
902
+ const knowledgeInline = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
903
+ if (knowledgeInline)
904
+ inlined.push(knowledgeInline);
905
+ // Inline milestone context file
906
+ const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
907
+ const contextRel = relMilestoneFile(base, mid, "CONTEXT");
908
+ const contextInline = await inlineFileOptional(contextPath, contextRel, "Milestone Context");
909
+ if (contextInline)
910
+ inlined.push(contextInline);
911
+ const inlinedContext = buildInlinedContextSection(inlined);
912
+ const validationOutputPath = join(base, `${relMilestonePath(base, mid)}/${mid}-VALIDATION.md`);
913
+ const roadmapOutputPath = `${relMilestonePath(base, mid)}/${mid}-ROADMAP.md`;
914
+ return loadPrompt("validate-milestone", {
915
+ workingDirectory: base,
916
+ milestoneId: mid,
917
+ milestoneTitle: midTitle,
918
+ roadmapPath: roadmapOutputPath,
919
+ inlinedContext,
920
+ validationPath: validationOutputPath,
921
+ remediationRound: String(remediationRound),
922
+ });
923
+ }
924
+ export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
925
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
926
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
927
+ const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
928
+ const slicePlanRel = relSliceFile(base, mid, sid, "PLAN");
929
+ const inlined = [];
930
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
931
+ inlined.push(await inlineFile(slicePlanPath, slicePlanRel, "Current Slice Plan"));
932
+ // Find the blocker task summary — the completed task with blocker_discovered: true
933
+ let blockerTaskId = "";
934
+ const tDir = resolveTasksDir(base, mid, sid);
935
+ if (tDir) {
936
+ const summaryFiles = resolveTaskFiles(tDir, "SUMMARY").sort();
937
+ for (const file of summaryFiles) {
938
+ const absPath = join(tDir, file);
939
+ const content = await loadFile(absPath);
940
+ if (!content)
941
+ continue;
942
+ const summary = parseSummary(content);
943
+ const sRel = relSlicePath(base, mid, sid);
944
+ const relPath = `${sRel}/tasks/${file}`;
945
+ if (summary.frontmatter.blocker_discovered) {
946
+ blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
947
+ inlined.push(`### Blocker Task Summary: ${blockerTaskId}\nSource: \`${relPath}\`\n\n${content.trim()}`);
948
+ }
949
+ }
950
+ }
951
+ // Inline decisions
952
+ const decisionsInline = await inlineDecisionsFromDb(base, mid);
953
+ if (decisionsInline)
954
+ inlined.push(decisionsInline);
955
+ const replanActiveOverrides = await loadActiveOverrides(base);
956
+ const replanOverridesInline = formatOverridesSection(replanActiveOverrides);
957
+ if (replanOverridesInline)
958
+ inlined.unshift(replanOverridesInline);
959
+ const inlinedContext = buildInlinedContextSection(inlined);
960
+ const replanPath = join(base, `${relSlicePath(base, mid, sid)}/${sid}-REPLAN.md`);
961
+ // Build capture context for replan prompt (captures that triggered this replan)
962
+ let captureContext = "(none)";
963
+ try {
964
+ const { loadReplanCaptures } = await import("./triage-resolution.js");
965
+ const replanCaptures = loadReplanCaptures(base);
966
+ if (replanCaptures.length > 0) {
967
+ captureContext = replanCaptures.map(c => `- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`).join("\n");
968
+ }
969
+ }
970
+ catch {
971
+ // Non-fatal — captures module may not be available
972
+ }
973
+ return loadPrompt("replan-slice", {
974
+ workingDirectory: base,
975
+ milestoneId: mid,
976
+ sliceId: sid,
977
+ sliceTitle: sTitle,
978
+ slicePath: relSlicePath(base, mid, sid),
979
+ planPath: join(base, slicePlanRel),
980
+ blockerTaskId,
981
+ inlinedContext,
982
+ replanPath,
983
+ captureContext,
984
+ });
985
+ }
986
+ export async function buildRunUatPrompt(mid, sliceId, uatPath, base) {
987
+ const inlined = [];
988
+ inlined.push(await inlineFile(resolveSliceFile(base, mid, sliceId, "UAT"), uatPath, `${sliceId} UAT`));
989
+ const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
990
+ const summaryRel = relSliceFile(base, mid, sliceId, "SUMMARY");
991
+ if (summaryPath) {
992
+ const summaryInline = await inlineFileOptional(summaryPath, summaryRel, `${sliceId} Summary`);
993
+ if (summaryInline)
994
+ inlined.push(summaryInline);
995
+ }
996
+ const projectInline = await inlineProjectFromDb(base);
997
+ if (projectInline)
998
+ inlined.push(projectInline);
999
+ const inlinedContext = buildInlinedContextSection(inlined);
1000
+ const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "UAT-RESULT"));
1001
+ return loadPrompt("run-uat", {
1002
+ workingDirectory: base,
1003
+ milestoneId: mid,
1004
+ sliceId,
1005
+ uatPath,
1006
+ uatResultPath,
1007
+ inlinedContext,
1008
+ });
1009
+ }
1010
+ export async function buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base, level) {
1011
+ const inlineLevel = level ?? resolveInlineLevel();
1012
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
1013
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
1014
+ const summaryPath = resolveSliceFile(base, mid, completedSliceId, "SUMMARY");
1015
+ const summaryRel = relSliceFile(base, mid, completedSliceId, "SUMMARY");
1016
+ const inlined = [];
1017
+ inlined.push(await inlineFile(roadmapPath, roadmapRel, "Current Roadmap"));
1018
+ inlined.push(await inlineFile(summaryPath, summaryRel, `${completedSliceId} Summary`));
1019
+ if (inlineLevel !== "minimal") {
1020
+ const projectInline = await inlineProjectFromDb(base);
1021
+ if (projectInline)
1022
+ inlined.push(projectInline);
1023
+ const requirementsInline = await inlineRequirementsFromDb(base, undefined, inlineLevel);
1024
+ if (requirementsInline)
1025
+ inlined.push(requirementsInline);
1026
+ const decisionsInline = await inlineDecisionsFromDb(base, mid, undefined, inlineLevel);
1027
+ if (decisionsInline)
1028
+ inlined.push(decisionsInline);
1029
+ }
1030
+ const knowledgeInlineRA = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
1031
+ if (knowledgeInlineRA)
1032
+ inlined.push(knowledgeInlineRA);
1033
+ const inlinedContext = buildInlinedContextSection(inlined);
1034
+ const assessmentPath = join(base, relSliceFile(base, mid, completedSliceId, "ASSESSMENT"));
1035
+ // Build deferred captures context for reassess prompt
1036
+ let deferredCaptures = "(none)";
1037
+ try {
1038
+ const { loadDeferredCaptures } = await import("./triage-resolution.js");
1039
+ const deferred = loadDeferredCaptures(base);
1040
+ if (deferred.length > 0) {
1041
+ deferredCaptures = deferred.map(c => `- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`).join("\n");
1042
+ }
1043
+ }
1044
+ catch {
1045
+ // Non-fatal — captures module may not be available
1046
+ }
1047
+ const reassessCommitInstruction = "Do not commit planning artifacts — .gsd/ is managed externally.";
1048
+ return loadPrompt("reassess-roadmap", {
1049
+ workingDirectory: base,
1050
+ milestoneId: mid,
1051
+ milestoneTitle: midTitle,
1052
+ completedSliceId,
1053
+ roadmapPath: roadmapRel,
1054
+ completedSliceSummaryPath: summaryRel,
1055
+ assessmentPath,
1056
+ inlinedContext,
1057
+ deferredCaptures,
1058
+ commitInstruction: reassessCommitInstruction,
1059
+ });
1060
+ }
1061
+ export async function buildRewriteDocsPrompt(mid, midTitle, activeSlice, base, overrides) {
1062
+ const sid = activeSlice?.id;
1063
+ const sTitle = activeSlice?.title ?? "";
1064
+ const docList = [];
1065
+ if (sid) {
1066
+ const slicePlanPath = resolveSliceFile(base, mid, sid, "PLAN");
1067
+ const slicePlanRel = relSliceFile(base, mid, sid, "PLAN");
1068
+ if (slicePlanPath) {
1069
+ docList.push(`- Slice plan: \`${slicePlanRel}\``);
1070
+ const tDir = resolveTasksDir(base, mid, sid);
1071
+ if (tDir) {
1072
+ const planContent = await loadFile(slicePlanPath);
1073
+ if (planContent) {
1074
+ const plan = parsePlan(planContent);
1075
+ for (const task of plan.tasks) {
1076
+ if (!task.done) {
1077
+ const taskPlanPath = resolveTaskFile(base, mid, sid, task.id, "PLAN");
1078
+ if (taskPlanPath) {
1079
+ const taskRelPath = `${relSlicePath(base, mid, sid)}/tasks/${task.id}-PLAN.md`;
1080
+ docList.push(`- Task plan: \`${taskRelPath}\``);
1081
+ }
1082
+ }
1083
+ }
1084
+ }
1085
+ }
1086
+ }
1087
+ }
1088
+ const decisionsPath = resolveGsdRootFile(base, "DECISIONS");
1089
+ if (existsSync(decisionsPath))
1090
+ docList.push(`- Decisions: \`${relGsdRootFile("DECISIONS")}\``);
1091
+ const requirementsPath = resolveGsdRootFile(base, "REQUIREMENTS");
1092
+ if (existsSync(requirementsPath))
1093
+ docList.push(`- Requirements: \`${relGsdRootFile("REQUIREMENTS")}\``);
1094
+ const projectPath = resolveGsdRootFile(base, "PROJECT");
1095
+ if (existsSync(projectPath))
1096
+ docList.push(`- Project: \`${relGsdRootFile("PROJECT")}\``);
1097
+ const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
1098
+ const contextRel = relMilestoneFile(base, mid, "CONTEXT");
1099
+ if (contextPath)
1100
+ docList.push(`- Milestone context (reference only): \`${contextRel}\``);
1101
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
1102
+ const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
1103
+ if (roadmapPath)
1104
+ docList.push(`- Roadmap: \`${roadmapRel}\``);
1105
+ const overrideContent = overrides.map((o, i) => [
1106
+ `### Override ${i + 1}`,
1107
+ `**Change:** ${o.change}`,
1108
+ `**Issued:** ${o.timestamp}`,
1109
+ `**During:** ${o.appliedAt}`,
1110
+ ].join("\n")).join("\n\n");
1111
+ const documentList = docList.length > 0 ? docList.join("\n") : "- No active plan documents found.";
1112
+ return loadPrompt("rewrite-docs", {
1113
+ milestoneId: mid,
1114
+ milestoneTitle: midTitle,
1115
+ sliceId: sid ?? "none",
1116
+ sliceTitle: sTitle,
1117
+ overrideContent,
1118
+ documentList,
1119
+ overridesPath: relGsdRootFile("OVERRIDES"),
1120
+ });
1121
+ }