@opengsd/get-shit-done-redux 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1466) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja-JP.md +870 -0
  3. package/README.ko-KR.md +861 -0
  4. package/README.md +300 -0
  5. package/README.pt-BR.md +492 -0
  6. package/README.zh-CN.md +842 -0
  7. package/agents/gsd-advisor-researcher.md +127 -0
  8. package/agents/gsd-ai-researcher.md +133 -0
  9. package/agents/gsd-assumptions-analyzer.md +105 -0
  10. package/agents/gsd-code-fixer.md +668 -0
  11. package/agents/gsd-code-reviewer.md +387 -0
  12. package/agents/gsd-codebase-mapper.md +853 -0
  13. package/agents/gsd-debug-session-manager.md +314 -0
  14. package/agents/gsd-debugger.md +1452 -0
  15. package/agents/gsd-doc-classifier.md +168 -0
  16. package/agents/gsd-doc-synthesizer.md +204 -0
  17. package/agents/gsd-doc-verifier.md +217 -0
  18. package/agents/gsd-doc-writer.md +615 -0
  19. package/agents/gsd-domain-researcher.md +153 -0
  20. package/agents/gsd-eval-auditor.md +191 -0
  21. package/agents/gsd-eval-planner.md +154 -0
  22. package/agents/gsd-executor.md +774 -0
  23. package/agents/gsd-framework-selector.md +160 -0
  24. package/agents/gsd-integration-checker.md +470 -0
  25. package/agents/gsd-intel-updater.md +342 -0
  26. package/agents/gsd-nyquist-auditor.md +203 -0
  27. package/agents/gsd-pattern-mapper.md +335 -0
  28. package/agents/gsd-phase-researcher.md +928 -0
  29. package/agents/gsd-plan-checker.md +978 -0
  30. package/agents/gsd-planner.md +1278 -0
  31. package/agents/gsd-project-researcher.md +677 -0
  32. package/agents/gsd-research-synthesizer.md +247 -0
  33. package/agents/gsd-roadmapper.md +688 -0
  34. package/agents/gsd-security-auditor.md +155 -0
  35. package/agents/gsd-ui-auditor.md +495 -0
  36. package/agents/gsd-ui-checker.md +309 -0
  37. package/agents/gsd-ui-researcher.md +380 -0
  38. package/agents/gsd-user-profiler.md +171 -0
  39. package/agents/gsd-verifier.md +917 -0
  40. package/bin/gsd-sdk.js +37 -0
  41. package/bin/install.js +11468 -0
  42. package/bin/lib/ui-safety-gate.cjs +107 -0
  43. package/commands/gsd/add-tests.md +42 -0
  44. package/commands/gsd/ai-integration-phase.md +37 -0
  45. package/commands/gsd/audit-fix.md +34 -0
  46. package/commands/gsd/audit-milestone.md +37 -0
  47. package/commands/gsd/audit-uat.md +24 -0
  48. package/commands/gsd/autonomous.md +46 -0
  49. package/commands/gsd/capture.md +62 -0
  50. package/commands/gsd/cleanup.md +24 -0
  51. package/commands/gsd/code-review.md +59 -0
  52. package/commands/gsd/complete-milestone.md +143 -0
  53. package/commands/gsd/config.md +58 -0
  54. package/commands/gsd/debug.md +52 -0
  55. package/commands/gsd/discuss-phase.md +76 -0
  56. package/commands/gsd/docs-update.md +49 -0
  57. package/commands/gsd/eval-review.md +33 -0
  58. package/commands/gsd/execute-phase.md +64 -0
  59. package/commands/gsd/explore.md +27 -0
  60. package/commands/gsd/extract-learnings.md +23 -0
  61. package/commands/gsd/fast.md +31 -0
  62. package/commands/gsd/forensics.md +57 -0
  63. package/commands/gsd/graphify.md +199 -0
  64. package/commands/gsd/health.md +31 -0
  65. package/commands/gsd/help.md +28 -0
  66. package/commands/gsd/import.md +41 -0
  67. package/commands/gsd/inbox.md +39 -0
  68. package/commands/gsd/ingest-docs.md +42 -0
  69. package/commands/gsd/manager.md +45 -0
  70. package/commands/gsd/map-codebase.md +83 -0
  71. package/commands/gsd/milestone-summary.md +51 -0
  72. package/commands/gsd/mvp-phase.md +45 -0
  73. package/commands/gsd/new-milestone.md +45 -0
  74. package/commands/gsd/new-project.md +47 -0
  75. package/commands/gsd/ns-context.md +23 -0
  76. package/commands/gsd/ns-ideate.md +24 -0
  77. package/commands/gsd/ns-manage.md +29 -0
  78. package/commands/gsd/ns-project.md +22 -0
  79. package/commands/gsd/ns-review.md +26 -0
  80. package/commands/gsd/ns-workflow.md +28 -0
  81. package/commands/gsd/pause-work.md +43 -0
  82. package/commands/gsd/phase.md +56 -0
  83. package/commands/gsd/plan-phase.md +62 -0
  84. package/commands/gsd/plan-review-convergence.md +59 -0
  85. package/commands/gsd/pr-branch.md +26 -0
  86. package/commands/gsd/profile-user.md +46 -0
  87. package/commands/gsd/progress.md +46 -0
  88. package/commands/gsd/quick.md +174 -0
  89. package/commands/gsd/resume-work.md +30 -0
  90. package/commands/gsd/review-backlog.md +63 -0
  91. package/commands/gsd/review.md +41 -0
  92. package/commands/gsd/secure-phase.md +36 -0
  93. package/commands/gsd/settings.md +29 -0
  94. package/commands/gsd/ship.md +24 -0
  95. package/commands/gsd/sketch.md +60 -0
  96. package/commands/gsd/spec-phase.md +63 -0
  97. package/commands/gsd/spike.md +57 -0
  98. package/commands/gsd/stats.md +19 -0
  99. package/commands/gsd/surface.md +155 -0
  100. package/commands/gsd/thread.md +24 -0
  101. package/commands/gsd/ui-phase.md +35 -0
  102. package/commands/gsd/ui-review.md +33 -0
  103. package/commands/gsd/ultraplan-phase.md +34 -0
  104. package/commands/gsd/undo.md +35 -0
  105. package/commands/gsd/update.md +48 -0
  106. package/commands/gsd/validate-phase.md +36 -0
  107. package/commands/gsd/verify-work.md +39 -0
  108. package/commands/gsd/workspace.md +52 -0
  109. package/commands/gsd/workstreams.md +70 -0
  110. package/get-shit-done/bin/check-latest-version.cjs +104 -0
  111. package/get-shit-done/bin/gsd-tools.cjs +1630 -0
  112. package/get-shit-done/bin/lib/active-workstream-store.cjs +85 -0
  113. package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
  114. package/get-shit-done/bin/lib/artifacts.cjs +53 -0
  115. package/get-shit-done/bin/lib/audit.cjs +755 -0
  116. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +39 -0
  117. package/get-shit-done/bin/lib/cjs-sdk-bridge.cjs +136 -0
  118. package/get-shit-done/bin/lib/clusters.cjs +135 -0
  119. package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
  120. package/get-shit-done/bin/lib/command-aliases.generated.cjs +824 -0
  121. package/get-shit-done/bin/lib/command-routing-hub.cjs +239 -0
  122. package/get-shit-done/bin/lib/commands.cjs +1035 -0
  123. package/get-shit-done/bin/lib/config-schema.cjs +31 -0
  124. package/get-shit-done/bin/lib/config.cjs +704 -0
  125. package/get-shit-done/bin/lib/configuration.generated.cjs +253 -0
  126. package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
  127. package/get-shit-done/bin/lib/core.cjs +1922 -0
  128. package/get-shit-done/bin/lib/decisions.cjs +19 -0
  129. package/get-shit-done/bin/lib/decisions.generated.cjs +121 -0
  130. package/get-shit-done/bin/lib/docs.cjs +270 -0
  131. package/get-shit-done/bin/lib/drift.cjs +388 -0
  132. package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
  133. package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
  134. package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
  135. package/get-shit-done/bin/lib/graphify.cjs +592 -0
  136. package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
  137. package/get-shit-done/bin/lib/init-command-router.cjs +174 -0
  138. package/get-shit-done/bin/lib/init.cjs +2096 -0
  139. package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
  140. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
  141. package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
  142. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  143. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  144. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  145. package/get-shit-done/bin/lib/installer-migrations.cjs +776 -0
  146. package/get-shit-done/bin/lib/intel.cjs +643 -0
  147. package/get-shit-done/bin/lib/learnings.cjs +379 -0
  148. package/get-shit-done/bin/lib/milestone.cjs +314 -0
  149. package/get-shit-done/bin/lib/model-catalog.cjs +136 -0
  150. package/get-shit-done/bin/lib/model-profiles.cjs +25 -0
  151. package/get-shit-done/bin/lib/phase-command-router.cjs +226 -0
  152. package/get-shit-done/bin/lib/phase.cjs +1490 -0
  153. package/get-shit-done/bin/lib/phases-command-router.cjs +97 -0
  154. package/get-shit-done/bin/lib/plan-scan.cjs +26 -0
  155. package/get-shit-done/bin/lib/plan-scan.generated.cjs +97 -0
  156. package/get-shit-done/bin/lib/planning-workspace.cjs +415 -0
  157. package/get-shit-done/bin/lib/profile-output.cjs +1130 -0
  158. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  159. package/get-shit-done/bin/lib/project-root.generated.cjs +117 -0
  160. package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
  161. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
  162. package/get-shit-done/bin/lib/roadmap-command-router.cjs +99 -0
  163. package/get-shit-done/bin/lib/roadmap.cjs +642 -0
  164. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
  165. package/get-shit-done/bin/lib/runtime-homes.cjs +185 -0
  166. package/get-shit-done/bin/lib/runtime-slash.cjs +109 -0
  167. package/get-shit-done/bin/lib/schema-detect.cjs +21 -0
  168. package/get-shit-done/bin/lib/schema-detect.generated.cjs +170 -0
  169. package/get-shit-done/bin/lib/secrets.cjs +20 -0
  170. package/get-shit-done/bin/lib/secrets.generated.cjs +37 -0
  171. package/get-shit-done/bin/lib/security.cjs +504 -0
  172. package/get-shit-done/bin/lib/shell-command-projection.cjs +552 -0
  173. package/get-shit-done/bin/lib/state-command-router.cjs +346 -0
  174. package/get-shit-done/bin/lib/state-document.cjs +12 -0
  175. package/get-shit-done/bin/lib/state-document.generated.cjs +127 -0
  176. package/get-shit-done/bin/lib/state.cjs +1940 -0
  177. package/get-shit-done/bin/lib/surface.cjs +430 -0
  178. package/get-shit-done/bin/lib/template.cjs +228 -0
  179. package/get-shit-done/bin/lib/uat.cjs +289 -0
  180. package/get-shit-done/bin/lib/validate-command-router.cjs +129 -0
  181. package/get-shit-done/bin/lib/verify-command-router.cjs +122 -0
  182. package/get-shit-done/bin/lib/verify.cjs +1458 -0
  183. package/get-shit-done/bin/lib/workstream-inventory-builder.generated.cjs +79 -0
  184. package/get-shit-done/bin/lib/workstream-inventory.cjs +132 -0
  185. package/get-shit-done/bin/lib/workstream-name-policy.cjs +19 -0
  186. package/get-shit-done/bin/lib/workstream-name-policy.generated.cjs +61 -0
  187. package/get-shit-done/bin/lib/workstream.cjs +374 -0
  188. package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
  189. package/get-shit-done/bin/verify-reapply-patches.cjs +336 -0
  190. package/get-shit-done/contexts/dev.md +21 -0
  191. package/get-shit-done/contexts/research.md +22 -0
  192. package/get-shit-done/contexts/review.md +23 -0
  193. package/get-shit-done/references/agent-contracts.md +79 -0
  194. package/get-shit-done/references/ai-evals.md +156 -0
  195. package/get-shit-done/references/ai-frameworks.md +186 -0
  196. package/get-shit-done/references/artifact-types.md +131 -0
  197. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  198. package/get-shit-done/references/checkpoints.md +814 -0
  199. package/get-shit-done/references/common-bug-patterns.md +114 -0
  200. package/get-shit-done/references/context-budget.md +85 -0
  201. package/get-shit-done/references/continuation-format.md +253 -0
  202. package/get-shit-done/references/debugger-philosophy.md +76 -0
  203. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  204. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  205. package/get-shit-done/references/domain-probes.md +125 -0
  206. package/get-shit-done/references/execute-mvp-tdd.md +81 -0
  207. package/get-shit-done/references/executor-examples.md +110 -0
  208. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  209. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  210. package/get-shit-done/references/gate-prompts.md +100 -0
  211. package/get-shit-done/references/gates.md +70 -0
  212. package/get-shit-done/references/git-integration.md +298 -0
  213. package/get-shit-done/references/git-planning-commit.md +40 -0
  214. package/get-shit-done/references/ios-scaffold.md +123 -0
  215. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  216. package/get-shit-done/references/model-profile-resolution.md +38 -0
  217. package/get-shit-done/references/model-profiles.md +245 -0
  218. package/get-shit-done/references/mvp-concepts.md +49 -0
  219. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  220. package/get-shit-done/references/planner-antipatterns.md +89 -0
  221. package/get-shit-done/references/planner-chunked.md +49 -0
  222. package/get-shit-done/references/planner-gap-closure.md +62 -0
  223. package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
  224. package/get-shit-done/references/planner-human-verify-mode.md +57 -0
  225. package/get-shit-done/references/planner-mvp-mode.md +53 -0
  226. package/get-shit-done/references/planner-reviews.md +39 -0
  227. package/get-shit-done/references/planner-revision.md +87 -0
  228. package/get-shit-done/references/planner-source-audit.md +73 -0
  229. package/get-shit-done/references/planning-config.md +471 -0
  230. package/get-shit-done/references/project-skills-discovery.md +19 -0
  231. package/get-shit-done/references/questioning.md +162 -0
  232. package/get-shit-done/references/revision-loop.md +97 -0
  233. package/get-shit-done/references/scout-codebase.md +51 -0
  234. package/get-shit-done/references/skeleton-template.md +48 -0
  235. package/get-shit-done/references/sketch-interactivity.md +41 -0
  236. package/get-shit-done/references/sketch-theme-system.md +94 -0
  237. package/get-shit-done/references/sketch-tooling.md +45 -0
  238. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  239. package/get-shit-done/references/spidr-splitting.md +69 -0
  240. package/get-shit-done/references/tdd.md +330 -0
  241. package/get-shit-done/references/thinking-models-debug.md +44 -0
  242. package/get-shit-done/references/thinking-models-execution.md +50 -0
  243. package/get-shit-done/references/thinking-models-planning.md +62 -0
  244. package/get-shit-done/references/thinking-models-research.md +50 -0
  245. package/get-shit-done/references/thinking-models-verification.md +55 -0
  246. package/get-shit-done/references/thinking-partner.md +96 -0
  247. package/get-shit-done/references/ui-brand.md +160 -0
  248. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  249. package/get-shit-done/references/user-profiling.md +681 -0
  250. package/get-shit-done/references/user-story-template.md +58 -0
  251. package/get-shit-done/references/verification-overrides.md +227 -0
  252. package/get-shit-done/references/verification-patterns.md +612 -0
  253. package/get-shit-done/references/verify-mvp-mode.md +85 -0
  254. package/get-shit-done/references/workstream-flag.md +111 -0
  255. package/get-shit-done/references/worktree-path-safety.md +89 -0
  256. package/get-shit-done/templates/AI-SPEC.md +246 -0
  257. package/get-shit-done/templates/DEBUG.md +169 -0
  258. package/get-shit-done/templates/README.md +77 -0
  259. package/get-shit-done/templates/SECURITY.md +61 -0
  260. package/get-shit-done/templates/UAT.md +265 -0
  261. package/get-shit-done/templates/UI-SPEC.md +100 -0
  262. package/get-shit-done/templates/VALIDATION.md +76 -0
  263. package/get-shit-done/templates/claude-md.md +145 -0
  264. package/get-shit-done/templates/codebase/architecture.md +255 -0
  265. package/get-shit-done/templates/codebase/concerns.md +310 -0
  266. package/get-shit-done/templates/codebase/conventions.md +307 -0
  267. package/get-shit-done/templates/codebase/integrations.md +280 -0
  268. package/get-shit-done/templates/codebase/stack.md +186 -0
  269. package/get-shit-done/templates/codebase/structure.md +285 -0
  270. package/get-shit-done/templates/codebase/testing.md +480 -0
  271. package/get-shit-done/templates/config.json +62 -0
  272. package/get-shit-done/templates/context.md +352 -0
  273. package/get-shit-done/templates/continue-here.md +78 -0
  274. package/get-shit-done/templates/copilot-instructions.md +7 -0
  275. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  276. package/get-shit-done/templates/dev-preferences.md +21 -0
  277. package/get-shit-done/templates/discovery.md +146 -0
  278. package/get-shit-done/templates/discussion-log.md +63 -0
  279. package/get-shit-done/templates/milestone-archive.md +123 -0
  280. package/get-shit-done/templates/milestone.md +115 -0
  281. package/get-shit-done/templates/phase-prompt.md +610 -0
  282. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  283. package/get-shit-done/templates/project.md +186 -0
  284. package/get-shit-done/templates/requirements.md +231 -0
  285. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  286. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  287. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  288. package/get-shit-done/templates/research-project/STACK.md +120 -0
  289. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  290. package/get-shit-done/templates/research.md +592 -0
  291. package/get-shit-done/templates/retrospective.md +54 -0
  292. package/get-shit-done/templates/roadmap.md +202 -0
  293. package/get-shit-done/templates/spec.md +307 -0
  294. package/get-shit-done/templates/state.md +184 -0
  295. package/get-shit-done/templates/summary-complex.md +59 -0
  296. package/get-shit-done/templates/summary-minimal.md +41 -0
  297. package/get-shit-done/templates/summary-standard.md +48 -0
  298. package/get-shit-done/templates/summary.md +248 -0
  299. package/get-shit-done/templates/user-profile.md +146 -0
  300. package/get-shit-done/templates/user-setup.md +311 -0
  301. package/get-shit-done/templates/verification-report.md +322 -0
  302. package/get-shit-done/workflows/add-backlog.md +101 -0
  303. package/get-shit-done/workflows/add-phase.md +123 -0
  304. package/get-shit-done/workflows/add-tests.md +365 -0
  305. package/get-shit-done/workflows/add-todo.md +171 -0
  306. package/get-shit-done/workflows/ai-integration-phase.md +305 -0
  307. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  308. package/get-shit-done/workflows/audit-fix.md +188 -0
  309. package/get-shit-done/workflows/audit-milestone.md +368 -0
  310. package/get-shit-done/workflows/audit-uat.md +120 -0
  311. package/get-shit-done/workflows/autonomous.md +805 -0
  312. package/get-shit-done/workflows/check-todos.md +190 -0
  313. package/get-shit-done/workflows/cleanup.md +165 -0
  314. package/get-shit-done/workflows/code-review-fix.md +512 -0
  315. package/get-shit-done/workflows/code-review.md +666 -0
  316. package/get-shit-done/workflows/complete-milestone.md +865 -0
  317. package/get-shit-done/workflows/debug.md +242 -0
  318. package/get-shit-done/workflows/diagnose-issues.md +251 -0
  319. package/get-shit-done/workflows/discovery-phase.md +291 -0
  320. package/get-shit-done/workflows/discuss-phase/modes/advisor.md +175 -0
  321. package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
  322. package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
  323. package/get-shit-done/workflows/discuss-phase/modes/auto.md +56 -0
  324. package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
  325. package/get-shit-done/workflows/discuss-phase/modes/chain.md +97 -0
  326. package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
  327. package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
  328. package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
  329. package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
  330. package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
  331. package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
  332. package/get-shit-done/workflows/discuss-phase-assumptions.md +685 -0
  333. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  334. package/get-shit-done/workflows/discuss-phase.md +499 -0
  335. package/get-shit-done/workflows/do.md +122 -0
  336. package/get-shit-done/workflows/docs-update.md +1172 -0
  337. package/get-shit-done/workflows/edit-phase.md +305 -0
  338. package/get-shit-done/workflows/eval-review.md +166 -0
  339. package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +81 -0
  340. package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  341. package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +116 -0
  342. package/get-shit-done/workflows/execute-phase.md +1717 -0
  343. package/get-shit-done/workflows/execute-plan.md +536 -0
  344. package/get-shit-done/workflows/explore.md +154 -0
  345. package/get-shit-done/workflows/extract-learnings.md +253 -0
  346. package/get-shit-done/workflows/fast.md +124 -0
  347. package/get-shit-done/workflows/forensics.md +289 -0
  348. package/get-shit-done/workflows/graduation.md +206 -0
  349. package/get-shit-done/workflows/health.md +234 -0
  350. package/get-shit-done/workflows/help/modes/brief.md +22 -0
  351. package/get-shit-done/workflows/help/modes/default.md +50 -0
  352. package/get-shit-done/workflows/help/modes/full.md +784 -0
  353. package/get-shit-done/workflows/help/modes/topic.md +74 -0
  354. package/get-shit-done/workflows/help.md +24 -0
  355. package/get-shit-done/workflows/import.md +264 -0
  356. package/get-shit-done/workflows/inbox.md +387 -0
  357. package/get-shit-done/workflows/ingest-docs.md +339 -0
  358. package/get-shit-done/workflows/insert-phase.md +162 -0
  359. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  360. package/get-shit-done/workflows/list-workspaces.md +67 -0
  361. package/get-shit-done/workflows/manager.md +403 -0
  362. package/get-shit-done/workflows/map-codebase.md +454 -0
  363. package/get-shit-done/workflows/milestone-summary.md +234 -0
  364. package/get-shit-done/workflows/mvp-phase.md +232 -0
  365. package/get-shit-done/workflows/new-milestone.md +645 -0
  366. package/get-shit-done/workflows/new-project.md +1487 -0
  367. package/get-shit-done/workflows/new-workspace.md +250 -0
  368. package/get-shit-done/workflows/next.md +231 -0
  369. package/get-shit-done/workflows/node-repair.md +92 -0
  370. package/get-shit-done/workflows/note.md +158 -0
  371. package/get-shit-done/workflows/pause-work.md +254 -0
  372. package/get-shit-done/workflows/plan-milestone-gaps.md +291 -0
  373. package/get-shit-done/workflows/plan-phase.md +1800 -0
  374. package/get-shit-done/workflows/plan-review-convergence.md +340 -0
  375. package/get-shit-done/workflows/plant-seed.md +240 -0
  376. package/get-shit-done/workflows/pr-branch.md +157 -0
  377. package/get-shit-done/workflows/profile-user.md +463 -0
  378. package/get-shit-done/workflows/progress.md +660 -0
  379. package/get-shit-done/workflows/quick.md +1049 -0
  380. package/get-shit-done/workflows/reapply-patches.md +426 -0
  381. package/get-shit-done/workflows/remove-phase.md +166 -0
  382. package/get-shit-done/workflows/remove-workspace.md +118 -0
  383. package/get-shit-done/workflows/resume-project.md +342 -0
  384. package/get-shit-done/workflows/review.md +633 -0
  385. package/get-shit-done/workflows/scan.md +115 -0
  386. package/get-shit-done/workflows/secure-phase.md +190 -0
  387. package/get-shit-done/workflows/session-report.md +146 -0
  388. package/get-shit-done/workflows/settings-advanced.md +590 -0
  389. package/get-shit-done/workflows/settings-integrations.md +292 -0
  390. package/get-shit-done/workflows/settings.md +545 -0
  391. package/get-shit-done/workflows/ship.md +366 -0
  392. package/get-shit-done/workflows/sketch-wrap-up.md +296 -0
  393. package/get-shit-done/workflows/sketch.md +371 -0
  394. package/get-shit-done/workflows/spec-phase.md +262 -0
  395. package/get-shit-done/workflows/spike-wrap-up.md +317 -0
  396. package/get-shit-done/workflows/spike.md +463 -0
  397. package/get-shit-done/workflows/stats.md +90 -0
  398. package/get-shit-done/workflows/sync-skills.md +182 -0
  399. package/get-shit-done/workflows/thread.md +232 -0
  400. package/get-shit-done/workflows/transition.md +704 -0
  401. package/get-shit-done/workflows/ui-phase.md +338 -0
  402. package/get-shit-done/workflows/ui-review.md +203 -0
  403. package/get-shit-done/workflows/ultraplan-phase.md +209 -0
  404. package/get-shit-done/workflows/undo.md +314 -0
  405. package/get-shit-done/workflows/update.md +664 -0
  406. package/get-shit-done/workflows/validate-phase.md +189 -0
  407. package/get-shit-done/workflows/verify-phase.md +554 -0
  408. package/get-shit-done/workflows/verify-work.md +791 -0
  409. package/hooks/dist/gsd-check-update-worker.js +117 -0
  410. package/hooks/dist/gsd-check-update.js +64 -0
  411. package/hooks/dist/gsd-context-monitor.js +192 -0
  412. package/hooks/dist/gsd-graphify-update.sh +158 -0
  413. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  414. package/hooks/dist/gsd-prompt-guard.js +97 -0
  415. package/hooks/dist/gsd-read-guard.js +101 -0
  416. package/hooks/dist/gsd-read-injection-scanner.js +152 -0
  417. package/hooks/dist/gsd-session-state.sh +59 -0
  418. package/hooks/dist/gsd-statusline.js +537 -0
  419. package/hooks/dist/gsd-update-banner.js +134 -0
  420. package/hooks/dist/gsd-validate-commit.sh +57 -0
  421. package/hooks/dist/gsd-workflow-guard.js +94 -0
  422. package/hooks/dist/lib/git-cmd.js +150 -0
  423. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  424. package/hooks/gsd-check-update-worker.js +117 -0
  425. package/hooks/gsd-check-update.js +64 -0
  426. package/hooks/gsd-context-monitor.js +192 -0
  427. package/hooks/gsd-graphify-update.sh +158 -0
  428. package/hooks/gsd-phase-boundary.sh +47 -0
  429. package/hooks/gsd-prompt-guard.js +97 -0
  430. package/hooks/gsd-read-guard.js +101 -0
  431. package/hooks/gsd-read-injection-scanner.js +152 -0
  432. package/hooks/gsd-session-state.sh +59 -0
  433. package/hooks/gsd-statusline.js +537 -0
  434. package/hooks/gsd-update-banner.js +134 -0
  435. package/hooks/gsd-validate-commit.sh +57 -0
  436. package/hooks/gsd-workflow-guard.js +94 -0
  437. package/hooks/lib/git-cmd.js +150 -0
  438. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  439. package/package.json +98 -0
  440. package/scripts/audit-workflow-script-paths.cjs +73 -0
  441. package/scripts/base64-scan.sh +262 -0
  442. package/scripts/build-hooks.js +227 -0
  443. package/scripts/changeset/cli.cjs +408 -0
  444. package/scripts/changeset/github-release-notes.cjs +198 -0
  445. package/scripts/changeset/lint.cjs +110 -0
  446. package/scripts/changeset/new.cjs +137 -0
  447. package/scripts/changeset/parse.cjs +114 -0
  448. package/scripts/changeset/render.cjs +34 -0
  449. package/scripts/changeset/serialize.cjs +130 -0
  450. package/scripts/command-contract-helpers.cjs +64 -0
  451. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  452. package/scripts/fix-slash-commands.cjs +147 -0
  453. package/scripts/gen-inventory-manifest.cjs +109 -0
  454. package/scripts/lint-command-contract.cjs +108 -0
  455. package/scripts/lint-descriptions.cjs +83 -0
  456. package/scripts/lint-docs-required.cjs +222 -0
  457. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  458. package/scripts/lint-no-source-grep.cjs +174 -0
  459. package/scripts/lint-pr-check-project-dir.cjs +98 -0
  460. package/scripts/lint-shared-module-handsync.cjs +331 -0
  461. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  462. package/scripts/lint-skill-deps.cjs +180 -0
  463. package/scripts/lint-test-file-count.allowlist.json +35 -0
  464. package/scripts/lint-test-file-count.cjs +190 -0
  465. package/scripts/pr-template-policy.cjs +268 -0
  466. package/scripts/prompt-injection-scan.sh +203 -0
  467. package/scripts/release-tarball-smoke.cjs +677 -0
  468. package/scripts/run-tests.cjs +178 -0
  469. package/scripts/secret-scan.sh +229 -0
  470. package/scripts/shared-module-handsync-allowlist.json +145 -0
  471. package/scripts/strip-prose-atrefs.cjs +106 -0
  472. package/scripts/sync-rulesets.sh +34 -0
  473. package/scripts/verify-tarball-sdk-dist.sh +69 -0
  474. package/sdk/dist/cli-transport.d.ts +19 -0
  475. package/sdk/dist/cli-transport.d.ts.map +1 -0
  476. package/sdk/dist/cli-transport.js +104 -0
  477. package/sdk/dist/cli-transport.js.map +1 -0
  478. package/sdk/dist/cli.d.ts +46 -0
  479. package/sdk/dist/cli.d.ts.map +1 -0
  480. package/sdk/dist/cli.js +511 -0
  481. package/sdk/dist/cli.js.map +1 -0
  482. package/sdk/dist/config.d.ts +108 -0
  483. package/sdk/dist/config.d.ts.map +1 -0
  484. package/sdk/dist/config.js +116 -0
  485. package/sdk/dist/config.js.map +1 -0
  486. package/sdk/dist/configuration/index.d.ts +85 -0
  487. package/sdk/dist/configuration/index.d.ts.map +1 -0
  488. package/sdk/dist/configuration/index.js +257 -0
  489. package/sdk/dist/configuration/index.js.map +1 -0
  490. package/sdk/dist/context-engine.d.ts +49 -0
  491. package/sdk/dist/context-engine.d.ts.map +1 -0
  492. package/sdk/dist/context-engine.js +142 -0
  493. package/sdk/dist/context-engine.js.map +1 -0
  494. package/sdk/dist/context-truncation.d.ts +33 -0
  495. package/sdk/dist/context-truncation.d.ts.map +1 -0
  496. package/sdk/dist/context-truncation.js +197 -0
  497. package/sdk/dist/context-truncation.js.map +1 -0
  498. package/sdk/dist/errors.d.ts +46 -0
  499. package/sdk/dist/errors.d.ts.map +1 -0
  500. package/sdk/dist/errors.js +64 -0
  501. package/sdk/dist/errors.js.map +1 -0
  502. package/sdk/dist/event-stream.d.ts +53 -0
  503. package/sdk/dist/event-stream.d.ts.map +1 -0
  504. package/sdk/dist/event-stream.js +321 -0
  505. package/sdk/dist/event-stream.js.map +1 -0
  506. package/sdk/dist/golden/capture.d.ts +15 -0
  507. package/sdk/dist/golden/capture.d.ts.map +1 -0
  508. package/sdk/dist/golden/capture.js +67 -0
  509. package/sdk/dist/golden/capture.js.map +1 -0
  510. package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
  511. package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
  512. package/sdk/dist/golden/golden-integration-covered.js +30 -0
  513. package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
  514. package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
  515. package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
  516. package/sdk/dist/golden/golden-mutation-covered.js +17 -0
  517. package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
  518. package/sdk/dist/golden/golden-policy.d.ts +10 -0
  519. package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
  520. package/sdk/dist/golden/golden-policy.js +98 -0
  521. package/sdk/dist/golden/golden-policy.js.map +1 -0
  522. package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
  523. package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
  524. package/sdk/dist/golden/init-golden-normalize.js +14 -0
  525. package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
  526. package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
  527. package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
  528. package/sdk/dist/golden/read-only-golden-rows.js +67 -0
  529. package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
  530. package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
  531. package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
  532. package/sdk/dist/golden/registry-canonical-commands.js +30 -0
  533. package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
  534. package/sdk/dist/gsd-tools-error.d.ts +23 -0
  535. package/sdk/dist/gsd-tools-error.d.ts.map +1 -0
  536. package/sdk/dist/gsd-tools-error.js +29 -0
  537. package/sdk/dist/gsd-tools-error.js.map +1 -0
  538. package/sdk/dist/gsd-tools.d.ts +97 -0
  539. package/sdk/dist/gsd-tools.d.ts.map +1 -0
  540. package/sdk/dist/gsd-tools.js +168 -0
  541. package/sdk/dist/gsd-tools.js.map +1 -0
  542. package/sdk/dist/gsd-transport-policy.d.ts +10 -0
  543. package/sdk/dist/gsd-transport-policy.d.ts.map +1 -0
  544. package/sdk/dist/gsd-transport-policy.js +32 -0
  545. package/sdk/dist/gsd-transport-policy.js.map +1 -0
  546. package/sdk/dist/gsd-transport.d.ts +39 -0
  547. package/sdk/dist/gsd-transport.d.ts.map +1 -0
  548. package/sdk/dist/gsd-transport.js +78 -0
  549. package/sdk/dist/gsd-transport.js.map +1 -0
  550. package/sdk/dist/index.d.ts +127 -0
  551. package/sdk/dist/index.d.ts.map +1 -0
  552. package/sdk/dist/index.js +300 -0
  553. package/sdk/dist/index.js.map +1 -0
  554. package/sdk/dist/init-runner.d.ts +90 -0
  555. package/sdk/dist/init-runner.d.ts.map +1 -0
  556. package/sdk/dist/init-runner.js +613 -0
  557. package/sdk/dist/init-runner.js.map +1 -0
  558. package/sdk/dist/logger.d.ts +50 -0
  559. package/sdk/dist/logger.d.ts.map +1 -0
  560. package/sdk/dist/logger.js +70 -0
  561. package/sdk/dist/logger.js.map +1 -0
  562. package/sdk/dist/model-catalog.d.ts +31 -0
  563. package/sdk/dist/model-catalog.d.ts.map +1 -0
  564. package/sdk/dist/model-catalog.js +31 -0
  565. package/sdk/dist/model-catalog.js.map +1 -0
  566. package/sdk/dist/phase-prompt.d.ts +72 -0
  567. package/sdk/dist/phase-prompt.d.ts.map +1 -0
  568. package/sdk/dist/phase-prompt.js +213 -0
  569. package/sdk/dist/phase-prompt.js.map +1 -0
  570. package/sdk/dist/phase-runner.d.ts +145 -0
  571. package/sdk/dist/phase-runner.d.ts.map +1 -0
  572. package/sdk/dist/phase-runner.js +1206 -0
  573. package/sdk/dist/phase-runner.js.map +1 -0
  574. package/sdk/dist/plan-parser.d.ts +55 -0
  575. package/sdk/dist/plan-parser.d.ts.map +1 -0
  576. package/sdk/dist/plan-parser.js +389 -0
  577. package/sdk/dist/plan-parser.js.map +1 -0
  578. package/sdk/dist/planning-journal.d.ts +64 -0
  579. package/sdk/dist/planning-journal.d.ts.map +1 -0
  580. package/sdk/dist/planning-journal.js +88 -0
  581. package/sdk/dist/planning-journal.js.map +1 -0
  582. package/sdk/dist/planning-runtime.d.ts +67 -0
  583. package/sdk/dist/planning-runtime.d.ts.map +1 -0
  584. package/sdk/dist/planning-runtime.js +58 -0
  585. package/sdk/dist/planning-runtime.js.map +1 -0
  586. package/sdk/dist/project-root/index.d.ts +46 -0
  587. package/sdk/dist/project-root/index.d.ts.map +1 -0
  588. package/sdk/dist/project-root/index.js +138 -0
  589. package/sdk/dist/project-root/index.js.map +1 -0
  590. package/sdk/dist/prompt-builder.d.ts +44 -0
  591. package/sdk/dist/prompt-builder.d.ts.map +1 -0
  592. package/sdk/dist/prompt-builder.js +180 -0
  593. package/sdk/dist/prompt-builder.js.map +1 -0
  594. package/sdk/dist/prompt-sanitizer.d.ts +35 -0
  595. package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
  596. package/sdk/dist/prompt-sanitizer.js +101 -0
  597. package/sdk/dist/prompt-sanitizer.js.map +1 -0
  598. package/sdk/dist/query/active-workstream-store.d.ts +7 -0
  599. package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
  600. package/sdk/dist/query/active-workstream-store.js +56 -0
  601. package/sdk/dist/query/active-workstream-store.js.map +1 -0
  602. package/sdk/dist/query/agent-failure-classifier.d.ts +38 -0
  603. package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
  604. package/sdk/dist/query/agent-failure-classifier.js +83 -0
  605. package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
  606. package/sdk/dist/query/audit-open.d.ts +46 -0
  607. package/sdk/dist/query/audit-open.d.ts.map +1 -0
  608. package/sdk/dist/query/audit-open.js +662 -0
  609. package/sdk/dist/query/audit-open.js.map +1 -0
  610. package/sdk/dist/query/check-auto-mode.d.ts +13 -0
  611. package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
  612. package/sdk/dist/query/check-auto-mode.js +40 -0
  613. package/sdk/dist/query/check-auto-mode.js.map +1 -0
  614. package/sdk/dist/query/check-completion.d.ts +10 -0
  615. package/sdk/dist/query/check-completion.d.ts.map +1 -0
  616. package/sdk/dist/query/check-completion.js +157 -0
  617. package/sdk/dist/query/check-completion.js.map +1 -0
  618. package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
  619. package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
  620. package/sdk/dist/query/check-decision-coverage.js +472 -0
  621. package/sdk/dist/query/check-decision-coverage.js.map +1 -0
  622. package/sdk/dist/query/check-gates.d.ts +10 -0
  623. package/sdk/dist/query/check-gates.d.ts.map +1 -0
  624. package/sdk/dist/query/check-gates.js +89 -0
  625. package/sdk/dist/query/check-gates.js.map +1 -0
  626. package/sdk/dist/query/check-ship-ready.d.ts +17 -0
  627. package/sdk/dist/query/check-ship-ready.d.ts.map +1 -0
  628. package/sdk/dist/query/check-ship-ready.js +121 -0
  629. package/sdk/dist/query/check-ship-ready.js.map +1 -0
  630. package/sdk/dist/query/check-verification-status.d.ts +10 -0
  631. package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
  632. package/sdk/dist/query/check-verification-status.js +142 -0
  633. package/sdk/dist/query/check-verification-status.js.map +1 -0
  634. package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
  635. package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
  636. package/sdk/dist/query/command-aliases.generated.js +133 -0
  637. package/sdk/dist/query/command-aliases.generated.js.map +1 -0
  638. package/sdk/dist/query/command-catalog.d.ts +9 -0
  639. package/sdk/dist/query/command-catalog.d.ts.map +1 -0
  640. package/sdk/dist/query/command-catalog.js +17 -0
  641. package/sdk/dist/query/command-catalog.js.map +1 -0
  642. package/sdk/dist/query/command-definition.d.ts +19 -0
  643. package/sdk/dist/query/command-definition.d.ts.map +1 -0
  644. package/sdk/dist/query/command-definition.js +44 -0
  645. package/sdk/dist/query/command-definition.js.map +1 -0
  646. package/sdk/dist/query/command-family-handlers.d.ts +3 -0
  647. package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
  648. package/sdk/dist/query/command-family-handlers.js +101 -0
  649. package/sdk/dist/query/command-family-handlers.js.map +1 -0
  650. package/sdk/dist/query/command-manifest.d.ts +2 -0
  651. package/sdk/dist/query/command-manifest.d.ts.map +1 -0
  652. package/sdk/dist/query/command-manifest.init.d.ts +6 -0
  653. package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
  654. package/sdk/dist/query/command-manifest.init.js +23 -0
  655. package/sdk/dist/query/command-manifest.init.js.map +1 -0
  656. package/sdk/dist/query/command-manifest.js +17 -0
  657. package/sdk/dist/query/command-manifest.js.map +1 -0
  658. package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
  659. package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
  660. package/sdk/dist/query/command-manifest.non-family.js +60 -0
  661. package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
  662. package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
  663. package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
  664. package/sdk/dist/query/command-manifest.phase.js +16 -0
  665. package/sdk/dist/query/command-manifest.phase.js.map +1 -0
  666. package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
  667. package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
  668. package/sdk/dist/query/command-manifest.phases.js +10 -0
  669. package/sdk/dist/query/command-manifest.phases.js.map +1 -0
  670. package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
  671. package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
  672. package/sdk/dist/query/command-manifest.roadmap.js +10 -0
  673. package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
  674. package/sdk/dist/query/command-manifest.state.d.ts +9 -0
  675. package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
  676. package/sdk/dist/query/command-manifest.state.js +30 -0
  677. package/sdk/dist/query/command-manifest.state.js.map +1 -0
  678. package/sdk/dist/query/command-manifest.types.d.ts +12 -0
  679. package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
  680. package/sdk/dist/query/command-manifest.types.js +2 -0
  681. package/sdk/dist/query/command-manifest.types.js.map +1 -0
  682. package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
  683. package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
  684. package/sdk/dist/query/command-manifest.validate.js +10 -0
  685. package/sdk/dist/query/command-manifest.validate.js.map +1 -0
  686. package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
  687. package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
  688. package/sdk/dist/query/command-manifest.verify.js +16 -0
  689. package/sdk/dist/query/command-manifest.verify.js.map +1 -0
  690. package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
  691. package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
  692. package/sdk/dist/query/command-static-catalog-domain.js +110 -0
  693. package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
  694. package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
  695. package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
  696. package/sdk/dist/query/command-static-catalog-foundation.js +106 -0
  697. package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
  698. package/sdk/dist/query/command-topology.d.ts +32 -0
  699. package/sdk/dist/query/command-topology.d.ts.map +1 -0
  700. package/sdk/dist/query/command-topology.js +66 -0
  701. package/sdk/dist/query/command-topology.js.map +1 -0
  702. package/sdk/dist/query/commands-list.d.ts +14 -0
  703. package/sdk/dist/query/commands-list.d.ts.map +1 -0
  704. package/sdk/dist/query/commands-list.js +18 -0
  705. package/sdk/dist/query/commands-list.js.map +1 -0
  706. package/sdk/dist/query/commit.d.ts +179 -0
  707. package/sdk/dist/query/commit.d.ts.map +1 -0
  708. package/sdk/dist/query/commit.js +632 -0
  709. package/sdk/dist/query/commit.js.map +1 -0
  710. package/sdk/dist/query/config-gates.d.ts +12 -0
  711. package/sdk/dist/query/config-gates.d.ts.map +1 -0
  712. package/sdk/dist/query/config-gates.js +66 -0
  713. package/sdk/dist/query/config-gates.js.map +1 -0
  714. package/sdk/dist/query/config-mutation.d.ts +86 -0
  715. package/sdk/dist/query/config-mutation.d.ts.map +1 -0
  716. package/sdk/dist/query/config-mutation.js +602 -0
  717. package/sdk/dist/query/config-mutation.js.map +1 -0
  718. package/sdk/dist/query/config-query.d.ts +57 -0
  719. package/sdk/dist/query/config-query.d.ts.map +1 -0
  720. package/sdk/dist/query/config-query.js +277 -0
  721. package/sdk/dist/query/config-query.js.map +1 -0
  722. package/sdk/dist/query/config-schema.d.ts +19 -0
  723. package/sdk/dist/query/config-schema.d.ts.map +1 -0
  724. package/sdk/dist/query/config-schema.js +26 -0
  725. package/sdk/dist/query/config-schema.js.map +1 -0
  726. package/sdk/dist/query/decisions.d.ts +58 -0
  727. package/sdk/dist/query/decisions.d.ts.map +1 -0
  728. package/sdk/dist/query/decisions.js +165 -0
  729. package/sdk/dist/query/decisions.js.map +1 -0
  730. package/sdk/dist/query/detect-custom-files.d.ts +11 -0
  731. package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
  732. package/sdk/dist/query/detect-custom-files.js +89 -0
  733. package/sdk/dist/query/detect-custom-files.js.map +1 -0
  734. package/sdk/dist/query/detect-phase-type.d.ts +9 -0
  735. package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
  736. package/sdk/dist/query/detect-phase-type.js +124 -0
  737. package/sdk/dist/query/detect-phase-type.js.map +1 -0
  738. package/sdk/dist/query/docs-init.d.ts +26 -0
  739. package/sdk/dist/query/docs-init.d.ts.map +1 -0
  740. package/sdk/dist/query/docs-init.js +231 -0
  741. package/sdk/dist/query/docs-init.js.map +1 -0
  742. package/sdk/dist/query/fallow-audit.d.ts +44 -0
  743. package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
  744. package/sdk/dist/query/fallow-audit.js +44 -0
  745. package/sdk/dist/query/fallow-audit.js.map +1 -0
  746. package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
  747. package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
  748. package/sdk/dist/query/frontmatter-mutation.js +299 -0
  749. package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
  750. package/sdk/dist/query/frontmatter.d.ts +93 -0
  751. package/sdk/dist/query/frontmatter.d.ts.map +1 -0
  752. package/sdk/dist/query/frontmatter.js +364 -0
  753. package/sdk/dist/query/frontmatter.js.map +1 -0
  754. package/sdk/dist/query/helpers.d.ts +194 -0
  755. package/sdk/dist/query/helpers.d.ts.map +1 -0
  756. package/sdk/dist/query/helpers.js +540 -0
  757. package/sdk/dist/query/helpers.js.map +1 -0
  758. package/sdk/dist/query/index.d.ts +8 -0
  759. package/sdk/dist/query/index.d.ts.map +1 -0
  760. package/sdk/dist/query/index.js +6 -0
  761. package/sdk/dist/query/index.js.map +1 -0
  762. package/sdk/dist/query/init-complex.d.ts +47 -0
  763. package/sdk/dist/query/init-complex.d.ts.map +1 -0
  764. package/sdk/dist/query/init-complex.js +735 -0
  765. package/sdk/dist/query/init-complex.js.map +1 -0
  766. package/sdk/dist/query/init.d.ts +106 -0
  767. package/sdk/dist/query/init.d.ts.map +1 -0
  768. package/sdk/dist/query/init.js +1228 -0
  769. package/sdk/dist/query/init.js.map +1 -0
  770. package/sdk/dist/query/intel.d.ts +43 -0
  771. package/sdk/dist/query/intel.d.ts.map +1 -0
  772. package/sdk/dist/query/intel.js +416 -0
  773. package/sdk/dist/query/intel.js.map +1 -0
  774. package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
  775. package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
  776. package/sdk/dist/query/mutation-event-decorator.js +28 -0
  777. package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
  778. package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
  779. package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
  780. package/sdk/dist/query/mutation-event-mapper.js +70 -0
  781. package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
  782. package/sdk/dist/query/mvp.d.ts +113 -0
  783. package/sdk/dist/query/mvp.d.ts.map +1 -0
  784. package/sdk/dist/query/mvp.js +225 -0
  785. package/sdk/dist/query/mvp.js.map +1 -0
  786. package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
  787. package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
  788. package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
  789. package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
  790. package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
  791. package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
  792. package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
  793. package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
  794. package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
  795. package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
  796. package/sdk/dist/query/phase-lifecycle.js +1823 -0
  797. package/sdk/dist/query/phase-lifecycle.js.map +1 -0
  798. package/sdk/dist/query/phase-list-queries.d.ts +20 -0
  799. package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
  800. package/sdk/dist/query/phase-list-queries.js +129 -0
  801. package/sdk/dist/query/phase-list-queries.js.map +1 -0
  802. package/sdk/dist/query/phase-ready.d.ts +9 -0
  803. package/sdk/dist/query/phase-ready.d.ts.map +1 -0
  804. package/sdk/dist/query/phase-ready.js +132 -0
  805. package/sdk/dist/query/phase-ready.js.map +1 -0
  806. package/sdk/dist/query/phase-roadmap-mutation.d.ts +25 -0
  807. package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
  808. package/sdk/dist/query/phase-roadmap-mutation.js +76 -0
  809. package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
  810. package/sdk/dist/query/phase-uat-passed.d.ts +46 -0
  811. package/sdk/dist/query/phase-uat-passed.d.ts.map +1 -0
  812. package/sdk/dist/query/phase-uat-passed.js +238 -0
  813. package/sdk/dist/query/phase-uat-passed.js.map +1 -0
  814. package/sdk/dist/query/phase.d.ts +104 -0
  815. package/sdk/dist/query/phase.d.ts.map +1 -0
  816. package/sdk/dist/query/phase.js +617 -0
  817. package/sdk/dist/query/phase.js.map +1 -0
  818. package/sdk/dist/query/pipeline.d.ts +53 -0
  819. package/sdk/dist/query/pipeline.d.ts.map +1 -0
  820. package/sdk/dist/query/pipeline.js +198 -0
  821. package/sdk/dist/query/pipeline.js.map +1 -0
  822. package/sdk/dist/query/plan-scan.d.ts +14 -0
  823. package/sdk/dist/query/plan-scan.d.ts.map +1 -0
  824. package/sdk/dist/query/plan-scan.js +70 -0
  825. package/sdk/dist/query/plan-scan.js.map +1 -0
  826. package/sdk/dist/query/plan-task-structure.d.ts +9 -0
  827. package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
  828. package/sdk/dist/query/plan-task-structure.js +59 -0
  829. package/sdk/dist/query/plan-task-structure.js.map +1 -0
  830. package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
  831. package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
  832. package/sdk/dist/query/profile-extract-messages.js +195 -0
  833. package/sdk/dist/query/profile-extract-messages.js.map +1 -0
  834. package/sdk/dist/query/profile-output.d.ts +11 -0
  835. package/sdk/dist/query/profile-output.d.ts.map +1 -0
  836. package/sdk/dist/query/profile-output.js +873 -0
  837. package/sdk/dist/query/profile-output.js.map +1 -0
  838. package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
  839. package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
  840. package/sdk/dist/query/profile-questionnaire-data.js +171 -0
  841. package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
  842. package/sdk/dist/query/profile-sample.d.ts +22 -0
  843. package/sdk/dist/query/profile-sample.d.ts.map +1 -0
  844. package/sdk/dist/query/profile-sample.js +136 -0
  845. package/sdk/dist/query/profile-sample.js.map +1 -0
  846. package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
  847. package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
  848. package/sdk/dist/query/profile-scan-sessions.js +137 -0
  849. package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
  850. package/sdk/dist/query/profile.d.ts +61 -0
  851. package/sdk/dist/query/profile.d.ts.map +1 -0
  852. package/sdk/dist/query/profile.js +307 -0
  853. package/sdk/dist/query/profile.js.map +1 -0
  854. package/sdk/dist/query/progress.d.ts +77 -0
  855. package/sdk/dist/query/progress.d.ts.map +1 -0
  856. package/sdk/dist/query/progress.js +481 -0
  857. package/sdk/dist/query/progress.js.map +1 -0
  858. package/sdk/dist/query/prompt-budget.d.ts +14 -0
  859. package/sdk/dist/query/prompt-budget.d.ts.map +1 -0
  860. package/sdk/dist/query/prompt-budget.js +417 -0
  861. package/sdk/dist/query/prompt-budget.js.map +1 -0
  862. package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
  863. package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
  864. package/sdk/dist/query/query-cli-adapter.js +32 -0
  865. package/sdk/dist/query/query-cli-adapter.js.map +1 -0
  866. package/sdk/dist/query/query-cli-output.d.ts +9 -0
  867. package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
  868. package/sdk/dist/query/query-cli-output.js +28 -0
  869. package/sdk/dist/query/query-cli-output.js.map +1 -0
  870. package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
  871. package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
  872. package/sdk/dist/query/query-command-diagnosis.js +6 -0
  873. package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
  874. package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
  875. package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
  876. package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
  877. package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
  878. package/sdk/dist/query/query-command-semantics.d.ts +7 -0
  879. package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
  880. package/sdk/dist/query/query-command-semantics.js +7 -0
  881. package/sdk/dist/query/query-command-semantics.js.map +1 -0
  882. package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
  883. package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
  884. package/sdk/dist/query/query-dispatch-contract.js +2 -0
  885. package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
  886. package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
  887. package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
  888. package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
  889. package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
  890. package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
  891. package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
  892. package/sdk/dist/query/query-dispatch-formatting.js +6 -0
  893. package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
  894. package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
  895. package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
  896. package/sdk/dist/query/query-dispatch-observability.js +7 -0
  897. package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
  898. package/sdk/dist/query/query-dispatch.d.ts +48 -0
  899. package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
  900. package/sdk/dist/query/query-dispatch.js +175 -0
  901. package/sdk/dist/query/query-dispatch.js.map +1 -0
  902. package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
  903. package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
  904. package/sdk/dist/query/query-error-details-schema.js +10 -0
  905. package/sdk/dist/query/query-error-details-schema.js.map +1 -0
  906. package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
  907. package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
  908. package/sdk/dist/query/query-error-taxonomy.js +74 -0
  909. package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
  910. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
  911. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
  912. package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
  913. package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
  914. package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
  915. package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
  916. package/sdk/dist/query/query-fallback-executor.js +31 -0
  917. package/sdk/dist/query/query-fallback-executor.js.map +1 -0
  918. package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
  919. package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
  920. package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
  921. package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
  922. package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
  923. package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
  924. package/sdk/dist/query/query-fallback-policy.js +7 -0
  925. package/sdk/dist/query/query-fallback-policy.js.map +1 -0
  926. package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
  927. package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
  928. package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
  929. package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
  930. package/sdk/dist/query/query-policy-capability.d.ts +10 -0
  931. package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
  932. package/sdk/dist/query/query-policy-capability.js +17 -0
  933. package/sdk/dist/query/query-policy-capability.js.map +1 -0
  934. package/sdk/dist/query/query-runtime-context.d.ts +19 -0
  935. package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
  936. package/sdk/dist/query/query-runtime-context.js +31 -0
  937. package/sdk/dist/query/query-runtime-context.js.map +1 -0
  938. package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
  939. package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
  940. package/sdk/dist/query/query-unknown-command-hints.js +6 -0
  941. package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
  942. package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
  943. package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
  944. package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
  945. package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
  946. package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
  947. package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
  948. package/sdk/dist/query/registry-assembly-invariants.js +77 -0
  949. package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
  950. package/sdk/dist/query/registry-assembly.d.ts +10 -0
  951. package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
  952. package/sdk/dist/query/registry-assembly.js +53 -0
  953. package/sdk/dist/query/registry-assembly.js.map +1 -0
  954. package/sdk/dist/query/registry.d.ts +90 -0
  955. package/sdk/dist/query/registry.d.ts.map +1 -0
  956. package/sdk/dist/query/registry.js +129 -0
  957. package/sdk/dist/query/registry.js.map +1 -0
  958. package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
  959. package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
  960. package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
  961. package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
  962. package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
  963. package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
  964. package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
  965. package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
  966. package/sdk/dist/query/roadmap.d.ts +160 -0
  967. package/sdk/dist/query/roadmap.d.ts.map +1 -0
  968. package/sdk/dist/query/roadmap.js +982 -0
  969. package/sdk/dist/query/roadmap.js.map +1 -0
  970. package/sdk/dist/query/route-next-action.d.ts +9 -0
  971. package/sdk/dist/query/route-next-action.d.ts.map +1 -0
  972. package/sdk/dist/query/route-next-action.js +318 -0
  973. package/sdk/dist/query/route-next-action.js.map +1 -0
  974. package/sdk/dist/query/schema-detect.d.ts +21 -0
  975. package/sdk/dist/query/schema-detect.d.ts.map +1 -0
  976. package/sdk/dist/query/schema-detect.js +146 -0
  977. package/sdk/dist/query/schema-detect.js.map +1 -0
  978. package/sdk/dist/query/secrets.d.ts +27 -0
  979. package/sdk/dist/query/secrets.d.ts.map +1 -0
  980. package/sdk/dist/query/secrets.js +42 -0
  981. package/sdk/dist/query/secrets.js.map +1 -0
  982. package/sdk/dist/query/skill-manifest.d.ts +50 -0
  983. package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
  984. package/sdk/dist/query/skill-manifest.js +171 -0
  985. package/sdk/dist/query/skill-manifest.js.map +1 -0
  986. package/sdk/dist/query/skills.d.ts +27 -0
  987. package/sdk/dist/query/skills.d.ts.map +1 -0
  988. package/sdk/dist/query/skills.js +137 -0
  989. package/sdk/dist/query/skills.js.map +1 -0
  990. package/sdk/dist/query/state-document.d.ts +14 -0
  991. package/sdk/dist/query/state-document.d.ts.map +1 -0
  992. package/sdk/dist/query/state-document.js +110 -0
  993. package/sdk/dist/query/state-document.js.map +1 -0
  994. package/sdk/dist/query/state-mutation.d.ts +224 -0
  995. package/sdk/dist/query/state-mutation.d.ts.map +1 -0
  996. package/sdk/dist/query/state-mutation.js +1635 -0
  997. package/sdk/dist/query/state-mutation.js.map +1 -0
  998. package/sdk/dist/query/state-project-load.d.ts +23 -0
  999. package/sdk/dist/query/state-project-load.d.ts.map +1 -0
  1000. package/sdk/dist/query/state-project-load.js +75 -0
  1001. package/sdk/dist/query/state-project-load.js.map +1 -0
  1002. package/sdk/dist/query/state.d.ts +78 -0
  1003. package/sdk/dist/query/state.d.ts.map +1 -0
  1004. package/sdk/dist/query/state.js +443 -0
  1005. package/sdk/dist/query/state.js.map +1 -0
  1006. package/sdk/dist/query/summary.d.ts +18 -0
  1007. package/sdk/dist/query/summary.d.ts.map +1 -0
  1008. package/sdk/dist/query/summary.js +249 -0
  1009. package/sdk/dist/query/summary.js.map +1 -0
  1010. package/sdk/dist/query/template.d.ts +46 -0
  1011. package/sdk/dist/query/template.d.ts.map +1 -0
  1012. package/sdk/dist/query/template.js +210 -0
  1013. package/sdk/dist/query/template.js.map +1 -0
  1014. package/sdk/dist/query/uat.d.ts +42 -0
  1015. package/sdk/dist/query/uat.d.ts.map +1 -0
  1016. package/sdk/dist/query/uat.js +339 -0
  1017. package/sdk/dist/query/uat.js.map +1 -0
  1018. package/sdk/dist/query/utils.d.ts +59 -0
  1019. package/sdk/dist/query/utils.d.ts.map +1 -0
  1020. package/sdk/dist/query/utils.js +74 -0
  1021. package/sdk/dist/query/utils.js.map +1 -0
  1022. package/sdk/dist/query/validate.d.ts +67 -0
  1023. package/sdk/dist/query/validate.d.ts.map +1 -0
  1024. package/sdk/dist/query/validate.js +1001 -0
  1025. package/sdk/dist/query/validate.js.map +1 -0
  1026. package/sdk/dist/query/verify.d.ts +98 -0
  1027. package/sdk/dist/query/verify.d.ts.map +1 -0
  1028. package/sdk/dist/query/verify.js +593 -0
  1029. package/sdk/dist/query/verify.js.map +1 -0
  1030. package/sdk/dist/query/websearch.d.ts +24 -0
  1031. package/sdk/dist/query/websearch.d.ts.map +1 -0
  1032. package/sdk/dist/query/websearch.js +68 -0
  1033. package/sdk/dist/query/websearch.js.map +1 -0
  1034. package/sdk/dist/query/workspace.d.ts +62 -0
  1035. package/sdk/dist/query/workspace.d.ts.map +1 -0
  1036. package/sdk/dist/query/workspace.js +104 -0
  1037. package/sdk/dist/query/workspace.js.map +1 -0
  1038. package/sdk/dist/query/workstream-inventory.d.ts +24 -0
  1039. package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
  1040. package/sdk/dist/query/workstream-inventory.js +120 -0
  1041. package/sdk/dist/query/workstream-inventory.js.map +1 -0
  1042. package/sdk/dist/query/workstream.d.ts +35 -0
  1043. package/sdk/dist/query/workstream.d.ts.map +1 -0
  1044. package/sdk/dist/query/workstream.js +298 -0
  1045. package/sdk/dist/query/workstream.js.map +1 -0
  1046. package/sdk/dist/query/worktree.d.ts +9 -0
  1047. package/sdk/dist/query/worktree.d.ts.map +1 -0
  1048. package/sdk/dist/query/worktree.js +79 -0
  1049. package/sdk/dist/query/worktree.js.map +1 -0
  1050. package/sdk/dist/query-command-executor.d.ts +22 -0
  1051. package/sdk/dist/query-command-executor.d.ts.map +1 -0
  1052. package/sdk/dist/query-command-executor.js +22 -0
  1053. package/sdk/dist/query-command-executor.js.map +1 -0
  1054. package/sdk/dist/query-execution-policy.d.ts +24 -0
  1055. package/sdk/dist/query-execution-policy.d.ts.map +1 -0
  1056. package/sdk/dist/query-execution-policy.js +27 -0
  1057. package/sdk/dist/query-execution-policy.js.map +1 -0
  1058. package/sdk/dist/query-failure-classification.d.ts +9 -0
  1059. package/sdk/dist/query-failure-classification.d.ts.map +1 -0
  1060. package/sdk/dist/query-failure-classification.js +32 -0
  1061. package/sdk/dist/query-failure-classification.js.map +1 -0
  1062. package/sdk/dist/query-gsd-tools-path.d.ts +2 -0
  1063. package/sdk/dist/query-gsd-tools-path.d.ts.map +1 -0
  1064. package/sdk/dist/query-gsd-tools-path.js +2 -0
  1065. package/sdk/dist/query-gsd-tools-path.js.map +1 -0
  1066. package/sdk/dist/query-gsd-tools-runtime.d.ts +20 -0
  1067. package/sdk/dist/query-gsd-tools-runtime.d.ts.map +1 -0
  1068. package/sdk/dist/query-gsd-tools-runtime.js +47 -0
  1069. package/sdk/dist/query-gsd-tools-runtime.js.map +1 -0
  1070. package/sdk/dist/query-hotpath-methods.d.ts +19 -0
  1071. package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
  1072. package/sdk/dist/query-hotpath-methods.js +34 -0
  1073. package/sdk/dist/query-hotpath-methods.js.map +1 -0
  1074. package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
  1075. package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
  1076. package/sdk/dist/query-native-direct-adapter.js +52 -0
  1077. package/sdk/dist/query-native-direct-adapter.js.map +1 -0
  1078. package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
  1079. package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
  1080. package/sdk/dist/query-native-hotpath-adapter.js +32 -0
  1081. package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
  1082. package/sdk/dist/query-raw-output-projection.d.ts +6 -0
  1083. package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
  1084. package/sdk/dist/query-raw-output-projection.js +86 -0
  1085. package/sdk/dist/query-raw-output-projection.js.map +1 -0
  1086. package/sdk/dist/query-runtime-bridge.d.ts +61 -0
  1087. package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
  1088. package/sdk/dist/query-runtime-bridge.js +144 -0
  1089. package/sdk/dist/query-runtime-bridge.js.map +1 -0
  1090. package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
  1091. package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
  1092. package/sdk/dist/query-subprocess-adapter.js +92 -0
  1093. package/sdk/dist/query-subprocess-adapter.js.map +1 -0
  1094. package/sdk/dist/query-tools-error-factory.d.ts +16 -0
  1095. package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
  1096. package/sdk/dist/query-tools-error-factory.js +33 -0
  1097. package/sdk/dist/query-tools-error-factory.js.map +1 -0
  1098. package/sdk/dist/research-gate.d.ts +24 -0
  1099. package/sdk/dist/research-gate.d.ts.map +1 -0
  1100. package/sdk/dist/research-gate.js +70 -0
  1101. package/sdk/dist/research-gate.js.map +1 -0
  1102. package/sdk/dist/runtime-bridge-sync/index.d.ts +96 -0
  1103. package/sdk/dist/runtime-bridge-sync/index.d.ts.map +1 -0
  1104. package/sdk/dist/runtime-bridge-sync/index.js +109 -0
  1105. package/sdk/dist/runtime-bridge-sync/index.js.map +1 -0
  1106. package/sdk/dist/runtime-bridge-sync/worker.d.ts +2 -0
  1107. package/sdk/dist/runtime-bridge-sync/worker.d.ts.map +1 -0
  1108. package/sdk/dist/runtime-bridge-sync/worker.js +180 -0
  1109. package/sdk/dist/runtime-bridge-sync/worker.js.map +1 -0
  1110. package/sdk/dist/runtime-gate.d.ts +14 -0
  1111. package/sdk/dist/runtime-gate.d.ts.map +1 -0
  1112. package/sdk/dist/runtime-gate.js +48 -0
  1113. package/sdk/dist/runtime-gate.js.map +1 -0
  1114. package/sdk/dist/sdk-package-compatibility.d.ts +38 -0
  1115. package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
  1116. package/sdk/dist/sdk-package-compatibility.js +90 -0
  1117. package/sdk/dist/sdk-package-compatibility.js.map +1 -0
  1118. package/sdk/dist/session-runner.d.ts +40 -0
  1119. package/sdk/dist/session-runner.d.ts.map +1 -0
  1120. package/sdk/dist/session-runner.js +274 -0
  1121. package/sdk/dist/session-runner.js.map +1 -0
  1122. package/sdk/dist/tool-scoping.d.ts +31 -0
  1123. package/sdk/dist/tool-scoping.d.ts.map +1 -0
  1124. package/sdk/dist/tool-scoping.js +54 -0
  1125. package/sdk/dist/tool-scoping.js.map +1 -0
  1126. package/sdk/dist/types.d.ts +794 -0
  1127. package/sdk/dist/types.d.ts.map +1 -0
  1128. package/sdk/dist/types.js +77 -0
  1129. package/sdk/dist/types.js.map +1 -0
  1130. package/sdk/dist/workstream-inventory/builder.d.ts +88 -0
  1131. package/sdk/dist/workstream-inventory/builder.d.ts.map +1 -0
  1132. package/sdk/dist/workstream-inventory/builder.js +84 -0
  1133. package/sdk/dist/workstream-inventory/builder.js.map +1 -0
  1134. package/sdk/dist/workstream-name-policy.d.ts +37 -0
  1135. package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
  1136. package/sdk/dist/workstream-name-policy.js +53 -0
  1137. package/sdk/dist/workstream-name-policy.js.map +1 -0
  1138. package/sdk/dist/workstream-utils.d.ts +23 -0
  1139. package/sdk/dist/workstream-utils.d.ts.map +1 -0
  1140. package/sdk/dist/workstream-utils.js +34 -0
  1141. package/sdk/dist/workstream-utils.js.map +1 -0
  1142. package/sdk/dist/ws-transport.d.ts +32 -0
  1143. package/sdk/dist/ws-transport.d.ts.map +1 -0
  1144. package/sdk/dist/ws-transport.js +84 -0
  1145. package/sdk/dist/ws-transport.js.map +1 -0
  1146. package/sdk/package-lock.json +2530 -0
  1147. package/sdk/package.json +77 -0
  1148. package/sdk/prompts/templates/project.md +186 -0
  1149. package/sdk/prompts/templates/requirements.md +231 -0
  1150. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  1151. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  1152. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  1153. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  1154. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  1155. package/sdk/prompts/templates/roadmap.md +202 -0
  1156. package/sdk/prompts/templates/state.md +175 -0
  1157. package/sdk/shared/config-defaults.manifest.json +75 -0
  1158. package/sdk/shared/config-schema.manifest.json +151 -0
  1159. package/sdk/shared/model-catalog.json +122 -0
  1160. package/sdk/src/assembled-prompts.test.ts +349 -0
  1161. package/sdk/src/bug-3589-planning-paths-validation.test.ts +89 -0
  1162. package/sdk/src/bug-3591-gsdtools-runtime-workstream.test.ts +179 -0
  1163. package/sdk/src/cli-transport.test.ts +388 -0
  1164. package/sdk/src/cli-transport.ts +130 -0
  1165. package/sdk/src/cli.test.ts +426 -0
  1166. package/sdk/src/cli.ts +589 -0
  1167. package/sdk/src/config.test.ts +277 -0
  1168. package/sdk/src/config.ts +202 -0
  1169. package/sdk/src/configuration/index.test.ts +318 -0
  1170. package/sdk/src/configuration/index.ts +325 -0
  1171. package/sdk/src/context-engine.test.ts +295 -0
  1172. package/sdk/src/context-engine.ts +170 -0
  1173. package/sdk/src/context-truncation.test.ts +163 -0
  1174. package/sdk/src/context-truncation.ts +233 -0
  1175. package/sdk/src/e2e.integration.test.ts +181 -0
  1176. package/sdk/src/errors.ts +72 -0
  1177. package/sdk/src/event-stream.test.ts +661 -0
  1178. package/sdk/src/event-stream.ts +441 -0
  1179. package/sdk/src/golden/capture.ts +95 -0
  1180. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  1181. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  1182. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  1183. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  1184. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  1185. package/sdk/src/golden/golden-mutation-covered.ts +17 -0
  1186. package/sdk/src/golden/golden-policy.test.ts +8 -0
  1187. package/sdk/src/golden/golden-policy.ts +120 -0
  1188. package/sdk/src/golden/golden.integration.test.ts +1031 -0
  1189. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  1190. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  1191. package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
  1192. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  1193. package/sdk/src/gsd-tools-error.test.ts +21 -0
  1194. package/sdk/src/gsd-tools-error.ts +65 -0
  1195. package/sdk/src/gsd-tools.test.ts +472 -0
  1196. package/sdk/src/gsd-tools.ts +237 -0
  1197. package/sdk/src/gsd-transport-policy.test.ts +34 -0
  1198. package/sdk/src/gsd-transport-policy.ts +48 -0
  1199. package/sdk/src/gsd-transport.test.ts +299 -0
  1200. package/sdk/src/gsd-transport.ts +118 -0
  1201. package/sdk/src/index.ts +366 -0
  1202. package/sdk/src/init-e2e.integration.test.ts +138 -0
  1203. package/sdk/src/init-runner.test.ts +740 -0
  1204. package/sdk/src/init-runner.ts +734 -0
  1205. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  1206. package/sdk/src/logger.test.ts +149 -0
  1207. package/sdk/src/logger.ts +113 -0
  1208. package/sdk/src/milestone-runner.test.ts +421 -0
  1209. package/sdk/src/model-catalog.ts +70 -0
  1210. package/sdk/src/phase-prompt.ts +259 -0
  1211. package/sdk/src/phase-runner.integration.test.ts +377 -0
  1212. package/sdk/src/phase-runner.test.ts +3660 -0
  1213. package/sdk/src/phase-runner.ts +1442 -0
  1214. package/sdk/src/plan-parser.test.ts +579 -0
  1215. package/sdk/src/plan-parser.ts +431 -0
  1216. package/sdk/src/planning-journal.test.ts +70 -0
  1217. package/sdk/src/planning-journal.ts +153 -0
  1218. package/sdk/src/planning-runtime.test.ts +29 -0
  1219. package/sdk/src/planning-runtime.ts +100 -0
  1220. package/sdk/src/project-root/index.test.ts +186 -0
  1221. package/sdk/src/project-root/index.ts +144 -0
  1222. package/sdk/src/prompt-builder.test.ts +318 -0
  1223. package/sdk/src/prompt-builder.ts +218 -0
  1224. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  1225. package/sdk/src/prompt-sanitizer.ts +116 -0
  1226. package/sdk/src/query/QUERY-HANDLERS.md +349 -0
  1227. package/sdk/src/query/active-workstream-store.ts +50 -0
  1228. package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
  1229. package/sdk/src/query/agent-failure-classifier.ts +105 -0
  1230. package/sdk/src/query/audit-open.ts +722 -0
  1231. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  1232. package/sdk/src/query/check-auto-mode.ts +49 -0
  1233. package/sdk/src/query/check-completion.test.ts +113 -0
  1234. package/sdk/src/query/check-completion.ts +182 -0
  1235. package/sdk/src/query/check-decision-coverage.test.ts +519 -0
  1236. package/sdk/src/query/check-decision-coverage.ts +554 -0
  1237. package/sdk/src/query/check-gates.test.ts +103 -0
  1238. package/sdk/src/query/check-gates.ts +112 -0
  1239. package/sdk/src/query/check-ship-ready.test.ts +303 -0
  1240. package/sdk/src/query/check-ship-ready.ts +136 -0
  1241. package/sdk/src/query/check-verification-status.test.ts +143 -0
  1242. package/sdk/src/query/check-verification-status.ts +160 -0
  1243. package/sdk/src/query/command-aliases.generated.ts +154 -0
  1244. package/sdk/src/query/command-catalog.ts +31 -0
  1245. package/sdk/src/query/command-definition.test.ts +47 -0
  1246. package/sdk/src/query/command-definition.ts +70 -0
  1247. package/sdk/src/query/command-family-handlers.ts +123 -0
  1248. package/sdk/src/query/command-manifest.init.ts +24 -0
  1249. package/sdk/src/query/command-manifest.non-family.ts +86 -0
  1250. package/sdk/src/query/command-manifest.phase.ts +17 -0
  1251. package/sdk/src/query/command-manifest.phases.ts +11 -0
  1252. package/sdk/src/query/command-manifest.roadmap.ts +11 -0
  1253. package/sdk/src/query/command-manifest.state.ts +31 -0
  1254. package/sdk/src/query/command-manifest.ts +17 -0
  1255. package/sdk/src/query/command-manifest.types.ts +13 -0
  1256. package/sdk/src/query/command-manifest.validate.ts +11 -0
  1257. package/sdk/src/query/command-manifest.verify.ts +17 -0
  1258. package/sdk/src/query/command-resolution.test.ts +70 -0
  1259. package/sdk/src/query/command-seam-coverage.test.ts +118 -0
  1260. package/sdk/src/query/command-static-catalog-domain.ts +111 -0
  1261. package/sdk/src/query/command-static-catalog-foundation.ts +111 -0
  1262. package/sdk/src/query/command-topology.test.ts +28 -0
  1263. package/sdk/src/query/command-topology.ts +114 -0
  1264. package/sdk/src/query/commands-list.test.ts +36 -0
  1265. package/sdk/src/query/commands-list.ts +19 -0
  1266. package/sdk/src/query/commit.test.ts +485 -0
  1267. package/sdk/src/query/commit.ts +717 -0
  1268. package/sdk/src/query/config-gates.test.ts +89 -0
  1269. package/sdk/src/query/config-gates.ts +69 -0
  1270. package/sdk/src/query/config-mutation.test.ts +598 -0
  1271. package/sdk/src/query/config-mutation.ts +705 -0
  1272. package/sdk/src/query/config-query.test.ts +472 -0
  1273. package/sdk/src/query/config-query.ts +314 -0
  1274. package/sdk/src/query/config-schema.ts +35 -0
  1275. package/sdk/src/query/decisions.test.ts +221 -0
  1276. package/sdk/src/query/decisions.ts +196 -0
  1277. package/sdk/src/query/decomposed-handlers.test.ts +431 -0
  1278. package/sdk/src/query/detect-custom-files.test.ts +115 -0
  1279. package/sdk/src/query/detect-custom-files.ts +96 -0
  1280. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  1281. package/sdk/src/query/detect-phase-type.ts +141 -0
  1282. package/sdk/src/query/docs-init.ts +258 -0
  1283. package/sdk/src/query/fallow-audit.ts +88 -0
  1284. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  1285. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  1286. package/sdk/src/query/frontmatter-mutation.ts +328 -0
  1287. package/sdk/src/query/frontmatter.test.ts +326 -0
  1288. package/sdk/src/query/frontmatter.ts +395 -0
  1289. package/sdk/src/query/helpers.test.ts +615 -0
  1290. package/sdk/src/query/helpers.ts +566 -0
  1291. package/sdk/src/query/index-thin-seam.test.ts +16 -0
  1292. package/sdk/src/query/index.ts +9 -0
  1293. package/sdk/src/query/init-complex.test.ts +788 -0
  1294. package/sdk/src/query/init-complex.ts +815 -0
  1295. package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
  1296. package/sdk/src/query/init.test.ts +791 -0
  1297. package/sdk/src/query/init.ts +1335 -0
  1298. package/sdk/src/query/intel.test.ts +90 -0
  1299. package/sdk/src/query/intel.ts +404 -0
  1300. package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
  1301. package/sdk/src/query/mutation-event-decorator.ts +37 -0
  1302. package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
  1303. package/sdk/src/query/mutation-event-mapper.ts +102 -0
  1304. package/sdk/src/query/mvp.test.ts +335 -0
  1305. package/sdk/src/query/mvp.ts +292 -0
  1306. package/sdk/src/query/normalize-query-command.test.ts +102 -0
  1307. package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
  1308. package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
  1309. package/sdk/src/query/phase-lifecycle.test.ts +1971 -0
  1310. package/sdk/src/query/phase-lifecycle.ts +2210 -0
  1311. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  1312. package/sdk/src/query/phase-list-queries.ts +152 -0
  1313. package/sdk/src/query/phase-ready.test.ts +65 -0
  1314. package/sdk/src/query/phase-ready.ts +159 -0
  1315. package/sdk/src/query/phase-roadmap-mutation.ts +82 -0
  1316. package/sdk/src/query/phase-uat-passed.test.ts +593 -0
  1317. package/sdk/src/query/phase-uat-passed.ts +297 -0
  1318. package/sdk/src/query/phase.test.ts +693 -0
  1319. package/sdk/src/query/phase.ts +741 -0
  1320. package/sdk/src/query/pipeline.test.ts +169 -0
  1321. package/sdk/src/query/pipeline.ts +243 -0
  1322. package/sdk/src/query/plan-scan.test.ts +35 -0
  1323. package/sdk/src/query/plan-scan.ts +82 -0
  1324. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  1325. package/sdk/src/query/plan-task-structure.ts +63 -0
  1326. package/sdk/src/query/policy-convergence.test.ts +28 -0
  1327. package/sdk/src/query/profile-extract-messages.ts +247 -0
  1328. package/sdk/src/query/profile-output.ts +929 -0
  1329. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  1330. package/sdk/src/query/profile-sample.ts +184 -0
  1331. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  1332. package/sdk/src/query/profile.test.ts +136 -0
  1333. package/sdk/src/query/profile.ts +337 -0
  1334. package/sdk/src/query/progress.test.ts +156 -0
  1335. package/sdk/src/query/progress.ts +566 -0
  1336. package/sdk/src/query/prompt-budget.ts +556 -0
  1337. package/sdk/src/query/query-cli-adapter.test.ts +79 -0
  1338. package/sdk/src/query/query-cli-adapter.ts +39 -0
  1339. package/sdk/src/query/query-cli-output.test.ts +33 -0
  1340. package/sdk/src/query/query-cli-output.ts +35 -0
  1341. package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
  1342. package/sdk/src/query/query-command-diagnosis.ts +5 -0
  1343. package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
  1344. package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
  1345. package/sdk/src/query/query-command-semantics.test.ts +22 -0
  1346. package/sdk/src/query/query-command-semantics.ts +22 -0
  1347. package/sdk/src/query/query-dispatch-contract.ts +30 -0
  1348. package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
  1349. package/sdk/src/query/query-dispatch-formatting.ts +5 -0
  1350. package/sdk/src/query/query-dispatch-observability.ts +6 -0
  1351. package/sdk/src/query/query-dispatch.test.ts +699 -0
  1352. package/sdk/src/query/query-dispatch.ts +243 -0
  1353. package/sdk/src/query/query-error-details-schema.ts +29 -0
  1354. package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
  1355. package/sdk/src/query/query-error-taxonomy.ts +117 -0
  1356. package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
  1357. package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
  1358. package/sdk/src/query/query-fallback-executor.test.ts +82 -0
  1359. package/sdk/src/query/query-fallback-executor.ts +44 -0
  1360. package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
  1361. package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
  1362. package/sdk/src/query/query-fallback-policy.test.ts +13 -0
  1363. package/sdk/src/query/query-fallback-policy.ts +11 -0
  1364. package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
  1365. package/sdk/src/query/query-policy-capability.test.ts +10 -0
  1366. package/sdk/src/query/query-policy-capability.ts +26 -0
  1367. package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
  1368. package/sdk/src/query/query-registry-capability.test.ts +14 -0
  1369. package/sdk/src/query/query-runtime-context.ts +44 -0
  1370. package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
  1371. package/sdk/src/query/query-unknown-command-hints.ts +5 -0
  1372. package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
  1373. package/sdk/src/query/registry-assembly-invariants.ts +127 -0
  1374. package/sdk/src/query/registry-assembly.test.ts +138 -0
  1375. package/sdk/src/query/registry-assembly.ts +78 -0
  1376. package/sdk/src/query/registry.test.ts +208 -0
  1377. package/sdk/src/query/registry.ts +142 -0
  1378. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  1379. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  1380. package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
  1381. package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
  1382. package/sdk/src/query/roadmap.test.ts +1250 -0
  1383. package/sdk/src/query/roadmap.ts +1131 -0
  1384. package/sdk/src/query/route-next-action.test.ts +61 -0
  1385. package/sdk/src/query/route-next-action.ts +345 -0
  1386. package/sdk/src/query/schema-detect.ts +189 -0
  1387. package/sdk/src/query/secrets.test.ts +66 -0
  1388. package/sdk/src/query/secrets.ts +43 -0
  1389. package/sdk/src/query/skill-manifest.test.ts +62 -0
  1390. package/sdk/src/query/skill-manifest.ts +216 -0
  1391. package/sdk/src/query/skills.test.ts +234 -0
  1392. package/sdk/src/query/skills.ts +143 -0
  1393. package/sdk/src/query/state-document.test.ts +197 -0
  1394. package/sdk/src/query/state-document.ts +129 -0
  1395. package/sdk/src/query/state-mutation.test.ts +1210 -0
  1396. package/sdk/src/query/state-mutation.ts +1814 -0
  1397. package/sdk/src/query/state-project-load.ts +80 -0
  1398. package/sdk/src/query/state.test.ts +616 -0
  1399. package/sdk/src/query/state.ts +476 -0
  1400. package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
  1401. package/sdk/src/query/summary.test.ts +95 -0
  1402. package/sdk/src/query/summary.ts +296 -0
  1403. package/sdk/src/query/template.test.ts +180 -0
  1404. package/sdk/src/query/template.ts +242 -0
  1405. package/sdk/src/query/uat.test.ts +77 -0
  1406. package/sdk/src/query/uat.ts +365 -0
  1407. package/sdk/src/query/utils.test.ts +82 -0
  1408. package/sdk/src/query/utils.ts +106 -0
  1409. package/sdk/src/query/validate.test.ts +924 -0
  1410. package/sdk/src/query/validate.ts +1054 -0
  1411. package/sdk/src/query/verify.test.ts +414 -0
  1412. package/sdk/src/query/verify.ts +656 -0
  1413. package/sdk/src/query/websearch.test.ts +31 -0
  1414. package/sdk/src/query/websearch.ts +82 -0
  1415. package/sdk/src/query/workspace.test.ts +120 -0
  1416. package/sdk/src/query/workspace.ts +145 -0
  1417. package/sdk/src/query/workstream-inventory.ts +143 -0
  1418. package/sdk/src/query/workstream.test.ts +153 -0
  1419. package/sdk/src/query/workstream.ts +324 -0
  1420. package/sdk/src/query/worktree.ts +84 -0
  1421. package/sdk/src/query-command-executor.ts +31 -0
  1422. package/sdk/src/query-execution-policy.test.ts +52 -0
  1423. package/sdk/src/query-execution-policy.ts +46 -0
  1424. package/sdk/src/query-failure-classification.test.ts +23 -0
  1425. package/sdk/src/query-failure-classification.ts +42 -0
  1426. package/sdk/src/query-gsd-tools-path.ts +1 -0
  1427. package/sdk/src/query-gsd-tools-runtime.ts +89 -0
  1428. package/sdk/src/query-hotpath-methods.ts +48 -0
  1429. package/sdk/src/query-native-direct-adapter.test.ts +35 -0
  1430. package/sdk/src/query-native-direct-adapter.ts +70 -0
  1431. package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
  1432. package/sdk/src/query-native-hotpath-adapter.ts +45 -0
  1433. package/sdk/src/query-raw-output-projection.test.ts +39 -0
  1434. package/sdk/src/query-raw-output-projection.ts +93 -0
  1435. package/sdk/src/query-runtime-bridge.test.ts +150 -0
  1436. package/sdk/src/query-runtime-bridge.ts +215 -0
  1437. package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
  1438. package/sdk/src/query-subprocess-adapter.test.ts +84 -0
  1439. package/sdk/src/query-subprocess-adapter.ts +146 -0
  1440. package/sdk/src/query-tools-error-factory.test.ts +35 -0
  1441. package/sdk/src/query-tools-error-factory.ts +76 -0
  1442. package/sdk/src/research-gate.test.ts +190 -0
  1443. package/sdk/src/research-gate.ts +94 -0
  1444. package/sdk/src/runtime-bridge-options.test.ts +33 -0
  1445. package/sdk/src/runtime-bridge-sync/index.test.ts +164 -0
  1446. package/sdk/src/runtime-bridge-sync/index.ts +154 -0
  1447. package/sdk/src/runtime-bridge-sync/projectdir-regression.test.ts +150 -0
  1448. package/sdk/src/runtime-bridge-sync/worker.ts +224 -0
  1449. package/sdk/src/runtime-gate.test.ts +84 -0
  1450. package/sdk/src/runtime-gate.ts +52 -0
  1451. package/sdk/src/sdk-package-compatibility.test.ts +97 -0
  1452. package/sdk/src/sdk-package-compatibility.ts +141 -0
  1453. package/sdk/src/session-runner.test.ts +164 -0
  1454. package/sdk/src/session-runner.ts +327 -0
  1455. package/sdk/src/tool-scoping.test.ts +160 -0
  1456. package/sdk/src/tool-scoping.ts +61 -0
  1457. package/sdk/src/types.ts +927 -0
  1458. package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
  1459. package/sdk/src/workstream-inventory/builder.test.ts +241 -0
  1460. package/sdk/src/workstream-inventory/builder.ts +170 -0
  1461. package/sdk/src/workstream-name-policy.ts +57 -0
  1462. package/sdk/src/workstream-utils.ts +36 -0
  1463. package/sdk/src/ws-flag.test.ts +285 -0
  1464. package/sdk/src/ws-transport.test.ts +161 -0
  1465. package/sdk/src/ws-transport.ts +93 -0
  1466. package/sdk/tsconfig.json +20 -0
