gsd-pi 2.33.1 → 2.34.0-dev.6769913

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 (1061) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/cli.js +16 -0
  4. package/dist/headless-query.js +6 -6
  5. package/dist/resource-loader.d.ts +2 -0
  6. package/dist/resource-loader.js +39 -4
  7. package/dist/resources/extensions/ask-user-questions.js +217 -0
  8. package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
  9. package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
  10. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
  11. package/dist/resources/extensions/async-jobs/index.js +119 -0
  12. package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
  13. package/dist/resources/extensions/aws-auth/index.js +138 -0
  14. package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
  15. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
  17. package/dist/resources/extensions/bg-shell/index.js +41 -0
  18. package/dist/resources/extensions/bg-shell/interaction.js +160 -0
  19. package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
  20. package/dist/resources/extensions/bg-shell/overlay.js +378 -0
  21. package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
  23. package/dist/resources/extensions/bg-shell/types.js +96 -0
  24. package/dist/resources/extensions/bg-shell/utilities.js +50 -0
  25. package/dist/resources/extensions/browser-tools/capture.js +179 -0
  26. package/dist/resources/extensions/browser-tools/core.js +899 -0
  27. package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
  28. package/dist/resources/extensions/browser-tools/index.js +123 -0
  29. package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
  30. package/dist/resources/extensions/browser-tools/refs.js +254 -0
  31. package/dist/resources/extensions/browser-tools/settle.js +173 -0
  32. package/dist/resources/extensions/browser-tools/state.js +126 -0
  33. package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
  34. package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
  35. package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
  36. package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
  37. package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
  38. package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
  39. package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
  40. package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
  41. package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
  42. package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
  43. package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
  44. package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
  45. package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
  46. package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
  47. package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
  48. package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
  49. package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
  50. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
  51. package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
  52. package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
  53. package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
  54. package/dist/resources/extensions/browser-tools/utils.js +490 -0
  55. package/dist/resources/extensions/context7/index.js +337 -0
  56. package/dist/resources/extensions/get-secrets-from-user.js +492 -0
  57. package/dist/resources/extensions/google-search/index.js +373 -0
  58. package/dist/resources/extensions/gsd/activity-log.js +146 -0
  59. package/dist/resources/extensions/gsd/atomic-write.js +38 -0
  60. package/dist/resources/extensions/gsd/auto/session.js +182 -0
  61. package/dist/resources/extensions/gsd/auto-budget.js +30 -0
  62. package/dist/resources/extensions/gsd/auto-dashboard.js +429 -0
  63. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +185 -0
  64. package/dist/resources/extensions/gsd/auto-dispatch.js +353 -0
  65. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  66. package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
  67. package/dist/resources/extensions/gsd/auto-observability.js +56 -0
  68. package/dist/resources/extensions/gsd/auto-post-unit.js +385 -0
  69. package/dist/resources/extensions/gsd/auto-prompts.js +1153 -0
  70. package/dist/resources/extensions/gsd/auto-recovery.js +512 -0
  71. package/dist/resources/extensions/gsd/auto-start.js +414 -0
  72. package/dist/resources/extensions/gsd/auto-supervisor.js +47 -0
  73. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
  74. package/dist/resources/extensions/gsd/auto-timers.js +180 -0
  75. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  76. package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
  77. package/dist/resources/extensions/gsd/auto-verification.js +171 -0
  78. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  79. package/dist/resources/extensions/gsd/auto-worktree.js +830 -0
  80. package/dist/resources/extensions/gsd/auto.js +765 -0
  81. package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
  82. package/dist/resources/extensions/gsd/captures.js +354 -0
  83. package/dist/resources/extensions/gsd/changelog.js +162 -0
  84. package/dist/resources/extensions/gsd/claude-import.js +540 -0
  85. package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
  86. package/dist/resources/extensions/gsd/commands-bootstrap.js +224 -0
  87. package/dist/resources/extensions/gsd/commands-config.js +89 -0
  88. package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
  89. package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
  90. package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
  91. package/dist/resources/extensions/gsd/commands-logs.js +468 -0
  92. package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
  93. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
  94. package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
  95. package/dist/resources/extensions/gsd/commands.js +1031 -0
  96. package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
  97. package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
  98. package/dist/resources/extensions/gsd/context-budget.js +187 -0
  99. package/dist/resources/extensions/gsd/context-store.js +165 -0
  100. package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
  101. package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
  102. package/dist/resources/extensions/gsd/db-writer.js +298 -0
  103. package/dist/resources/extensions/gsd/debug-logger.js +161 -0
  104. package/dist/resources/extensions/gsd/detection.js +373 -0
  105. package/dist/resources/extensions/gsd/diff-context.js +168 -0
  106. package/dist/resources/extensions/gsd/dispatch-guard.js +75 -0
  107. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  108. package/dist/resources/extensions/gsd/doctor-checks.js +562 -0
  109. package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
  110. package/dist/resources/extensions/gsd/doctor-format.js +71 -0
  111. package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
  112. package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
  113. package/dist/resources/extensions/gsd/doctor-types.js +12 -0
  114. package/dist/resources/extensions/gsd/doctor.js +672 -0
  115. package/dist/resources/extensions/gsd/error-utils.js +6 -0
  116. package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
  117. package/dist/resources/extensions/gsd/exit-command.js +11 -0
  118. package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
  119. package/dist/resources/extensions/gsd/export.js +268 -0
  120. package/dist/resources/extensions/gsd/file-watcher.js +76 -0
  121. package/dist/resources/extensions/gsd/files.js +937 -0
  122. package/dist/resources/extensions/gsd/forensics.js +511 -0
  123. package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
  124. package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
  125. package/dist/resources/extensions/gsd/git-service.js +460 -0
  126. package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
  127. package/dist/resources/extensions/gsd/gsd-db.js +735 -0
  128. package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
  129. package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
  130. package/dist/resources/extensions/gsd/health-widget.js +141 -0
  131. package/dist/resources/extensions/gsd/history.js +118 -0
  132. package/dist/resources/extensions/gsd/index.js +1114 -0
  133. package/dist/resources/extensions/gsd/init-wizard.js +479 -0
  134. package/dist/resources/extensions/gsd/json-persistence.js +62 -0
  135. package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
  136. package/dist/resources/extensions/gsd/key-manager.js +829 -0
  137. package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
  138. package/dist/resources/extensions/gsd/md-importer.js +440 -0
  139. package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
  140. package/dist/resources/extensions/gsd/memory-store.js +351 -0
  141. package/dist/resources/extensions/gsd/metrics.js +377 -0
  142. package/dist/resources/extensions/gsd/migrate/command.js +157 -0
  143. package/dist/resources/extensions/gsd/migrate/index.js +7 -0
  144. package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
  145. package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
  146. package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
  147. package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
  148. package/dist/resources/extensions/gsd/migrate/types.js +4 -0
  149. package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
  150. package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
  151. package/dist/resources/extensions/gsd/migrate-external.js +130 -0
  152. package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
  153. package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
  154. package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
  155. package/dist/resources/extensions/gsd/model-router.js +187 -0
  156. package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
  157. package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
  158. package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
  159. package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
  160. package/dist/resources/extensions/gsd/notifications.js +58 -0
  161. package/dist/resources/extensions/gsd/observability-validator.js +398 -0
  162. package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
  163. package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
  164. package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
  165. package/dist/resources/extensions/gsd/paths.js +414 -0
  166. package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
  167. package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
  168. package/dist/resources/extensions/gsd/preferences-models.js +294 -0
  169. package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
  170. package/dist/resources/extensions/gsd/preferences-types.js +73 -0
  171. package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
  172. package/dist/resources/extensions/gsd/preferences.js +325 -0
  173. package/dist/resources/extensions/gsd/progress-score.js +102 -0
  174. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
  175. package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
  176. package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
  177. package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
  178. package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
  179. package/dist/resources/extensions/gsd/queue-order.js +178 -0
  180. package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
  181. package/dist/resources/extensions/gsd/quick.js +206 -0
  182. package/dist/resources/extensions/gsd/repo-identity.js +187 -0
  183. package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
  184. package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
  185. package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
  186. package/dist/resources/extensions/gsd/routing-history.js +210 -0
  187. package/dist/resources/extensions/gsd/safe-fs.js +52 -0
  188. package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
  189. package/dist/resources/extensions/gsd/session-forensics.js +427 -0
  190. package/dist/resources/extensions/gsd/session-lock.js +397 -0
  191. package/dist/resources/extensions/gsd/session-status-io.js +134 -0
  192. package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
  193. package/dist/resources/extensions/gsd/skill-health.js +324 -0
  194. package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
  195. package/dist/resources/extensions/gsd/state.js +653 -0
  196. package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
  197. package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
  198. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  199. package/dist/resources/extensions/gsd/token-counter.js +54 -0
  200. package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
  201. package/dist/resources/extensions/gsd/triage-ui.js +125 -0
  202. package/dist/resources/extensions/gsd/types.js +4 -0
  203. package/dist/resources/extensions/gsd/undo.js +205 -0
  204. package/dist/resources/extensions/gsd/unit-id.js +7 -0
  205. package/dist/resources/extensions/gsd/unit-runtime.js +131 -0
  206. package/dist/resources/extensions/gsd/validate-directory.js +143 -0
  207. package/dist/resources/extensions/gsd/verification-evidence.js +122 -0
  208. package/dist/resources/extensions/gsd/verification-gate.js +514 -0
  209. package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
  210. package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
  211. package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
  212. package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
  213. package/dist/resources/extensions/gsd/workspace-index.js +139 -0
  214. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
  215. package/dist/resources/extensions/gsd/worktree-command.js +682 -0
  216. package/dist/resources/extensions/gsd/worktree-manager.js +358 -0
  217. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  218. package/dist/resources/extensions/gsd/worktree.js +199 -0
  219. package/dist/resources/extensions/mac-tools/index.js +768 -0
  220. package/dist/resources/extensions/mcp-client/index.js +364 -0
  221. package/dist/resources/extensions/package.json +3 -0
  222. package/dist/resources/extensions/remote-questions/config.js +70 -0
  223. package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
  224. package/dist/resources/extensions/remote-questions/format.js +234 -0
  225. package/dist/resources/extensions/remote-questions/http-client.js +43 -0
  226. package/dist/resources/extensions/remote-questions/manager.js +156 -0
  227. package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
  228. package/dist/resources/extensions/remote-questions/notify.js +89 -0
  229. package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
  230. package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
  231. package/dist/resources/extensions/remote-questions/status.js +25 -0
  232. package/dist/resources/extensions/remote-questions/store.js +70 -0
  233. package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
  234. package/dist/resources/extensions/remote-questions/types.js +5 -0
  235. package/dist/resources/extensions/search-the-web/cache.js +74 -0
  236. package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
  237. package/dist/resources/extensions/search-the-web/format.js +161 -0
  238. package/dist/resources/extensions/search-the-web/http.js +178 -0
  239. package/dist/resources/extensions/search-the-web/index.js +41 -0
  240. package/dist/resources/extensions/search-the-web/native-search.js +166 -0
  241. package/dist/resources/extensions/search-the-web/provider.js +143 -0
  242. package/dist/resources/extensions/search-the-web/tavily.js +82 -0
  243. package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
  244. package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
  245. package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
  246. package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
  247. package/dist/resources/extensions/shared/confirm-ui.js +96 -0
  248. package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
  249. package/dist/resources/extensions/shared/frontmatter.js +109 -0
  250. package/dist/resources/extensions/shared/interview-ui.js +569 -0
  251. package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
  252. package/dist/resources/extensions/shared/next-action-ui.js +168 -0
  253. package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
  254. package/dist/resources/extensions/shared/sanitize.js +17 -0
  255. package/dist/resources/extensions/shared/terminal.js +21 -0
  256. package/dist/resources/extensions/shared/ui.js +245 -0
  257. package/dist/resources/extensions/shared/wizard-ui.js +478 -0
  258. package/dist/resources/extensions/slash-commands/audit.js +72 -0
  259. package/dist/resources/extensions/slash-commands/clear.js +8 -0
  260. package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
  261. package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
  262. package/dist/resources/extensions/slash-commands/index.js +10 -0
  263. package/dist/resources/extensions/subagent/agents.js +103 -0
  264. package/dist/resources/extensions/subagent/index.js +905 -0
  265. package/dist/resources/extensions/subagent/isolation.js +384 -0
  266. package/dist/resources/extensions/subagent/worker-registry.js +73 -0
  267. package/dist/resources/extensions/ttsr/index.js +144 -0
  268. package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
  269. package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
  270. package/dist/resources/extensions/universal-config/discovery.js +94 -0
  271. package/dist/resources/extensions/universal-config/format.js +178 -0
  272. package/dist/resources/extensions/universal-config/index.js +99 -0
  273. package/dist/resources/extensions/universal-config/scanners.js +574 -0
  274. package/dist/resources/extensions/universal-config/tools.js +57 -0
  275. package/dist/resources/extensions/universal-config/types.js +8 -0
  276. package/dist/resources/extensions/voice/index.js +247 -0
  277. package/dist/startup-timings.d.ts +2 -0
  278. package/dist/startup-timings.js +22 -0
  279. package/dist/tool-bootstrap.js +59 -11
  280. package/dist/worktree-cli.js +7 -7
  281. package/package.json +1 -1
  282. package/packages/native/dist/native.d.ts +0 -2
  283. package/packages/native/dist/native.js +0 -2
  284. package/packages/native/src/native.ts +0 -3
  285. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  286. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  287. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  288. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  289. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  290. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  291. package/packages/pi-agent-core/dist/agent.js +11 -22
  292. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  293. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  294. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  295. package/packages/pi-agent-core/dist/proxy.js +1 -1
  296. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  297. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  298. package/packages/pi-agent-core/src/agent.ts +12 -23
  299. package/packages/pi-agent-core/src/proxy.ts +1 -1
  300. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  301. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/api-registry.js +0 -10
  303. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  304. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  305. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  307. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  309. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  310. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  311. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  312. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  313. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  315. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  317. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  319. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  321. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  323. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  324. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  325. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  326. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  327. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  328. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  329. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  330. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  331. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  332. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  333. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/utils/validation.js +0 -14
  335. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  336. package/packages/pi-ai/src/api-registry.ts +0 -12
  337. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  338. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  339. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  340. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  341. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  342. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  343. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  344. package/packages/pi-ai/src/utils/validation.ts +0 -15
  345. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  346. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/config.js +4 -8
  348. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  350. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/agent-session.js +24 -5
  352. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  354. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  356. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  358. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  360. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  362. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  364. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -5
  366. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  368. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  370. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  372. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  374. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  376. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +0 -2
  378. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/lsp/config.js +0 -7
  380. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  382. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  384. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  386. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +1 -1
  388. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  390. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  391. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  392. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  394. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  396. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  398. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  400. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  402. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  404. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  406. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  407. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  408. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  409. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -4
  410. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/session-manager.js +2 -4
  412. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -12
  414. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/settings-manager.js +78 -168
  416. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  418. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  419. package/packages/pi-coding-agent/dist/index.js +1 -1
  420. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  422. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  424. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  430. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  432. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  434. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  435. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  436. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  440. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  442. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  443. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  445. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  446. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  447. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  448. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  449. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  450. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  451. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  452. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  454. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  456. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  458. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  459. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  460. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  461. package/packages/pi-coding-agent/package.json +1 -1
  462. package/packages/pi-coding-agent/src/config.ts +5 -10
  463. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -5
  464. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  465. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
  466. package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
  467. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -13
  468. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  469. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  470. package/packages/pi-coding-agent/src/core/lsp/config.ts +0 -11
  471. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  472. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +1 -1
  473. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  474. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  475. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  476. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  477. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  478. package/packages/pi-coding-agent/src/core/session-manager.ts +2 -4
  479. package/packages/pi-coding-agent/src/core/settings-manager.ts +87 -166
  480. package/packages/pi-coding-agent/src/index.ts +1 -0
  481. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  482. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  483. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  484. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  485. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  486. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  487. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  488. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  489. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  490. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  491. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  492. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  493. package/packages/pi-tui/dist/components/editor.js +1 -1
  494. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  495. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  496. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  497. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  498. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  499. package/packages/pi-tui/dist/tui.d.ts +0 -22
  500. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  501. package/packages/pi-tui/dist/tui.js +6 -272
  502. package/packages/pi-tui/dist/tui.js.map +1 -1
  503. package/packages/pi-tui/dist/utils.d.ts +0 -7
  504. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  505. package/packages/pi-tui/dist/utils.js +0 -44
  506. package/packages/pi-tui/dist/utils.js.map +1 -1
  507. package/packages/pi-tui/src/components/editor.ts +1 -1
  508. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  509. package/packages/pi-tui/src/tui.ts +11 -312
  510. package/packages/pi-tui/src/utils.ts +0 -43
  511. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  512. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  513. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  514. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  515. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  516. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  517. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  518. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  519. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  520. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  521. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  522. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  523. package/pkg/package.json +1 -1
  524. package/src/resources/extensions/bg-shell/index.ts +41 -46
  525. package/src/resources/extensions/browser-tools/index.ts +156 -67
  526. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  527. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  528. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  529. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  530. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  531. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  532. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  533. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  534. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  535. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  536. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  537. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  538. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  539. package/src/resources/extensions/gsd/auto-verification.ts +76 -72
  540. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  541. package/src/resources/extensions/gsd/auto-worktree.ts +453 -133
  542. package/src/resources/extensions/gsd/auto.ts +516 -1189
  543. package/src/resources/extensions/gsd/captures.ts +10 -4
  544. package/src/resources/extensions/gsd/changelog.ts +213 -0
  545. package/src/resources/extensions/gsd/commands-bootstrap.ts +253 -0
  546. package/src/resources/extensions/gsd/commands.ts +48 -32
  547. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  548. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  549. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  550. package/src/resources/extensions/gsd/git-service.ts +32 -12
  551. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  552. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  553. package/src/resources/extensions/gsd/guided-flow.ts +22 -11
  554. package/src/resources/extensions/gsd/index.ts +76 -163
  555. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  556. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  557. package/src/resources/extensions/gsd/quick.ts +121 -76
  558. package/src/resources/extensions/gsd/repo-identity.ts +56 -22
  559. package/src/resources/extensions/gsd/session-lock.ts +17 -0
  560. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  561. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  562. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  563. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  564. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  565. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  566. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  567. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  568. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  569. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  570. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  571. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  572. package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
  573. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  574. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  575. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  576. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
  577. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
  578. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  579. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  580. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  581. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  582. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  583. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  584. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  585. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  586. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -136
  587. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  588. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  589. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  590. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  591. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  592. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  593. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  594. package/src/resources/extensions/gsd/types.ts +90 -77
  595. package/src/resources/extensions/gsd/undo.ts +42 -46
  596. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  597. package/src/resources/extensions/gsd/verification-evidence.ts +0 -2
  598. package/src/resources/extensions/gsd/verification-gate.ts +4 -16
  599. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  600. package/src/resources/extensions/gsd/worktree-command.ts +29 -11
  601. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  602. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  603. package/src/resources/extensions/gsd/worktree.ts +7 -44
  604. package/src/resources/extensions/mcp-client/index.ts +2 -1
  605. package/src/resources/extensions/package.json +3 -0
  606. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  607. package/src/resources/extensions/search-the-web/index.ts +35 -52
  608. package/src/resources/extensions/search-the-web/tavily.ts +1 -1
  609. package/dist/resources/extensions/ask-user-questions.ts +0 -290
  610. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
  611. package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
  612. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
  613. package/dist/resources/extensions/async-jobs/index.ts +0 -141
  614. package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
  615. package/dist/resources/extensions/aws-auth/index.ts +0 -144
  616. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
  617. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
  618. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
  619. package/dist/resources/extensions/bg-shell/index.ts +0 -59
  620. package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
  621. package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
  622. package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
  623. package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
  624. package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
  625. package/dist/resources/extensions/bg-shell/types.ts +0 -303
  626. package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
  627. package/dist/resources/extensions/browser-tools/capture.ts +0 -199
  628. package/dist/resources/extensions/browser-tools/core.ts +0 -1196
  629. package/dist/resources/extensions/browser-tools/index.ts +0 -71
  630. package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
  631. package/dist/resources/extensions/browser-tools/refs.ts +0 -264
  632. package/dist/resources/extensions/browser-tools/settle.ts +0 -197
  633. package/dist/resources/extensions/browser-tools/state.ts +0 -408
  634. package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
  635. package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
  636. package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
  637. package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
  638. package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
  639. package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
  640. package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
  641. package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
  642. package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
  643. package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
  644. package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
  645. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
  646. package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
  647. package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
  648. package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
  649. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
  650. package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
  651. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
  652. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
  653. package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
  654. package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
  655. package/dist/resources/extensions/browser-tools/utils.ts +0 -660
  656. package/dist/resources/extensions/context7/index.ts +0 -428
  657. package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
  658. package/dist/resources/extensions/google-search/index.ts +0 -466
  659. package/dist/resources/extensions/gsd/activity-log.ts +0 -162
  660. package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
  661. package/dist/resources/extensions/gsd/auto/session.ts +0 -236
  662. package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
  663. package/dist/resources/extensions/gsd/auto-constants.ts +0 -6
  664. package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
  665. package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
  666. package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
  667. package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
  668. package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
  669. package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
  670. package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
  671. package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
  672. package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
  673. package/dist/resources/extensions/gsd/auto-start.ts +0 -483
  674. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  675. package/dist/resources/extensions/gsd/auto-supervisor.ts +0 -61
  676. package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
  677. package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
  678. package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
  679. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  680. package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
  681. package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
  682. package/dist/resources/extensions/gsd/auto.ts +0 -1834
  683. package/dist/resources/extensions/gsd/captures.ts +0 -427
  684. package/dist/resources/extensions/gsd/claude-import.ts +0 -656
  685. package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  686. package/dist/resources/extensions/gsd/commands-config.ts +0 -102
  687. package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
  688. package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
  689. package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
  690. package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
  691. package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
  692. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
  693. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  694. package/dist/resources/extensions/gsd/commands.ts +0 -1149
  695. package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
  696. package/dist/resources/extensions/gsd/context-budget.ts +0 -266
  697. package/dist/resources/extensions/gsd/context-store.ts +0 -195
  698. package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
  699. package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
  700. package/dist/resources/extensions/gsd/db-writer.ts +0 -360
  701. package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
  702. package/dist/resources/extensions/gsd/detection.ts +0 -470
  703. package/dist/resources/extensions/gsd/diff-context.ts +0 -214
  704. package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
  705. package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
  706. package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
  707. package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
  708. package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
  709. package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
  710. package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
  711. package/dist/resources/extensions/gsd/doctor.ts +0 -722
  712. package/dist/resources/extensions/gsd/error-utils.ts +0 -6
  713. package/dist/resources/extensions/gsd/exit-command.ts +0 -18
  714. package/dist/resources/extensions/gsd/export.ts +0 -317
  715. package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
  716. package/dist/resources/extensions/gsd/files.ts +0 -1058
  717. package/dist/resources/extensions/gsd/forensics.ts +0 -629
  718. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
  719. package/dist/resources/extensions/gsd/git-service.ts +0 -580
  720. package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
  721. package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
  722. package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
  723. package/dist/resources/extensions/gsd/health-widget.ts +0 -167
  724. package/dist/resources/extensions/gsd/history.ts +0 -143
  725. package/dist/resources/extensions/gsd/index.ts +0 -1390
  726. package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
  727. package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
  728. package/dist/resources/extensions/gsd/key-manager.ts +0 -996
  729. package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  730. package/dist/resources/extensions/gsd/md-importer.ts +0 -527
  731. package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
  732. package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
  733. package/dist/resources/extensions/gsd/memory-store.ts +0 -441
  734. package/dist/resources/extensions/gsd/metrics.ts +0 -532
  735. package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
  736. package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
  737. package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
  738. package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
  739. package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
  740. package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
  741. package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
  742. package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
  743. package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
  744. package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
  745. package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
  746. package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
  747. package/dist/resources/extensions/gsd/model-router.ts +0 -256
  748. package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
  749. package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  750. package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
  751. package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  752. package/dist/resources/extensions/gsd/notifications.ts +0 -87
  753. package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
  754. package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
  755. package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
  756. package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
  757. package/dist/resources/extensions/gsd/paths.ts +0 -449
  758. package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
  759. package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
  760. package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
  761. package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
  762. package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
  763. package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
  764. package/dist/resources/extensions/gsd/preferences.ts +0 -416
  765. package/dist/resources/extensions/gsd/progress-score.ts +0 -273
  766. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  767. package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
  768. package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
  769. package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
  770. package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
  771. package/dist/resources/extensions/gsd/queue-order.ts +0 -230
  772. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
  773. package/dist/resources/extensions/gsd/quick.ts +0 -212
  774. package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
  775. package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
  776. package/dist/resources/extensions/gsd/routing-history.ts +0 -286
  777. package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
  778. package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
  779. package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
  780. package/dist/resources/extensions/gsd/session-lock.ts +0 -426
  781. package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
  782. package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
  783. package/dist/resources/extensions/gsd/skill-health.ts +0 -417
  784. package/dist/resources/extensions/gsd/state.ts +0 -727
  785. package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
  786. package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
  787. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
  788. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
  789. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
  790. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  791. package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
  792. package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  793. package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
  794. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
  795. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
  796. package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  797. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
  798. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
  799. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  800. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
  801. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
  802. package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  803. package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
  804. package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
  805. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
  806. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
  807. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  808. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  809. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
  810. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  811. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  812. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  813. package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
  814. package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
  815. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
  816. package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
  817. package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
  818. package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
  819. package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  820. package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
  821. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
  822. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
  823. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
  824. package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
  825. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  826. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  827. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
  828. package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
  829. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  830. package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
  831. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
  832. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
  833. package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
  834. package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
  835. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
  836. package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
  837. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  838. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
  839. package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  840. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
  841. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  842. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
  843. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
  844. package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
  845. package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
  846. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
  847. package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
  848. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  849. package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
  850. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
  851. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  852. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
  853. package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  854. package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
  855. package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
  856. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
  857. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
  858. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
  859. package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  860. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
  861. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  862. package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
  863. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  864. package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
  865. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  866. package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
  867. package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
  868. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
  869. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
  870. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
  871. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
  872. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
  873. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
  874. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
  875. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
  876. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  877. package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
  878. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
  879. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  880. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  881. package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  882. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  883. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
  884. package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
  885. package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
  886. package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
  887. package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
  888. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
  889. package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
  890. package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
  891. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
  892. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
  893. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
  894. package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
  895. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
  896. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
  897. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
  898. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
  899. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  900. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
  901. package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
  902. package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  903. package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  904. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  905. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  906. package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
  907. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  908. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
  909. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
  910. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
  911. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
  912. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  913. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
  914. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  915. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
  916. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  917. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
  918. package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
  919. package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
  920. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
  921. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
  922. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
  923. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
  924. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  925. package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
  926. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
  927. package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  928. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  929. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
  930. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
  931. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
  932. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  933. package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
  934. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  935. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  936. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
  937. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  938. package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
  939. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
  940. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
  941. package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
  942. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
  943. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
  944. package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  945. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
  946. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
  947. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
  948. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
  949. package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
  950. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
  951. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
  952. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
  953. package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
  954. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
  955. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  956. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
  957. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
  958. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
  959. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
  960. package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  961. package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
  962. package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
  963. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
  964. package/dist/resources/extensions/gsd/token-counter.ts +0 -65
  965. package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
  966. package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
  967. package/dist/resources/extensions/gsd/types.ts +0 -425
  968. package/dist/resources/extensions/gsd/undo.ts +0 -223
  969. package/dist/resources/extensions/gsd/unit-id.ts +0 -14
  970. package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
  971. package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
  972. package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
  973. package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
  974. package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
  975. package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  976. package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
  977. package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
  978. package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
  979. package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
  980. package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
  981. package/dist/resources/extensions/gsd/worktree.ts +0 -257
  982. package/dist/resources/extensions/mac-tools/index.ts +0 -852
  983. package/dist/resources/extensions/mcp-client/index.ts +0 -459
  984. package/dist/resources/extensions/remote-questions/config.ts +0 -83
  985. package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
  986. package/dist/resources/extensions/remote-questions/format.ts +0 -315
  987. package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
  988. package/dist/resources/extensions/remote-questions/manager.ts +0 -184
  989. package/dist/resources/extensions/remote-questions/notify.ts +0 -90
  990. package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
  991. package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
  992. package/dist/resources/extensions/remote-questions/status.ts +0 -31
  993. package/dist/resources/extensions/remote-questions/store.ts +0 -81
  994. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
  995. package/dist/resources/extensions/remote-questions/types.ts +0 -102
  996. package/dist/resources/extensions/search-the-web/cache.ts +0 -78
  997. package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
  998. package/dist/resources/extensions/search-the-web/format.ts +0 -258
  999. package/dist/resources/extensions/search-the-web/http.ts +0 -238
  1000. package/dist/resources/extensions/search-the-web/index.ts +0 -65
  1001. package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
  1002. package/dist/resources/extensions/search-the-web/provider.ts +0 -148
  1003. package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
  1004. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
  1005. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
  1006. package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
  1007. package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
  1008. package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
  1009. package/dist/resources/extensions/shared/frontmatter.ts +0 -117
  1010. package/dist/resources/extensions/shared/interview-ui.ts +0 -613
  1011. package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
  1012. package/dist/resources/extensions/shared/sanitize.ts +0 -19
  1013. package/dist/resources/extensions/shared/terminal.ts +0 -23
  1014. package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
  1015. package/dist/resources/extensions/shared/ui.ts +0 -400
  1016. package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
  1017. package/dist/resources/extensions/slash-commands/audit.ts +0 -88
  1018. package/dist/resources/extensions/slash-commands/clear.ts +0 -10
  1019. package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
  1020. package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  1021. package/dist/resources/extensions/slash-commands/index.ts +0 -12
  1022. package/dist/resources/extensions/subagent/agents.ts +0 -126
  1023. package/dist/resources/extensions/subagent/index.ts +0 -1121
  1024. package/dist/resources/extensions/subagent/isolation.ts +0 -501
  1025. package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
  1026. package/dist/resources/extensions/ttsr/index.ts +0 -168
  1027. package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
  1028. package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
  1029. package/dist/resources/extensions/universal-config/discovery.ts +0 -104
  1030. package/dist/resources/extensions/universal-config/format.ts +0 -191
  1031. package/dist/resources/extensions/universal-config/index.ts +0 -120
  1032. package/dist/resources/extensions/universal-config/scanners.ts +0 -642
  1033. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
  1034. package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
  1035. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
  1036. package/dist/resources/extensions/universal-config/tools.ts +0 -60
  1037. package/dist/resources/extensions/universal-config/types.ts +0 -135
  1038. package/dist/resources/extensions/voice/index.ts +0 -272
  1039. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
  1040. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
  1041. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  1042. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  1043. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  1044. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  1045. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  1046. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  1047. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  1048. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  1049. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  1050. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  1051. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  1052. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  1053. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  1054. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  1055. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  1056. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  1057. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  1058. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  1059. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  1060. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  1061. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -1,1704 +0,0 @@
