gsd-pi 2.33.0-dev.bafba33 → 2.33.1-dev.235d83a

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 (751) hide show
  1. package/README.md +13 -18
  2. package/dist/cli.js +16 -0
  3. package/dist/resource-loader.d.ts +2 -0
  4. package/dist/resource-loader.js +36 -3
  5. package/dist/resources/extensions/ask-user-questions.js +217 -0
  6. package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
  7. package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
  8. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
  9. package/dist/resources/extensions/async-jobs/index.js +119 -0
  10. package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
  11. package/dist/resources/extensions/aws-auth/index.js +138 -0
  12. package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
  13. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
  14. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
  15. package/dist/resources/extensions/bg-shell/index.js +41 -0
  16. package/dist/resources/extensions/bg-shell/interaction.js +160 -0
  17. package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
  18. package/dist/resources/extensions/bg-shell/overlay.js +378 -0
  19. package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
  21. package/dist/resources/extensions/bg-shell/types.js +96 -0
  22. package/dist/resources/extensions/bg-shell/utilities.js +50 -0
  23. package/dist/resources/extensions/browser-tools/capture.js +179 -0
  24. package/dist/resources/extensions/browser-tools/core.js +899 -0
  25. package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
  26. package/dist/resources/extensions/browser-tools/index.js +123 -0
  27. package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
  28. package/dist/resources/extensions/browser-tools/refs.js +254 -0
  29. package/dist/resources/extensions/browser-tools/settle.js +173 -0
  30. package/dist/resources/extensions/browser-tools/state.js +126 -0
  31. package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
  32. package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
  33. package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
  34. package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
  35. package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
  36. package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
  37. package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
  38. package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
  39. package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
  40. package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
  41. package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
  42. package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
  43. package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
  44. package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
  45. package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
  46. package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
  47. package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
  48. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
  49. package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
  50. package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
  51. package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
  52. package/dist/resources/extensions/browser-tools/utils.js +490 -0
  53. package/dist/resources/extensions/context7/index.js +337 -0
  54. package/dist/resources/extensions/get-secrets-from-user.js +492 -0
  55. package/dist/resources/extensions/google-search/index.js +373 -0
  56. package/dist/resources/extensions/gsd/activity-log.js +146 -0
  57. package/dist/resources/extensions/gsd/atomic-write.js +38 -0
  58. package/dist/resources/extensions/gsd/auto/session.js +187 -0
  59. package/dist/resources/extensions/gsd/auto-budget.js +30 -0
  60. package/dist/resources/extensions/gsd/{auto-constants.ts → auto-constants.js} +0 -1
  61. package/dist/resources/extensions/gsd/auto-dashboard.js +509 -0
  62. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +180 -0
  63. package/dist/resources/extensions/gsd/auto-dispatch.js +382 -0
  64. package/dist/resources/extensions/gsd/auto-idempotency.js +106 -0
  65. package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
  66. package/dist/resources/extensions/gsd/auto-observability.js +54 -0
  67. package/dist/resources/extensions/gsd/auto-post-unit.js +495 -0
  68. package/dist/resources/extensions/gsd/auto-prompts.js +1121 -0
  69. package/dist/resources/extensions/gsd/auto-recovery.js +550 -0
  70. package/dist/resources/extensions/gsd/auto-start.js +393 -0
  71. package/dist/resources/extensions/gsd/auto-stuck-detection.js +165 -0
  72. package/dist/resources/extensions/gsd/{auto-supervisor.ts → auto-supervisor.js} +29 -32
  73. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
  74. package/dist/resources/extensions/gsd/auto-timers.js +181 -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 +209 -0
  78. package/dist/resources/extensions/gsd/auto-worktree.js +594 -0
  79. package/dist/resources/extensions/gsd/auto.js +1485 -0
  80. package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
  81. package/dist/resources/extensions/gsd/captures.js +348 -0
  82. package/dist/resources/extensions/gsd/claude-import.js +540 -0
  83. package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
  84. package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
  85. package/dist/resources/extensions/gsd/commands-config.js +89 -0
  86. package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
  87. package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
  88. package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
  89. package/dist/resources/extensions/gsd/commands-logs.js +468 -0
  90. package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
  91. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
  92. package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
  93. package/dist/resources/extensions/gsd/commands.js +1024 -0
  94. package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
  95. package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
  96. package/dist/resources/extensions/gsd/context-budget.js +187 -0
  97. package/dist/resources/extensions/gsd/context-store.js +165 -0
  98. package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
  99. package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
  100. package/dist/resources/extensions/gsd/db-writer.js +298 -0
  101. package/dist/resources/extensions/gsd/debug-logger.js +161 -0
  102. package/dist/resources/extensions/gsd/detection.js +373 -0
  103. package/dist/resources/extensions/gsd/diff-context.js +168 -0
  104. package/dist/resources/extensions/gsd/dispatch-guard.js +76 -0
  105. package/dist/resources/extensions/gsd/doctor-checks.js +563 -0
  106. package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
  107. package/dist/resources/extensions/gsd/doctor-format.js +71 -0
  108. package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
  109. package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
  110. package/dist/resources/extensions/gsd/doctor-types.js +12 -0
  111. package/dist/resources/extensions/gsd/doctor.js +672 -0
  112. package/dist/resources/extensions/gsd/error-utils.js +6 -0
  113. package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
  114. package/dist/resources/extensions/gsd/exit-command.js +11 -0
  115. package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
  116. package/dist/resources/extensions/gsd/export.js +268 -0
  117. package/dist/resources/extensions/gsd/file-watcher.js +76 -0
  118. package/dist/resources/extensions/gsd/files.js +937 -0
  119. package/dist/resources/extensions/gsd/forensics.js +511 -0
  120. package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
  121. package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
  122. package/dist/resources/extensions/gsd/git-service.js +460 -0
  123. package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
  124. package/dist/resources/extensions/gsd/gsd-db.js +590 -0
  125. package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
  126. package/dist/resources/extensions/gsd/guided-flow.js +1149 -0
  127. package/dist/resources/extensions/gsd/health-widget.js +141 -0
  128. package/dist/resources/extensions/gsd/history.js +118 -0
  129. package/dist/resources/extensions/gsd/index.js +1250 -0
  130. package/dist/resources/extensions/gsd/init-wizard.js +479 -0
  131. package/dist/resources/extensions/gsd/json-persistence.js +62 -0
  132. package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
  133. package/dist/resources/extensions/gsd/key-manager.js +829 -0
  134. package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
  135. package/dist/resources/extensions/gsd/md-importer.js +440 -0
  136. package/dist/resources/extensions/gsd/mechanical-completion.js +351 -0
  137. package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
  138. package/dist/resources/extensions/gsd/memory-store.js +351 -0
  139. package/dist/resources/extensions/gsd/metrics.js +377 -0
  140. package/dist/resources/extensions/gsd/migrate/command.js +157 -0
  141. package/dist/resources/extensions/gsd/migrate/index.js +7 -0
  142. package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
  143. package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
  144. package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
  145. package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
  146. package/dist/resources/extensions/gsd/migrate/types.js +4 -0
  147. package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
  148. package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
  149. package/dist/resources/extensions/gsd/migrate-external.js +130 -0
  150. package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
  151. package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
  152. package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
  153. package/dist/resources/extensions/gsd/model-router.js +187 -0
  154. package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
  155. package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
  156. package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
  157. package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
  158. package/dist/resources/extensions/gsd/notifications.js +58 -0
  159. package/dist/resources/extensions/gsd/observability-validator.js +398 -0
  160. package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
  161. package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
  162. package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
  163. package/dist/resources/extensions/gsd/paths.js +414 -0
  164. package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
  165. package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
  166. package/dist/resources/extensions/gsd/preferences-models.js +294 -0
  167. package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
  168. package/dist/resources/extensions/gsd/preferences-types.js +73 -0
  169. package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
  170. package/dist/resources/extensions/gsd/preferences.js +325 -0
  171. package/dist/resources/extensions/gsd/progress-score.js +197 -0
  172. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
  173. package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
  174. package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
  175. package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
  176. package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
  177. package/dist/resources/extensions/gsd/queue-order.js +178 -0
  178. package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
  179. package/dist/resources/extensions/gsd/quick.js +230 -0
  180. package/dist/resources/extensions/gsd/repo-identity.js +187 -0
  181. package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
  182. package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
  183. package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
  184. package/dist/resources/extensions/gsd/routing-history.js +210 -0
  185. package/dist/resources/extensions/gsd/safe-fs.js +52 -0
  186. package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
  187. package/dist/resources/extensions/gsd/session-forensics.js +427 -0
  188. package/dist/resources/extensions/gsd/session-lock.js +376 -0
  189. package/dist/resources/extensions/gsd/session-status-io.js +134 -0
  190. package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
  191. package/dist/resources/extensions/gsd/skill-health.js +324 -0
  192. package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
  193. package/dist/resources/extensions/gsd/state.js +653 -0
  194. package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
  195. package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
  196. package/dist/resources/extensions/gsd/token-counter.js +54 -0
  197. package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
  198. package/dist/resources/extensions/gsd/triage-ui.js +125 -0
  199. package/dist/resources/extensions/gsd/types.js +4 -0
  200. package/dist/resources/extensions/gsd/undo.js +210 -0
  201. package/dist/resources/extensions/gsd/unit-id.js +7 -0
  202. package/dist/resources/extensions/gsd/unit-runtime.js +130 -0
  203. package/dist/resources/extensions/gsd/validate-directory.js +143 -0
  204. package/dist/resources/extensions/gsd/verification-evidence.js +123 -0
  205. package/dist/resources/extensions/gsd/verification-gate.js +543 -0
  206. package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
  207. package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
  208. package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
  209. package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
  210. package/dist/resources/extensions/gsd/workspace-index.js +139 -0
  211. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
  212. package/dist/resources/extensions/gsd/worktree-command.js +676 -0
  213. package/dist/resources/extensions/gsd/worktree-manager.js +359 -0
  214. package/dist/resources/extensions/gsd/worktree.js +236 -0
  215. package/dist/resources/extensions/mac-tools/index.js +768 -0
  216. package/dist/resources/extensions/mcp-client/index.js +363 -0
  217. package/dist/resources/extensions/package.json +3 -0
  218. package/dist/resources/extensions/remote-questions/config.js +70 -0
  219. package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
  220. package/dist/resources/extensions/remote-questions/format.js +234 -0
  221. package/dist/resources/extensions/remote-questions/http-client.js +43 -0
  222. package/dist/resources/extensions/remote-questions/manager.js +156 -0
  223. package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
  224. package/dist/resources/extensions/remote-questions/notify.js +89 -0
  225. package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
  226. package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
  227. package/dist/resources/extensions/remote-questions/status.js +25 -0
  228. package/dist/resources/extensions/remote-questions/store.js +70 -0
  229. package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
  230. package/dist/resources/extensions/remote-questions/types.js +5 -0
  231. package/dist/resources/extensions/search-the-web/cache.js +74 -0
  232. package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
  233. package/dist/resources/extensions/search-the-web/format.js +161 -0
  234. package/dist/resources/extensions/search-the-web/http.js +178 -0
  235. package/dist/resources/extensions/search-the-web/index.js +41 -0
  236. package/dist/resources/extensions/search-the-web/native-search.js +166 -0
  237. package/dist/resources/extensions/search-the-web/provider.js +143 -0
  238. package/dist/resources/extensions/search-the-web/tavily.js +82 -0
  239. package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
  240. package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
  241. package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
  242. package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
  243. package/dist/resources/extensions/shared/confirm-ui.js +96 -0
  244. package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
  245. package/dist/resources/extensions/shared/frontmatter.js +109 -0
  246. package/dist/resources/extensions/shared/interview-ui.js +569 -0
  247. package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
  248. package/dist/resources/extensions/shared/next-action-ui.js +168 -0
  249. package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
  250. package/dist/resources/extensions/shared/sanitize.js +17 -0
  251. package/dist/resources/extensions/shared/terminal.js +21 -0
  252. package/dist/resources/extensions/shared/ui.js +245 -0
  253. package/dist/resources/extensions/shared/wizard-ui.js +478 -0
  254. package/dist/resources/extensions/slash-commands/audit.js +72 -0
  255. package/dist/resources/extensions/slash-commands/clear.js +8 -0
  256. package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
  257. package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
  258. package/dist/resources/extensions/slash-commands/index.js +10 -0
  259. package/dist/resources/extensions/subagent/agents.js +103 -0
  260. package/dist/resources/extensions/subagent/index.js +905 -0
  261. package/dist/resources/extensions/subagent/isolation.js +384 -0
  262. package/dist/resources/extensions/subagent/worker-registry.js +73 -0
  263. package/dist/resources/extensions/ttsr/index.js +144 -0
  264. package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
  265. package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
  266. package/dist/resources/extensions/universal-config/discovery.js +94 -0
  267. package/dist/resources/extensions/universal-config/format.js +178 -0
  268. package/dist/resources/extensions/universal-config/index.js +99 -0
  269. package/dist/resources/extensions/universal-config/scanners.js +574 -0
  270. package/dist/resources/extensions/universal-config/tools.js +57 -0
  271. package/dist/resources/extensions/universal-config/types.js +8 -0
  272. package/dist/resources/extensions/voice/index.js +247 -0
  273. package/dist/startup-timings.d.ts +2 -0
  274. package/dist/startup-timings.js +22 -0
  275. package/package.json +1 -1
  276. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  277. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  279. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  283. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  285. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/index.js +1 -1
  287. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  288. package/packages/pi-coding-agent/package.json +1 -1
  289. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
  290. package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
  291. package/packages/pi-coding-agent/src/index.ts +1 -0
  292. package/pkg/package.json +1 -1
  293. package/src/resources/extensions/bg-shell/index.ts +41 -46
  294. package/src/resources/extensions/browser-tools/index.ts +156 -67
  295. package/src/resources/extensions/gsd/auto-supervisor.ts +10 -5
  296. package/src/resources/extensions/gsd/auto-verification.ts +20 -2
  297. package/src/resources/extensions/gsd/auto-worktree.ts +136 -1
  298. package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
  299. package/src/resources/extensions/gsd/commands.ts +53 -33
  300. package/src/resources/extensions/gsd/git-service.ts +24 -11
  301. package/src/resources/extensions/gsd/index.ts +106 -34
  302. package/src/resources/extensions/gsd/quick.ts +52 -3
  303. package/src/resources/extensions/gsd/repo-identity.ts +56 -22
  304. package/src/resources/extensions/gsd/session-lock.ts +80 -16
  305. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +691 -0
  306. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +317 -0
  307. package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
  308. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +40 -5
  309. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
  310. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
  311. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +358 -0
  312. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +216 -0
  313. package/src/resources/extensions/gsd/tests/session-lock.test.ts +119 -0
  314. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +65 -0
  315. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +206 -0
  316. package/src/resources/extensions/gsd/types.ts +4 -0
  317. package/src/resources/extensions/gsd/verification-evidence.ts +1 -1
  318. package/src/resources/extensions/gsd/verification-gate.ts +23 -2
  319. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  320. package/src/resources/extensions/gsd/worktree-command.ts +17 -11
  321. package/src/resources/extensions/package.json +3 -0
  322. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  323. package/src/resources/extensions/search-the-web/index.ts +35 -52
  324. package/src/resources/extensions/search-the-web/tavily.ts +1 -1
  325. package/dist/resources/extensions/ask-user-questions.ts +0 -290
  326. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
  327. package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
  328. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
  329. package/dist/resources/extensions/async-jobs/index.ts +0 -141
  330. package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
  331. package/dist/resources/extensions/aws-auth/index.ts +0 -144
  332. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
  333. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
  334. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
  335. package/dist/resources/extensions/bg-shell/index.ts +0 -59
  336. package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
  337. package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
  338. package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
  339. package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
  340. package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
  341. package/dist/resources/extensions/bg-shell/types.ts +0 -303
  342. package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
  343. package/dist/resources/extensions/browser-tools/capture.ts +0 -199
  344. package/dist/resources/extensions/browser-tools/core.ts +0 -1196
  345. package/dist/resources/extensions/browser-tools/index.ts +0 -71
  346. package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
  347. package/dist/resources/extensions/browser-tools/refs.ts +0 -264
  348. package/dist/resources/extensions/browser-tools/settle.ts +0 -197
  349. package/dist/resources/extensions/browser-tools/state.ts +0 -408
  350. package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
  351. package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
  352. package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
  353. package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
  354. package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
  355. package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
  356. package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
  357. package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
  358. package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
  359. package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
  360. package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
  361. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
  362. package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
  363. package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
  364. package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
  365. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
  366. package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
  367. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
  368. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
  369. package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
  370. package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
  371. package/dist/resources/extensions/browser-tools/utils.ts +0 -660
  372. package/dist/resources/extensions/context7/index.ts +0 -428
  373. package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
  374. package/dist/resources/extensions/google-search/index.ts +0 -466
  375. package/dist/resources/extensions/gsd/activity-log.ts +0 -162
  376. package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
  377. package/dist/resources/extensions/gsd/auto/session.ts +0 -236
  378. package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
  379. package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
  380. package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
  381. package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
  382. package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
  383. package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
  384. package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
  385. package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
  386. package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
  387. package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
  388. package/dist/resources/extensions/gsd/auto-start.ts +0 -483
  389. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  390. package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
  391. package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
  392. package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
  393. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  394. package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
  395. package/dist/resources/extensions/gsd/auto-worktree.ts +0 -524
  396. package/dist/resources/extensions/gsd/auto.ts +0 -1834
  397. package/dist/resources/extensions/gsd/captures.ts +0 -427
  398. package/dist/resources/extensions/gsd/claude-import.ts +0 -656
  399. package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  400. package/dist/resources/extensions/gsd/commands-config.ts +0 -102
  401. package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
  402. package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
  403. package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
  404. package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
  405. package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
  406. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
  407. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  408. package/dist/resources/extensions/gsd/commands.ts +0 -1137
  409. package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
  410. package/dist/resources/extensions/gsd/context-budget.ts +0 -266
  411. package/dist/resources/extensions/gsd/context-store.ts +0 -195
  412. package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
  413. package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
  414. package/dist/resources/extensions/gsd/db-writer.ts +0 -360
  415. package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
  416. package/dist/resources/extensions/gsd/detection.ts +0 -470
  417. package/dist/resources/extensions/gsd/diff-context.ts +0 -214
  418. package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
  419. package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
  420. package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
  421. package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
  422. package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
  423. package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
  424. package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
  425. package/dist/resources/extensions/gsd/doctor.ts +0 -722
  426. package/dist/resources/extensions/gsd/error-utils.ts +0 -6
  427. package/dist/resources/extensions/gsd/exit-command.ts +0 -18
  428. package/dist/resources/extensions/gsd/export.ts +0 -317
  429. package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
  430. package/dist/resources/extensions/gsd/files.ts +0 -1058
  431. package/dist/resources/extensions/gsd/forensics.ts +0 -629
  432. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
  433. package/dist/resources/extensions/gsd/git-service.ts +0 -580
  434. package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
  435. package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
  436. package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
  437. package/dist/resources/extensions/gsd/health-widget.ts +0 -167
  438. package/dist/resources/extensions/gsd/history.ts +0 -143
  439. package/dist/resources/extensions/gsd/index.ts +0 -1390
  440. package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
  441. package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
  442. package/dist/resources/extensions/gsd/key-manager.ts +0 -996
  443. package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  444. package/dist/resources/extensions/gsd/md-importer.ts +0 -527
  445. package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
  446. package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
  447. package/dist/resources/extensions/gsd/memory-store.ts +0 -441
  448. package/dist/resources/extensions/gsd/metrics.ts +0 -532
  449. package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
  450. package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
  451. package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
  452. package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
  453. package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
  454. package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
  455. package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
  456. package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
  457. package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
  458. package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
  459. package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
  460. package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
  461. package/dist/resources/extensions/gsd/model-router.ts +0 -256
  462. package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
  463. package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  464. package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
  465. package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  466. package/dist/resources/extensions/gsd/notifications.ts +0 -87
  467. package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
  468. package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
  469. package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
  470. package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
  471. package/dist/resources/extensions/gsd/paths.ts +0 -449
  472. package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
  473. package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
  474. package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
  475. package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
  476. package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
  477. package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
  478. package/dist/resources/extensions/gsd/preferences.ts +0 -416
  479. package/dist/resources/extensions/gsd/progress-score.ts +0 -273
  480. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  481. package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
  482. package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
  483. package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
  484. package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
  485. package/dist/resources/extensions/gsd/queue-order.ts +0 -230
  486. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
  487. package/dist/resources/extensions/gsd/quick.ts +0 -212
  488. package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
  489. package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
  490. package/dist/resources/extensions/gsd/routing-history.ts +0 -286
  491. package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
  492. package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
  493. package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
  494. package/dist/resources/extensions/gsd/session-lock.ts +0 -362
  495. package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
  496. package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
  497. package/dist/resources/extensions/gsd/skill-health.ts +0 -417
  498. package/dist/resources/extensions/gsd/state.ts +0 -727
  499. package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
  500. package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
  501. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
  502. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
  503. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
  504. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  505. package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
  506. package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
  507. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
  508. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
  509. package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  510. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
  511. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
  512. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  513. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
  514. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
  515. package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  516. package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
  517. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
  518. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
  519. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  520. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  521. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
  522. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  523. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  524. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  525. package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
  526. package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
  527. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
  528. package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
  529. package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
  530. package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
  531. package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  532. package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
  533. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
  534. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
  535. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
  536. package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
  537. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  538. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  539. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
  540. package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
  541. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  542. package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
  543. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
  544. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
  545. package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
  546. package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
  547. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
  548. package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
  549. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  550. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
  551. package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  552. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
  553. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  554. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
  555. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
  556. package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
  557. package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
  558. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
  559. package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
  560. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  561. package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
  562. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
  563. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  564. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
  565. package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  566. package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
  567. package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
  568. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
  569. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
  570. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
  571. package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -839
  572. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
  573. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  574. package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
  575. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  576. package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
  577. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  578. package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
  579. package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
  580. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
  581. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
  582. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
  583. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
  584. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
  585. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
  586. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
  587. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
  588. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  589. package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
  590. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
  591. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  592. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  593. package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  594. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  595. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
  596. package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
  597. package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
  598. package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
  599. package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
  600. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
  601. package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
  602. package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
  603. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
  604. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
  605. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
  606. package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
  607. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
  608. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
  609. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
  610. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
  611. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  612. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
  613. package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
  614. package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  615. package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  616. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  617. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  618. package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
  619. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  620. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
  621. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
  622. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
  623. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
  624. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  625. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
  626. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  627. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
  628. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  629. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
  630. package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
  631. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
  632. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
  633. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
  634. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
  635. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  636. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -315
  637. package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  638. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  639. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
  640. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
  641. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
  642. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  643. package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
  644. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  645. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  646. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
  647. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  648. package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
  649. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
  650. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
  651. package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
  652. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
  653. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
  654. package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  655. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
  656. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
  657. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
  658. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
  659. package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
  660. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
  661. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
  662. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
  663. package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
  664. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
  665. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  666. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
  667. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
  668. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
  669. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
  670. package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  671. package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
  672. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
  673. package/dist/resources/extensions/gsd/token-counter.ts +0 -65
  674. package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
  675. package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
  676. package/dist/resources/extensions/gsd/types.ts +0 -425
  677. package/dist/resources/extensions/gsd/undo.ts +0 -223
  678. package/dist/resources/extensions/gsd/unit-id.ts +0 -14
  679. package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
  680. package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
  681. package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
  682. package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
  683. package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
  684. package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  685. package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
  686. package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
  687. package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
  688. package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
  689. package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
  690. package/dist/resources/extensions/gsd/worktree.ts +0 -257
  691. package/dist/resources/extensions/mac-tools/index.ts +0 -852
  692. package/dist/resources/extensions/mcp-client/index.ts +0 -459
  693. package/dist/resources/extensions/mcporter/extension-manifest.json +0 -12
  694. package/dist/resources/extensions/remote-questions/config.ts +0 -83
  695. package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
  696. package/dist/resources/extensions/remote-questions/format.ts +0 -315
  697. package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
  698. package/dist/resources/extensions/remote-questions/manager.ts +0 -184
  699. package/dist/resources/extensions/remote-questions/notify.ts +0 -90
  700. package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
  701. package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
  702. package/dist/resources/extensions/remote-questions/status.ts +0 -31
  703. package/dist/resources/extensions/remote-questions/store.ts +0 -81
  704. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
  705. package/dist/resources/extensions/remote-questions/types.ts +0 -102
  706. package/dist/resources/extensions/search-the-web/cache.ts +0 -78
  707. package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
  708. package/dist/resources/extensions/search-the-web/format.ts +0 -258
  709. package/dist/resources/extensions/search-the-web/http.ts +0 -238
  710. package/dist/resources/extensions/search-the-web/index.ts +0 -65
  711. package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
  712. package/dist/resources/extensions/search-the-web/provider.ts +0 -148
  713. package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
  714. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
  715. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
  716. package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
  717. package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
  718. package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
  719. package/dist/resources/extensions/shared/frontmatter.ts +0 -117
  720. package/dist/resources/extensions/shared/interview-ui.ts +0 -613
  721. package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
  722. package/dist/resources/extensions/shared/sanitize.ts +0 -19
  723. package/dist/resources/extensions/shared/terminal.ts +0 -23
  724. package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
  725. package/dist/resources/extensions/shared/ui.ts +0 -400
  726. package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
  727. package/dist/resources/extensions/slash-commands/audit.ts +0 -88
  728. package/dist/resources/extensions/slash-commands/clear.ts +0 -10
  729. package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
  730. package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  731. package/dist/resources/extensions/slash-commands/index.ts +0 -12
  732. package/dist/resources/extensions/subagent/agents.ts +0 -126
  733. package/dist/resources/extensions/subagent/index.ts +0 -1121
  734. package/dist/resources/extensions/subagent/isolation.ts +0 -501
  735. package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
  736. package/dist/resources/extensions/ttsr/index.ts +0 -168
  737. package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
  738. package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
  739. package/dist/resources/extensions/universal-config/discovery.ts +0 -104
  740. package/dist/resources/extensions/universal-config/format.ts +0 -191
  741. package/dist/resources/extensions/universal-config/index.ts +0 -120
  742. package/dist/resources/extensions/universal-config/scanners.ts +0 -642
  743. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
  744. package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
  745. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
  746. package/dist/resources/extensions/universal-config/tools.ts +0 -60
  747. package/dist/resources/extensions/universal-config/types.ts +0 -135
  748. package/dist/resources/extensions/voice/index.ts +0 -272
  749. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
  750. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
  751. package/src/resources/extensions/mcporter/extension-manifest.json +0 -12