@@ -0,0 +1,1250 @@
1
+ /**
2
+ * Unit tests for roadmap query handlers.
3
+ *
4
+ * Tests roadmapAnalyze, roadmapGetPhase, getMilestoneInfo,
5
+ * extractCurrentMilestone, and stripShippedMilestones.
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { mkdtemp, writeFile, mkdir, rm } from 'node:fs/promises';
10
+ import { join } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+
13
+ // These will be imported once roadmap.ts is created
14
+ import {
15
+ roadmapAnalyze,
16
+ roadmapGetPhase,
17
+ getMilestoneInfo,
18
+ extractCurrentMilestone,
19
+ extractNextMilestoneSection,
20
+ extractPhasesFromSection,
21
+ stripShippedMilestones,
22
+ } from './roadmap.js';
23
+
24
+ // ─── Test fixtures ────────────────────────────────────────────────────────
25
+
26
+ const ROADMAP_CONTENT = `# Roadmap
27
+
28
+ ## Current Milestone: v3.0 SDK-First Migration
29
+
30
+ **Goal:** Migrate all deterministic orchestration into TypeScript SDK.
31
+
32
+ - [x] **Phase 9: Foundation and Test Infrastructure**
33
+ - [ ] **Phase 10: Read-Only Queries**
34
+ - [ ] **Phase 11: Mutations**
35
+
36
+ ### Phase 9: Foundation and Test Infrastructure
37
+
38
+ **Goal:** Build core SDK infrastructure.
39
+
40
+ **Depends on:** None
41
+
42
+ **Success Criteria**:
43
+ 1. Error classification system exists
44
+ 2. Query registry works
45
+
46
+ ### Phase 10: Read-Only Queries
47
+
48
+ **Goal:** Port read-only query operations.
49
+
50
+ **Depends on:** Phase 9
51
+
52
+ **Success Criteria**:
53
+ 1. All read queries work
54
+ 2. Golden file tests pass
55
+
56
+ ### Phase 11: Mutations
57
+
58
+ **Goal:** Port mutation operations.
59
+
60
+ **Depends on:** Phase 10
61
+ `;
62
+
63
+ const STATE_WITH_MILESTONE = `---
64
+ gsd_state_version: 1.0
65
+ milestone: v3.0
66
+ status: executing
67
+ ---
68
+
69
+ # Project State
70
+
71
+ **Current Phase:** 10
72
+ **Status:** Ready to execute
73
+ `;
74
+
75
+ // ─── Helpers ──────────────────────────────────────────────────────────────
76
+
77
+ let tmpDir: string;
78
+
79
+ beforeEach(async () => {
80
+ tmpDir = await mkdtemp(join(tmpdir(), 'roadmap-test-'));
81
+ await mkdir(join(tmpDir, '.planning', 'phases', '09-foundation'), { recursive: true });
82
+ await mkdir(join(tmpDir, '.planning', 'phases', '10-read-only-queries'), { recursive: true });
83
+ });
84
+
85
+ afterEach(async () => {
86
+ await rm(tmpDir, { recursive: true, force: true });
87
+ });
88
+
89
+ // ─── stripShippedMilestones ───────────────────────────────────────────────
90
+
91
+ describe('stripShippedMilestones', () => {
92
+ it('removes <details> blocks', () => {
93
+ const content = 'before\n<details>\nshipped content\n</details>\nafter';
94
+ expect(stripShippedMilestones(content)).toBe('before\n\nafter');
95
+ });
96
+
97
+ it('handles multiple <details> blocks', () => {
98
+ const content = '<details>a</details>middle<details>b</details>end';
99
+ expect(stripShippedMilestones(content)).toBe('middleend');
100
+ });
101
+
102
+ // Bug #2641 (symmetry): tolerate attributes on <details> tag, matching
103
+ // extractCurrentMilestone's attribute-tolerant fallback. Without this,
104
+ // shipped content wrapped in `<details open>` (a common GitHub pattern for
105
+ // sections that should default to expanded) would leak through the strip.
106
+ it('removes <details open> blocks (attribute-bearing tags)', () => {
107
+ const content = 'before\n<details open>\nshipped content\n</details>\nafter';
108
+ expect(stripShippedMilestones(content)).toBe('before\n\nafter');
109
+ });
110
+
111
+ it('removes <details class="..."> blocks (attribute-bearing tags)', () => {
112
+ const content = 'a<details class="milestone" data-version="v0.5">x</details>b';
113
+ expect(stripShippedMilestones(content)).toBe('ab');
114
+ });
115
+
116
+ it('returns content unchanged when no details blocks', () => {
117
+ expect(stripShippedMilestones('no details here')).toBe('no details here');
118
+ });
119
+
120
+ // Bug #2496: inline ✅ SHIPPED heading sections must be stripped
121
+ it('strips ## heading sections marked ✅ SHIPPED', () => {
122
+ const content = [
123
+ '## Milestone v1.0: MVP — ✅ SHIPPED 2026-01-15',
124
+ '',
125
+ 'Phase 1, Phase 2',
126
+ '',
127
+ '## Milestone v2.0: Current',
128
+ '',
129
+ 'Phase 3',
130
+ ].join('\n');
131
+ const stripped = stripShippedMilestones(content);
132
+ expect(stripped).not.toContain('MVP');
133
+ expect(stripped).not.toContain('v1.0');
134
+ expect(stripped).toContain('v2.0');
135
+ expect(stripped).toContain('Current');
136
+ });
137
+
138
+ it('strips multiple inline SHIPPED sections and leaves non-shipped content', () => {
139
+ const content = [
140
+ '## Milestone v1.0: Alpha — ✅ SHIPPED 2026-01-01',
141
+ '',
142
+ 'Old content',
143
+ '',
144
+ '## Milestone v1.5: Beta — ✅ SHIPPED 2026-02-01',
145
+ '',
146
+ 'More old content',
147
+ '',
148
+ '## Milestone v2.0: Gamma',
149
+ '',
150
+ 'Current content',
151
+ ].join('\n');
152
+ const stripped = stripShippedMilestones(content);
153
+ expect(stripped).not.toContain('Alpha');
154
+ expect(stripped).not.toContain('Beta');
155
+ expect(stripped).toContain('Gamma');
156
+ expect(stripped).toContain('Current content');
157
+ });
158
+
159
+ // Bug #2508 follow-up: ### headings must be stripped too
160
+ it('strips ### heading sections marked ✅ SHIPPED', () => {
161
+ const content = [
162
+ '### Milestone v1.0: MVP — ✅ SHIPPED 2026-01-15',
163
+ '',
164
+ 'Phase 1, Phase 2',
165
+ '',
166
+ '### Milestone v2.0: Current',
167
+ '',
168
+ 'Phase 3',
169
+ ].join('\n');
170
+ const stripped = stripShippedMilestones(content);
171
+ expect(stripped).not.toContain('MVP');
172
+ expect(stripped).not.toContain('v1.0');
173
+ expect(stripped).toContain('v2.0');
174
+ expect(stripped).toContain('Current');
175
+ });
176
+ });
177
+
178
+ // ─── getMilestoneInfo ─────────────────────────────────────────────────────
179
+
180
+ describe('getMilestoneInfo', () => {
181
+ it('extracts version and name from heading format', async () => {
182
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
183
+ const info = await getMilestoneInfo(tmpDir);
184
+ expect(info.version).toBe('v3.0');
185
+ expect(info.name).toBe('SDK-First Migration');
186
+ });
187
+
188
+ it('extracts from in-progress marker format', async () => {
189
+ const roadmap = '- \u{1F6A7} **v2.1 Belgium** \u2014 Phases 24-28 (in progress)';
190
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
191
+ const info = await getMilestoneInfo(tmpDir);
192
+ expect(info.version).toBe('v2.1');
193
+ expect(info.name).toBe('Belgium');
194
+ });
195
+
196
+ it('extracts from yellow-circle in-flight marker (GSD ROADMAP template)', async () => {
197
+ const roadmap = '- 🟡 **v3.1 Upstream Landing** — Phase 15 (in flight)';
198
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
199
+ const info = await getMilestoneInfo(tmpDir);
200
+ expect(info.version).toBe('v3.1');
201
+ expect(info.name).toBe('Upstream Landing');
202
+ });
203
+
204
+ it('uses last **vX.Y Title** in milestone list before ## Phases when no emoji match', async () => {
205
+ const roadmap = `## Milestones
206
+
207
+ - ✅ **v1.0 A**
208
+ - ✅ **v3.0 B**
209
+ - ✅ **v3.1 Current Name**
210
+
211
+ ## Phases
212
+ `;
213
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
214
+ const info = await getMilestoneInfo(tmpDir);
215
+ expect(info.version).toBe('v3.1');
216
+ expect(info.name).toBe('Current Name');
217
+ });
218
+
219
+ it('falls back to STATE.md milestone when ROADMAP.md is missing', async () => {
220
+ await writeFile(
221
+ join(tmpDir, '.planning', 'STATE.md'),
222
+ '---\nmilestone: v4.2\nmilestone_name: From State\n---\n\n# State\n',
223
+ );
224
+ const info = await getMilestoneInfo(tmpDir);
225
+ expect(info.version).toBe('v4.2');
226
+ expect(info.name).toBe('From State');
227
+ });
228
+
229
+ it('falls back to v1.0 when ROADMAP.md and STATE.md lack milestone', async () => {
230
+ const info = await getMilestoneInfo(tmpDir);
231
+ expect(info.version).toBe('v1.0');
232
+ expect(info.name).toBe('milestone');
233
+ });
234
+
235
+ // Bug #2495: STATE.md must take priority over ROADMAP heading matching
236
+ it('prefers STATE.md milestone over ROADMAP heading match', async () => {
237
+ const roadmap = [
238
+ '## Milestone v1.0: Shipped — ✅ SHIPPED 2026-01-01',
239
+ '',
240
+ 'Phase 1',
241
+ '',
242
+ '## Milestone v2.0: Current Active',
243
+ '',
244
+ 'Phase 2',
245
+ ].join('\n');
246
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
247
+ await writeFile(
248
+ join(tmpDir, '.planning', 'STATE.md'),
249
+ '---\nmilestone: v2.0\nmilestone_name: Current Active\n---\n',
250
+ );
251
+ const info = await getMilestoneInfo(tmpDir);
252
+ expect(info.version).toBe('v2.0');
253
+ expect(info.name).toBe('Current Active');
254
+ });
255
+
256
+ // Bug #2508 follow-up: STATE.md has milestone version but no milestone_name —
257
+ // should use ROADMAP for the real name, still prefer STATE.md for version.
258
+ it('uses ROADMAP name when STATE.md has milestone version but no milestone_name', async () => {
259
+ const roadmap = [
260
+ '## Milestone v2.0: Real Name From Roadmap',
261
+ '',
262
+ 'Phase 2',
263
+ ].join('\n');
264
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
265
+ await writeFile(
266
+ join(tmpDir, '.planning', 'STATE.md'),
267
+ '---\nmilestone: v2.0\n---\n', // no milestone_name
268
+ );
269
+ const info = await getMilestoneInfo(tmpDir);
270
+ expect(info.version).toBe('v2.0');
271
+ expect(info.name).toBe('Real Name From Roadmap');
272
+ });
273
+
274
+ it('returns correct milestone from STATE.md even when ROADMAP inline-SHIPPED stripping would fix it', async () => {
275
+ // ROADMAP with an unstripped shipped milestone heading (pre-fix state)
276
+ const roadmap = [
277
+ '## Milestone v1.0: Old — ✅ SHIPPED 2026-01-01',
278
+ '',
279
+ 'Old phases',
280
+ '',
281
+ '## Milestone v2.0: New',
282
+ '',
283
+ 'New phases',
284
+ ].join('\n');
285
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
286
+ await writeFile(
287
+ join(tmpDir, '.planning', 'STATE.md'),
288
+ '---\nmilestone: v2.0\nmilestone_name: New\n---\n',
289
+ );
290
+ const info = await getMilestoneInfo(tmpDir);
291
+ expect(info.version).toBe('v2.0');
292
+ expect(info.name).toBe('New');
293
+ });
294
+ });
295
+
296
+ // ─── extractCurrentMilestone ──────────────────────────────────────────────
297
+
298
+ describe('extractCurrentMilestone', () => {
299
+ it('scopes content to current milestone from STATE.md version', async () => {
300
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
301
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
302
+ const result = await extractCurrentMilestone(ROADMAP_CONTENT, tmpDir);
303
+ expect(result).toContain('Phase 10');
304
+ expect(result).toContain('v3.0');
305
+ });
306
+
307
+ it('strips shipped milestones when no cwd version found', async () => {
308
+ const content = '<details>old</details>current content';
309
+ // No STATE.md, no in-progress marker
310
+ const result = await extractCurrentMilestone(content, tmpDir);
311
+ expect(result).toBe('current content');
312
+ });
313
+
314
+ // ─── Bug #2422: preamble Backlog leak ─────────────────────────────────
315
+ it('bug-2422: does not include ## Backlog section before the current milestone', async () => {
316
+ const roadmapWithBacklog = `# ROADMAP
317
+
318
+ ## Backlog
319
+ ### Phase 999.1: Parking lot item A
320
+ ### Phase 999.2: Parking lot item B
321
+
322
+ ### 🚧 v2.0 My Milestone (In Progress)
323
+ - [ ] **Phase 100: Real work**
324
+
325
+ ## v2.0 Phase Details
326
+ ### Phase 100: Real work
327
+ **Goal**: Do stuff.
328
+ `;
329
+ const state = `---\nmilestone: v2.0\n---\n# State\n`;
330
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
331
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithBacklog);
332
+
333
+ const result = await extractCurrentMilestone(roadmapWithBacklog, tmpDir);
334
+
335
+ // Must NOT include backlog phases
336
+ expect(result).not.toContain('Phase 999.1');
337
+ expect(result).not.toContain('Phase 999.2');
338
+ expect(result).not.toContain('Parking lot');
339
+ // Must include the actual v2.0 content
340
+ expect(result).toContain('Phase 100');
341
+ });
342
+
343
+ // ─── Bug #2619: phase heading containing vX.Y triggers truncation ─────
344
+ it('bug-2619: does not truncate at a phase heading containing vX.Y', async () => {
345
+ // A phase title like "Phase 12: v1.0 Tech-Debt Closure" was being treated
346
+ // as a milestone boundary because the greedy `.*v(\d+(?:\.\d+)+)` branch
347
+ // in nextMilestoneRegex matched any heading with a version literal.
348
+ const roadmapWithPhaseVersion = `# ROADMAP
349
+
350
+ ## Phases
351
+
352
+ ### 🚧 v1.1 Launch-Ready (In Progress)
353
+
354
+ ### Phase 11: Structured Logging
355
+ **Goal**: Add structured logging
356
+
357
+ ### Phase 12: v1.0 Tech-Debt Closure
358
+ **Goal**: Close out v1.0 debt
359
+
360
+ ### Phase 19: Security Audit
361
+ **Goal**: Full security audit
362
+ `;
363
+ const state = `---\nmilestone: v1.1\n---\n# State\n`;
364
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
365
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithPhaseVersion);
366
+
367
+ const result = await extractCurrentMilestone(roadmapWithPhaseVersion, tmpDir);
368
+
369
+ // Phase 12 and Phase 19 must both survive — the slice cannot be truncated
370
+ // at "### Phase 12: v1.0 Tech-Debt Closure".
371
+ expect(result).toContain('### Phase 12: v1.0 Tech-Debt Closure');
372
+ expect(result).toContain('### Phase 19: Security Audit');
373
+ });
374
+
375
+ // ─── Bug #2619 (CodeRabbit follow-up): case-insensitive Phase lookahead ───
376
+ it('bug-2619: does not truncate at PHASE/phase heading containing vX.Y (case-insensitive)', async () => {
377
+ // The negative lookahead `(?!Phase\s+\S)` must be case-insensitive so that
378
+ // headings like "### PHASE 12: v1.0 Tech-Debt" or "### phase 12: v1.0 …"
379
+ // are also excluded from milestone-boundary matching.
380
+ const roadmapMixedCase = `# ROADMAP
381
+
382
+ ## Phases
383
+
384
+ ### 🚧 v1.1 Launch-Ready (In Progress)
385
+
386
+ ### PHASE 11: Structured Logging
387
+ **Goal**: Add structured logging
388
+
389
+ ### phase 12: v1.0 Tech-Debt Closure
390
+ **Goal**: Close out v1.0 debt
391
+
392
+ ### Phase 19: Security Audit
393
+ **Goal**: Full security audit
394
+ `;
395
+ const state = `---\nmilestone: v1.1\n---\n# State\n`;
396
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
397
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapMixedCase);
398
+
399
+ const result = await extractCurrentMilestone(roadmapMixedCase, tmpDir);
400
+
401
+ expect(result).toContain('### PHASE 11: Structured Logging');
402
+ expect(result).toContain('### phase 12: v1.0 Tech-Debt Closure');
403
+ expect(result).toContain('### Phase 19: Security Audit');
404
+ });
405
+
406
+ // ─── Bug #2641: <details><summary>vX.Y …</summary> not recognized as anchor ───
407
+ it('bug-2641: finds active milestone wrapped in <details><summary>vX.Y …</summary>', async () => {
408
+ // Many projects (GitHub-friendly collapse) wrap the active milestone's
409
+ // phase details inside <details><summary>v0.9 …</summary>. Without the
410
+ // <details>-aware fallback, extractCurrentMilestone misses the heading
411
+ // anchor (because <summary> is HTML), falls through to
412
+ // stripShippedMilestones, and loses all <details> blocks — including
413
+ // the active one. Result: roadmapGetPhase returns {found:false} for
414
+ // phases that ARE in the active ROADMAP.
415
+ const roadmapWithActiveDetails = `# Roadmap
416
+
417
+ ## Milestones
418
+ - ✅ **v0.8 Foundation** — shipped
419
+ - 📋 **v0.9 Local-First Bus** — active
420
+
421
+ ## Phases
422
+
423
+ <details>
424
+ <summary>✅ v0.8 Foundation — SHIPPED 2026-04-15</summary>
425
+
426
+ ### Phase 1: Old phase
427
+ **Goal:** Old goal.
428
+ </details>
429
+
430
+ <details>
431
+ <summary>v0.9 Local-First Bus (active) — Phase Details</summary>
432
+
433
+ ### Phase 1: Library
434
+ **Goal:** Build the library.
435
+
436
+ ### Phase 3: Polish
437
+ **Goal:** Add polish.
438
+ </details>
439
+ `;
440
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
441
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
442
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithActiveDetails);
443
+
444
+ const result = await extractCurrentMilestone(roadmapWithActiveDetails, tmpDir);
445
+
446
+ // Active milestone's phases must survive
447
+ expect(result).toContain('### Phase 1: Library');
448
+ expect(result).toContain('### Phase 3: Polish');
449
+ expect(result).toContain('Add polish.');
450
+ // Shipped milestone phases must not bleed in
451
+ expect(result).not.toContain('Old phase');
452
+ // The <summary> text is normalized as a `## ` milestone heading so
453
+ // downstream consumers (e.g. roadmapAnalyze's data.milestones scan) see
454
+ // the active milestone anchor — not just the body.
455
+ expect(result).toMatch(/^##\s+v0\.9 Local-First Bus \(active\) — Phase Details/m);
456
+ });
457
+
458
+ // ─── Bug #2641 (CodeRabbit follow-up): quoted YAML version normalization ───
459
+ it('bug-2641: handles quoted YAML version (milestone: "v0.9") in STATE.md', async () => {
460
+ // STATE.md may use quoted YAML (`milestone: "v0.9"`). Without quote-stripping,
461
+ // version would carry literal quotes, escapedVersion would be `\"v0\.9\"`,
462
+ // and neither the markdown-heading regex nor the <details><summary> fallback
463
+ // would match — falling through to stripShippedMilestones and reintroducing
464
+ // the archived-milestone misrouting this PR addresses. Parity with
465
+ // parseMilestoneFromState() and getMilestoneInfo() (which both strip quotes).
466
+ const roadmap = `# Roadmap
467
+
468
+ <details>
469
+ <summary>v0.9 Local-First Bus (active) — Phase Details</summary>
470
+
471
+ ### Phase 3: Polish
472
+ **Goal:** Add polish.
473
+ </details>
474
+ `;
475
+ const stateQuoted = `---\nmilestone: "v0.9"\n---\n# State\n`;
476
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), stateQuoted);
477
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
478
+
479
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
480
+
481
+ expect(result).toContain('### Phase 3: Polish');
482
+ expect(result).toMatch(/^##\s+v0\.9 Local-First Bus/m);
483
+ });
484
+
485
+ // ─── Bug #2641: tolerate attributes on <details> tag (e.g. <details open>) ───
486
+ it('bug-2641: finds active milestone in <details open><summary>vX.Y …</summary>', async () => {
487
+ // GitHub auto-renders <details open> for sections that should default to
488
+ // expanded. The <details>-aware fallback regex must use <details\b[^>]*>
489
+ // (not literal <details>) so attribute-bearing tags also anchor correctly.
490
+ const roadmapWithDetailsOpen = `# Roadmap
491
+
492
+ ## Phases
493
+
494
+ <details open>
495
+ <summary>v0.9 Local-First Bus (active) — Phase Details</summary>
496
+
497
+ ### Phase 3: Polish
498
+ **Goal:** Add polish.
499
+ </details>
500
+ `;
501
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
502
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
503
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithDetailsOpen);
504
+
505
+ const result = await extractCurrentMilestone(roadmapWithDetailsOpen, tmpDir);
506
+
507
+ expect(result).toContain('### Phase 3: Polish');
508
+ expect(result).toContain('Add polish.');
509
+ expect(result).toMatch(/^##\s+v0\.9 Local-First Bus/m);
510
+ });
511
+
512
+ it('bug-2641: v0.1 must not substring-match v0.10 in markdown heading anchor path', async () => {
513
+ const roadmap = `# Roadmap
514
+
515
+ ## v0.10 Future Milestone
516
+
517
+ ### Phase 7: Wrong Phase
518
+ **Goal:** This is from v0.10, not v0.1.
519
+
520
+ ## v0.1 Active Milestone
521
+
522
+ ### Phase 1: Right Phase
523
+ **Goal:** This is the active milestone.
524
+ `;
525
+ const state = `---\nmilestone: v0.1\n---\n# State\n`;
526
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
527
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
528
+
529
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
530
+
531
+ expect(result).toContain('### Phase 1: Right Phase');
532
+ expect(result).toContain('This is the active milestone');
533
+ expect(result).not.toContain('Phase 7: Wrong Phase');
534
+ expect(result).not.toContain('This is from v0.10');
535
+ });
536
+
537
+ // ─── Bug #2641 (review hardening): substring-version trap ───
538
+ it('bug-2641: v0.1 must not substring-match <summary>v0.10 …</summary>', async () => {
539
+ // The fallback regex anchors on `escapedVersion` inside `<summary>` text.
540
+ // Without a non-version-character lookahead, `v0.1` matches inside `v0.10`,
541
+ // and the function returns the v0.10 block's body as the active milestone
542
+ // — confidently-wrong content (worse than the pre-fix fall-through, which
543
+ // returned known-incomplete content). The synthesized `## v0.10 …` heading
544
+ // would then mask the bug from downstream debugging. Lock the boundary.
545
+ const roadmap = `# Roadmap
546
+
547
+ <details>
548
+ <summary>v0.10 Future Milestone — Phase Details</summary>
549
+
550
+ ### Phase 7: Wrong Phase
551
+ **Goal:** This is from v0.10, not v0.1.
552
+ </details>
553
+
554
+ <details>
555
+ <summary>v0.1 Active — Phase Details</summary>
556
+
557
+ ### Phase 1: Right Phase
558
+ **Goal:** This is the active milestone.
559
+ </details>
560
+ `;
561
+ const state = `---\nmilestone: v0.1\n---\n# State\n`;
562
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
563
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
564
+
565
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
566
+
567
+ expect(result).toContain('### Phase 1: Right Phase');
568
+ expect(result).toContain('This is the active milestone');
569
+ expect(result).not.toContain('Phase 7: Wrong Phase');
570
+ expect(result).not.toContain('This is from v0.10');
571
+ });
572
+
573
+ // ─── Bug #2641 (review hardening): nested <details> guard ───
574
+ it('bug-2641: nested <details> falls through (does not silently truncate)', async () => {
575
+ // The lazy [\s\S]*?</details> terminates on the FIRST </details>, which
576
+ // is the inner closer when nesting is present. Without a guard, the
577
+ // function returns truncated body and silently loses everything after the
578
+ // inner </details>. Detect nesting and fall through to the existing
579
+ // stripShippedMilestones path so the failure mode is loud (no match) not
580
+ // silent (truncated content).
581
+ const roadmap = `# Roadmap
582
+
583
+ <details>
584
+ <summary>v0.9 Local-First Bus — Phase Details</summary>
585
+
586
+ ### Phase 1: Library
587
+ <details>
588
+ <summary>Implementation notes</summary>
589
+ Detail
590
+ </details>
591
+
592
+ ### Phase 2: Polish — would be silently lost without the guard
593
+ **Goal:** Add polish.
594
+ </details>
595
+ `;
596
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
597
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
598
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
599
+
600
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
601
+
602
+ // The critical contract: must NOT return a synthesized `## v0.9` heading
603
+ // anchored to truncated body. The truncation case (without the nested-
604
+ // guard) would emit `## v0.9 Local-First Bus\n\n### Phase 1: Library\n
605
+ // <details><summary>Implementation notes</summary>\nDetail` and silently
606
+ // lose Phase 2 — confidently-wrong content. Falling through to
607
+ // stripShippedMilestones() may leak unrelated content but doesn't claim
608
+ // to be the active milestone. Loud failure > silent truncation.
609
+ expect(result).not.toMatch(/^##\s+v0\.9 Local-First Bus/m);
610
+ // The Phase 1 detail block (which sits between the outer <details> open
611
+ // and the inner </details>) must not appear under a v0.9 heading.
612
+ expect(result).not.toMatch(/##\s+v0\.9[\s\S]*Phase 1: Library/);
613
+ });
614
+
615
+ // ─── Bug #2641 (review hardening): empty <details> body guard ───
616
+ it('bug-2641: empty <details> body falls through (no phantom milestone)', async () => {
617
+ // <details><summary>v0.9</summary></details> with no body would synthesize
618
+ // `## v0.9\n` — a phantom milestone with zero phases. roadmapAnalyze would
619
+ // then return {phases: []} with no error signal. Treat as no-match.
620
+ const roadmap = `# Roadmap
621
+
622
+ <details>
623
+ <summary>v0.9 Empty</summary>
624
+ </details>
625
+ `;
626
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
627
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
628
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
629
+
630
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
631
+
632
+ // Must not synthesize a phantom heading
633
+ expect(result).not.toMatch(/^##\s+v0\.9/m);
634
+ });
635
+
636
+ // ─── Bug #2641 (lockdown): leading `#` in <summary> stripped from synthesized heading ───
637
+ it('bug-2641: strips leading # from <summary> text in synthesized heading', async () => {
638
+ // Prevents a `<summary># v0.9 …</summary>` from producing `## # v0.9 …`,
639
+ // which downstream `#{2,4}` heading regexes would parse as a 4-hash
640
+ // header. The implementation uses `.replace(/^#+\s*/, '')` on the captured
641
+ // summary; this test pins that path so a future refactor doesn't drop it.
642
+ const roadmap = `# Roadmap
643
+
644
+ <details>
645
+ <summary># v0.9 Hash-Prefixed</summary>
646
+
647
+ ### Phase 1: Test
648
+ **Goal:** Works.
649
+ </details>
650
+ `;
651
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
652
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
653
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
654
+
655
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
656
+
657
+ // Synthesized heading must be `## v0.9 …`, not `## # v0.9 …`
658
+ expect(result).toMatch(/^##\s+v0\.9 Hash-Prefixed/m);
659
+ expect(result).not.toMatch(/^##\s+#+/m);
660
+ });
661
+
662
+ // ─── Bug #2641 (review hardening): inline HTML in <summary> + leading # ───
663
+ it('bug-2641: tolerates inline HTML in <summary> and strips it from synthesized heading', async () => {
664
+ // GitHub-rendered summaries commonly contain inline tags like
665
+ // <em>(active)</em> or <code>v0.9</code>. The summary capture must allow
666
+ // them through and the synthesized `## ` heading must strip the tags so
667
+ // the result is clean markdown (no `## <em>...</em>`).
668
+ const roadmap = `# Roadmap
669
+
670
+ <details open>
671
+ <summary><strong>v0.9 Local-First Bus</strong> <em>(active)</em></summary>
672
+
673
+ ### Phase 3: Polish
674
+ **Goal:** Add polish.
675
+ </details>
676
+ `;
677
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
678
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
679
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
680
+
681
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
682
+
683
+ expect(result).toContain('### Phase 3: Polish');
684
+ expect(result).toMatch(/^##\s+v0\.9 Local-First Bus\s+\(active\)/m);
685
+ // Tags must be stripped from the synthesized heading
686
+ expect(result).not.toMatch(/^##.*<strong>/m);
687
+ expect(result).not.toMatch(/^##.*<em>/m);
688
+ });
689
+
690
+ // ─── Bug #2641 (lockdown): single-quote YAML version ───
691
+ it('bug-2641: handles single-quote YAML version (milestone: \'v0.9\') in STATE.md', async () => {
692
+ // Parity coverage with the double-quote test. The strip pattern
693
+ // `/^["']|["']$/g` handles both — locked here so a future change to
694
+ // either character class doesn't silently regress one form.
695
+ const roadmap = `# Roadmap
696
+
697
+ <details>
698
+ <summary>v0.9 Local-First Bus — Phase Details</summary>
699
+
700
+ ### Phase 3: Polish
701
+ **Goal:** Add polish.
702
+ </details>
703
+ `;
704
+ const stateSingle = `---\nmilestone: 'v0.9'\n---\n# State\n`;
705
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), stateSingle);
706
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
707
+
708
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
709
+
710
+ expect(result).toContain('### Phase 3: Polish');
711
+ expect(result).toMatch(/^##\s+v0\.9 Local-First Bus/m);
712
+ });
713
+
714
+ // ─── Bug #2641 (lockdown): heading wins when BOTH heading and <details> match ───
715
+ it('bug-2641: markdown heading anchor wins over <details><summary> fallback', async () => {
716
+ // The <details> fallback only fires when the heading-level lookup MISSES.
717
+ // If a ROADMAP has both `### v0.9 …` heading AND `<details><summary>v0.9 …</summary>`
718
+ // for the same version, the heading anchor must win. Locks precedence so a
719
+ // future refactor doesn't accidentally flip the order and silently change
720
+ // which slice gets returned.
721
+ const roadmap = `# Roadmap
722
+
723
+ ### v0.9 Local-First Bus (heading-anchored)
724
+
725
+ ### Phase 1: Heading-anchored Phase
726
+ **Goal:** From the heading slice.
727
+
728
+ <details>
729
+ <summary>v0.9 Local-First Bus — Phase Details (details-anchored)</summary>
730
+
731
+ ### Phase 99: Details-anchored Phase
732
+ **Goal:** From the details slice.
733
+ </details>
734
+ `;
735
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
736
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
737
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
738
+
739
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
740
+
741
+ // Heading slice is what got returned — original `### v0.9` heading
742
+ // present, Phase 1 from the heading slice present.
743
+ expect(result).toContain('### v0.9 Local-First Bus (heading-anchored)');
744
+ expect(result).toContain('### Phase 1: Heading-anchored Phase');
745
+ // Critical: the <details> fallback did NOT fire, so no synthesized
746
+ // `## ` heading is prepended. (The heading-anchor slice extends to the
747
+ // next milestone boundary and includes the downstream <details> block
748
+ // verbatim — that's a property of the heading-anchor path, not the
749
+ // fallback. We're locking which CODE PATH ran, not how its output looks.)
750
+ expect(result).not.toMatch(/^##\s+v0\.9 Local-First Bus.*details-anchored/im);
751
+ // The original heading must appear at the START of the slice (the
752
+ // heading-anchor path returns content starting at the matched heading).
753
+ expect(result.indexOf('### v0.9 Local-First Bus (heading-anchored)')).toBe(0);
754
+ });
755
+
756
+ // ─── Bug #2641 (lockdown): multiple <details> blocks for same version ───
757
+ it('bug-2641: when multiple <details> match the version, the FIRST is returned', async () => {
758
+ // `content.match(detailsPattern)` (non-`g`) returns the first match in
759
+ // document order. Lock this so a future change to the matcher (e.g.
760
+ // switching to `matchAll` and picking the last) doesn't silently change
761
+ // which block is treated as the active milestone. Document-order-first is
762
+ // intentional: in real ROADMAPs, the active milestone is conventionally
763
+ // listed before any duplicates (e.g. retro-active or branch-merge artefacts).
764
+ const roadmap = `# Roadmap
765
+
766
+ <details>
767
+ <summary>v0.9 Local-First Bus — Phase Details (FIRST)</summary>
768
+
769
+ ### Phase 1: First-block Phase
770
+ **Goal:** Should be returned.
771
+ </details>
772
+
773
+ <details>
774
+ <summary>v0.9 Local-First Bus — Phase Details (SECOND)</summary>
775
+
776
+ ### Phase 99: Second-block Phase
777
+ **Goal:** Should NOT be returned.
778
+ </details>
779
+ `;
780
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
781
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
782
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
783
+
784
+ const result = await extractCurrentMilestone(roadmap, tmpDir);
785
+
786
+ expect(result).toContain('### Phase 1: First-block Phase');
787
+ expect(result).not.toContain('### Phase 99: Second-block Phase');
788
+ expect(result).toMatch(/^##\s+v0\.9 Local-First Bus.*FIRST/m);
789
+ });
790
+
791
+ // ─── Bug #2422: same-version sub-heading truncation ───────────────────
792
+ it('bug-2422: does not truncate at same-version sub-heading (## v2.0 Phase Details)', async () => {
793
+ const roadmapWithDetails = `# ROADMAP
794
+
795
+ ### 🚧 v2.0 My Milestone (In Progress)
796
+ - [ ] **Phase 100: Real work**
797
+
798
+ ## v2.0 Phase Details
799
+ ### Phase 100: Real work
800
+ **Goal**: Do stuff.
801
+ `;
802
+ const state = `---\nmilestone: v2.0\n---\n# State\n`;
803
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
804
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithDetails);
805
+
806
+ const result = await extractCurrentMilestone(roadmapWithDetails, tmpDir);
807
+
808
+ // The detail section must survive — not be cut off
809
+ expect(result).toContain('Phase 100');
810
+ expect(result).toContain('Phase Details');
811
+ });
812
+
813
+ // ─── Bug #3493: generic `## Phase Details` after planned-milestone sibling ──
814
+ it('bug-3493: preserves generic `## Phase Details` heading after `### 📋 vX.Y+ (Planned)` sibling', async () => {
815
+ // Minimal repro from issue #3493 verbatim: a generic (non-version-prefixed)
816
+ // `## Phase Details` heading sits AFTER a `### 📋 v2.1+ (Planned)` sibling
817
+ // in document order. The 📋-bearing sibling otherwise terminates the slice
818
+ // and the generic Phase Details body — including `### Phase 4: Next` — is
819
+ // dropped, even though it belongs to the active v2.0 milestone.
820
+ const roadmap = `# Roadmap: Example
821
+
822
+ ## Phases
823
+
824
+ <details>
825
+ <summary>✅ v1.0 First Milestone — SHIPPED</summary>
826
+ - [x] **Phase 1: First** (1/1 plans)
827
+ </details>
828
+
829
+ ### v2.0 Active Milestone (Phases 2–5)
830
+
831
+ - [x] **Phase 2: Foundation** (5/5 plans) — completed
832
+ - [x] **Phase 3: Pipeline** (8/8 plans) — completed
833
+ - [ ] **Phase 4: Next** — pending
834
+ - [ ] **Phase 5: Final** — pending
835
+
836
+ ### 📋 v2.1+ (Planned — Not Yet Scoped)
837
+
838
+ Candidates pending milestone selection.
839
+
840
+ ## Phase Details
841
+
842
+ ### Phase 2: Foundation
843
+ **Goal**: Foundation goal.
844
+
845
+ ### Phase 3: Pipeline
846
+ **Goal**: Pipeline goal.
847
+
848
+ ### Phase 4: Next
849
+ **Goal**: Next goal.
850
+
851
+ ### Phase 5: Final
852
+ **Goal**: Final goal.
853
+ `;
854
+ const state = `---\nmilestone: v2.0\n---\n# State\n`;
855
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
856
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
857
+
858
+ const slice = await extractCurrentMilestone(roadmap, tmpDir);
859
+
860
+ // The generic Phase Details heading and all four detail sections must
861
+ // survive — they belong to the active v2.0 milestone even though they
862
+ // sit after the planned-milestone sibling in document order.
863
+ expect(slice).toContain('## Phase Details');
864
+ expect(slice).toContain('### Phase 2: Foundation');
865
+ expect(slice).toContain('### Phase 3: Pipeline');
866
+ expect(slice).toContain('### Phase 4: Next');
867
+ expect(slice).toContain('### Phase 5: Final');
868
+
869
+ // And roadmapGetPhase (which calls extractCurrentMilestone internally)
870
+ // must locate Phase 4's detail section.
871
+ const result = await roadmapGetPhase(['4'], tmpDir);
872
+ const data = result.data as Record<string, unknown>;
873
+ expect(data.found).toBe(true);
874
+ expect(data.phase_number).toBe('4');
875
+ expect(data.phase_name).toBe('Next');
876
+ });
877
+ });
878
+
879
+ // ─── roadmapGetPhase ──────────────────────────────────────────────────────
880
+
881
+ describe('roadmapGetPhase', () => {
882
+ it('returns phase info for existing phase', async () => {
883
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
884
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
885
+ const result = await roadmapGetPhase(['10'], tmpDir);
886
+ const data = result.data as Record<string, unknown>;
887
+ expect(data.found).toBe(true);
888
+ expect(data.phase_number).toBe('10');
889
+ expect(data.phase_name).toBe('Read-Only Queries');
890
+ expect(data.goal).toBe('Port read-only query operations.');
891
+ expect((data.success_criteria as string[]).length).toBe(2);
892
+ expect(data.section).toContain('### Phase 10');
893
+ });
894
+
895
+ it('returns { found: false } for nonexistent phase', async () => {
896
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
897
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
898
+ const result = await roadmapGetPhase(['999'], tmpDir);
899
+ const data = result.data as Record<string, unknown>;
900
+ expect(data.found).toBe(false);
901
+ expect(data.phase_number).toBe('999');
902
+ });
903
+
904
+ it('throws GSDError when no phase number provided', async () => {
905
+ await expect(roadmapGetPhase([], tmpDir)).rejects.toThrow();
906
+ });
907
+
908
+ it('handles malformed roadmap (checklist-only, no detail section)', async () => {
909
+ const malformed = `# Roadmap\n\n- [ ] **Phase 99: Missing Detail**\n`;
910
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), malformed);
911
+ const result = await roadmapGetPhase(['99'], tmpDir);
912
+ const data = result.data as Record<string, unknown>;
913
+ expect(data.error).toBe('malformed_roadmap');
914
+ expect(data.phase_name).toBe('Missing Detail');
915
+ });
916
+
917
+ it('returns error object when ROADMAP.md not found', async () => {
918
+ const result = await roadmapGetPhase(['10'], tmpDir);
919
+ const data = result.data as Record<string, unknown>;
920
+ expect(data.found).toBe(false);
921
+ expect(data.error).toBe('ROADMAP.md not found');
922
+ });
923
+
924
+ // ─── Bug #2641 (regression): end-to-end via roadmapGetPhase ───
925
+ it('bug-2641: returns found:true for phase inside <details>-wrapped active milestone', async () => {
926
+ // End-to-end coverage: roadmapGetPhase calls extractCurrentMilestone
927
+ // internally. Without the <details>-aware fallback, the active
928
+ // milestone's phases were stripped before the phase-heading lookup,
929
+ // and roadmapGetPhase returned {found:false} for phases that exist.
930
+ const roadmap = `# Roadmap
931
+
932
+ ## Milestones
933
+ - 📋 **v0.9 Local-First Bus** — active
934
+
935
+ <details>
936
+ <summary>v0.9 Local-First Bus (active) — Phase Details</summary>
937
+
938
+ ### Phase 3: Polish
939
+
940
+ **Goal:** Add polish.
941
+
942
+ **Success Criteria**:
943
+ 1. Polish applied
944
+ 2. Tests pass
945
+ </details>
946
+ `;
947
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
948
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
949
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
950
+
951
+ const result = await roadmapGetPhase(['3'], tmpDir);
952
+ const data = result.data as Record<string, unknown>;
953
+ expect(data.found).toBe(true);
954
+ expect(data.phase_number).toBe('3');
955
+ expect(data.phase_name).toBe('Polish');
956
+ expect(data.goal).toBe('Add polish.');
957
+ });
958
+ });
959
+
960
+ // ─── roadmapAnalyze ───────────────────────────────────────────────────────
961
+
962
+ describe('roadmapAnalyze', () => {
963
+ it('returns full analysis for valid roadmap', async () => {
964
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
965
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
966
+
967
+ // Create some plan/summary files for disk correlation
968
+ await writeFile(join(tmpDir, '.planning', 'phases', '09-foundation', '09-01-PLAN.md'), '---\n---\n');
969
+ await writeFile(join(tmpDir, '.planning', 'phases', '09-foundation', '09-01-SUMMARY.md'), '---\n---\n');
970
+ await writeFile(join(tmpDir, '.planning', 'phases', '10-read-only-queries', '10-01-PLAN.md'), '---\n---\n');
971
+
972
+ const result = await roadmapAnalyze([], tmpDir);
973
+ const data = result.data as Record<string, unknown>;
974
+
975
+ expect(data.phase_count).toBe(3);
976
+ expect((data.phases as Array<Record<string, unknown>>).length).toBe(3);
977
+
978
+ const phases = data.phases as Array<Record<string, unknown>>;
979
+ // Phase 9 has 1 plan, 1 summary => complete (or roadmap checkbox says complete)
980
+ const p9 = phases.find(p => p.number === '9');
981
+ expect(p9).toBeDefined();
982
+ expect(p9!.name).toBe('Foundation and Test Infrastructure');
983
+ expect(p9!.roadmap_complete).toBe(true); // [x] in checklist
984
+
985
+ // Phase 10 has 1 plan, 0 summaries => planned
986
+ const p10 = phases.find(p => p.number === '10');
987
+ expect(p10).toBeDefined();
988
+ expect(p10!.disk_status).toBe('planned');
989
+ expect(p10!.plan_count).toBe(1);
990
+
991
+ // Phase 11 has no directory content
992
+ const p11 = phases.find(p => p.number === '11');
993
+ expect(p11).toBeDefined();
994
+ expect(p11!.disk_status).toBe('no_directory');
995
+
996
+ expect(data.total_plans).toBeGreaterThan(0);
997
+ expect(typeof data.progress_percent).toBe('number');
998
+ });
999
+
1000
+ it('returns error when ROADMAP.md not found', async () => {
1001
+ const result = await roadmapAnalyze([], tmpDir);
1002
+ const data = result.data as Record<string, unknown>;
1003
+ expect(data.error).toBe('ROADMAP.md not found');
1004
+ });
1005
+
1006
+ it('overrides disk_status to complete when roadmap checkbox is checked', async () => {
1007
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
1008
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
1009
+
1010
+ // Phase 9 dir is empty (no plans/summaries) but roadmap has [x]
1011
+ const result = await roadmapAnalyze([], tmpDir);
1012
+ const data = result.data as Record<string, unknown>;
1013
+ const phases = data.phases as Array<Record<string, unknown>>;
1014
+ const p9 = phases.find(p => p.number === '9');
1015
+ expect(p9!.disk_status).toBe('complete');
1016
+ expect(p9!.roadmap_complete).toBe(true);
1017
+ });
1018
+
1019
+ it('detects missing phase details from checklist', async () => {
1020
+ const roadmapWithExtra = ROADMAP_CONTENT + '\n- [ ] **Phase 99: Future Phase**\n';
1021
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithExtra);
1022
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
1023
+
1024
+ const result = await roadmapAnalyze([], tmpDir);
1025
+ const data = result.data as Record<string, unknown>;
1026
+ expect(data.missing_phase_details).toContain('99');
1027
+ });
1028
+
1029
+ it('handles repeated calls correctly (no lastIndex bug)', async () => {
1030
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
1031
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
1032
+
1033
+ const result1 = await roadmapAnalyze([], tmpDir);
1034
+ const result2 = await roadmapAnalyze([], tmpDir);
1035
+ const data1 = result1.data as Record<string, unknown>;
1036
+ const data2 = result2.data as Record<string, unknown>;
1037
+
1038
+ expect((data1.phases as unknown[]).length).toBe((data2.phases as unknown[]).length);
1039
+ });
1040
+
1041
+ // ─── Bug #2641 (regression): roadmapAnalyze populates milestones array
1042
+ // for <details>-wrapped active milestones via the synthesized `## ` heading. ───
1043
+ it('bug-2641: data.milestones contains the active milestone when wrapped in <details>', async () => {
1044
+ // Without the synthesized heading injected by extractCurrentMilestone's
1045
+ // <details>-aware fallback, the milestone-heading scan at the bottom of
1046
+ // roadmapAnalyze (`/##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi`) would find
1047
+ // nothing useful inside the body of a <details>-wrapped active milestone
1048
+ // and `data.milestones` would be empty / wrong.
1049
+ const roadmap = `# Roadmap
1050
+
1051
+ ## Milestones
1052
+ - 📋 **v0.9 Local-First Bus** — active
1053
+
1054
+ <details>
1055
+ <summary>v0.9 Local-First Bus (active) — Phase Details</summary>
1056
+
1057
+ ### Phase 1: Library
1058
+ **Goal:** Build the library.
1059
+
1060
+ ### Phase 3: Polish
1061
+ **Goal:** Add polish.
1062
+ </details>
1063
+ `;
1064
+ const state = `---\nmilestone: v0.9\n---\n# State\n`;
1065
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
1066
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
1067
+
1068
+ const result = await roadmapAnalyze([], tmpDir);
1069
+ const data = result.data as Record<string, unknown>;
1070
+ // Defensive guard: fail with a clear message if roadmapAnalyze didn't
1071
+ // populate data.milestones, rather than throwing TypeError on `.some()`.
1072
+ expect(data.milestones).toBeDefined();
1073
+ const milestones = data.milestones as Array<{ heading: string; version: string }>;
1074
+
1075
+ // Active milestone surfaces with correct version
1076
+ expect(milestones.some(m => m.version === 'v0.9')).toBe(true);
1077
+ expect(milestones.some(m => m.heading.includes('Local-First Bus'))).toBe(true);
1078
+
1079
+ // Phases are also surfaced (the original bug)
1080
+ const phases = data.phases as Array<Record<string, unknown>>;
1081
+ expect(phases.length).toBe(2);
1082
+ expect(phases.some(p => p.number === '1')).toBe(true);
1083
+ expect(phases.some(p => p.number === '3')).toBe(true);
1084
+ });
1085
+
1086
+ // ─── Bug #3816: bullet-list phases under prefixed-milestone heading ─────
1087
+
1088
+ it('#3816: roadmapAnalyze finds phases listed as bullets under prefixed-milestone heading', async () => {
1089
+ // Project uses "aimpf-v1.1" milestone (non-standard prefix).
1090
+ // ROADMAP uses bullet-format phases (- [ ] Phase N:) under the active
1091
+ // milestone heading, not heading-format (### Phase N:).
1092
+ const roadmap = [
1093
+ '# Roadmap',
1094
+ '',
1095
+ '### 🚧 aimpf-v1.1 Branch Rename + V1.0 Debt Closure (active)',
1096
+ '',
1097
+ '- [x] Phase 7: Branch Rename — pending /gsd:spec-phase 7',
1098
+ '',
1099
+ '## Backlog',
1100
+ '',
1101
+ '### Phase 999.1: PycartaContext — backlog item',
1102
+ '**Goal:** Parked idea.',
1103
+ '',
1104
+ '---',
1105
+ '*Last updated: 2026-05-21*',
1106
+ ].join('\n');
1107
+ const state = '---\nmilestone: aimpf-v1.1\nstatus: executing\n---\n\n# State\n';
1108
+
1109
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
1110
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
1111
+
1112
+ const result = await roadmapAnalyze([], tmpDir);
1113
+ const data = result.data as Record<string, unknown>;
1114
+ const phases = data.phases as Array<Record<string, unknown>>;
1115
+
1116
+ // Phase 7 must be discovered — it is in the active milestone section
1117
+ expect(phases.some(p => p.number === '7')).toBe(true);
1118
+ // Backlog phase 999.1 must NOT appear in the phases list
1119
+ expect(phases.every(p => p.number !== '999.1')).toBe(true);
1120
+ // phase_count must reflect active phases only
1121
+ const activePhases = phases.filter(p => {
1122
+ const num = parseFloat(String(p.number));
1123
+ return num < 999;
1124
+ });
1125
+ expect(activePhases.length).toBeGreaterThan(0);
1126
+ });
1127
+
1128
+ it('#3816: roadmapGetPhase finds phase listed as bullet under prefixed-milestone heading', async () => {
1129
+ // Same ROADMAP structure as above, but using roadmapGetPhase
1130
+ const roadmap = [
1131
+ '# Roadmap',
1132
+ '',
1133
+ '### 🚧 aimpf-v1.1 Branch Rename + V1.0 Debt Closure (active)',
1134
+ '',
1135
+ '- [ ] Phase 7: Branch Rename',
1136
+ '',
1137
+ '## Backlog',
1138
+ '',
1139
+ '---',
1140
+ '*Last updated: 2026-05-21*',
1141
+ ].join('\n');
1142
+ const state = '---\nmilestone: aimpf-v1.1\nstatus: executing\n---\n\n# State\n';
1143
+
1144
+ await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
1145
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
1146
+
1147
+ const result = await roadmapGetPhase(['7'], tmpDir);
1148
+ const data = result.data as Record<string, unknown>;
1149
+
1150
+ expect(data.found).toBe(true);
1151
+ expect(data.phase_number).toBe('7');
1152
+ expect(data.phase_name).toBe('Branch Rename');
1153
+ });
1154
+ });
1155
+
1156
+ // ─── extractPhasesFromSection + extractNextMilestoneSection (#2497) ──────
1157
+
1158
+ describe('extractPhasesFromSection', () => {
1159
+ it('parses phase number, name, goal, and depends_on from a milestone section', () => {
1160
+ const section = [
1161
+ '',
1162
+ '### Phase 31: Email Schema',
1163
+ '**Goal**: Set up Prisma models.',
1164
+ '**Depends on**: None',
1165
+ '',
1166
+ '### Phase 32: Today\'s Sheets',
1167
+ '**Goal**: Port the GAS sender.',
1168
+ '**Depends on**: Phase 31',
1169
+ '',
1170
+ ].join('\n');
1171
+ const phases = extractPhasesFromSection(section);
1172
+ expect(phases).toEqual([
1173
+ { number: '31', name: 'Email Schema', goal: 'Set up Prisma models.', depends_on: 'None' },
1174
+ { number: '32', name: "Today's Sheets", goal: 'Port the GAS sender.', depends_on: 'Phase 31' },
1175
+ ]);
1176
+ });
1177
+
1178
+ it('returns empty array when section has no phase headings', () => {
1179
+ expect(extractPhasesFromSection('no phases here\njust prose.')).toEqual([]);
1180
+ });
1181
+ });
1182
+
1183
+ describe('extractNextMilestoneSection', () => {
1184
+ const MULTI = [
1185
+ '# Roadmap',
1186
+ '',
1187
+ '## Milestone v1.0: Old — ✅ SHIPPED 2026-01-01',
1188
+ '',
1189
+ 'Shipped stuff.',
1190
+ '',
1191
+ '## Milestone v2.0.5: Current Milestone',
1192
+ '',
1193
+ '### Phase 35: Audit',
1194
+ '**Goal**: Audit schemas.',
1195
+ '',
1196
+ '## Milestone v2.1: Daily Emails',
1197
+ '',
1198
+ '### Phase 31: Schema',
1199
+ '**Goal**: Build schema.',
1200
+ '**Depends on**: None',
1201
+ '',
1202
+ '### Phase 32: Sending',
1203
+ '**Goal**: Send emails.',
1204
+ '**Depends on**: Phase 31',
1205
+ '',
1206
+ '## Milestone v2.2: Later',
1207
+ '',
1208
+ '### Phase 99: Future',
1209
+ '**Goal**: Later work.',
1210
+ ].join('\n');
1211
+
1212
+ it('returns the milestone immediately after the active one (STATE-driven)', async () => {
1213
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), MULTI);
1214
+ await writeFile(
1215
+ join(tmpDir, '.planning', 'STATE.md'),
1216
+ '---\nmilestone: v2.0.5\nmilestone_name: Current Milestone\n---\n',
1217
+ );
1218
+ const next = await extractNextMilestoneSection(MULTI, tmpDir);
1219
+ expect(next).not.toBeNull();
1220
+ expect(next!.version).toBe('v2.1');
1221
+ expect(next!.name).toBe('Daily Emails');
1222
+ // Phases parse correctly from the returned section — only v2.1 phases,
1223
+ // not v2.2's Phase 99.
1224
+ const phases = extractPhasesFromSection(next!.section).map(p => p.number);
1225
+ expect(phases).toEqual(['31', '32']);
1226
+ });
1227
+
1228
+ it('returns null when the active milestone is the last one in ROADMAP', async () => {
1229
+ const roadmap = [
1230
+ '# Roadmap',
1231
+ '',
1232
+ '## Milestone v2.0.5: Last One',
1233
+ '',
1234
+ '### Phase 35: Final',
1235
+ '**Goal**: Final work.',
1236
+ ].join('\n');
1237
+ await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
1238
+ await writeFile(
1239
+ join(tmpDir, '.planning', 'STATE.md'),
1240
+ '---\nmilestone: v2.0.5\n---\n',
1241
+ );
1242
+ const next = await extractNextMilestoneSection(roadmap, tmpDir);
1243
+ expect(next).toBeNull();
1244
+ });
1245
+
1246
+ it('returns null when no current milestone can be resolved', async () => {
1247
+ const next = await extractNextMilestoneSection('# Roadmap\nno milestones\n', tmpDir);
1248
+ expect(next).toBeNull();
1249
+ });
1250
+ });