1
- import { parseRoadmap, parsePlan, parseSummary, parseContinue, parseRequirementCounts, parseSecretsManifest, formatSecretsManifest } from '../files.ts';
2
- import { createTestContext } from './test-helpers.ts';
3
-
4
- const { assertEq, assertTrue, report } = createTestContext();
5
- // ═══════════════════════════════════════════════════════════════════════════
6
- // parseRoadmap tests
7
- // ═══════════════════════════════════════════════════════════════════════════
8
-
9
- console.log('\n=== parseRoadmap: full roadmap ===');
10
- {
11
- const content = `# M001: GSD Extension — Hierarchical Planning
12
-
13
- **Vision:** Build a structured planning system for coding agents.
14
-
15
- **Success Criteria:**
16
- - All parsers have test coverage
17
- - Round-trip formatting preserves data
18
- - State derivation works correctly
19
-
20
- ---
21
-
22
- ## Slices
23
-
24
- - [x] **S01: Types + File I/O** \`risk:low\` \`depends:[]\`
25
- > After this: All types defined and parsers work.
26
-
27
- - [ ] **S02: State Derivation** \`risk:medium\` \`depends:[S01]\`
28
- > After this: Dashboard shows real-time state.
29
-
30
- - [ ] **S03: Auto Mode** \`risk:high\` \`depends:[S01, S02]\`
31
- > After this: Agent can execute tasks automatically.
32
-
33
- ---
34
-
35
- ## Boundary Map
36
-
37
- ### S01 → S02
38
- \`\`\`
39
- Produces:
40
- types.ts — all type definitions
41
- files.ts — parser and formatter functions
42
-
43
- Consumes from S02:
44
- nothing
45
- \`\`\`
46
-
47
- ### S02 → S03
48
- \`\`\`
49
- Produces:
50
- state.ts — deriveState function
51
-
52
- Consumes from S03:
53
- auto-mode entry points
54
- \`\`\`
55
- `;
56
-
57
- const r = parseRoadmap(content);
58
-
59
- assertEq(r.title, 'M001: GSD Extension — Hierarchical Planning', 'roadmap title');
60
- assertEq(r.vision, 'Build a structured planning system for coding agents.', 'roadmap vision');
61
- assertEq(r.successCriteria.length, 3, 'success criteria count');
62
- assertEq(r.successCriteria[0], 'All parsers have test coverage', 'first success criterion');
63
- assertEq(r.successCriteria[2], 'State derivation works correctly', 'third success criterion');
64
-
65
- // Slices
66
- assertEq(r.slices.length, 3, 'slice count');
67
-
68
- assertEq(r.slices[0].id, 'S01', 'S01 id');
69
- assertEq(r.slices[0].title, 'Types + File I/O', 'S01 title');
70
- assertEq(r.slices[0].risk, 'low', 'S01 risk');
71
- assertEq(r.slices[0].depends, [], 'S01 depends');
72
- assertEq(r.slices[0].done, true, 'S01 done');
73
- assertEq(r.slices[0].demo, 'All types defined and parsers work.', 'S01 demo');
74
-
75
- assertEq(r.slices[1].id, 'S02', 'S02 id');
76
- assertEq(r.slices[1].title, 'State Derivation', 'S02 title');
77
- assertEq(r.slices[1].risk, 'medium', 'S02 risk');
78
- assertEq(r.slices[1].depends, ['S01'], 'S02 depends');
79
- assertEq(r.slices[1].done, false, 'S02 done');
80
-
81
- assertEq(r.slices[2].id, 'S03', 'S03 id');
82
- assertEq(r.slices[2].risk, 'high', 'S03 risk');
83
- assertEq(r.slices[2].depends, ['S01', 'S02'], 'S03 depends');
84
- assertEq(r.slices[2].done, false, 'S03 done');
85
-
86
- // Boundary map
87
- assertEq(r.boundaryMap.length, 2, 'boundary map entry count');
88
- assertEq(r.boundaryMap[0].fromSlice, 'S01', 'bm[0] from');
89
- assertEq(r.boundaryMap[0].toSlice, 'S02', 'bm[0] to');
90
- assertTrue(r.boundaryMap[0].produces.includes('types.ts'), 'bm[0] produces mentions types.ts');
91
- assertEq(r.boundaryMap[1].fromSlice, 'S02', 'bm[1] from');
92
- assertEq(r.boundaryMap[1].toSlice, 'S03', 'bm[1] to');
93
- }
94
-
95
- console.log('\n=== parseRoadmap: empty slices section ===');
96
- {
97
- const content = `# M002: Empty Milestone
98
-
99
- **Vision:** Nothing yet.
100
-
101
- ## Slices
102
-
103
- ## Boundary Map
104
- `;
105
-
106
- const r = parseRoadmap(content);
107
- assertEq(r.title, 'M002: Empty Milestone', 'title with empty slices');
108
- assertEq(r.slices.length, 0, 'no slices parsed');
109
- assertEq(r.boundaryMap.length, 0, 'no boundary map entries');
110
- }
111
-
112
- console.log('\n=== parseRoadmap: malformed checkbox lines ===');
113
- {
114
- // Lines that don't match the expected bold pattern should be skipped
115
- const content = `# M003: Malformed
116
-
117
- **Vision:** Test malformed lines.
118
-
119
- ## Slices
120
-
121
- - [ ] S01: Missing bold markers \`risk:low\` \`depends:[]\`
122
- - [x] **S02: Valid Slice** \`risk:medium\` \`depends:[]\`
123
- > After this: Works.
124
- - [ ] Not a checkbox at all
125
- Some random text
126
- - [x] **S03: Another Valid** \`risk:high\` \`depends:[S02]\`
127
- > After this: Also works.
128
- `;
129
-
130
- const r = parseRoadmap(content);
131
- // Only S02 and S03 should be parsed (malformed lines without bold markers are skipped)
132
- assertEq(r.slices.length, 2, 'only valid slices parsed from malformed input');
133
- assertEq(r.slices[0].id, 'S02', 'first valid slice is S02');
134
- assertEq(r.slices[0].done, true, 'S02 done');
135
- assertEq(r.slices[1].id, 'S03', 'second valid slice is S03');
136
- assertEq(r.slices[1].depends, ['S02'], 'S03 depends on S02');
137
- }
138
-
139
- console.log('\n=== parseRoadmap: lowercase vs uppercase X for done ===');
140
- {
141
- const content = `# M004: Case Test
142
-
143
- **Vision:** Test X case sensitivity.
144
-
145
- ## Slices
146
-
147
- - [x] **S01: Lowercase x** \`risk:low\` \`depends:[]\`
148
- > After this: done.
149
-
150
- - [X] **S02: Uppercase X** \`risk:low\` \`depends:[]\`
151
- > After this: also done.
152
-
153
- - [ ] **S03: Not Done** \`risk:low\` \`depends:[]\`
154
- > After this: not yet.
155
- `;
156
-
157
- const r = parseRoadmap(content);
158
- assertEq(r.slices.length, 3, 'all three slices parsed');
159
- assertEq(r.slices[0].done, true, 'lowercase x is done');
160
- assertEq(r.slices[1].done, true, 'uppercase X is done');
161
- assertEq(r.slices[2].done, false, 'space is not done');
162
- }
163
-
164
- console.log('\n=== parseRoadmap: missing boundary map ===');
165
- {
166
- const content = `# M005: No Boundary Map
167
-
168
- **Vision:** A roadmap without a boundary map section.
169
-
170
- **Success Criteria:**
171
- - One criterion
172
-
173
- ---
174
-
175
- ## Slices
176
-
177
- - [ ] **S01: Only Slice** \`risk:low\` \`depends:[]\`
178
- > After this: Done.
179
- `;
180
-
181
- const r = parseRoadmap(content);
182
- assertEq(r.title, 'M005: No Boundary Map', 'title');
183
- assertEq(r.slices.length, 1, 'one slice');
184
- assertEq(r.boundaryMap.length, 0, 'empty boundary map when section missing');
185
- assertEq(r.successCriteria.length, 1, 'one success criterion');
186
- }
187
-
188
- console.log('\n=== parseRoadmap: no sections at all ===');
189
- {
190
- const content = `# M006: Bare Minimum
191
-
192
- Just a title and nothing else.
193
- `;
194
-
195
- const r = parseRoadmap(content);
196
- assertEq(r.title, 'M006: Bare Minimum', 'title from bare roadmap');
197
- assertEq(r.vision, '', 'empty vision');
198
- assertEq(r.successCriteria.length, 0, 'no success criteria');
199
- assertEq(r.slices.length, 0, 'no slices');
200
- assertEq(r.boundaryMap.length, 0, 'no boundary map');
201
- }
202
-
203
- console.log('\n=== parseRoadmap: slice with no demo blockquote ===');
204
- {
205
- const content = `# M007: No Demo
206
-
207
- **Vision:** Testing slices without demo lines.
208
-
209
- ## Slices
210
-
211
- - [ ] **S01: No Demo Here** \`risk:medium\` \`depends:[]\`
212
- - [ ] **S02: Also No Demo** \`risk:low\` \`depends:[S01]\`
213
- `;
214
-
215
- const r = parseRoadmap(content);
216
- assertEq(r.slices.length, 2, 'two slices without demos');
217
- assertEq(r.slices[0].demo, '', 'S01 demo empty');
218
- assertEq(r.slices[1].demo, '', 'S02 demo empty');
219
- }
220
-
221
- console.log('\n=== parseRoadmap: missing risk defaults to low ===');
222
- {
223
- const content = `# M008: Default Risk
224
-
225
- **Vision:** Test default risk.
226
-
227
- ## Slices
228
-
229
- - [ ] **S01: No Risk Tag** \`depends:[]\`
230
- > After this: done.
231
- `;
232
-
233
- const r = parseRoadmap(content);
234
- assertEq(r.slices.length, 1, 'one slice');
235
- assertEq(r.slices[0].risk, 'low', 'default risk is low');
236
- }
237
-
238
- // ═══════════════════════════════════════════════════════════════════════════
239
- // parsePlan tests
240
- // ═══════════════════════════════════════════════════════════════════════════
241
-
242
- console.log('\n=== parsePlan: full plan ===');
243
- {
244
- const content = `# S01: Parser Test Suite
245
-
246
- **Goal:** All 5 parsers have test coverage with edge cases.
247
- **Demo:** \`node --test tests/parsers.test.ts\` passes with zero failures.
248
-
249
- ## Must-Haves
250
-
251
- - parseRoadmap tests cover happy path and edge cases
252
- - parsePlan tests cover happy path and edge cases
253
- - All existing tests still pass
254
-
255
- ## Tasks
256
-
257
- - [ ] **T01: Test parseRoadmap and parsePlan** \`est:45m\`
258
- Create tests/parsers.test.ts with comprehensive tests for the two most complex parsers.
259
-
260
- - [x] **T02: Test parseSummary and parseContinue** \`est:35m\`
261
- Extend tests/parsers.test.ts with tests for the remaining parsers.
262
-
263
- ## Files Likely Touched
264
-
265
- - \`tests/parsers.test.ts\` — new test file
266
- - \`types.ts\` — add observability_surfaces
267
- - \`files.ts\` — update parseSummary
268
- `;
269
-
270
- const p = parsePlan(content);
271
-
272
- assertEq(p.id, 'S01', 'plan id');
273
- assertEq(p.title, 'Parser Test Suite', 'plan title');
274
- assertEq(p.goal, 'All 5 parsers have test coverage with edge cases.', 'plan goal');
275
- assertEq(p.demo, '`node --test tests/parsers.test.ts` passes with zero failures.', 'plan demo');
276
-
277
- // Must-haves
278
- assertEq(p.mustHaves.length, 3, 'must-have count');
279
- assertEq(p.mustHaves[0], 'parseRoadmap tests cover happy path and edge cases', 'first must-have');
280
-
281
- // Tasks
282
- assertEq(p.tasks.length, 2, 'task count');
283
-
284
- assertEq(p.tasks[0].id, 'T01', 'T01 id');
285
- assertEq(p.tasks[0].title, 'Test parseRoadmap and parsePlan', 'T01 title');
286
- assertEq(p.tasks[0].done, false, 'T01 not done');
287
- assertTrue(p.tasks[0].description.includes('comprehensive tests'), 'T01 description content');
288
-
289
- assertEq(p.tasks[1].id, 'T02', 'T02 id');
290
- assertEq(p.tasks[1].title, 'Test parseSummary and parseContinue', 'T02 title');
291
- assertEq(p.tasks[1].done, true, 'T02 done');
292
-
293
- // Files likely touched
294
- assertEq(p.filesLikelyTouched.length, 3, 'files likely touched count');
295
- assertTrue(p.filesLikelyTouched[0].includes('tests/parsers.test.ts'), 'first file');
296
- }
297
-
298
- console.log('\n=== parsePlan: multi-line task description concatenation ===');
299
- {
300
- const content = `# S02: Multi-line Test
301
-
302
- **Goal:** Test multi-line descriptions.
303
- **Demo:** Descriptions are concatenated.
304
-
305
- ## Must-Haves
306
-
307
- - Multi-line works
308
-
309
- ## Tasks
310
-
311
- - [ ] **T01: Multi-line Task** \`est:30m\`
312
- First line of description.
313
- Second line of description.
314
- Third line of description.
315
-
316
- - [ ] **T02: Single Line** \`est:10m\`
317
- Just one line.
318
-
319
- ## Files Likely Touched
320
-
321
- - \`foo.ts\`
322
- `;
323
-
324
- const p = parsePlan(content);
325
-
326
- assertEq(p.tasks.length, 2, 'two tasks');
327
- // Multi-line descriptions should be concatenated with spaces
328
- assertTrue(p.tasks[0].description.includes('First line'), 'T01 desc has first line');
329
- assertTrue(p.tasks[0].description.includes('Second line'), 'T01 desc has second line');
330
- assertTrue(p.tasks[0].description.includes('Third line'), 'T01 desc has third line');
331
- // Verify concatenation with space separator
332
- assertTrue(p.tasks[0].description.includes('description. Second'), 'lines joined with space');
333
-
334
- assertEq(p.tasks[1].description, 'Just one line.', 'T02 single-line desc');
335
- }
336
-
337
- console.log('\n=== parsePlan: task with missing estimate ===');
338
- {
339
- const content = `# S03: No Estimate
340
-
341
- **Goal:** Handle tasks without estimates.
342
- **Demo:** Parser doesn't crash.
343
-
344
- ## Tasks
345
-
346
- - [ ] **T01: No Estimate Task**
347
- A task without an estimate backtick.
348
-
349
- - [ ] **T02: Has Estimate** \`est:20m\`
350
- This one has an estimate.
351
- `;
352
-
353
- const p = parsePlan(content);
354
-
355
- assertEq(p.tasks.length, 2, 'two tasks parsed');
356
- assertEq(p.tasks[0].id, 'T01', 'T01 id');
357
- assertEq(p.tasks[0].title, 'No Estimate Task', 'T01 title without estimate');
358
- assertEq(p.tasks[0].done, false, 'T01 not done');
359
- // The estimate backtick text appears in description if present, but parser doesn't crash without it
360
- assertEq(p.tasks[1].id, 'T02', 'T02 id');
361
- }
362
-
363
- console.log('\n=== parsePlan: empty tasks section ===');
364
- {
365
- const content = `# S04: Empty Tasks
366
-
367
- **Goal:** No tasks yet.
368
- **Demo:** Nothing.
369
-
370
- ## Must-Haves
371
-
372
- - Something
373
-
374
- ## Tasks
375
-
376
- ## Files Likely Touched
377
-
378
- - \`nothing.ts\`
379
- `;
380
-
381
- const p = parsePlan(content);
382
-
383
- assertEq(p.id, 'S04', 'plan id with empty tasks');
384
- assertEq(p.tasks.length, 0, 'no tasks');
385
- assertEq(p.mustHaves.length, 1, 'one must-have');
386
- assertEq(p.filesLikelyTouched.length, 1, 'one file');
387
- }
388
-
389
- console.log('\n=== parsePlan: no H1 ===');
390
- {
391
- const content = `**Goal:** A plan without a heading.
392
- **Demo:** Still parses.
393
-
394
- ## Tasks
395
-
396
- - [ ] **T01: Orphan Task** \`est:5m\`
397
- A task in a headingless plan.
398
- `;
399
-
400
- const p = parsePlan(content);
401
-
402
- assertEq(p.id, '', 'empty id without H1');
403
- assertEq(p.title, '', 'empty title without H1');
404
- assertEq(p.goal, 'A plan without a heading.', 'goal still parsed');
405
- assertEq(p.tasks.length, 1, 'task still parsed');
406
- assertEq(p.tasks[0].id, 'T01', 'task id');
407
- }
408
-
409
- console.log('\n=== parsePlan: task estimate backtick in description ===');
410
- {
411
- // The `est:45m` text appears after the bold closing but before the description lines
412
- // It should end up as part of the description or be ignored gracefully
413
- const content = `# S05: Estimate Handling
414
-
415
- **Goal:** Test estimate text handling.
416
- **Demo:** Works.
417
-
418
- ## Tasks
419
-
420
- - [ ] **T01: With Estimate** \`est:45m\`
421
- Main description here.
422
- `;
423
-
424
- const p = parsePlan(content);
425
- assertEq(p.tasks.length, 1, 'one task');
426
- assertEq(p.tasks[0].id, 'T01', 'task id');
427
- assertEq(p.tasks[0].title, 'With Estimate', 'title excludes estimate');
428
- // The `est:45m` backtick text after ** is not part of the title or description
429
- // It's on the same line after the regex match captures, so it's in the remainder
430
- // The description should be the continuation lines
431
- assertTrue(p.tasks[0].description.includes('Main description'), 'description from continuation line');
432
- }
433
-
434
- console.log('\n=== parsePlan: uppercase X for done ===');
435
- {
436
- const content = `# S06: Case Test
437
-
438
- **Goal:** Test case.
439
- **Demo:** Works.
440
-
441
- ## Tasks
442
-
443
- - [X] **T01: Uppercase Done** \`est:5m\`
444
- Done with uppercase X.
445
-
446
- - [x] **T02: Lowercase Done** \`est:5m\`
447
- Done with lowercase x.
448
- `;
449
-
450
- const p = parsePlan(content);
451
- assertEq(p.tasks[0].done, true, 'uppercase X is done');
452
- assertEq(p.tasks[1].done, true, 'lowercase x is done');
453
- }
454
-
455
- console.log('\n=== parsePlan: no Must-Haves section ===');
456
- {
457
- const content = `# S07: No Must-Haves
458
-
459
- **Goal:** Test missing must-haves.
460
- **Demo:** Parser handles it.
461
-
462
- ## Tasks
463
-
464
- - [ ] **T01: Only Task** \`est:10m\`
465
- The only task.
466
- `;
467
-
468
- const p = parsePlan(content);
469
- assertEq(p.mustHaves.length, 0, 'empty must-haves');
470
- assertEq(p.tasks.length, 1, 'task still parsed');
471
- }
472
-
473
- console.log('\n=== parsePlan: no Files Likely Touched section ===');
474
- {
475
- const content = `# S08: No Files
476
-
477
- **Goal:** Test missing files section.
478
- **Demo:** Parser handles it.
479
-
480
- ## Tasks
481
-
482
- - [ ] **T01: Task** \`est:10m\`
483
- Description.
484
- `;
485
-
486
- const p = parsePlan(content);
487
- assertEq(p.filesLikelyTouched.length, 0, 'empty files likely touched');
488
- }
489
-
490
- console.log('\n=== parsePlan: old-format task entries (no sublines) ===');
491
- {
492
- const content = `# S09: Old Format
493
-
494
- **Goal:** Test old-format compatibility.
495
- **Demo:** Parser handles entries without sublines.
496
-
497
- ## Tasks
498
-
499
- - [ ] **T01: Classic Task** \`est:10m\`
500
- Just a plain description with no labeled sublines.
501
- `;
502
-
503
- const p = parsePlan(content);
504
- assertEq(p.tasks.length, 1, 'one task parsed');
505
- assertEq(p.tasks[0].id, 'T01', 'task id');
506
- assertEq(p.tasks[0].title, 'Classic Task', 'task title');
507
- assertEq(p.tasks[0].done, false, 'task not done');
508
- assertEq(p.tasks[0].files, undefined, 'files is undefined for old-format entry');
509
- assertEq(p.tasks[0].verify, undefined, 'verify is undefined for old-format entry');
510
- }
511
-
512
- console.log('\n=== parsePlan: new-format task entries with Files and Verify sublines ===');
513
- {
514
- const content = `# S10: New Format
515
-
516
- **Goal:** Test new-format subline extraction.
517
- **Demo:** Parser extracts Files and Verify correctly.
518
-
519
- ## Tasks
520
-
521
- - [ ] **T01: Modern Task** \`est:15m\`
522
- - Why: because we need typed plan entries
523
- - Files: \`types.ts\`, \`files.ts\`
524
- - Verify: run the test suite
525
- `;
526
-
527
- const p = parsePlan(content);
528
- assertEq(p.tasks.length, 1, 'one task parsed');
529
- assertEq(p.tasks[0].id, 'T01', 'task id');
530
- assertTrue(Array.isArray(p.tasks[0].files), 'files is an array');
531
- assertEq(p.tasks[0].files!.length, 2, 'files array has two entries');
532
- assertEq(p.tasks[0].files![0], 'types.ts', 'first file is types.ts');
533
- assertEq(p.tasks[0].files![1], 'files.ts', 'second file is files.ts');
534
- assertEq(p.tasks[0].verify, 'run the test suite', 'verify string extracted correctly');
535
- assertTrue(p.tasks[0].description.includes('Why: because we need typed plan entries'), 'Why line accumulates into description');
536
- }
537
-
538
- // ═══════════════════════════════════════════════════════════════════════════
539
- // parseSummary tests
540
- // ═══════════════════════════════════════════════════════════════════════════
541
-
542
- console.log('\n=== parseSummary: full summary with all frontmatter fields ===');
543
- {
544
- const content = `---
545
- id: T01
546
- parent: S01
547
- milestone: M001
548
- provides:
549
- - parseRoadmap test coverage
550
- - parsePlan test coverage
551
- requires:
552
- - slice: S00
553
- provides: type definitions
554
- - slice: S02
555
- provides: state derivation
556
- affects:
557
- - auto-mode dispatch
558
- key_files:
559
- - tests/parsers.test.ts
560
- - files.ts
561
- key_decisions:
562
- - Use manual assert pattern
563
- patterns_established:
564
- - parsers.test.ts is the canonical test location
565
- drill_down_paths:
566
- - tests/parsers.test.ts for assertion details
567
- observability_surfaces:
568
- - test pass/fail output from node --test
569
- - exit code 1 on failure
570
- duration: 23min
571
- verification_result: pass
572
- retries: 0
573
- completed_at: 2025-03-10T08:00:00Z
574
- ---
575
-
576
- # T01: Test parseRoadmap and parsePlan
577
-
578
- **Created parsers.test.ts with 98 assertions across 16 test groups.**
579
-
580
- ## What Happened
581
-
582
- Added comprehensive tests for parseRoadmap and parsePlan.
583
-
584
- ## Deviations
585
-
586
- None.
587
-
588
- ## Files Created/Modified
589
-
590
- - \`tests/parsers.test.ts\` — new test file with 98 assertions
591
- - \`types.ts\` — added observability_surfaces field
592
- - \`files.ts\` — updated parseSummary extraction
593
- `;
594
-
595
- const s = parseSummary(content);
596
-
597
- // Frontmatter fields
598
- assertEq(s.frontmatter.id, 'T01', 'summary id');
599
- assertEq(s.frontmatter.parent, 'S01', 'summary parent');
600
- assertEq(s.frontmatter.milestone, 'M001', 'summary milestone');
601
- assertEq(s.frontmatter.provides.length, 2, 'provides count');
602
- assertEq(s.frontmatter.provides[0], 'parseRoadmap test coverage', 'first provides');
603
- assertEq(s.frontmatter.provides[1], 'parsePlan test coverage', 'second provides');
604
-
605
- // requires (nested objects)
606
- assertEq(s.frontmatter.requires.length, 2, 'requires count');
607
- assertEq(s.frontmatter.requires[0].slice, 'S00', 'first requires slice');
608
- assertEq(s.frontmatter.requires[0].provides, 'type definitions', 'first requires provides');
609
- assertEq(s.frontmatter.requires[1].slice, 'S02', 'second requires slice');
610
- assertEq(s.frontmatter.requires[1].provides, 'state derivation', 'second requires provides');
611
-
612
- assertEq(s.frontmatter.affects.length, 1, 'affects count');
613
- assertEq(s.frontmatter.affects[0], 'auto-mode dispatch', 'affects value');
614
- assertEq(s.frontmatter.key_files.length, 2, 'key_files count');
615
- assertEq(s.frontmatter.key_decisions.length, 1, 'key_decisions count');
616
- assertEq(s.frontmatter.patterns_established.length, 1, 'patterns_established count');
617
- assertEq(s.frontmatter.drill_down_paths.length, 1, 'drill_down_paths count');
618
-
619
- // observability_surfaces extraction
620
- assertEq(s.frontmatter.observability_surfaces.length, 2, 'observability_surfaces count');
621
- assertEq(s.frontmatter.observability_surfaces[0], 'test pass/fail output from node --test', 'first observability surface');
622
- assertEq(s.frontmatter.observability_surfaces[1], 'exit code 1 on failure', 'second observability surface');
623
-
624
- assertEq(s.frontmatter.duration, '23min', 'duration');
625
- assertEq(s.frontmatter.verification_result, 'pass', 'verification_result');
626
- assertEq(s.frontmatter.completed_at, '2025-03-10T08:00:00Z', 'completed_at');
627
-
628
- // Body fields
629
- assertEq(s.title, 'T01: Test parseRoadmap and parsePlan', 'summary title');
630
- assertEq(s.oneLiner, 'Created parsers.test.ts with 98 assertions across 16 test groups.', 'one-liner');
631
- assertTrue(s.whatHappened.includes('comprehensive tests'), 'whatHappened content');
632
- assertEq(s.deviations, 'None.', 'deviations');
633
-
634
- // Files modified
635
- assertEq(s.filesModified.length, 3, 'filesModified count');
636
- assertEq(s.filesModified[0].path, 'tests/parsers.test.ts', 'first file path');
637
- assertTrue(s.filesModified[0].description.includes('98 assertions'), 'first file description');
638
- assertEq(s.filesModified[1].path, 'types.ts', 'second file path');
639
- assertEq(s.filesModified[2].path, 'files.ts', 'third file path');
640
- }
641
-
642
- console.log('\n=== parseSummary: one-liner extraction (bold-wrapped line after H1) ===');
643
- {
644
- const content = `# S01: Parser Test Suite
645
-
646
- **All 5 parsers have test coverage with edge cases.**
647
-
648
- ## What Happened
649
-
650
- Things happened.
651
- `;
652
-
653
- const s = parseSummary(content);
654
- assertEq(s.title, 'S01: Parser Test Suite', 'title');
655
- assertEq(s.oneLiner, 'All 5 parsers have test coverage with edge cases.', 'bold one-liner');
656
- }
657
-
658
- console.log('\n=== parseSummary: non-bold paragraph after H1 (empty one-liner) ===');
659
- {
660
- const content = `# T02: Some Task
661
-
662
- This is just a regular paragraph, not bold.
663
-
664
- ## What Happened
665
-
666
- Did stuff.
667
- `;
668
-
669
- const s = parseSummary(content);
670
- assertEq(s.title, 'T02: Some Task', 'title');
671
- assertEq(s.oneLiner, '', 'non-bold line results in empty one-liner');
672
- }
673
-
674
- console.log('\n=== parseSummary: files-modified parsing (backtick path — description format) ===');
675
- {
676
- const content = `# T03: File Changes
677
-
678
- **One-liner.**
679
-
680
- ## Files Created/Modified
681
-
682
- - \`src/index.ts\` — main entry point
683
- - \`src/utils.ts\` — utility functions
684
- - \`README.md\` — updated docs
685
- `;
686
-
687
- const s = parseSummary(content);
688
- assertEq(s.filesModified.length, 3, 'three files');
689
- assertEq(s.filesModified[0].path, 'src/index.ts', 'first path');
690
- assertEq(s.filesModified[0].description, 'main entry point', 'first description');
691
- assertEq(s.filesModified[1].path, 'src/utils.ts', 'second path');
692
- assertEq(s.filesModified[2].path, 'README.md', 'third path');
693
- }
694
-
695
- console.log('\n=== parseSummary: missing frontmatter (safe defaults) ===');
696
- {
697
- const content = `# T04: No Frontmatter
698
-
699
- **Did something.**
700
-
701
- ## What Happened
702
-
703
- No frontmatter at all.
704
- `;
705
-
706
- const s = parseSummary(content);
707
- assertEq(s.frontmatter.id, '', 'default id empty');
708
- assertEq(s.frontmatter.parent, '', 'default parent empty');
709
- assertEq(s.frontmatter.milestone, '', 'default milestone empty');
710
- assertEq(s.frontmatter.provides.length, 0, 'default provides empty');
711
- assertEq(s.frontmatter.requires.length, 0, 'default requires empty');
712
- assertEq(s.frontmatter.affects.length, 0, 'default affects empty');
713
- assertEq(s.frontmatter.key_files.length, 0, 'default key_files empty');
714
- assertEq(s.frontmatter.key_decisions.length, 0, 'default key_decisions empty');
715
- assertEq(s.frontmatter.patterns_established.length, 0, 'default patterns_established empty');
716
- assertEq(s.frontmatter.drill_down_paths.length, 0, 'default drill_down_paths empty');
717
- assertEq(s.frontmatter.observability_surfaces.length, 0, 'default observability_surfaces empty');
718
- assertEq(s.frontmatter.duration, '', 'default duration empty');
719
- assertEq(s.frontmatter.verification_result, 'untested', 'default verification_result');
720
- assertEq(s.frontmatter.completed_at, '', 'default completed_at empty');
721
- assertEq(s.title, 'T04: No Frontmatter', 'title still parsed');
722
- assertEq(s.oneLiner, 'Did something.', 'one-liner still parsed');
723
- }
724
-
725
- console.log('\n=== parseSummary: empty body ===');
726
- {
727
- const content = `---
728
- id: T05
729
- parent: S01
730
- milestone: M001
731
- ---
732
- `;
733
-
734
- const s = parseSummary(content);
735
- assertEq(s.frontmatter.id, 'T05', 'id from frontmatter');
736
- assertEq(s.title, '', 'empty title');
737
- assertEq(s.oneLiner, '', 'empty one-liner');
738
- assertEq(s.whatHappened, '', 'empty whatHappened');
739
- assertEq(s.deviations, '', 'empty deviations');
740
- assertEq(s.filesModified.length, 0, 'no files modified');
741
- }
742
-
743
- console.log('\n=== parseSummary: summary with requires array (nested objects) ===');
744
- {
745
- const content = `---
746
- id: T06
747
- parent: S02
748
- milestone: M001
749
- requires:
750
- - slice: S01
751
- provides: parser functions
752
- - slice: S00
753
- provides: core types
754
- - slice: S03
755
- provides: state engine
756
- provides: []
757
- affects: []
758
- key_files: []
759
- key_decisions: []
760
- patterns_established: []
761
- drill_down_paths: []
762
- observability_surfaces: []
763
- duration: 10min
764
- verification_result: pass
765
- retries: 1
766
- completed_at: 2025-03-10T09:00:00Z
767
- ---
768
-
769
- # T06: Nested Requires
770
-
771
- **Test nested requires parsing.**
772
-
773
- ## What Happened
774
-
775
- Tested.
776
- `;
777
-
778
- const s = parseSummary(content);
779
- assertEq(s.frontmatter.requires.length, 3, 'three requires entries');
780
- assertEq(s.frontmatter.requires[0].slice, 'S01', 'first requires slice');
781
- assertEq(s.frontmatter.requires[0].provides, 'parser functions', 'first requires provides');
782
- assertEq(s.frontmatter.requires[1].slice, 'S00', 'second requires slice');
783
- assertEq(s.frontmatter.requires[2].slice, 'S03', 'third requires slice');
784
- assertEq(s.frontmatter.requires[2].provides, 'state engine', 'third requires provides');
785
- }
786
-
787
- // ═══════════════════════════════════════════════════════════════════════════
788
- // parseContinue tests
789
- // ═══════════════════════════════════════════════════════════════════════════
790
-
791
- console.log('\n=== parseContinue: full continue file with all frontmatter fields ===');
792
- {
793
- const content = `---
794
- milestone: M001
795
- slice: S01
796
- task: T02
797
- step: 3
798
- total_steps: 5
799
- status: in_progress
800
- saved_at: 2025-03-10T08:30:00Z
801
- ---
802
-
803
- ## Completed Work
804
-
805
- Steps 1-3 are done. Created test file and wrote assertions.
806
-
807
- ## Remaining Work
808
-
809
- Steps 4-5: run tests and check regressions.
810
-
811
- ## Decisions Made
812
-
813
- Used manual assert pattern instead of node:assert.
814
-
815
- ## Context
816
-
817
- Working in the gsd-s01 worktree. All imports use .ts extensions.
818
-
819
- ## Next Action
820
-
821
- Run the full test suite with node --test.
822
- `;
823
-
824
- const c = parseContinue(content);
825
-
826
- // Frontmatter
827
- assertEq(c.frontmatter.milestone, 'M001', 'continue milestone');
828
- assertEq(c.frontmatter.slice, 'S01', 'continue slice');
829
- assertEq(c.frontmatter.task, 'T02', 'continue task');
830
- assertEq(c.frontmatter.step, 3, 'continue step');
831
- assertEq(c.frontmatter.totalSteps, 5, 'continue totalSteps');
832
- assertEq(c.frontmatter.status, 'in_progress', 'continue status');
833
- assertEq(c.frontmatter.savedAt, '2025-03-10T08:30:00Z', 'continue savedAt');
834
-
835
- // Body sections
836
- assertTrue(c.completedWork.includes('Steps 1-3 are done'), 'completedWork content');
837
- assertTrue(c.remainingWork.includes('Steps 4-5'), 'remainingWork content');
838
- assertTrue(c.decisions.includes('manual assert pattern'), 'decisions content');
839
- assertTrue(c.context.includes('gsd-s01 worktree'), 'context content');
840
- assertTrue(c.nextAction.includes('node --test'), 'nextAction content');
841
- }
842
-
843
- console.log('\n=== parseContinue: string step/totalSteps parsed as integers ===');
844
- {
845
- const content = `---
846
- milestone: M002
847
- slice: S03
848
- task: T01
849
- step: 7
850
- total_steps: 12
851
- status: in_progress
852
- saved_at: 2025-03-10T10:00:00Z
853
- ---
854
-
855
- ## Completed Work
856
-
857
- Some work.
858
-
859
- ## Remaining Work
860
-
861
- More work.
862
-
863
- ## Decisions Made
864
-
865
- None.
866
-
867
- ## Context
868
-
869
- None.
870
-
871
- ## Next Action
872
-
873
- Continue.
874
- `;
875
-
876
- const c = parseContinue(content);
877
- assertEq(c.frontmatter.step, 7, 'step parsed as integer 7');
878
- assertEq(c.frontmatter.totalSteps, 12, 'totalSteps parsed as integer 12');
879
- assertEq(typeof c.frontmatter.step, 'number', 'step is number type');
880
- assertEq(typeof c.frontmatter.totalSteps, 'number', 'totalSteps is number type');
881
- }
882
-
883
- console.log('\n=== parseContinue: NaN step values (non-numeric strings) ===');
884
- {
885
- const content = `---
886
- milestone: M001
887
- slice: S01
888
- task: T01
889
- step: abc
890
- total_steps: xyz
891
- status: in_progress
892
- saved_at: 2025-03-10T10:00:00Z
893
- ---
894
-
895
- ## Completed Work
896
-
897
- Work.
898
-
899
- ## Remaining Work
900
-
901
- Work.
902
-
903
- ## Decisions Made
904
-
905
- None.
906
-
907
- ## Context
908
-
909
- None.
910
-
911
- ## Next Action
912
-
913
- Do things.
914
- `;
915
-
916
- const c = parseContinue(content);
917
- // parseInt("abc") returns NaN; the parser || 0 fallback should give 0
918
- // Actually, looking at parser: typeof fm.step === 'string' ? parseInt(fm.step) : ...
919
- // parseInt("abc") = NaN, and NaN || 0 doesn't work because NaN is falsy only in boolean context
920
- // But the parser uses: typeof fm.step === 'string' ? parseInt(fm.step) : (fm.step as number) || 0
921
- // parseInt returns NaN which is a number, not 0 — let's verify
922
- const stepIsNaN = Number.isNaN(c.frontmatter.step);
923
- const totalIsNaN = Number.isNaN(c.frontmatter.totalSteps);
924
- // The parser does parseInt which returns NaN for non-numeric strings
925
- // There's no || 0 fallback on the parseInt path, so NaN is expected
926
- assertTrue(stepIsNaN, 'NaN step when non-numeric string');
927
- assertTrue(totalIsNaN, 'NaN totalSteps when non-numeric string');
928
- }
929
-
930
- console.log('\n=== parseContinue: all three status variants ===');
931
- {
932
- for (const status of ['in_progress', 'interrupted', 'compacted'] as const) {
933
- const content = `---
934
- milestone: M001
935
- slice: S01
936
- task: T01
937
- step: 1
938
- total_steps: 3
939
- status: ${status}
940
- saved_at: 2025-03-10T10:00:00Z
941
- ---
942
-
943
- ## Completed Work
944
-
945
- Work.
946
- `;
947
-
948
- const c = parseContinue(content);
949
- assertEq(c.frontmatter.status, status, `status variant: ${status}`);
950
- }
951
- }
952
-
953
- console.log('\n=== parseContinue: missing frontmatter ===');
954
- {
955
- const content = `## Completed Work
956
-
957
- Some work done.
958
-
959
- ## Remaining Work
960
-
961
- More to do.
962
-
963
- ## Decisions Made
964
-
965
- A decision.
966
-
967
- ## Context
968
-
969
- Some context.
970
-
971
- ## Next Action
972
-
973
- Next thing.
974
- `;
975
-
976
- const c = parseContinue(content);
977
- assertEq(c.frontmatter.milestone, '', 'default milestone empty');
978
- assertEq(c.frontmatter.slice, '', 'default slice empty');
979
- assertEq(c.frontmatter.task, '', 'default task empty');
980
- assertEq(c.frontmatter.step, 0, 'default step 0');
981
- assertEq(c.frontmatter.totalSteps, 0, 'default totalSteps 0');
982
- assertEq(c.frontmatter.status, 'in_progress', 'default status in_progress');
983
- assertEq(c.frontmatter.savedAt, '', 'default savedAt empty');
984
-
985
- // Body sections still parse
986
- assertTrue(c.completedWork.includes('Some work done'), 'completedWork without frontmatter');
987
- assertTrue(c.remainingWork.includes('More to do'), 'remainingWork without frontmatter');
988
- assertTrue(c.decisions.includes('A decision'), 'decisions without frontmatter');
989
- assertTrue(c.context.includes('Some context'), 'context without frontmatter');
990
- assertTrue(c.nextAction.includes('Next thing'), 'nextAction without frontmatter');
991
- }
992
-
993
- console.log('\n=== parseContinue: body section extraction ===');
994
- {
995
- const content = `---
996
- milestone: M001
997
- slice: S01
998
- task: T03
999
- step: 2
1000
- total_steps: 4
1001
- status: interrupted
1002
- saved_at: 2025-03-10T11:00:00Z
1003
- ---
1004
-
1005
- ## Completed Work
1006
-
1007
- First paragraph of completed work.
1008
- Second paragraph continuing the explanation.
1009
-
1010
- ## Remaining Work
1011
-
1012
- Need to finish step 3 and step 4.
1013
-
1014
- ## Decisions Made
1015
-
1016
- Decided to use approach A over approach B because of performance.
1017
-
1018
- ## Context
1019
-
1020
- Running in worktree. Node 22 required. TypeScript strict mode.
1021
-
1022
- ## Next Action
1023
-
1024
- Pick up at step 3: run the integration tests.
1025
- `;
1026
-
1027
- const c = parseContinue(content);
1028
- assertTrue(c.completedWork.includes('First paragraph'), 'completedWork first paragraph');
1029
- assertTrue(c.completedWork.includes('Second paragraph'), 'completedWork second paragraph');
1030
- assertTrue(c.remainingWork.includes('step 3 and step 4'), 'remainingWork detail');
1031
- assertTrue(c.decisions.includes('approach A over approach B'), 'decisions detail');
1032
- assertTrue(c.context.includes('Node 22 required'), 'context detail');
1033
- assertTrue(c.nextAction.includes('step 3: run the integration tests'), 'nextAction detail');
1034
- }
1035
-
1036
- console.log('\n=== parseContinue: total_steps vs totalSteps key support ===');
1037
- {
1038
- // Test total_steps (snake_case) — the primary format
1039
- const content1 = `---
1040
- milestone: M001
1041
- slice: S01
1042
- task: T01
1043
- step: 2
1044
- total_steps: 8
1045
- status: in_progress
1046
- saved_at: 2025-03-10T12:00:00Z
1047
- ---
1048
-
1049
- ## Completed Work
1050
-
1051
- Work.
1052
- `;
1053
-
1054
- const c1 = parseContinue(content1);
1055
- assertEq(c1.frontmatter.totalSteps, 8, 'total_steps snake_case works');
1056
-
1057
- // Test totalSteps (camelCase) — the fallback
1058
- const content2 = `---
1059
- milestone: M001
1060
- slice: S01
1061
- task: T01
1062
- step: 2
1063
- totalSteps: 6
1064
- status: in_progress
1065
- saved_at: 2025-03-10T12:00:00Z
1066
- ---
1067
-
1068
- ## Completed Work
1069
-
1070
- Work.
1071
- `;
1072
-
1073
- const c2 = parseContinue(content2);
1074
- assertEq(c2.frontmatter.totalSteps, 6, 'totalSteps camelCase works');
1075
- }
1076
-
1077
- // ═══════════════════════════════════════════════════════════════════════════
1078
- // parseRequirementCounts tests
1079
- // ═══════════════════════════════════════════════════════════════════════════
1080
-
1081
- console.log('\n=== parseRequirementCounts: full requirements file ===');
1082
- {
1083
- const content = `# Requirements
1084
-
1085
- ## Active
1086
-
1087
- ### R001 — User authentication
1088
- - Status: active
1089
-
1090
- ### R002 — Dashboard rendering
1091
- - Status: blocked
1092
-
1093
- ### R003 — API rate limiting
1094
- - Status: active
1095
-
1096
- ## Validated
1097
-
1098
- ### R010 — Parser test coverage
1099
- - Status: validated
1100
-
1101
- ### R011 — Type system
1102
- - Status: validated
1103
-
1104
- ## Deferred
1105
-
1106
- ### R020 — Admin panel
1107
- - Status: deferred
1108
-
1109
- ## Out of Scope
1110
-
1111
- ### R030 — Mobile app
1112
- - Status: out-of-scope
1113
-
1114
- ### R031 — Desktop app
1115
- - Status: out-of-scope
1116
- `;
1117
-
1118
- const counts = parseRequirementCounts(content);
1119
- assertEq(counts.active, 3, 'active count');
1120
- assertEq(counts.validated, 2, 'validated count');
1121
- assertEq(counts.deferred, 1, 'deferred count');
1122
- assertEq(counts.outOfScope, 2, 'outOfScope count');
1123
- assertEq(counts.blocked, 1, 'blocked count');
1124
- assertEq(counts.total, 8, 'total is sum of active+validated+deferred+outOfScope');
1125
- }
1126
-
1127
- console.log('\n=== parseRequirementCounts: null input returns all zeros ===');
1128
- {
1129
- const counts = parseRequirementCounts(null);
1130
- assertEq(counts.active, 0, 'null active');
1131
- assertEq(counts.validated, 0, 'null validated');
1132
- assertEq(counts.deferred, 0, 'null deferred');
1133
- assertEq(counts.outOfScope, 0, 'null outOfScope');
1134
- assertEq(counts.blocked, 0, 'null blocked');
1135
- assertEq(counts.total, 0, 'null total');
1136
- }
1137
-
1138
- console.log('\n=== parseRequirementCounts: empty sections return zero counts ===');
1139
- {
1140
- const content = `# Requirements
1141
-
1142
- ## Active
1143
-
1144
- ## Validated
1145
-
1146
- ## Deferred
1147
-
1148
- ## Out of Scope
1149
- `;
1150
-
1151
- const counts = parseRequirementCounts(content);
1152
- assertEq(counts.active, 0, 'empty active');
1153
- assertEq(counts.validated, 0, 'empty validated');
1154
- assertEq(counts.deferred, 0, 'empty deferred');
1155
- assertEq(counts.outOfScope, 0, 'empty outOfScope');
1156
- assertEq(counts.blocked, 0, 'empty blocked');
1157
- assertEq(counts.total, 0, 'empty total');
1158
- }
1159
-
1160
- console.log('\n=== parseRequirementCounts: blocked status counting ===');
1161
- {
1162
- const content = `# Requirements
1163
-
1164
- ## Active
1165
-
1166
- ### R001 — Blocked thing
1167
- - Status: blocked
1168
-
1169
- ### R002 — Another blocked thing
1170
- - Status: blocked
1171
-
1172
- ### R003 — Active thing
1173
- - Status: active
1174
-
1175
- ## Validated
1176
-
1177
- ## Deferred
1178
-
1179
- ### R020 — Blocked deferred
1180
- - Status: blocked
1181
-
1182
- ## Out of Scope
1183
- `;
1184
-
1185
- const counts = parseRequirementCounts(content);
1186
- assertEq(counts.active, 3, 'active includes blocked items in Active section');
1187
- assertEq(counts.blocked, 3, 'blocked counts all blocked statuses across sections');
1188
- assertEq(counts.deferred, 1, 'deferred section count');
1189
- }
1190
-
1191
- console.log('\n=== parseRequirementCounts: total is sum of all section counts ===');
1192
- {
1193
- const content = `# Requirements
1194
-
1195
- ## Active
1196
-
1197
- ### R001 — One
1198
- - Status: active
1199
-
1200
- ## Validated
1201
-
1202
- ### R010 — Two
1203
- - Status: validated
1204
-
1205
- ### R011 — Three
1206
- - Status: validated
1207
-
1208
- ## Deferred
1209
-
1210
- ### R020 — Four
1211
- - Status: deferred
1212
-
1213
- ### R021 — Five
1214
- - Status: deferred
1215
-
1216
- ### R022 — Six
1217
- - Status: deferred
1218
-
1219
- ## Out of Scope
1220
-
1221
- ### R030 — Seven
1222
- - Status: out-of-scope
1223
- `;
1224
-
1225
- const counts = parseRequirementCounts(content);
1226
- assertEq(counts.active, 1, 'one active');
1227
- assertEq(counts.validated, 2, 'two validated');
1228
- assertEq(counts.deferred, 3, 'three deferred');
1229
- assertEq(counts.outOfScope, 1, 'one outOfScope');
1230
- assertEq(counts.total, 7, 'total = 1 + 2 + 3 + 1');
1231
- assertEq(counts.total, counts.active + counts.validated + counts.deferred + counts.outOfScope, 'total is exact sum');
1232
- }
1233
-
1234
- // ═══════════════════════════════════════════════════════════════════════════
1235
- // parseSecretsManifest / formatSecretsManifest tests
1236
- // ═══════════════════════════════════════════════════════════════════════════
1237
-
1238
- console.log('\n=== parseSecretsManifest: full manifest with 3 keys ===');
1239
- {
1240
- const content = `# Secrets Manifest
1241
-
1242
- **Milestone:** M003
1243
- **Generated:** 2025-06-15T10:00:00Z
1244
-
1245
- ### OPENAI_API_KEY
1246
-
1247
- **Service:** OpenAI
1248
- **Dashboard:** https://platform.openai.com/api-keys
1249
- **Format hint:** starts with sk-
1250
- **Status:** pending
1251
- **Destination:** dotenv
1252
-
1253
- 1. Go to https://platform.openai.com/api-keys
1254
- 2. Click "Create new secret key"
1255
- 3. Copy the key immediately — it won't be shown again
1256
-
1257
- ### STRIPE_SECRET_KEY
1258
-
1259
- **Service:** Stripe
1260
- **Dashboard:** https://dashboard.stripe.com/apikeys
1261
- **Format hint:** starts with sk_test_ or sk_live_
1262
- **Status:** collected
1263
- **Destination:** dotenv
1264
-
1265
- 1. Go to https://dashboard.stripe.com/apikeys
1266
- 2. Reveal the secret key
1267
- 3. Copy it
1268
-
1269
- ### SUPABASE_URL
1270
-
1271
- **Service:** Supabase
1272
- **Dashboard:** https://app.supabase.com/project/settings/api
1273
- **Format hint:** https://<project-ref>.supabase.co
1274
- **Status:** skipped
1275
- **Destination:** vercel
1276
-
1277
- 1. Go to project settings in Supabase
1278
- 2. Copy the URL from the API section
1279
- `;
1280
-
1281
- const m = parseSecretsManifest(content);
1282
-
1283
- assertEq(m.milestone, 'M003', 'manifest milestone');
1284
- assertEq(m.generatedAt, '2025-06-15T10:00:00Z', 'manifest generatedAt');
1285
- assertEq(m.entries.length, 3, 'three entries');
1286
-
1287
- // First entry
1288
- assertEq(m.entries[0].key, 'OPENAI_API_KEY', 'entry 0 key');
1289
- assertEq(m.entries[0].service, 'OpenAI', 'entry 0 service');
1290
- assertEq(m.entries[0].dashboardUrl, 'https://platform.openai.com/api-keys', 'entry 0 dashboardUrl');
1291
- assertEq(m.entries[0].formatHint, 'starts with sk-', 'entry 0 formatHint');
1292
- assertEq(m.entries[0].status, 'pending', 'entry 0 status');
1293
- assertEq(m.entries[0].destination, 'dotenv', 'entry 0 destination');
1294
- assertEq(m.entries[0].guidance.length, 3, 'entry 0 guidance count');
1295
- assertEq(m.entries[0].guidance[0], 'Go to https://platform.openai.com/api-keys', 'entry 0 guidance[0]');
1296
- assertEq(m.entries[0].guidance[2], 'Copy the key immediately — it won\'t be shown again', 'entry 0 guidance[2]');
1297
-
1298
- // Second entry
1299
- assertEq(m.entries[1].key, 'STRIPE_SECRET_KEY', 'entry 1 key');
1300
- assertEq(m.entries[1].service, 'Stripe', 'entry 1 service');
1301
- assertEq(m.entries[1].status, 'collected', 'entry 1 status');
1302
- assertEq(m.entries[1].formatHint, 'starts with sk_test_ or sk_live_', 'entry 1 formatHint');
1303
- assertEq(m.entries[1].guidance.length, 3, 'entry 1 guidance count');
1304
-
1305
- // Third entry
1306
- assertEq(m.entries[2].key, 'SUPABASE_URL', 'entry 2 key');
1307
- assertEq(m.entries[2].status, 'skipped', 'entry 2 status');
1308
- assertEq(m.entries[2].destination, 'vercel', 'entry 2 destination');
1309
- assertEq(m.entries[2].guidance.length, 2, 'entry 2 guidance count');
1310
- }
1311
-
1312
- console.log('\n=== parseSecretsManifest: single-key manifest ===');
1313
- {
1314
- const content = `# Secrets Manifest
1315
-
1316
- **Milestone:** M001
1317
- **Generated:** 2025-06-15T12:00:00Z
1318
-
1319
- ### DATABASE_URL
1320
-
1321
- **Service:** PostgreSQL
1322
- **Dashboard:** https://console.neon.tech
1323
- **Format hint:** postgresql://...
1324
- **Status:** pending
1325
- **Destination:** dotenv
1326
-
1327
- 1. Create a database on Neon
1328
- 2. Copy the connection string
1329
- `;
1330
-
1331
- const m = parseSecretsManifest(content);
1332
- assertEq(m.milestone, 'M001', 'single-key milestone');
1333
- assertEq(m.entries.length, 1, 'single entry');
1334
- assertEq(m.entries[0].key, 'DATABASE_URL', 'single entry key');
1335
- assertEq(m.entries[0].service, 'PostgreSQL', 'single entry service');
1336
- assertEq(m.entries[0].guidance.length, 2, 'single entry guidance count');
1337
- }
1338
-
1339
- console.log('\n=== parseSecretsManifest: empty/no-secrets manifest ===');
1340
- {
1341
- const content = `# Secrets Manifest
1342
-
1343
- **Milestone:** M002
1344
- **Generated:** 2025-06-15T14:00:00Z
1345
- `;
1346
-
1347
- const m = parseSecretsManifest(content);
1348
- assertEq(m.milestone, 'M002', 'empty manifest milestone');
1349
- assertEq(m.generatedAt, '2025-06-15T14:00:00Z', 'empty manifest generatedAt');
1350
- assertEq(m.entries.length, 0, 'no entries in empty manifest');
1351
- }
1352
-
1353
- console.log('\n=== parseSecretsManifest: missing optional fields default correctly ===');
1354
- {
1355
- const content = `# Secrets Manifest
1356
-
1357
- **Milestone:** M004
1358
- **Generated:** 2025-06-15T16:00:00Z
1359
-
1360
- ### SOME_API_KEY
1361
-
1362
- **Service:** SomeService
1363
-
1364
- 1. Get the key from the dashboard
1365
- `;
1366
-
1367
- const m = parseSecretsManifest(content);
1368
- assertEq(m.entries.length, 1, 'one entry with missing fields');
1369
- assertEq(m.entries[0].key, 'SOME_API_KEY', 'key parsed');
1370
- assertEq(m.entries[0].service, 'SomeService', 'service parsed');
1371
- assertEq(m.entries[0].dashboardUrl, '', 'missing dashboardUrl defaults to empty string');
1372
- assertEq(m.entries[0].formatHint, '', 'missing formatHint defaults to empty string');
1373
- assertEq(m.entries[0].status, 'pending', 'missing status defaults to pending');
1374
- assertEq(m.entries[0].destination, 'dotenv', 'missing destination defaults to dotenv');
1375
- assertEq(m.entries[0].guidance.length, 1, 'guidance still parsed');
1376
- }
1377
-
1378
- console.log('\n=== parseSecretsManifest: all three status values parse ===');
1379
- {
1380
- for (const status of ['pending', 'collected', 'skipped'] as const) {
1381
- const content = `# Secrets Manifest
1382
-
1383
- **Milestone:** M005
1384
- **Generated:** 2025-06-15T18:00:00Z
1385
-
1386
- ### TEST_KEY
1387
-
1388
- **Service:** TestService
1389
- **Status:** ${status}
1390
-
1391
- 1. Do something
1392
- `;
1393
-
1394
- const m = parseSecretsManifest(content);
1395
- assertEq(m.entries[0].status, status, `status variant: ${status}`);
1396
- }
1397
- }
1398
-
1399
- console.log('\n=== parseSecretsManifest: invalid status defaults to pending ===');
1400
- {
1401
- const content = `# Secrets Manifest
1402
-
1403
- **Milestone:** M006
1404
- **Generated:** 2025-06-15T20:00:00Z
1405
-
1406
- ### BAD_STATUS_KEY
1407
-
1408
- **Service:** TestService
1409
- **Status:** invalid_value
1410
-
1411
- 1. Some step
1412
- `;
1413
-
1414
- const m = parseSecretsManifest(content);
1415
- assertEq(m.entries[0].status, 'pending', 'invalid status defaults to pending');
1416
- }
1417
-
1418
- console.log('\n=== parseSecretsManifest + formatSecretsManifest: round-trip ===');
1419
- {
1420
- const original = `# Secrets Manifest
1421
-
1422
- **Milestone:** M007
1423
- **Generated:** 2025-06-16T10:00:00Z
1424
-
1425
- ### OPENAI_API_KEY
1426
-
1427
- **Service:** OpenAI
1428
- **Dashboard:** https://platform.openai.com/api-keys
1429
- **Format hint:** starts with sk-
1430
- **Status:** pending
1431
- **Destination:** dotenv
1432
-
1433
- 1. Go to the API keys page
1434
- 2. Create a new key
1435
- 3. Copy it
1436
-
1437
- ### REDIS_URL
1438
-
1439
- **Service:** Upstash
1440
- **Dashboard:** https://console.upstash.com
1441
- **Format hint:** redis://...
1442
- **Status:** collected
1443
- **Destination:** vercel
1444
-
1445
- 1. Open Upstash console
1446
- 2. Copy the Redis URL
1447
- `;
1448
-
1449
- const parsed1 = parseSecretsManifest(original);
1450
- const formatted = formatSecretsManifest(parsed1);
1451
- const parsed2 = parseSecretsManifest(formatted);
1452
-
1453
- // Verify semantic equality after round-trip
1454
- assertEq(parsed2.milestone, parsed1.milestone, 'round-trip milestone');
1455
- assertEq(parsed2.generatedAt, parsed1.generatedAt, 'round-trip generatedAt');
1456
- assertEq(parsed2.entries.length, parsed1.entries.length, 'round-trip entry count');
1457
-
1458
- for (let i = 0; i < parsed1.entries.length; i++) {
1459
- const e1 = parsed1.entries[i];
1460
- const e2 = parsed2.entries[i];
1461
- assertEq(e2.key, e1.key, `round-trip entry ${i} key`);
1462
- assertEq(e2.service, e1.service, `round-trip entry ${i} service`);
1463
- assertEq(e2.dashboardUrl, e1.dashboardUrl, `round-trip entry ${i} dashboardUrl`);
1464
- assertEq(e2.formatHint, e1.formatHint, `round-trip entry ${i} formatHint`);
1465
- assertEq(e2.status, e1.status, `round-trip entry ${i} status`);
1466
- assertEq(e2.destination, e1.destination, `round-trip entry ${i} destination`);
1467
- assertEq(e2.guidance.length, e1.guidance.length, `round-trip entry ${i} guidance length`);
1468
- for (let j = 0; j < e1.guidance.length; j++) {
1469
- assertEq(e2.guidance[j], e1.guidance[j], `round-trip entry ${i} guidance[${j}]`);
1470
- }
1471
- }
1472
- }
1473
-
1474
- // ═══════════════════════════════════════════════════════════════════════════
1475
- // LLM-style round-trip tests — realistic manifest variations
1476
- // ═══════════════════════════════════════════════════════════════════════════
1477
-
1478
- console.log('\n=== LLM round-trip: extra whitespace ===');
1479
- {
1480
- // LLMs often produce inconsistent indentation and trailing spaces
1481
- const messy = `# Secrets Manifest
1482
-
1483
- **Milestone:** M010
1484
- **Generated:** 2025-07-01T12:00:00Z
1485
-
1486
- ### OPENAI_API_KEY
1487
-
1488
- **Service:** OpenAI
1489
- **Dashboard:** https://platform.openai.com/api-keys
1490
- **Format hint:** starts with sk-
1491
- **Status:** pending
1492
- **Destination:** dotenv
1493
-
1494
- 1. Go to the API keys page
1495
- 2. Create a new key
1496
-
1497
- ### REDIS_URL
1498
-
1499
- **Service:** Upstash
1500
- **Status:** collected
1501
- **Destination:** vercel
1502
-
1503
- 1. Open console
1504
- `;
1505
-
1506
- const parsed1 = parseSecretsManifest(messy);
1507
- const formatted = formatSecretsManifest(parsed1);
1508
- const parsed2 = parseSecretsManifest(formatted);
1509
-
1510
- assertEq(parsed2.milestone, parsed1.milestone, 'whitespace round-trip milestone');
1511
- assertEq(parsed2.generatedAt, parsed1.generatedAt, 'whitespace round-trip generatedAt');
1512
- assertEq(parsed2.entries.length, parsed1.entries.length, 'whitespace round-trip entry count');
1513
- assertEq(parsed2.entries.length, 2, 'whitespace: two entries parsed');
1514
-
1515
- for (let i = 0; i < parsed1.entries.length; i++) {
1516
- const e1 = parsed1.entries[i];
1517
- const e2 = parsed2.entries[i];
1518
- assertEq(e2.key, e1.key, `whitespace round-trip entry ${i} key`);
1519
- assertEq(e2.service, e1.service, `whitespace round-trip entry ${i} service`);
1520
- assertEq(e2.dashboardUrl, e1.dashboardUrl, `whitespace round-trip entry ${i} dashboardUrl`);
1521
- assertEq(e2.formatHint, e1.formatHint, `whitespace round-trip entry ${i} formatHint`);
1522
- assertEq(e2.status, e1.status, `whitespace round-trip entry ${i} status`);
1523
- assertEq(e2.destination, e1.destination, `whitespace round-trip entry ${i} destination`);
1524
- assertEq(e2.guidance.length, e1.guidance.length, `whitespace round-trip entry ${i} guidance length`);
1525
- for (let j = 0; j < e1.guidance.length; j++) {
1526
- assertEq(e2.guidance[j], e1.guidance[j], `whitespace round-trip entry ${i} guidance[${j}]`);
1527
- }
1528
- }
1529
-
1530
- // Verify the parser correctly stripped trailing whitespace
1531
- assertEq(parsed1.milestone, 'M010', 'whitespace: milestone trimmed');
1532
- assertEq(parsed1.entries[0].key, 'OPENAI_API_KEY', 'whitespace: key trimmed');
1533
- assertEq(parsed1.entries[0].service, 'OpenAI', 'whitespace: service trimmed');
1534
- }
1535
-
1536
- console.log('\n=== LLM round-trip: missing optional fields ===');
1537
- {
1538
- // LLMs may omit Dashboard and Format hint lines entirely
1539
- const minimal = `# Secrets Manifest
1540
-
1541
- **Milestone:** M011
1542
- **Generated:** 2025-07-02T08:00:00Z
1543
-
1544
- ### DATABASE_URL
1545
-
1546
- **Service:** Neon
1547
- **Status:** pending
1548
- **Destination:** dotenv
1549
-
1550
- 1. Create a Neon project
1551
- 2. Copy connection string
1552
-
1553
- ### WEBHOOK_SECRET
1554
-
1555
- **Service:** Stripe
1556
- **Status:** collected
1557
- **Destination:** dotenv
1558
-
1559
- 1. Go to webhooks
1560
- `;
1561
-
1562
- const parsed1 = parseSecretsManifest(minimal);
1563
-
1564
- // Verify missing optional fields get defaults
1565
- assertEq(parsed1.entries[0].dashboardUrl, '', 'missing-optional: no dashboard → empty string');
1566
- assertEq(parsed1.entries[0].formatHint, '', 'missing-optional: no format hint → empty string');
1567
- assertEq(parsed1.entries[1].dashboardUrl, '', 'missing-optional: entry 2 no dashboard → empty string');
1568
- assertEq(parsed1.entries[1].formatHint, '', 'missing-optional: entry 2 no format hint → empty string');
1569
-
1570
- // Round-trip: formatter omits empty optional fields, re-parse preserves defaults
1571
- const formatted = formatSecretsManifest(parsed1);
1572
- const parsed2 = parseSecretsManifest(formatted);
1573
-
1574
- assertEq(parsed2.entries.length, parsed1.entries.length, 'missing-optional round-trip entry count');
1575
-
1576
- for (let i = 0; i < parsed1.entries.length; i++) {
1577
- const e1 = parsed1.entries[i];
1578
- const e2 = parsed2.entries[i];
1579
- assertEq(e2.key, e1.key, `missing-optional round-trip entry ${i} key`);
1580
- assertEq(e2.service, e1.service, `missing-optional round-trip entry ${i} service`);
1581
- assertEq(e2.dashboardUrl, e1.dashboardUrl, `missing-optional round-trip entry ${i} dashboardUrl`);
1582
- assertEq(e2.formatHint, e1.formatHint, `missing-optional round-trip entry ${i} formatHint`);
1583
- assertEq(e2.status, e1.status, `missing-optional round-trip entry ${i} status`);
1584
- assertEq(e2.destination, e1.destination, `missing-optional round-trip entry ${i} destination`);
1585
- assertEq(e2.guidance.length, e1.guidance.length, `missing-optional round-trip entry ${i} guidance length`);
1586
- }
1587
- }
1588
-
1589
- console.log('\n=== LLM round-trip: extra blank lines ===');
1590
- {
1591
- // LLMs sometimes insert excessive blank lines between sections
1592
- const blanky = `# Secrets Manifest
1593
-
1594
-
1595
- **Milestone:** M012
1596
- **Generated:** 2025-07-03T14:00:00Z
1597
-
1598
-
1599
-
1600
- ### API_KEY_ONE
1601
-
1602
-
1603
- **Service:** ServiceOne
1604
- **Dashboard:** https://one.example.com
1605
-
1606
-
1607
- **Format hint:** key_...
1608
- **Status:** pending
1609
- **Destination:** dotenv
1610
-
1611
-
1612
-
1613
- 1. Go to settings
1614
-
1615
-
1616
- 2. Generate key
1617
-
1618
-
1619
-
1620
- ### API_KEY_TWO
1621
-
1622
-
1623
-
1624
- **Service:** ServiceTwo
1625
- **Status:** skipped
1626
- **Destination:** dotenv
1627
-
1628
-
1629
- 1. Not needed
1630
- `;
1631
-
1632
- const parsed1 = parseSecretsManifest(blanky);
1633
-
1634
- assertEq(parsed1.entries.length, 2, 'blank-lines: two entries parsed');
1635
- assertEq(parsed1.milestone, 'M012', 'blank-lines: milestone parsed');
1636
- assertEq(parsed1.entries[0].key, 'API_KEY_ONE', 'blank-lines: first key');
1637
- assertEq(parsed1.entries[0].guidance.length, 2, 'blank-lines: first entry guidance count');
1638
- assertEq(parsed1.entries[1].key, 'API_KEY_TWO', 'blank-lines: second key');
1639
- assertEq(parsed1.entries[1].status, 'skipped', 'blank-lines: second entry status');
1640
-
1641
- // Round-trip produces clean output
1642
- const formatted = formatSecretsManifest(parsed1);
1643
- const parsed2 = parseSecretsManifest(formatted);
1644
-
1645
- assertEq(parsed2.entries.length, parsed1.entries.length, 'blank-lines round-trip entry count');
1646
-
1647
- for (let i = 0; i < parsed1.entries.length; i++) {
1648
- const e1 = parsed1.entries[i];
1649
- const e2 = parsed2.entries[i];
1650
- assertEq(e2.key, e1.key, `blank-lines round-trip entry ${i} key`);
1651
- assertEq(e2.service, e1.service, `blank-lines round-trip entry ${i} service`);
1652
- assertEq(e2.dashboardUrl, e1.dashboardUrl, `blank-lines round-trip entry ${i} dashboardUrl`);
1653
- assertEq(e2.formatHint, e1.formatHint, `blank-lines round-trip entry ${i} formatHint`);
1654
- assertEq(e2.status, e1.status, `blank-lines round-trip entry ${i} status`);
1655
- assertEq(e2.destination, e1.destination, `blank-lines round-trip entry ${i} destination`);
1656
- assertEq(e2.guidance.length, e1.guidance.length, `blank-lines round-trip entry ${i} guidance length`);
1657
- }
1658
-
1659
- // Verify the formatted output is cleaner (fewer consecutive blank lines)
1660
- const consecutiveBlanks = formatted.match(/\n{4,}/g);
1661
- assertTrue(consecutiveBlanks === null, 'blank-lines: formatted output has no 4+ consecutive newlines');
1662
- }
1663
-
1664
- // ═══════════════════════════════════════════════════════════════════════════
1665
- // parseRoadmap: boundary map with embedded code fences (#468)
1666
- // ═══════════════════════════════════════════════════════════════════════════
1667
-
1668
- console.log('\n=== parseRoadmap: boundary map with code fences (#468) ===');
1669
- {
1670
- const content = `# M001: Test
1671
-
1672
- **Vision:** Test
1673
-
1674
- ## Slices
1675
-
1676
- - [ ] **S01: Core** \`risk:low\` \`depends:[]\`
1677
- - [ ] **S02: API** \`risk:low\` \`depends:[S01]\`
1678
-
1679
- ## Boundary Map
1680
-
1681
- ### S01 → S02
1682
-
1683
- Produces:
1684
- types.ts — all types
1685
- \`\`\`
1686
- const x = 1;
1687
- \`\`\`
1688
-
1689
- Consumes: nothing
1690
- `;
1691
-
1692
- // This test ensures the boundary map parser does not hang or
1693
- // catastrophically backtrack when content contains code fences.
1694
- const start = Date.now();
1695
- const r = parseRoadmap(content);
1696
- const elapsed = Date.now() - start;
1697
-
1698
- assertTrue(elapsed < 1000, `boundary map with code fences parsed in ${elapsed}ms (should be < 1s)`);
1699
- assertEq(r.slices.length, 2, 'code-fence roadmap: slice count');
1700
- // Boundary map should still parse (may not capture perfectly with code fences, but must not hang)
1701
- assertTrue(r.boundaryMap.length >= 0, 'code-fence roadmap: boundary map parsed without hanging');
1702
- }
1703
-
1704
- report();