@@ -1,1272 +0,0 @@
1
- /**
2
- * Token Optimization Benchmark -- measures actual savings from all modules
3
- * using realistic GSD prompt content.
4
- *
5
- * This test validates that the optimization suite achieves its documented
6
- * savings targets and reports precise metrics.
7
- */
8
-
9
- import { describe, it } from "node:test";
10
- import assert from "node:assert/strict";
11
-
12
- import {
13
- formatDecisionsCompact,
14
- formatRequirementsCompact,
15
- measureSavings,
16
- } from "../structured-data-formatter.js";
17
- import { compressPrompt, compressToTarget } from "../prompt-compressor.js";
18
- import { chunkByRelevance } from "../semantic-chunker.js";
19
- import { distillSummaries } from "../summary-distiller.js";
20
- import {
21
- optimizeForCaching,
22
- section,
23
- estimateCacheSavings,
24
- } from "../prompt-cache-optimizer.js";
25
- import {
26
- estimateTokensForProvider,
27
- getCharsPerToken,
28
- } from "../token-counter.js";
29
- import { computeBudgets } from "../context-budget.js";
30
-
31
- // ---------------------------------------------------------------------------
32
- // Fixture: Decisions (8 entries with 200-400 chars each)
33
- // ---------------------------------------------------------------------------
34
-
35
- function buildDecisions() {
36
- return [
37
- {
38
- id: "D001",
39
- when_context: "M001/S01",
40
- scope: "architecture",
41
- decision:
42
- "Select a database engine for artifact storage that supports embedded operation without requiring a separate server process, while providing ACID guarantees and WAL mode for concurrent reads during background indexing operations",
43
- choice:
44
- "SQLite with WAL mode enabled and PRAGMA journal_mode=WAL; connection pool size of 1 writer + 4 readers to prevent lock contention while maximizing read throughput",
45
- rationale:
46
- "Eliminates external dependency on PostgreSQL or MySQL server, reducing deployment complexity. SQLite WAL mode provides concurrent read access during writes, which is critical for background indexing while the user interacts with the system",
47
- revisable: "no",
48
- },
49
- {
50
- id: "D002",
51
- when_context: "M001/S02",
52
- scope: "testing",
53
- decision:
54
- "Establish the testing framework and assertion library for all unit and integration tests across the project, ensuring compatibility with TypeScript and ESM module resolution",
55
- choice:
56
- "Use node:test as the primary test runner with node:assert/strict for assertions; avoid Jest due to ESM compatibility issues and excessive configuration overhead for TypeScript projects",
57
- rationale:
58
- "Built-in Node.js test runner requires zero external dependencies, supports TypeScript via --experimental-strip-types, and produces TAP output compatible with CI systems. This reduces package install time by ~15 seconds",
59
- revisable: "yes",
60
- },
61
- {
62
- id: "D003",
63
- when_context: "M001/S03",
64
- scope: "observability",
65
- decision:
66
- "Define the observability strategy for tracking token usage, cache hit rates, and prompt compression efficiency across all provider integrations in the dispatch pipeline",
67
- choice:
68
- "Structured JSON logging with JSONL format to stderr; metrics collected in-memory with periodic flush to SQLite metrics table; no external APM dependency required for core functionality",
69
- rationale:
70
- "JSONL format enables easy parsing by external tools (jq, Datadog agent) without coupling the core system to any specific observability vendor. In-memory accumulation prevents I/O bottlenecks during rapid dispatch cycles",
71
- revisable: "yes",
72
- },
73
- {
74
- id: "D004",
75
- when_context: "M001/S04",
76
- scope: "security",
77
- decision:
78
- "Implement access control for environment variable injection into executor prompts, preventing accidental exposure of secrets like API keys, database credentials, and signing tokens",
79
- choice:
80
- "Allowlist-based environment variable filter with pattern matching; only variables matching GSD_*, NODE_ENV, and explicitly configured patterns are passed to executor prompts; all others are redacted",
81
- rationale:
82
- "Allowlist approach is safer than denylist because new environment variables are blocked by default. Pattern matching allows project-specific overrides via preferences without modifying core code",
83
- revisable: "no",
84
- },
85
- {
86
- id: "D005",
87
- when_context: "M002/S01",
88
- scope: "performance",
89
- decision:
90
- "Optimize prompt assembly latency for the dispatch pipeline to ensure sub-100ms total preparation time including context gathering, compression, and template rendering",
91
- choice:
92
- "Lazy evaluation with memoized context sections; compress only when content exceeds budget threshold; cache compiled templates in memory across dispatch cycles within the same session",
93
- rationale:
94
- "Profiling showed that eager compression of all sections added 40ms overhead even when total content was within budget. Lazy evaluation skips unnecessary work in the common case where context fits without compression",
95
- revisable: "yes",
96
- },
97
- {
98
- id: "D006",
99
- when_context: "M002/S02",
100
- scope: "architecture",
101
- decision:
102
- "Design the plugin system architecture to support third-party extensions for custom skill definitions, prompt templates, and model routing rules without modifying core GSD code",
103
- choice:
104
- "File-based plugin discovery with JSON manifest validation; plugins loaded from .gsd/plugins/ directory with sandboxed execution context; no dynamic require() or eval() permitted",
105
- rationale:
106
- "File-based discovery avoids npm registry dependency for plugin distribution. Sandboxed execution prevents plugins from modifying core state or accessing the file system outside their declared scope",
107
- revisable: "yes",
108
- },
109
- {
110
- id: "D007",
111
- when_context: "M002/S03",
112
- scope: "testing",
113
- decision:
114
- "Establish integration test patterns for verifying end-to-end dispatch flows including context gathering, prompt assembly, provider API calls, and response processing",
115
- choice:
116
- "Recorded HTTP fixtures with deterministic replay; test harness intercepts provider API calls and returns pre-recorded responses; fixture files stored alongside test files in tests/fixtures/ directory",
117
- rationale:
118
- "Recorded fixtures eliminate flaky tests caused by network issues or API rate limits. Deterministic replay ensures tests produce identical results across environments and CI runs",
119
- revisable: "yes",
120
- },
121
- {
122
- id: "D008",
123
- when_context: "M002/S04",
124
- scope: "observability",
125
- decision:
126
- "Implement cost tracking and projection for token usage across multiple providers, enabling budget alerts and automated throttling when spending approaches configured limits",
127
- choice:
128
- "Per-request cost calculation using model cost table with provider-specific pricing; rolling 24-hour window for budget tracking; configurable alert thresholds at 50%, 75%, and 90% of daily budget",
129
- rationale:
130
- "Rolling window prevents budget resets at midnight from causing spending spikes. Per-request calculation ensures accurate cost attribution even when switching between models mid-session",
131
- revisable: "no",
132
- },
133
- ];
134
- }
135
-
136
- // ---------------------------------------------------------------------------
137
- // Fixture: Requirements (6 entries with 300-500 chars each)
138
- // ---------------------------------------------------------------------------
139
-
140
- function buildRequirements() {
141
- return [
142
- {
143
- id: "R001",
144
- class: "non-functional",
145
- status: "active",
146
- description:
147
- "Response latency for prompt assembly must remain below 100ms at the 99th percentile under normal operating conditions with up to 200K tokens of context window utilization",
148
- why: "Users experience noticeable delay when prompt assembly exceeds 100ms, compounding with network latency to the provider API. Sub-100ms assembly ensures total round-trip time stays under 2 seconds for interactive workflows",
149
- primary_owner: "S01",
150
- validation:
151
- "Benchmark test measures P99 assembly latency across 1000 iterations with realistic context sizes. Alert triggers if P99 exceeds 80ms to provide early warning before the 100ms threshold is breached",
152
- },
153
- {
154
- id: "R002",
155
- class: "functional",
156
- status: "active",
157
- description:
158
- "Token optimization pipeline must achieve at least 30% character savings on structured data (decisions, requirements) when using compact format versus standard markdown table format",
159
- why: "Context window capacity is the primary constraint for complex multi-task dispatches. A 30% savings on structured data frees approximately 15K characters for additional code context or dependency summaries",
160
- primary_owner: "S02",
161
- validation:
162
- "End-to-end benchmark test with realistic decision and requirement fixtures validates savings percentage. Test fails if any optimization module falls below its documented savings target",
163
- },
164
- {
165
- id: "R003",
166
- class: "constraint",
167
- status: "active",
168
- description:
169
- "All prompt compression transformations must be deterministic: identical input must always produce identical output regardless of execution environment, timing, or system state",
170
- why: "Non-deterministic compression would break prompt caching strategies that rely on prefix stability. Anthropic cache hits require exact prefix matches, so any variation in compressed output wastes cache credits",
171
- primary_owner: "S03",
172
- validation:
173
- "Property-based test generates 500 random inputs and verifies that compressing each input twice produces byte-identical output. Additional test verifies cross-platform consistency",
174
- },
175
- {
176
- id: "R004",
177
- class: "non-functional",
178
- status: "active",
179
- description:
180
- "Semantic chunking must select relevant code sections with at least 80% precision: selected chunks should contain query-relevant content, and the total selected content should be less than 60% of the original",
181
- why: "Including irrelevant code sections wastes context budget and can confuse the executor model with unrelated implementation details. Precision above 80% ensures the context is focused and actionable",
182
- primary_owner: "S04",
183
- validation:
184
- "Benchmark test with annotated code fixtures measures precision and recall of chunk selection. Query terms are chosen to target specific functions, and chunk scores are validated against expected relevance ordering",
185
- },
186
- {
187
- id: "R005",
188
- class: "functional",
189
- status: "active",
190
- description:
191
- "Summary distillation must preserve all structured metadata fields (provides, requires, key_files, key_decisions) while achieving at least 40% size reduction from full SUMMARY.md content",
192
- why: "Dependency summaries are injected into every task dispatch prompt. Reducing their size by 40% while preserving structured fields saves approximately 3-5K characters per dispatch across 3-4 dependency summaries",
193
- primary_owner: "S05",
194
- validation:
195
- "Benchmark test creates realistic SUMMARY.md fixtures with full YAML frontmatter and prose sections. Distilled output is verified to contain all structured fields and meet the 40% savings target",
196
- },
197
- {
198
- id: "R006",
199
- class: "non-functional",
200
- status: "active",
201
- description:
202
- "Cache optimization must achieve at least 60% cacheable prefix ratio by correctly classifying prompt sections as static, semi-static, or dynamic and ordering them for maximum cache hit potential",
203
- why: "Anthropic charges 90% less for cached tokens. A 60% cacheable prefix with 90% cache discount yields approximately 54% cost savings on input tokens, which dominate the total cost for long-context prompts",
204
- primary_owner: "S01",
205
- validation:
206
- "Benchmark test constructs a realistic prompt with system instructions, templates, slice context, and task-specific content. Cache optimizer output is verified to have cacheable prefix above 60% threshold",
207
- },
208
- ];
209
- }
210
-
211
- // ---------------------------------------------------------------------------
212
- // Fixture: Markdown table format for decisions (baseline)
213
- // ---------------------------------------------------------------------------
214
-
215
- function formatDecisionsAsMarkdownTable(
216
- decisions: ReturnType<typeof buildDecisions>,
217
- ): string {
218
- // Simulate a padded markdown table (typical of human-authored or tool-generated tables)
219
- const lines: string[] = [
220
- "# Decisions Register",
221
- "",
222
- "<!-- Append-only. Never edit or remove existing rows. -->",
223
- "",
224
- "| # | When Context | Scope | Decision | Choice | Rationale | Revisable? |",
225
- "|--------|----------------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|",
226
- ];
227
- for (const d of decisions) {
228
- lines.push(
229
- `| ${d.id.padEnd(6)} | ${d.when_context.padEnd(14)} | ${d.scope.padEnd(15)} | ${d.decision.padEnd(160)} | ${d.choice.padEnd(160)} | ${d.rationale.padEnd(160)} | ${d.revisable.padEnd(10)} |`,
230
- );
231
- }
232
- return lines.join("\n");
233
- }
234
-
235
- // ---------------------------------------------------------------------------
236
- // Fixture: Markdown format for requirements (baseline)
237
- // ---------------------------------------------------------------------------
238
-
239
- function formatRequirementsAsMarkdown(
240
- requirements: ReturnType<typeof buildRequirements>,
241
- ): string {
242
- const lines: string[] = ["# Requirements", "", "## Active", ""];
243
- for (const r of requirements) {
244
- lines.push(`### ${r.id} -- ${r.description}`);
245
- lines.push("");
246
- lines.push(`- Class: ${r.class}`);
247
- lines.push(`- Status: ${r.status}`);
248
- lines.push(`- Why it matters: ${r.why}`);
249
- lines.push(`- Primary owning slice: ${r.primary_owner}`);
250
- lines.push(`- Validation: ${r.validation}`);
251
- lines.push("");
252
- }
253
- return lines.join("\n");
254
- }
255
-
256
- // ---------------------------------------------------------------------------
257
- // Fixture: Realistic TypeScript code file (200+ lines, 8+ functions)
258
- // ---------------------------------------------------------------------------
259
-
260
- const SAMPLE_CODE = `import { readFileSync, writeFileSync, existsSync } from "node:fs";
261
- import { join, resolve, dirname } from "node:path";
262
- import { createHash } from "node:crypto";
263
-
264
- // ---- Types ----
265
-
266
- interface Config {
267
- basePath: string;
268
- maxRetries: number;
269
- timeout: number;
270
- logLevel: "debug" | "info" | "warn" | "error";
271
- database: {
272
- host: string;
273
- port: number;
274
- name: string;
275
- poolSize: number;
276
- };
277
- }
278
-
279
- interface User {
280
- id: string;
281
- email: string;
282
- role: "admin" | "editor" | "viewer";
283
- createdAt: Date;
284
- lastLogin: Date | null;
285
- }
286
-
287
- interface AuthToken {
288
- token: string;
289
- userId: string;
290
- expiresAt: Date;
291
- scopes: string[];
292
- }
293
-
294
- interface LogEntry {
295
- timestamp: Date;
296
- level: string;
297
- message: string;
298
- context: Record<string, unknown>;
299
- }
300
-
301
- interface DatabaseConnection {
302
- query(sql: string, params?: unknown[]): Promise<unknown[]>;
303
- execute(sql: string, params?: unknown[]): Promise<{ affectedRows: number }>;
304
- close(): Promise<void>;
305
- }
306
-
307
- // ---- Config Module ----
308
-
309
- export function loadConfig(path: string): Config {
310
- if (!existsSync(path)) {
311
- throw new Error(\`Config file not found: \${path}\`);
312
- }
313
- const raw = readFileSync(path, "utf-8");
314
- const parsed = JSON.parse(raw);
315
- return validateConfig(parsed);
316
- }
317
-
318
- export function validateConfig(config: unknown): Config {
319
- if (typeof config !== "object" || config === null) {
320
- throw new Error("Config must be a non-null object");
321
- }
322
- const c = config as Record<string, unknown>;
323
- if (typeof c.basePath !== "string" || !c.basePath) {
324
- throw new Error("Config.basePath must be a non-empty string");
325
- }
326
- if (typeof c.maxRetries !== "number" || c.maxRetries < 0) {
327
- throw new Error("Config.maxRetries must be a non-negative number");
328
- }
329
- if (typeof c.timeout !== "number" || c.timeout <= 0) {
330
- throw new Error("Config.timeout must be a positive number");
331
- }
332
- return c as unknown as Config;
333
- }
334
-
335
- export function mergeConfigs(base: Config, overrides: Partial<Config>): Config {
336
- return {
337
- ...base,
338
- ...overrides,
339
- database: {
340
- ...base.database,
341
- ...(overrides.database ?? {}),
342
- },
343
- };
344
- }
345
-
346
- // ---- Database Module ----
347
-
348
- export async function connectDatabase(config: Config): Promise<DatabaseConnection> {
349
- const db = config.database;
350
- const connectionString = \`\${db.host}:\${db.port}/\${db.name}\`;
351
- let connected = false;
352
- let attempts = 0;
353
-
354
- while (!connected && attempts < config.maxRetries) {
355
- try {
356
- attempts++;
357
- // Simulated connection logic
358
- connected = true;
359
- } catch (err) {
360
- if (attempts >= config.maxRetries) {
361
- throw new Error(\`Failed to connect to \${connectionString} after \${attempts} attempts\`);
362
- }
363
- await new Promise((resolve) => setTimeout(resolve, 1000 * attempts));
364
- }
365
- }
366
-
367
- return {
368
- async query(sql: string, params?: unknown[]): Promise<unknown[]> {
369
- return [];
370
- },
371
- async execute(sql: string, params?: unknown[]): Promise<{ affectedRows: number }> {
372
- return { affectedRows: 0 };
373
- },
374
- async close(): Promise<void> {
375
- connected = false;
376
- },
377
- };
378
- }
379
-
380
- export async function runMigrations(db: DatabaseConnection, migrationsDir: string): Promise<number> {
381
- const files = existsSync(migrationsDir) ? [] : [];
382
- let applied = 0;
383
- for (const file of files) {
384
- const sql = readFileSync(join(migrationsDir, file), "utf-8");
385
- await db.execute(sql);
386
- applied++;
387
- }
388
- return applied;
389
- }
390
-
391
- // ---- Auth Module ----
392
-
393
- export function hashPassword(password: string, salt: string): string {
394
- return createHash("sha256")
395
- .update(password + salt)
396
- .digest("hex");
397
- }
398
-
399
- export function generateAuthToken(user: User, scopes: string[]): AuthToken {
400
- const token = createHash("sha256")
401
- .update(user.id + Date.now().toString() + Math.random().toString())
402
- .digest("hex");
403
-
404
- return {
405
- token,
406
- userId: user.id,
407
- expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
408
- scopes,
409
- };
410
- }
411
-
412
- export function validateAuthToken(token: AuthToken): boolean {
413
- if (!token.token || token.token.length < 32) return false;
414
- if (new Date() > token.expiresAt) return false;
415
- if (!token.scopes || token.scopes.length === 0) return false;
416
- return true;
417
- }
418
-
419
- export function checkPermission(user: User, requiredRole: string): boolean {
420
- const roleHierarchy: Record<string, number> = {
421
- viewer: 1,
422
- editor: 2,
423
- admin: 3,
424
- };
425
- const userLevel = roleHierarchy[user.role] ?? 0;
426
- const requiredLevel = roleHierarchy[requiredRole] ?? 999;
427
- return userLevel >= requiredLevel;
428
- }
429
-
430
- // ---- Logging Module ----
431
-
432
- export function createLogger(config: Config) {
433
- const levels: Record<string, number> = {
434
- debug: 0,
435
- info: 1,
436
- warn: 2,
437
- error: 3,
438
- };
439
-
440
- const minLevel = levels[config.logLevel] ?? 1;
441
-
442
- return {
443
- log(level: string, message: string, context: Record<string, unknown> = {}): void {
444
- if ((levels[level] ?? 0) < minLevel) return;
445
- const entry: LogEntry = {
446
- timestamp: new Date(),
447
- level,
448
- message,
449
- context,
450
- };
451
- console.error(JSON.stringify(entry));
452
- },
453
- debug(message: string, context?: Record<string, unknown>): void {
454
- this.log("debug", message, context);
455
- },
456
- info(message: string, context?: Record<string, unknown>): void {
457
- this.log("info", message, context);
458
- },
459
- warn(message: string, context?: Record<string, unknown>): void {
460
- this.log("warn", message, context);
461
- },
462
- error(message: string, context?: Record<string, unknown>): void {
463
- this.log("error", message, context);
464
- },
465
- };
466
- }
467
-
468
- // ---- Formatting Module ----
469
-
470
- export function formatBytes(bytes: number): string {
471
- if (bytes < 1024) return bytes + " B";
472
- if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB";
473
- if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + " MB";
474
- return (bytes / (1024 * 1024 * 1024)).toFixed(1) + " GB";
475
- }
476
-
477
- export function formatDuration(ms: number): string {
478
- if (ms < 1000) return ms + "ms";
479
- if (ms < 60_000) return (ms / 1000).toFixed(1) + "s";
480
- const minutes = Math.floor(ms / 60_000);
481
- const seconds = Math.floor((ms % 60_000) / 1000);
482
- return minutes + "m " + seconds + "s";
483
- }
484
-
485
- export function truncateString(str: string, maxLen: number): string {
486
- if (str.length <= maxLen) return str;
487
- return str.slice(0, maxLen - 3) + "...";
488
- }
489
-
490
- // ---- Parsing Module ----
491
-
492
- export function parseKeyValuePairs(input: string): Map<string, string> {
493
- const result = new Map<string, string>();
494
- const lines = input.split("\\n");
495
- for (const line of lines) {
496
- const idx = line.indexOf(":");
497
- if (idx > 0) {
498
- const key = line.slice(0, idx).trim();
499
- const value = line.slice(idx + 1).trim();
500
- if (key && value) {
501
- result.set(key, value);
502
- }
503
- }
504
- }
505
- return result;
506
- }
507
-
508
- export function parseCSVLine(line: string): string[] {
509
- const fields: string[] = [];
510
- let current = "";
511
- let inQuotes = false;
512
- for (const char of line) {
513
- if (char === '"') {
514
- inQuotes = !inQuotes;
515
- } else if (char === "," && !inQuotes) {
516
- fields.push(current.trim());
517
- current = "";
518
- } else {
519
- current += char;
520
- }
521
- }
522
- fields.push(current.trim());
523
- return fields;
524
- }
525
-
526
- // ---- Utility Module ----
527
-
528
- export function deepClone<T>(obj: T): T {
529
- return JSON.parse(JSON.stringify(obj));
530
- }
531
-
532
- export function debounce<T extends (...args: unknown[]) => void>(
533
- fn: T,
534
- delayMs: number,
535
- ): (...args: Parameters<T>) => void {
536
- let timer: ReturnType<typeof setTimeout> | null = null;
537
- return (...args: Parameters<T>) => {
538
- if (timer) clearTimeout(timer);
539
- timer = setTimeout(() => fn(...args), delayMs);
540
- };
541
- }
542
-
543
- export function retry<T>(
544
- fn: () => Promise<T>,
545
- maxAttempts: number,
546
- delayMs: number,
547
- ): Promise<T> {
548
- return new Promise((resolve, reject) => {
549
- let attempts = 0;
550
- const attempt = async () => {
551
- try {
552
- attempts++;
553
- const result = await fn();
554
- resolve(result);
555
- } catch (err) {
556
- if (attempts >= maxAttempts) {
557
- reject(err);
558
- } else {
559
- setTimeout(attempt, delayMs);
560
- }
561
- }
562
- };
563
- attempt();
564
- });
565
- }
566
-
567
- export function groupBy<T>(items: T[], keyFn: (item: T) => string): Map<string, T[]> {
568
- const groups = new Map<string, T[]>();
569
- for (const item of items) {
570
- const key = keyFn(item);
571
- const group = groups.get(key) ?? [];
572
- group.push(item);
573
- groups.set(key, group);
574
- }
575
- return groups;
576
- }
577
- `;
578
-
579
- // ---------------------------------------------------------------------------
580
- // Fixture: Realistic SUMMARY.md contents (4 entries, 800-1200 chars each)
581
- // ---------------------------------------------------------------------------
582
-
583
- function buildSummaries(): string[] {
584
- return [
585
- `---
586
- id: S01
587
- provides:
588
- - database-schema
589
- - migration-engine
590
- - connection-pool
591
- requires: []
592
- key_files:
593
- - src/db/schema.ts
594
- - src/db/migrations/001-init.sql
595
- - src/db/connection.ts
596
- - src/db/pool.ts
597
- key_decisions:
598
- - D001
599
- - D004
600
- patterns_established:
601
- - WAL-mode for all SQLite connections
602
- - Migration files numbered sequentially
603
- - Connection pool with 1 writer + N readers
604
- ---
605
-
606
- # S01: Database Foundation
607
-
608
- This slice establishes the core database infrastructure used by all subsequent slices.
609
- The SQLite database uses WAL mode for concurrent read access during background operations.
610
-
611
- ## Implementation Details
612
-
613
- The schema defines tables for artifacts (decisions, requirements, tasks), metrics,
614
- and session state. Each table includes created_at and updated_at timestamps with
615
- automatic trigger-based updates.
616
-
617
- The migration engine supports forward-only migrations with checksum verification
618
- to detect tampering. Each migration runs in a transaction with automatic rollback
619
- on failure.
620
-
621
- ## Testing Approach
622
-
623
- Integration tests use an in-memory SQLite database to avoid filesystem side effects.
624
- Each test creates a fresh database, applies all migrations, and verifies the schema
625
- matches expected structure.
626
-
627
- ## Performance Characteristics
628
-
629
- Schema initialization takes approximately 5ms on modern hardware. Query latency
630
- for typical operations (insert, select by ID, range scan) is under 1ms. The WAL
631
- checkpoint runs automatically every 1000 pages or when the connection closes.`,
632
-
633
- `---
634
- id: S02
635
- provides:
636
- - prompt-compressor
637
- - token-counter
638
- - context-budget
639
- requires:
640
- - database-schema
641
- key_files:
642
- - src/extensions/gsd/prompt-compressor.ts
643
- - src/extensions/gsd/token-counter.ts
644
- - src/extensions/gsd/context-budget.ts
645
- - src/extensions/gsd/structured-data-formatter.ts
646
- key_decisions:
647
- - D002
648
- - D003
649
- - D005
650
- patterns_established:
651
- - Deterministic compression with no LLM calls
652
- - Three compression levels (light/moderate/aggressive)
653
- - Provider-aware token estimation
654
- ---
655
-
656
- # S02: Token Optimization Pipeline
657
-
658
- This slice implements the complete token optimization pipeline that reduces prompt
659
- size while preserving semantic content. All transformations are deterministic and
660
- require no external API calls.
661
-
662
- ## Compression Strategy
663
-
664
- The pipeline applies transformations in order of increasing aggressiveness:
665
- light (whitespace normalization, comment removal), moderate (phrase abbreviation,
666
- boilerplate removal), and aggressive (emphasis removal, line truncation).
667
-
668
- Code blocks and markdown headings are preserved by default to maintain structural
669
- readability for the LLM executor.
670
-
671
- ## Budget Allocation
672
-
673
- Context budgets are computed proportionally from the executor model's context window.
674
- Summaries receive 15%, inline context receives 40%, and verification sections receive
675
- 10%. The remaining 35% is reserved for the model's response generation.
676
-
677
- ## Token Counting
678
-
679
- Token counts are estimated using provider-specific chars-per-token ratios:
680
- Anthropic at 3.5, OpenAI at 4.0, Google at 4.0. When tiktoken is available,
681
- exact counts replace estimates for OpenAI-compatible models.`,
682
-
683
- `---
684
- id: S03
685
- provides:
686
- - semantic-chunker
687
- - summary-distiller
688
- - cache-optimizer
689
- requires:
690
- - prompt-compressor
691
- - token-counter
692
- key_files:
693
- - src/extensions/gsd/semantic-chunker.ts
694
- - src/extensions/gsd/summary-distiller.ts
695
- - src/extensions/gsd/prompt-cache-optimizer.ts
696
- key_decisions:
697
- - D006
698
- - D007
699
- patterns_established:
700
- - TF-IDF scoring for content relevance
701
- - Progressive field dropping for budget compliance
702
- - Static-first section ordering for cache efficiency
703
- ---
704
-
705
- # S03: Advanced Context Selection
706
-
707
- This slice builds on the token optimization pipeline to provide intelligent content
708
- selection and cache-aware prompt assembly. It includes semantic chunking for code
709
- files, summary distillation for dependency context, and cache-optimized section ordering.
710
-
711
- ## Semantic Chunking
712
-
713
- The chunker splits code files at semantic boundaries (function/class/interface
714
- declarations) and scores each chunk against the task query using TF-IDF relevance.
715
- Only the top-scoring chunks are included in the prompt, typically reducing code
716
- context by 40-60%.
717
-
718
- ## Summary Distillation
719
-
720
- SUMMARY.md files from dependency slices are distilled to their essential structured
721
- data: provides, requires, key_files, and key_decisions. Verbose prose descriptions
722
- are dropped to save context budget. Progressive field dropping ensures output fits
723
- within any budget constraint.
724
-
725
- ## Cache Optimization
726
-
727
- Prompt sections are classified as static (system prompt, templates), semi-static
728
- (slice plan, decisions), or dynamic (task plan, file contents). Sections are reordered
729
- to place static content first, maximizing the cacheable prefix length for both
730
- Anthropic and OpenAI prompt caching strategies.`,
731
-
732
- `---
733
- id: S04
734
- provides:
735
- - dispatch-pipeline
736
- - task-routing
737
- - verification-gate
738
- requires:
739
- - database-schema
740
- - prompt-compressor
741
- - semantic-chunker
742
- - cache-optimizer
743
- key_files:
744
- - src/extensions/gsd/auto-dispatch.ts
745
- - src/extensions/gsd/model-router.ts
746
- - src/extensions/gsd/verification-gate.ts
747
- - src/extensions/gsd/auto-supervisor.ts
748
- key_decisions:
749
- - D008
750
- patterns_established:
751
- - Budget-aware dispatch with automatic compression
752
- - Model routing based on task complexity
753
- - Evidence-based verification before task completion
754
- ---
755
-
756
- # S04: Dispatch Pipeline
757
-
758
- This slice implements the end-to-end dispatch pipeline that takes a task plan,
759
- assembles an optimized prompt, routes it to the appropriate model, and verifies
760
- the executor's output before marking the task complete.
761
-
762
- ## Prompt Assembly
763
-
764
- The dispatch pipeline collects context from multiple sources: decisions and
765
- requirements from the database, dependency summaries from prior slices, code
766
- context from the workspace index, and task-specific instructions from the plan.
767
- All content passes through the optimization pipeline before assembly.
768
-
769
- ## Model Routing
770
-
771
- Tasks are routed to models based on complexity classification: simple tasks go
772
- to smaller/faster models, complex tasks go to larger models with bigger context
773
- windows. The router considers available context budget, estimated token usage,
774
- and historical success rates for each model-task combination.
775
-
776
- ## Verification
777
-
778
- Each completed task passes through a verification gate that checks for evidence
779
- of completion: modified files, passing tests, and explicit verification commands
780
- defined in the task plan. Tasks without sufficient evidence are flagged for
781
- review rather than silently accepted.`,
782
- ];
783
- }
784
-
785
- // ---------------------------------------------------------------------------
786
- // Fixture: Verbose prompt content (5000+ chars) for compression benchmark
787
- // ---------------------------------------------------------------------------
788
-
789
- function buildVerbosePrompt(): string {
790
- return `# Executor Instructions
791
-
792
- <!-- These instructions are generated automatically by the GSD dispatch system. -->
793
- <!-- Version: 2.4.1 -->
794
- <!-- Generated: 2026-03-17T10:00:00Z -->
795
- <!-- Template: executor-v3 -->
796
-
797
- ---
798
-
799
- ## Context and Background
800
-
801
-
802
- In order to complete this task successfully, it is important to note that the system architecture follows a modular design pattern. The following sections describe the relevant context for your work.
803
-
804
- As mentioned previously, the database layer uses SQLite with WAL mode enabled. In addition to the database configuration, you should be aware of the caching strategy that has been implemented.
805
-
806
- Due to the fact that we need to maintain backward compatibility, all API changes must be additive. At this point in time, we do not support breaking changes to the public API surface.
807
-
808
- For the purpose of maintaining consistency, all new code should follow the established patterns documented in the architecture decision records. In the event that you encounter a conflict between patterns, prefer the most recent decision.
809
-
810
- With regard to testing, all new functionality must include unit tests with at least 80% branch coverage. Prior to submitting your changes, run the full test suite to verify no regressions.
811
-
812
- Subsequent to completing the implementation, update the SUMMARY.md file with any new patterns or decisions established during development.
813
-
814
-
815
- ---
816
-
817
-
818
- ## Technical Requirements
819
-
820
- In accordance with the project standards, the implementation must satisfy the following requirements:
821
-
822
- (none)
823
- N/A
824
- (not applicable)
825
- (empty)
826
-
827
- A number of performance constraints apply to this module. In the case of database operations, queries must complete within 10ms at the 95th percentile. On the basis of our load testing results, the system handles approximately 500 concurrent requests.
828
-
829
- In order to ensure proper error handling, all async functions must use try-catch blocks. In the event that an error occurs, it is important to note that the error should be logged before re-throwing.
830
-
831
- The following code patterns should be followed:
832
-
833
- \`\`\`typescript
834
- // Always use strict null checks
835
- interface Result<T> {
836
- data: T | null;
837
- error: string | null;
838
- }
839
-
840
- // Prefer explicit return types
841
- export function processItem(item: unknown): Result<ProcessedItem> {
842
- if (!isValid(item)) {
843
- return { data: null, error: "Invalid item format" };
844
- }
845
- return { data: transform(item), error: null };
846
- }
847
- \`\`\`
848
-
849
- ---
850
-
851
- ## Dependencies
852
-
853
- - **Database module** (src/db/connection.ts): Provides connection pool management
854
- - **Auth module** (src/auth/tokens.ts): Handles token validation and refresh
855
- - **Logger** (src/utils/logger.ts): Structured logging with context propagation
856
- - **Config module** (src/config/loader.ts): Configuration loading and validation
857
-
858
- > Note: The database module is currently being refactored as part of M002/S03.
859
- > Use the stable API surface and avoid internal implementation details.
860
- > In order to avoid breakage, do not import from internal paths.
861
-
862
- ---
863
-
864
- ## Task Plan
865
-
866
- In order to implement the requested changes, you should follow these steps:
867
-
868
- 1. Review the existing implementation in the target files
869
- 2. Implement the changes described in the task description
870
- 3. Write unit tests covering all new code paths
871
- 4. Update documentation if any public APIs change
872
- 5. Run the verification commands listed below
873
-
874
-
875
-
876
- ## Carry-Forward Context
877
-
878
- In order to understand the current state of the codebase, it is important to note that the following decisions were made in prior slices:
879
-
880
- - In the event that a database connection fails, the system should retry with exponential backoff. Due to the fact that connection failures are transient, this approach works well.
881
- - Due to the fact that we use SQLite, all write operations are serialized through a single writer connection. In order to prevent lock contention, the pool is configured with 1 writer and 4 readers.
882
- - As mentioned previously, the token optimization pipeline processes content in three stages: light, moderate, and aggressive compression. In order to preserve semantic meaning, code blocks are excluded from compression.
883
- - For the purpose of maintaining cache efficiency, static prompt sections are always placed before dynamic sections. In the event that sections are reordered, cache hit rates drop significantly.
884
- - At this point in time, the system supports three providers: Anthropic, OpenAI, and Google. In order to add a new provider, implement the ProviderAdapter interface.
885
- - In accordance with the security policy, all environment variables are filtered through an allowlist. For the purpose of preventing accidental exposure, unknown variables are redacted.
886
- - With regard to the plugin system, plugins are loaded from the .gsd/plugins/ directory. Prior to loading, each plugin manifest is validated against the JSON schema.
887
- - Subsequent to task completion, the verification gate checks for evidence of completion. In the case of missing evidence, the task is flagged for review.
888
-
889
- N/A
890
- (none)
891
- (not applicable)
892
- (empty)
893
-
894
- ---
895
-
896
- ## Verification Commands
897
-
898
- \`\`\`bash
899
- npm run test -- --grep "database"
900
- npm run lint
901
- npm run build
902
- \`\`\`
903
-
904
- <!-- End of generated instructions -->
905
- <!-- Do not modify below this line -->`;
906
- }
907
-
908
- // ═══════════════════════════════════════════════════════════════════════════
909
- // Tests
910
- // ═══════════════════════════════════════════════════════════════════════════
911
-
912
- describe("Token Optimization Benchmark", () => {
913
- // -----------------------------------------------------------------------
914
- // Test 1: Structured Data Savings
915
- // -----------------------------------------------------------------------
916
- it("structured data savings benchmark", () => {
917
- const decisions = buildDecisions();
918
- const requirements = buildRequirements();
919
-
920
- const markdownDecisions = formatDecisionsAsMarkdownTable(decisions);
921
- const compactDecisions = formatDecisionsCompact(decisions);
922
-
923
- const decisionSavings = measureSavings(compactDecisions, markdownDecisions);
924
-
925
- console.log(
926
- ` Decisions compact: ${decisionSavings.toFixed(1)}% savings (${markdownDecisions.length} -> ${compactDecisions.length} chars)`,
927
- );
928
- assert.ok(
929
- decisionSavings > 15,
930
- `Decisions savings should be >15%, got ${decisionSavings.toFixed(1)}%`,
931
- );
932
-
933
- const markdownReqs = formatRequirementsAsMarkdown(requirements);
934
- const compactReqs = formatRequirementsCompact(requirements);
935
-
936
- const reqSavings = measureSavings(compactReqs, markdownReqs);
937
-
938
- console.log(
939
- ` Requirements compact: ${reqSavings.toFixed(1)}% savings (${markdownReqs.length} -> ${compactReqs.length} chars)`,
940
- );
941
- assert.ok(
942
- reqSavings > 5,
943
- `Requirements savings should be >5%, got ${reqSavings.toFixed(1)}%`,
944
- );
945
- });
946
-
947
- // -----------------------------------------------------------------------
948
- // Test 2: Prompt Compression
949
- // -----------------------------------------------------------------------
950
- it("prompt compression benchmark", () => {
951
- const verbose = buildVerbosePrompt();
952
-
953
- const light = compressPrompt(verbose, { level: "light" });
954
- console.log(
955
- ` Compression light: ${light.savingsPercent.toFixed(1)}% savings (${light.originalChars} -> ${light.compressedChars} chars, ${light.transformationsApplied} transforms)`,
956
- );
957
- assert.ok(
958
- light.savingsPercent > 5,
959
- `Light compression should save >5%, got ${light.savingsPercent}%`,
960
- );
961
-
962
- const moderate = compressPrompt(verbose, { level: "moderate" });
963
- console.log(
964
- ` Compression moderate: ${moderate.savingsPercent.toFixed(1)}% savings (${moderate.originalChars} -> ${moderate.compressedChars} chars, ${moderate.transformationsApplied} transforms)`,
965
- );
966
- assert.ok(
967
- moderate.savingsPercent > 10,
968
- `Moderate compression should save >10%, got ${moderate.savingsPercent}%`,
969
- );
970
-
971
- const aggressive = compressPrompt(verbose, { level: "aggressive" });
972
- console.log(
973
- ` Compression aggressive: ${aggressive.savingsPercent.toFixed(1)}% savings (${aggressive.originalChars} -> ${aggressive.compressedChars} chars, ${aggressive.transformationsApplied} transforms)`,
974
- );
975
- assert.ok(
976
- aggressive.savingsPercent > 15,
977
- `Aggressive compression should save >15%, got ${aggressive.savingsPercent}%`,
978
- );
979
-
980
- // Verify code blocks are preserved
981
- assert.ok(
982
- aggressive.content.includes("interface Result<T>"),
983
- "Code blocks should be preserved through all compression levels",
984
- );
985
- });
986
-
987
- // -----------------------------------------------------------------------
988
- // Test 3: Semantic Chunking
989
- // -----------------------------------------------------------------------
990
- it("semantic chunking benchmark", () => {
991
- const query = "database connection config validation";
992
- const result = chunkByRelevance(SAMPLE_CODE, query, {
993
- maxChunks: 5,
994
- minScore: 0.05,
995
- });
996
-
997
- console.log(
998
- ` Semantic chunking: ${result.totalChunks} total chunks, ${result.chunks.length} selected, ${result.omittedChunks} omitted`,
999
- );
1000
- console.log(
1001
- ` Chunking savings: ${result.savingsPercent}% of content omitted`,
1002
- );
1003
-
1004
- assert.ok(
1005
- result.totalChunks >= 4,
1006
- `Should produce at least 4 chunks, got ${result.totalChunks}`,
1007
- );
1008
- assert.ok(
1009
- result.savingsPercent > 40,
1010
- `Should omit >40% of content, got ${result.savingsPercent}%`,
1011
- );
1012
-
1013
- // Verify that chunks relevant to the query score higher
1014
- const scores = result.chunks.map((c) => c.score);
1015
- const hasHighScorer = scores.some((s) => s > 0.5);
1016
- assert.ok(hasHighScorer, "At least one chunk should score above 0.5");
1017
-
1018
- // Verify selected content contains query-relevant terms
1019
- const selectedText = result.chunks.map((c) => c.content).join("\n");
1020
- const hasRelevantContent =
1021
- selectedText.includes("Config") ||
1022
- selectedText.includes("config") ||
1023
- selectedText.includes("database") ||
1024
- selectedText.includes("connect") ||
1025
- selectedText.includes("validate");
1026
- assert.ok(
1027
- hasRelevantContent,
1028
- "Selected chunks should contain query-relevant content",
1029
- );
1030
- });
1031
-
1032
- // -----------------------------------------------------------------------
1033
- // Test 4: Summary Distillation
1034
- // -----------------------------------------------------------------------
1035
- it("summary distillation benchmark", () => {
1036
- const summaries = buildSummaries();
1037
- const originalTotalChars = summaries.reduce((s, c) => s + c.length, 0);
1038
-
1039
- // Use a generous budget so we can measure natural distillation savings
1040
- const result = distillSummaries(summaries, 100_000);
1041
-
1042
- console.log(
1043
- ` Summary distillation: ${result.savingsPercent}% savings (${result.originalChars} -> ${result.distilledChars} chars, ${result.summaryCount} summaries)`,
1044
- );
1045
-
1046
- assert.ok(
1047
- result.savingsPercent > 40,
1048
- `Summary distillation should save >40%, got ${result.savingsPercent}%`,
1049
- );
1050
- assert.equal(result.summaryCount, 4, "Should process all 4 summaries");
1051
-
1052
- // Verify key structured fields are preserved
1053
- assert.ok(
1054
- result.content.includes("provides:"),
1055
- "Distilled output should preserve 'provides' field",
1056
- );
1057
- assert.ok(
1058
- result.content.includes("key_files:"),
1059
- "Distilled output should preserve 'key_files' field",
1060
- );
1061
- assert.ok(
1062
- result.content.includes("key_decisions:"),
1063
- "Distilled output should preserve 'key_decisions' field",
1064
- );
1065
-
1066
- // Verify slice IDs are preserved
1067
- assert.ok(result.content.includes("S01"), "Should preserve S01 reference");
1068
- assert.ok(result.content.includes("S02"), "Should preserve S02 reference");
1069
- assert.ok(result.content.includes("S03"), "Should preserve S03 reference");
1070
- assert.ok(result.content.includes("S04"), "Should preserve S04 reference");
1071
- });
1072
-
1073
- // -----------------------------------------------------------------------
1074
- // Test 5: Combined Pipeline
1075
- // -----------------------------------------------------------------------
1076
- it("combined pipeline benchmark", () => {
1077
- const decisions = buildDecisions();
1078
- const requirements = buildRequirements();
1079
- const summaries = buildSummaries();
1080
- const knowledgeFile = SAMPLE_CODE;
1081
- const carryForward = buildVerbosePrompt();
1082
-
1083
- // --- Unoptimized baseline ---
1084
- const unoptDecisions = formatDecisionsAsMarkdownTable(decisions);
1085
- const unoptRequirements = formatRequirementsAsMarkdown(requirements);
1086
- const unoptSummaries = summaries.join("\n\n---\n\n");
1087
- const unoptKnowledge = knowledgeFile;
1088
- const unoptCarry = carryForward;
1089
-
1090
- const unoptimizedTotal =
1091
- unoptDecisions.length +
1092
- unoptRequirements.length +
1093
- unoptSummaries.length +
1094
- unoptKnowledge.length +
1095
- unoptCarry.length;
1096
-
1097
- // --- Optimized pipeline ---
1098
- // 1. Compact format for decisions and requirements
1099
- const optDecisions = formatDecisionsCompact(decisions);
1100
- const optRequirements = formatRequirementsCompact(requirements);
1101
-
1102
- // 2. Distill summaries
1103
- const distilled = distillSummaries(summaries, 100_000);
1104
-
1105
- // 3. Chunk knowledge file
1106
- const chunked = chunkByRelevance(knowledgeFile, "database config validation", {
1107
- maxChunks: 5,
1108
- minScore: 0.05,
1109
- });
1110
- const optKnowledge = chunked.chunks.map((c) => c.content).join("\n\n");
1111
-
1112
- // 4. Compress carry-forward
1113
- const compressed = compressPrompt(carryForward, { level: "moderate" });
1114
-
1115
- const optimizedTotal =
1116
- optDecisions.length +
1117
- optRequirements.length +
1118
- distilled.distilledChars +
1119
- optKnowledge.length +
1120
- compressed.compressedChars;
1121
-
1122
- const totalSavingsPercent =
1123
- ((unoptimizedTotal - optimizedTotal) / unoptimizedTotal) * 100;
1124
-
1125
- console.log(
1126
- ` Combined pipeline: ${totalSavingsPercent.toFixed(1)}% total savings (${unoptimizedTotal} -> ${optimizedTotal} chars)`,
1127
- );
1128
- console.log(
1129
- ` Decisions: ${unoptDecisions.length} -> ${optDecisions.length} chars`,
1130
- );
1131
- console.log(
1132
- ` Requirements: ${unoptRequirements.length} -> ${optRequirements.length} chars`,
1133
- );
1134
- console.log(
1135
- ` Summaries: ${unoptSummaries.length} -> ${distilled.distilledChars} chars`,
1136
- );
1137
- console.log(
1138
- ` Knowledge: ${unoptKnowledge.length} -> ${optKnowledge.length} chars`,
1139
- );
1140
- console.log(
1141
- ` Carry-fwd: ${unoptCarry.length} -> ${compressed.compressedChars} chars`,
1142
- );
1143
-
1144
- assert.ok(
1145
- totalSavingsPercent > 30,
1146
- `Combined pipeline should save >30%, got ${totalSavingsPercent.toFixed(1)}%`,
1147
- );
1148
- });
1149
-
1150
- // -----------------------------------------------------------------------
1151
- // Test 6: Cache Efficiency Analysis
1152
- // -----------------------------------------------------------------------
1153
- it("cache efficiency analysis", () => {
1154
- const sections_input = [
1155
- section(
1156
- "system-prompt",
1157
- "You are a GSD executor agent. Follow the task plan precisely. Report evidence of completion. Do not deviate from the assigned scope. Always verify your work before reporting done.",
1158
- ),
1159
- section(
1160
- "template-executor",
1161
- "## Output Format\n\nProvide your response in the following structure:\n1. Analysis of the task requirements\n2. Implementation plan\n3. Code changes with file paths\n4. Verification evidence\n5. Summary of changes made\n\nDo not include preamble or meta-commentary.",
1162
- ),
1163
- section(
1164
- "slice-plan",
1165
- "## Slice S03: Advanced Context Selection\n\nTasks:\n- T01: Implement semantic chunker with TF-IDF scoring\n- T02: Build summary distiller with progressive dropping\n- T03: Create cache optimizer with section classification\n- T04: Write benchmark tests for all optimization modules\n- T05: Integration test for combined pipeline",
1166
- ),
1167
- section(
1168
- "decisions",
1169
- formatDecisionsCompact(buildDecisions()),
1170
- ),
1171
- section(
1172
- "requirements",
1173
- formatRequirementsCompact(buildRequirements()),
1174
- ),
1175
- section(
1176
- "task-plan",
1177
- "## T04: Write benchmark tests\n\nCreate comprehensive benchmark tests that measure token savings from each optimization module. Include realistic fixture data and conservative assertion targets.\n\nFiles: src/extensions/gsd/tests/token-optimization-benchmark.test.ts\nVerify: npm run test -- --grep benchmark",
1178
- ),
1179
- section(
1180
- "task-context",
1181
- "Current implementation status: all optimization modules are complete and passing unit tests. This task adds end-to-end validation.\n\nRecent changes:\n- prompt-compressor.ts: added aggressive level\n- semantic-chunker.ts: improved boundary detection\n- summary-distiller.ts: added progressive field dropping",
1182
- ),
1183
- ];
1184
-
1185
- const optimized = optimizeForCaching(sections_input);
1186
-
1187
- console.log(
1188
- ` Cache efficiency: ${(optimized.cacheEfficiency * 100).toFixed(1)}% cacheable prefix (${optimized.cacheablePrefixChars} / ${optimized.totalChars} chars)`,
1189
- );
1190
- console.log(
1191
- ` Static sections: ${optimized.sectionCounts.static}, Semi-static: ${optimized.sectionCounts["semi-static"]}, Dynamic: ${optimized.sectionCounts.dynamic}`,
1192
- );
1193
-
1194
- assert.ok(
1195
- optimized.cacheEfficiency > 0.6,
1196
- `Cache efficiency should be >60%, got ${(optimized.cacheEfficiency * 100).toFixed(1)}%`,
1197
- );
1198
-
1199
- const anthropicSavings = estimateCacheSavings(optimized, "anthropic");
1200
- console.log(
1201
- ` Estimated Anthropic savings: ${(anthropicSavings * 100).toFixed(1)}%`,
1202
- );
1203
- assert.ok(
1204
- anthropicSavings > 0.5,
1205
- `Anthropic cache savings should be >50%, got ${(anthropicSavings * 100).toFixed(1)}%`,
1206
- );
1207
-
1208
- const openaiSavings = estimateCacheSavings(optimized, "openai");
1209
- console.log(
1210
- ` Estimated OpenAI savings: ${(openaiSavings * 100).toFixed(1)}%`,
1211
- );
1212
- assert.ok(
1213
- anthropicSavings > openaiSavings,
1214
- "Anthropic savings should exceed OpenAI savings (90% vs 50% discount)",
1215
- );
1216
- });
1217
-
1218
- // -----------------------------------------------------------------------
1219
- // Test 7: Provider-Aware Budget Accuracy
1220
- // -----------------------------------------------------------------------
1221
- it("provider-aware budget accuracy", () => {
1222
- const contextWindow = 200_000;
1223
-
1224
- const anthropicBudget = computeBudgets(contextWindow, "anthropic");
1225
- const openaiBudget = computeBudgets(contextWindow, "openai");
1226
-
1227
- const anthropicCharsPerToken = getCharsPerToken("anthropic");
1228
- const openaiCharsPerToken = getCharsPerToken("openai");
1229
-
1230
- console.log(
1231
- ` Anthropic: ${anthropicCharsPerToken} chars/token, inline budget: ${anthropicBudget.inlineContextBudgetChars} chars`,
1232
- );
1233
- console.log(
1234
- ` OpenAI: ${openaiCharsPerToken} chars/token, inline budget: ${openaiBudget.inlineContextBudgetChars} chars`,
1235
- );
1236
-
1237
- // OpenAI has higher chars-per-token (4.0 vs 3.5), so it gets more chars per budget
1238
- const charsDifference =
1239
- openaiBudget.inlineContextBudgetChars -
1240
- anthropicBudget.inlineContextBudgetChars;
1241
- const percentDifference =
1242
- (charsDifference / anthropicBudget.inlineContextBudgetChars) * 100;
1243
-
1244
- console.log(
1245
- ` OpenAI gets ${percentDifference.toFixed(1)}% more chars per budget unit (${charsDifference} chars difference)`,
1246
- );
1247
-
1248
- // OpenAI should get ~14% more chars (4.0/3.5 = 1.143)
1249
- assert.ok(
1250
- percentDifference > 10,
1251
- `OpenAI should get >10% more chars, got ${percentDifference.toFixed(1)}%`,
1252
- );
1253
- assert.ok(
1254
- percentDifference < 20,
1255
- `Difference should be <20%, got ${percentDifference.toFixed(1)}%`,
1256
- );
1257
-
1258
- // Verify token estimates differ for the same content
1259
- const sampleContent = SAMPLE_CODE;
1260
- const anthropicTokens = estimateTokensForProvider(sampleContent, "anthropic");
1261
- const openaiTokens = estimateTokensForProvider(sampleContent, "openai");
1262
-
1263
- console.log(
1264
- ` Same content (${sampleContent.length} chars): Anthropic estimates ${anthropicTokens} tokens, OpenAI estimates ${openaiTokens} tokens`,
1265
- );
1266
-
1267
- assert.ok(
1268
- anthropicTokens > openaiTokens,
1269
- "Anthropic should estimate more tokens (smaller chars-per-token ratio)",
1270
- );
1271
- });
1272
- });