@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,1131 @@
1
+ /**
2
+ * Roadmap query handlers — ROADMAP.md analysis and phase lookup.
3
+ *
4
+ * Ported from get-shit-done/bin/lib/roadmap.cjs and core.cjs.
5
+ * Provides roadmap.analyze (multi-pass parsing with disk correlation)
6
+ * and roadmap.get-phase (single phase section extraction).
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { roadmapAnalyze, roadmapGetPhase } from './roadmap.js';
11
+ *
12
+ * const analysis = await roadmapAnalyze([], '/project');
13
+ * // { data: { phases: [...], phase_count: 6, progress_percent: 50, ... } }
14
+ *
15
+ * const phase = await roadmapGetPhase(['10'], '/project');
16
+ * // { data: { found: true, phase_number: '10', phase_name: 'Read-Only Queries', ... } }
17
+ * ```
18
+ */
19
+
20
+ import { existsSync } from 'node:fs';
21
+ import { readFile, writeFile, readdir } from 'node:fs/promises';
22
+ import { join } from 'node:path';
23
+ import { GSDError, ErrorClassification } from '../errors.js';
24
+ import { resolveGsdToolsPath } from '../sdk-package-compatibility.js';
25
+ import {
26
+ escapeRegex,
27
+ normalizePhaseName,
28
+ phaseTokenMatches,
29
+ planningPaths,
30
+ } from './helpers.js';
31
+ import type { QueryHandler, QueryResult } from './utils.js';
32
+
33
+ // ─── Internal types ───────────────────────────────────────────────────────
34
+
35
+ interface PhaseSection {
36
+ found: boolean;
37
+ phase_number: string;
38
+ phase_name: string;
39
+ goal?: string | null;
40
+ /**
41
+ * Phase-level mode flag from `**Mode:** mvp` in ROADMAP.md.
42
+ * Lowercased + trimmed for canonical comparison; null when the field is absent.
43
+ * Unrecognized values are preserved verbatim for forward-compat (mirrors `roadmap.cjs`).
44
+ * Read by the `phase.mvp-mode` resolver and downstream MVP-aware workflows.
45
+ */
46
+ mode?: string | null;
47
+ success_criteria?: string[];
48
+ section?: string;
49
+ error?: string;
50
+ message?: string;
51
+ }
52
+
53
+ // ─── Exported helpers ─────────────────────────────────────────────────────
54
+
55
+ /**
56
+ * Strip <details>...</details> blocks from content (shipped milestones).
57
+ *
58
+ * Port of stripShippedMilestones from core.cjs line 1082-1084.
59
+ */
60
+ export function stripShippedMilestones(content: string): string {
61
+ // Pattern 1: <details>...</details> blocks (explicit collapse).
62
+ // <details\b[^>]*> tolerates attributes (e.g. <details open>, <details class="…">).
63
+ // Symmetry with extractCurrentMilestone()'s <details>-aware fallback (#2641):
64
+ // both functions must agree on what counts as a <details> opening tag, or
65
+ // shipped content wrapped in attributed tags would leak through here while
66
+ // the active-milestone anchor in extractCurrentMilestone() correctly fires.
67
+ let result = content.replace(/<details\b[^>]*>[\s\S]*?<\/details>/gi, '');
68
+ // Pattern 2: inline milestone headings marked as shipped.
69
+ // Keep aligned with heading levels accepted by extractCurrentMilestone() (## and ###).
70
+ const sections = result.split(/(?=^#{2,3}\s)/m);
71
+ result = sections.filter(s => !/^#{2,3}\s[^\n]*✅\s*SHIPPED\b/im.test(s)).join('');
72
+ return result;
73
+ }
74
+
75
+ /**
76
+ * Read milestone + name from STATE.md frontmatter when ROADMAP does not encode them.
77
+ */
78
+ async function parseMilestoneFromState(projectDir: string, workstream?: string): Promise<{ version: string; name: string } | null> {
79
+ try {
80
+ const stateRaw = await readFile(planningPaths(projectDir, workstream).state, 'utf-8');
81
+ const vm = stateRaw.match(/^milestone:\s*(.+)$/m);
82
+ if (!vm) return null;
83
+ const version = vm[1].trim().replace(/^["']|["']$/g, '');
84
+ const nm = stateRaw.match(/^milestone_name:\s*(.+)$/m);
85
+ const name = nm ? nm[1].trim().replace(/^["']|["']$/g, '') : 'milestone';
86
+ return { version, name };
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Get milestone version and name from ROADMAP.md (and optionally STATE.md).
94
+ *
95
+ * Port of getMilestoneInfo from core.cjs lines 1367-1402, extended for:
96
+ * - 🟡 in-flight marker (same list shape as 🚧)
97
+ * - milestone bullets `**vX.Y Title**` before `## Phases` (last = current when listed in semver order)
98
+ * - STATE.md frontmatter when ROADMAP has no parseable milestone
99
+ * - **last** bare `vX.Y` fallback (first match was often v1.0 from the shipped list)
100
+ *
101
+ * @param projectDir - Project root directory
102
+ * @returns Object with version and name
103
+ */
104
+ export async function getMilestoneInfo(projectDir: string, workstream?: string): Promise<{ version: string; name: string }> {
105
+ try {
106
+ // Priority 1: STATE.md frontmatter (authoritative for version; name only when real)
107
+ const fromState = await parseMilestoneFromState(projectDir, workstream);
108
+ const stateVersion = fromState?.version ?? null;
109
+ const stateName = fromState && fromState.name !== 'milestone' ? fromState.name : null;
110
+ if (stateVersion && stateName) {
111
+ return { version: stateVersion, name: stateName };
112
+ }
113
+ // STATE.md has a version but no real name — fall through to ROADMAP for the name,
114
+ // then override the version with the authoritative STATE.md value.
115
+
116
+ const roadmap = await readFile(planningPaths(projectDir, workstream).roadmap, 'utf-8');
117
+
118
+ // List-format: construction / blocked (legacy emoji)
119
+ const barricadeMatch = roadmap.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);
120
+ if (barricadeMatch) {
121
+ return { version: stateVersion ?? 'v' + barricadeMatch[1], name: barricadeMatch[2].trim() };
122
+ }
123
+
124
+ // List-format: in flight / active (GSD ROADMAP template uses 🟡 for current milestone)
125
+ const inFlightMatch = roadmap.match(/🟡\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);
126
+ if (inFlightMatch) {
127
+ return { version: stateVersion ?? 'v' + inFlightMatch[1], name: inFlightMatch[2].trim() };
128
+ }
129
+
130
+ // Heading-format — strip shipped <details> blocks first
131
+ const cleaned = stripShippedMilestones(roadmap);
132
+ const headingMatch = cleaned.match(/##\s+.*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);
133
+ if (headingMatch) {
134
+ return { version: stateVersion ?? 'v' + headingMatch[1], name: headingMatch[2].trim() };
135
+ }
136
+
137
+ // Milestone bullet list (## Milestones … ## Phases): use last **vX.Y Title** — typically the current row
138
+ const beforePhases = roadmap.split(/^##\s+Phases\b/m)[0] ?? roadmap;
139
+ const boldMatches = [...beforePhases.matchAll(/\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/g)];
140
+ if (boldMatches.length > 0) {
141
+ const last = boldMatches[boldMatches.length - 1];
142
+ return { version: stateVersion ?? 'v' + last[1], name: last[2].trim() };
143
+ }
144
+
145
+ const allBare = [...cleaned.matchAll(/\bv(\d+(?:\.\d+)+)\b/g)];
146
+ if (allBare.length > 0) {
147
+ const lastBare = allBare[allBare.length - 1];
148
+ return { version: stateVersion ?? lastBare[0], name: 'milestone' };
149
+ }
150
+
151
+ return { version: stateVersion ?? 'v1.0', name: 'milestone' };
152
+ } catch {
153
+ const fromState = await parseMilestoneFromState(projectDir, workstream);
154
+ if (fromState) return fromState;
155
+ return { version: 'v1.0', name: 'milestone' };
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Extract the current milestone section from ROADMAP.md.
161
+ *
162
+ * Two anchoring strategies, tried in order:
163
+ * 1. Markdown heading containing the active version (`^#{1,3}\s+.*vX.Y…`).
164
+ * 2. `<details><summary>vX.Y…</summary>…</details>` block (the GitHub-friendly
165
+ * collapse pattern; see #2641). When this fallback fires, the captured
166
+ * `<summary>` text is synthesized as a `##` heading prepended to the
167
+ * returned slice so downstream consumers that scan for milestone headings
168
+ * (e.g. the `data.milestones` loop in `roadmapAnalyze`) still see an
169
+ * active-milestone anchor.
170
+ *
171
+ * If neither strategy matches the active version, falls through to
172
+ * `stripShippedMilestones(content)`.
173
+ *
174
+ * Originally ported from core.cjs lines 1102-1170; the TS implementation has
175
+ * since diverged (Backlog-leak fix #2422, phase-vX.Y truncation fix #2619,
176
+ * fenced-code-block tracking #2787, `<details><summary>` fallback #2641).
177
+ *
178
+ * @param content - Full ROADMAP.md content
179
+ * @param projectDir - Working directory for reading STATE.md
180
+ * @returns Content scoped to current milestone
181
+ */
182
+ export async function extractCurrentMilestone(content: string, projectDir: string, workstream?: string): Promise<string> {
183
+ // Get version from STATE.md frontmatter.
184
+ // Strip optional surrounding YAML quotes (e.g. `milestone: "v0.9"`) for parity
185
+ // with parseMilestoneFromState() above and getMilestoneInfo()'s STATE.md path.
186
+ // Without this, a quoted version yields `escapedVersion = '\\"v0\\.9\\"'`
187
+ // which matches neither markdown headings nor <summary> text, falling
188
+ // through to stripShippedMilestones() — and reintroducing the same archived-
189
+ // milestone misrouting this fallback addresses.
190
+ let version: string | null = null;
191
+ try {
192
+ const stateRaw = await readFile(planningPaths(projectDir, workstream).state, 'utf-8');
193
+ const milestoneMatch = stateRaw.match(/^milestone:\s*(.+)/m);
194
+ if (milestoneMatch) {
195
+ version = milestoneMatch[1].trim().replace(/^["']|["']$/g, '');
196
+ }
197
+ } catch { /* intentionally empty */ }
198
+
199
+ // Fallback: derive from ROADMAP in-progress marker
200
+ if (!version) {
201
+ const inProgressMatch = content.match(/(?:🚧|🟡)\s*\*\*v(\d+(?:\.\d+)+)\s/);
202
+ if (inProgressMatch) {
203
+ version = 'v' + inProgressMatch[1];
204
+ }
205
+ }
206
+
207
+ if (!version) return stripShippedMilestones(content);
208
+
209
+ // Find section matching this version
210
+ const escapedVersion = escapeRegex(version);
211
+ const sectionPattern = new RegExp(
212
+ `(^#{1,3}\\s+.*${escapedVersion}(?![\\d.])[^\\n]*)`,
213
+ 'mi'
214
+ );
215
+ const sectionMatch = content.match(sectionPattern);
216
+
217
+ if (!sectionMatch || sectionMatch.index === undefined) {
218
+ // Fallback: <details><summary> matching the active version (issue #2641).
219
+ //
220
+ // Many projects (GitHub-friendly collapse pattern) wrap the active
221
+ // milestone's phase details inside a collapsible block whose <summary>
222
+ // names the version, e.g.:
223
+ //
224
+ // <details>
225
+ // <summary>v0.9 Local-First Bus (active) — Phase Details</summary>
226
+ // ### Phase 1: ...
227
+ // </details>
228
+ //
229
+ // The markdown-heading lookup above misses this because <summary> is HTML,
230
+ // not a heading. Without this fallback, control falls through to
231
+ // stripShippedMilestones() which removes ALL <details> blocks
232
+ // indiscriminately — including the active milestone's — causing
233
+ // roadmapGetPhase() to return {found:false} for phases that ARE in the
234
+ // active ROADMAP. The init.phase-op safety guard then misfires and can
235
+ // route phase lookups into archived milestones.
236
+ //
237
+ // Regex anatomy:
238
+ // <details\b[^>]*> tolerate attributes (e.g. <details open>)
239
+ // \s*<summary\b[^>]*> tolerate attributes on <summary>
240
+ // ((?:(?!</summary>).)*? non-greedy summary capture; tolerates
241
+ // ${escapedVersion} inline HTML in the summary text
242
+ // (?![\d.]) non-version-character lookahead — prevents
243
+ // `v0.1` from substring-matching `v0.10`
244
+ // (?:(?!</summary>).)*)
245
+ // </summary> end of summary
246
+ // ([\s\S]*?)</details> lazy body capture to the FIRST </details>
247
+ //
248
+ // Contract: any consumer that scans the returned slice for milestone
249
+ // headings (e.g. /##\s*.*vX.Y/) sees the active milestone's anchor. We
250
+ // synthesize that heading from the captured <summary> text rather than
251
+ // returning the body alone.
252
+ //
253
+ // Hardening guards:
254
+ // - Nested <details>: the lazy quantifier truncates at the inner
255
+ // </details>, silently losing trailing phases. Detect and fall through
256
+ // to stripShippedMilestones() instead of returning truncated content.
257
+ // - Empty body: a <details> block with no body would synthesize a heading
258
+ // with nothing under it. Treat as no-match.
259
+ // - Summary sanitization: strip inline HTML (e.g. <em>active</em>) and
260
+ // leading `#` tokens before promoting to a `##` heading, so the result
261
+ // is a single well-formed markdown heading.
262
+ const detailsPattern = new RegExp(
263
+ `<details\\b[^>]*>\\s*<summary\\b[^>]*>` +
264
+ `((?:(?!</summary>).)*?${escapedVersion}(?![\\d.])(?:(?!</summary>).)*)` +
265
+ `</summary>([\\s\\S]*?)</details>`,
266
+ 'i'
267
+ );
268
+ const detailsMatch = content.match(detailsPattern);
269
+ if (
270
+ detailsMatch &&
271
+ detailsMatch[2].trim() && // empty-body guard
272
+ !detailsMatch[2].includes('<details') // nested-<details> guard
273
+ ) {
274
+ const summary = detailsMatch[1]
275
+ .replace(/<[^>]+>/g, '') // strip inline HTML
276
+ .replace(/^#+\s*/, '') // strip leading `#`
277
+ .trim();
278
+ const body = detailsMatch[2];
279
+ return `## ${summary}\n${body}`;
280
+ }
281
+ return stripShippedMilestones(content);
282
+ }
283
+
284
+ const sectionStart = sectionMatch.index;
285
+
286
+ // Find end: next milestone heading at same or higher level, or EOF.
287
+ // Skip headings that belong to the SAME version (e.g. "## v2.0 Phase Details").
288
+ const headingLevelMatch = sectionMatch[1].match(/^(#{1,3})\s/);
289
+ const headingLevel = headingLevelMatch ? headingLevelMatch[1].length : 2;
290
+ const restContent = content.slice(sectionStart + sectionMatch[0].length);
291
+ // Extract current version so same-version sub-headings are not treated as boundaries.
292
+ // Capture full semver (major.minor.patch) so v2.0.1 is not collapsed to "2.0".
293
+ const currentVersionMatch = version ? version.match(/v(\d+(?:\.\d+)+)/i) : null;
294
+ const currentVersionStr = currentVersionMatch ? currentVersionMatch[1] : '';
295
+
296
+ // Exclude phase headings (e.g. "### Phase 12: v1.0 Tech-Debt Closure") from
297
+ // being treated as milestone boundaries just because they mention vX.Y in
298
+ // the title. Phase headings always start with the literal `Phase `. See #2619.
299
+ const nextMilestoneRegex = new RegExp(
300
+ `^#{1,${headingLevel}}\\s+(?!Phase\\s+\\S)(?:.*v(\\d+(?:\\.\\d+)+)[^\\n]*|.*(?:✅|📋|🚧|🟡))`,
301
+ // `i` flag ensures the `(?!Phase\s+\S)` lookahead matches PHASE/phase too
302
+ // (CodeRabbit follow-up on #2619).
303
+ 'gmi'
304
+ );
305
+
306
+ let sectionEnd = content.length;
307
+ let m: RegExpExecArray | null;
308
+ while ((m = nextMilestoneRegex.exec(restContent)) !== null) {
309
+ const matchedVersion = m[1];
310
+ // Skip headings that reference the same version (e.g. "## v2.0 Phase Details").
311
+ if (matchedVersion && currentVersionStr && matchedVersion === currentVersionStr) continue;
312
+ // Bug #2787: skip "heading-like" lines that sit inside a fenced code
313
+ // block. GFM fences toggle on a line starting with ``` or ~~~ (with
314
+ // optional info string); the closing fence must be the same char with
315
+ // no info string. Walk forward from the start of restContent up to
316
+ // the match index, toggling fenceChar. If we're inside a fence at the
317
+ // match, ignore this match and continue scanning. Without this, a
318
+ // line like `# Ops runbook — v1.0 compat` inside ```bash truncates the
319
+ // milestone slice and hides every phase that follows.
320
+ if (isInsideFencedCodeBlock(restContent, m.index)) continue;
321
+ sectionEnd = sectionStart + sectionMatch[0].length + m.index;
322
+ break;
323
+ }
324
+
325
+ // Issue #3493: a generic, non-version-prefixed `## Phase Details` (or
326
+ // `### Phase Details`) heading sometimes sits AFTER a planned-milestone
327
+ // sibling (e.g. `### 📋 v2.1+ (Planned)`) in document order but holds the
328
+ // detail bodies (`### Phase N: ...`) for the *active* milestone. Issue #2422
329
+ // / PR #2455 handled the version-prefixed variant `## v2.0 Phase Details`
330
+ // via the same-version `continue` above; this branch handles the generic-
331
+ // label variant. When such a heading is found after the initial sectionEnd,
332
+ // append the Phase Details block to the returned slice (skipping the
333
+ // intervening planned-milestone content so it does not leak in), stopping
334
+ // at the next real milestone boundary (version-bearing or milestone-emoji-
335
+ // bearing heading) or EOF.
336
+ //
337
+ // Bounded to a single append so a malformed roadmap can't loop. Only
338
+ // matches the literal `Phase Details` label (canonical per GSD ROADMAP
339
+ // template); anything else continues to terminate the slice.
340
+ let phaseDetailsTail = '';
341
+ if (sectionEnd < content.length) {
342
+ const afterEnd = content.slice(sectionEnd);
343
+ const genericPhaseDetailsRegex = /^(#{1,3})\s+Phase\s+Details\b[^\n]*$/im;
344
+ const phaseDetailsMatch = afterEnd.match(genericPhaseDetailsRegex);
345
+ if (phaseDetailsMatch && phaseDetailsMatch.index !== undefined) {
346
+ const pdStart = sectionEnd + phaseDetailsMatch.index;
347
+ const pdHeadingLen = phaseDetailsMatch[0].length;
348
+ const pdLevel = phaseDetailsMatch[1].length;
349
+ // Scan from after the Phase Details heading for the next real milestone
350
+ // boundary (different version OR milestone emoji). Reuses the same
351
+ // (?!Phase\s+\S) phase-heading guard from #2619, plus a
352
+ // (?!Phase\s+Details\b) guard so a sibling Phase Details heading
353
+ // doesn't terminate the block prematurely.
354
+ const afterPdHeading = content.slice(pdStart + pdHeadingLen);
355
+ const nextRealMilestoneRegex = new RegExp(
356
+ `^#{1,${pdLevel}}\\s+(?!Phase\\s+\\S)(?!Phase\\s+Details\\b)(?:.*v(\\d+(?:\\.\\d+)+)[^\\n]*|.*(?:✅|📋|🚧|🟡))`,
357
+ 'gmi'
358
+ );
359
+ let pdEnd = content.length;
360
+ let mm: RegExpExecArray | null;
361
+ while ((mm = nextRealMilestoneRegex.exec(afterPdHeading)) !== null) {
362
+ const mv = mm[1];
363
+ if (mv && currentVersionStr && mv === currentVersionStr) continue;
364
+ pdEnd = pdStart + pdHeadingLen + mm.index;
365
+ break;
366
+ }
367
+ phaseDetailsTail = '\n' + content.slice(pdStart, pdEnd);
368
+ }
369
+ }
370
+
371
+ // Return only the current milestone section — never include the preamble, which
372
+ // may contain ## Backlog and other non-current-milestone phases. Append any
373
+ // generic Phase Details block discovered above (#3493) so detail-section
374
+ // lookups for the active milestone succeed.
375
+ return content.slice(sectionStart, sectionEnd) + phaseDetailsTail;
376
+ }
377
+
378
+ /**
379
+ * Return true when `offset` falls inside an open GFM fenced code block
380
+ * within the provided `content`.
381
+ *
382
+ * GFM fence semantics (bug #2787):
383
+ * - Opening fence: a line starting with at least 3 backticks or 3 tildes,
384
+ * optionally followed by an info string (e.g. ```bash, ~~~markdown).
385
+ * - Closing fence: a line starting with at least 3 of the SAME char as
386
+ * the opener, with NO info string — so ```js inside an open ```text
387
+ * fence does NOT close it.
388
+ *
389
+ * We walk lines from the start of `content` to `offset`, toggling a
390
+ * `fenceChar` cursor on each fence boundary. Returns true when the
391
+ * cursor is non-null at `offset`.
392
+ */
393
+ function isInsideFencedCodeBlock(content: string, offset: number): boolean {
394
+ let fenceChar: '`' | '~' | null = null;
395
+ let lineStart = 0;
396
+ for (let i = 0; i <= offset; i++) {
397
+ if (i === content.length || content[i] === '\n') {
398
+ const line = content.slice(lineStart, i);
399
+ const openMatch = line.match(/^(`{3,}|~{3,})(\s*)([^\n]*)$/);
400
+ if (openMatch) {
401
+ const fenceRun = openMatch[1]!;
402
+ const ch = fenceRun[0] === '`' ? '`' : '~';
403
+ const info = openMatch[3]!.trim();
404
+ if (fenceChar === null) {
405
+ // Opening fence — info string allowed.
406
+ fenceChar = ch;
407
+ } else if (ch === fenceChar && info.length === 0) {
408
+ // Closing fence must match opener and carry no info string.
409
+ fenceChar = null;
410
+ }
411
+ }
412
+ lineStart = i + 1;
413
+ }
414
+ }
415
+ return fenceChar !== null;
416
+ }
417
+
418
+ // ─── Next-milestone helpers (issue #2497) ─────────────────────────────────
419
+
420
+ /**
421
+ * Phase shape returned by extractPhasesFromSection — mirrors the fields used
422
+ * by the current-milestone phases array in initManager so consumers can
423
+ * render queued phases uniformly.
424
+ */
425
+ export interface QueuedPhase {
426
+ number: string;
427
+ name: string;
428
+ goal: string | null;
429
+ depends_on: string | null;
430
+ }
431
+
432
+ /**
433
+ * Extract phase entries from an arbitrary ROADMAP milestone section.
434
+ *
435
+ * Parses `#### Phase N: Name` / `### Phase N: Name` / `## Phase N: Name`
436
+ * headings and, for each, captures goal + depends_on via the same patterns
437
+ * used by initManager's current-milestone phase parsing. Used by
438
+ * `initManager` to populate `queued_phases` (#2497).
439
+ */
440
+ export function extractPhasesFromSection(section: string): QueuedPhase[] {
441
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
442
+ const phases: QueuedPhase[] = [];
443
+ let m: RegExpExecArray | null;
444
+ while ((m = phasePattern.exec(section)) !== null) {
445
+ const phaseNum = m[1];
446
+ const phaseName = m[2].replace(/\(INSERTED\)/i, '').trim();
447
+ const sectionStart = m.index;
448
+ const rest = section.slice(sectionStart);
449
+ const nextHeader = rest.match(/\n#{2,4}\s+Phase\s+\d/i);
450
+ const end = nextHeader ? sectionStart + (nextHeader.index ?? 0) : section.length;
451
+ const body = section.slice(sectionStart, end);
452
+ const goalMatch = body.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i);
453
+ const dependsMatch = body.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i);
454
+ phases.push({
455
+ number: phaseNum,
456
+ name: phaseName,
457
+ goal: goalMatch ? goalMatch[1].trim() : null,
458
+ depends_on: dependsMatch ? dependsMatch[1].trim() : null,
459
+ });
460
+ }
461
+ return phases;
462
+ }
463
+
464
+ /**
465
+ * Find the milestone section that comes immediately AFTER the active one.
466
+ *
467
+ * Used by initManager to surface `queued_phases` without conflating the
468
+ * active milestone's phase list with the next one (#2497). Returns null
469
+ * when no subsequent milestone section exists (active is the last one).
470
+ *
471
+ * Reuses the same current-version resolution path as `getMilestoneInfo`:
472
+ * STATE.md frontmatter first, then in-flight emoji markers in ROADMAP.
473
+ * Shipped milestones are stripped first so they can't shadow the real
474
+ * "next" one.
475
+ */
476
+ export async function extractNextMilestoneSection(
477
+ content: string,
478
+ projectDir: string,
479
+ ): Promise<{ version: string; name: string; section: string } | null> {
480
+ const cleaned = stripShippedMilestones(content);
481
+
482
+ // Resolve current version via STATE.md (priority) then in-flight markers.
483
+ let currentVersion: string | null = null;
484
+ const fromState = await parseMilestoneFromState(projectDir);
485
+ if (fromState?.version) {
486
+ const raw = fromState.version.trim();
487
+ currentVersion = /^v\d/i.test(raw) ? raw : `v${raw}`;
488
+ }
489
+ if (!currentVersion) {
490
+ const inProgressMatch = cleaned.match(/(?:🚧|🟡)\s*\*\*v(\d+(?:\.\d+)+)\s/);
491
+ if (inProgressMatch) currentVersion = 'v' + inProgressMatch[1];
492
+ }
493
+ if (!currentVersion) return null;
494
+
495
+ // Find the current milestone ## heading.
496
+ const escaped = escapeRegex(currentVersion);
497
+ const currentHeadingPattern = new RegExp(
498
+ `^##\\s+[^\\n]*${escaped}[^\\n]*$`,
499
+ 'mi',
500
+ );
501
+ const currentMatch = cleaned.match(currentHeadingPattern);
502
+ if (!currentMatch || currentMatch.index === undefined) return null;
503
+
504
+ // Look for the next ## milestone heading after the current one.
505
+ const tail = cleaned.slice(currentMatch.index + currentMatch[0].length);
506
+ // Exclude phase headings — see #2619.
507
+ const nextMilestonePattern = /^##\s+(?!Phase\s+\S)([^\n]*(?:v(\d+(?:\.\d+)+)|✅|🚧|🟡|📋)[^\n]*)$/gim;
508
+ let nextMatch: RegExpExecArray | null;
509
+ while ((nextMatch = nextMilestonePattern.exec(tail)) !== null) {
510
+ const heading = nextMatch[1];
511
+ const versionMatch = heading.match(/v(\d+(?:\.\d+)+)/);
512
+ if (!versionMatch) continue;
513
+ const nextVersion = 'v' + versionMatch[1];
514
+ if (nextVersion === currentVersion) continue;
515
+
516
+ // Derive a display name: trim through "vX.Y:" or "vX.Y —" prefix.
517
+ const nameMatch = heading.match(/v\d+(?:\.\d+)+:?\s*[—–-]?\s*([^\n(]+)/);
518
+ const name = nameMatch ? nameMatch[1].trim() : heading.trim();
519
+
520
+ const sectionStart = (nextMatch.index ?? 0) + nextMatch[0].length;
521
+ const afterStart = tail.slice(sectionStart);
522
+ const followingHeader = afterStart.match(/^##\s/m);
523
+ const sectionEnd = followingHeader && followingHeader.index !== undefined
524
+ ? sectionStart + followingHeader.index
525
+ : tail.length;
526
+ const section = tail.slice(sectionStart, sectionEnd);
527
+
528
+ return { version: nextVersion, name, section };
529
+ }
530
+
531
+ return null;
532
+ }
533
+
534
+ // ─── Internal helpers ─────────────────────────────────────────────────────
535
+
536
+ /**
537
+ * Padding-tolerant regex fragment for a phase number — emits `0*<integer>` so
538
+ * the fragment matches both `Phase 3` and `Phase 03` (bug #2391 / #3537).
539
+ *
540
+ * Mirrors `phaseMarkdownRegexSource` in core.cjs and the local copy in
541
+ * roadmap-update-plan-progress.ts. Falls back to `escapeRegex(phaseNum)` for
542
+ * non-numeric IDs (custom project codes like `PROJ-42`).
543
+ */
544
+ export function phaseMarkdownRegexSource(phaseNum: string): string {
545
+ const stripped = String(phaseNum).replace(/^[A-Z]{1,6}-(?=\d)/i, '');
546
+ const match = stripped.match(/^0*(\d+)([A-Z])?((?:\.\d+)*)$/i);
547
+ if (!match) return escapeRegex(phaseNum);
548
+
549
+ const integer = match[1]!.replace(/^0+/, '') || '0';
550
+ const letter = match[2] ? escapeRegex(match[2]) : '';
551
+ const decimal = match[3] ? escapeRegex(match[3]) : '';
552
+ return `0*${escapeRegex(integer)}${letter}${decimal}`;
553
+ }
554
+
555
+ /**
556
+ * #3599 (parity with core.cjs phaseMarkdownRegexSourceExact, lines 691-708):
557
+ * when the caller passed a project-code-prefixed ID like `PROJ-42`, return
558
+ * the exact-escaped form so the caller can search the ROADMAP for
559
+ * `### Phase PROJ-42:` BEFORE falling back to the padding-tolerant numeric
560
+ * form. Returns null when the input has no project-code prefix — in that
561
+ * case `phaseMarkdownRegexSource` is the only form the caller needs.
562
+ *
563
+ * Two-pass at the call site preserves the #3537 contract (`CK-01` directory
564
+ * names mapping to `Phase 1:` prose) while letting `PROJ-42` resolve to its
565
+ * own prefixed heading without cross-matching a bare `### Phase 42:` that
566
+ * happens to share the trailing integer.
567
+ */
568
+ export function phaseMarkdownRegexSourceExact(phaseNum: string): string | null {
569
+ const raw = String(phaseNum);
570
+ if (!/^[A-Z]{1,6}-(?=\d)/i.test(raw)) return null;
571
+ return escapeRegex(raw);
572
+ }
573
+
574
+ /**
575
+ * Search for a phase section in roadmap content.
576
+ *
577
+ * Port of searchPhaseInContent from roadmap.cjs lines 14-73.
578
+ */
579
+ function searchPhaseInContent(content: string, escapedPhase: string, phaseNum: string): PhaseSection | null {
580
+ // Match "## Phase X:", "### Phase X:", or "#### Phase X:" with optional name.
581
+ // Uses the padding-tolerant fragment so zero-padded inputs ("03") match
582
+ // unpadded ROADMAP headings ("### Phase 3:"). See #2391 / #3537.
583
+ // Capture group 1 = the as-written phase token from the heading so callers
584
+ // get the canonical form (matching the ROADMAP source-of-truth), not the
585
+ // padded input the user typed. Without this, `roadmap get-phase 02.7`
586
+ // and `roadmap get-phase 2.7` produce divergent payloads for the same
587
+ // heading, breaking bug-3537 parity.
588
+ const phasePattern = new RegExp(
589
+ `#{2,4}\\s*Phase\\s+(${escapedPhase}):\\s*([^\\n]+)`,
590
+ 'i'
591
+ );
592
+ const headerMatch = content.match(phasePattern);
593
+
594
+ if (!headerMatch) {
595
+ // Fallback 1: bold-wrapped checklist entry `- [ ] **Phase N: name**`.
596
+ // Reports malformed_roadmap when a bold checklist entry exists without a
597
+ // companion `### Phase N:` detail heading (original fallback contract).
598
+ const checklistPattern = new RegExp(
599
+ `-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+(${escapedPhase}):\\s*([^*]+)\\*\\*`,
600
+ 'i'
601
+ );
602
+ const checklistMatch = content.match(checklistPattern);
603
+
604
+ if (checklistMatch) {
605
+ const canonicalChecklistPhase = checklistMatch[1];
606
+ return {
607
+ found: false,
608
+ phase_number: canonicalChecklistPhase,
609
+ phase_name: checklistMatch[2].trim(),
610
+ error: 'malformed_roadmap',
611
+ message: `Phase ${canonicalChecklistPhase} exists in summary list but missing "### Phase ${canonicalChecklistPhase}:" detail section. ROADMAP.md needs both formats.`,
612
+ };
613
+ }
614
+
615
+ // Fallback 2 (#3816): plain (non-bold) bullet entry `- [ ] Phase N: name`
616
+ // used by milestone-scoped ROADMAPs where phases are listed as bullets
617
+ // under a `### 🚧 <milestone>` heading, not as separate `### Phase N:` headings.
618
+ // Returns `found: true` — the bullet IS the authoritative phase record for
619
+ // these layouts, not just a malformed summary list entry.
620
+ const plainBulletPattern = new RegExp(
621
+ `-\\s*\\[[ x]\\]\\s*Phase\\s+(${escapedPhase}):\\s*([^\\n]+)`,
622
+ 'i'
623
+ );
624
+ const plainBulletMatch = content.match(plainBulletPattern);
625
+
626
+ if (plainBulletMatch) {
627
+ // Strip trailing annotations like `— pending /gsd:spec-phase 7`
628
+ const rawName = plainBulletMatch[2].trim();
629
+ const phaseName = rawName.replace(/\s*[-—].*$/, '').trim() || rawName;
630
+ return {
631
+ found: true,
632
+ phase_number: plainBulletMatch[1],
633
+ phase_name: phaseName,
634
+ section: plainBulletMatch[0],
635
+ goal: null,
636
+ mode: null,
637
+ success_criteria: [],
638
+ };
639
+ }
640
+
641
+ return null;
642
+ }
643
+
644
+ const canonicalPhaseNum = headerMatch[1];
645
+ const phaseName = headerMatch[2].trim();
646
+ const headerIndex = headerMatch.index!;
647
+
648
+ // Find the end of this section (next ## or ### phase header, or end of file)
649
+ const restOfContent = content.slice(headerIndex);
650
+ const nextHeaderMatch = restOfContent.match(/\n#{2,4}\s+Phase\s+\d/i);
651
+ const sectionEnd = nextHeaderMatch
652
+ ? headerIndex + nextHeaderMatch.index!
653
+ : content.length;
654
+
655
+ const section = content.slice(headerIndex, sectionEnd).trim();
656
+
657
+ // Extract goal if present (supports both **Goal:** and **Goal**: formats)
658
+ const goalMatch = section.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i);
659
+ const goal = goalMatch ? goalMatch[1].trim() : null;
660
+
661
+ // Mode: vertical-MVP slice mode flag. Lowercased + trimmed for canonical
662
+ // comparison; unrecognized values preserved verbatim for forward-compat.
663
+ // Mirrors roadmap.cjs:120-123 — restoring parity that was missed in the SDK port.
664
+ const modeMatch = section.match(/\*\*Mode(?::\*\*|\*\*:)\s*([^\n]+)/i);
665
+ const mode = modeMatch ? modeMatch[1].trim().toLowerCase() : null;
666
+
667
+ // Extract success criteria as structured array
668
+ const criteriaMatch = section.match(/\*\*Success Criteria\*\*[^\n]*:\s*\n((?:\s*\d+\.\s*[^\n]+\n?)+)/i);
669
+ const success_criteria = criteriaMatch
670
+ ? criteriaMatch[1].trim().split('\n').map(line => line.replace(/^\s*\d+\.\s*/, '').trim()).filter(Boolean)
671
+ : [];
672
+
673
+ // Suppress unused-arg warning — `phaseNum` is retained as the function
674
+ // signature so future callers can reintroduce input-mirroring if needed.
675
+ void phaseNum;
676
+
677
+ return {
678
+ found: true,
679
+ phase_number: canonicalPhaseNum,
680
+ phase_name: phaseName,
681
+ goal,
682
+ mode,
683
+ success_criteria,
684
+ section,
685
+ };
686
+ }
687
+
688
+ async function countPhasePlansAndSummaries(phaseDir: string): Promise<{ planCount: number; summaryCount: number; hasContext: boolean; hasResearch: boolean; }> {
689
+ const phaseFiles = await readdir(phaseDir);
690
+ const rootPlans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
691
+ const rootSummaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
692
+
693
+ let nestedPlans: string[] = [];
694
+ let nestedSummaries: string[] = [];
695
+ const plansDir = join(phaseDir, 'plans');
696
+ if (existsSync(plansDir)) {
697
+ const files = await readdir(plansDir);
698
+ nestedPlans = files.filter(f => /^PLAN-\d+.*\.md$/i.test(f));
699
+ nestedSummaries = files.filter(f => /^SUMMARY-\d+.*\.md$/i.test(f));
700
+ }
701
+
702
+ return {
703
+ planCount: rootPlans.length + nestedPlans.length,
704
+ summaryCount: rootSummaries.length + nestedSummaries.length,
705
+ hasContext: phaseFiles.some(f => f.endsWith('-CONTEXT.md') || f === 'CONTEXT.md'),
706
+ hasResearch: phaseFiles.some(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md'),
707
+ };
708
+ }
709
+
710
+ // ─── Exported handlers ────────────────────────────────────────────────────
711
+
712
+ /**
713
+ * Query handler for roadmap.get-phase.
714
+ *
715
+ * Port of cmdRoadmapGetPhase from roadmap.cjs lines 75-113.
716
+ *
717
+ * @param args - args[0] is phase number (required)
718
+ * @param projectDir - Project root directory
719
+ * @returns QueryResult with phase section info or { found: false }
720
+ */
721
+ export const roadmapGetPhase: QueryHandler = async (args, projectDir, workstream) => {
722
+ const phaseNum = args[0];
723
+ if (!phaseNum) {
724
+ throw new GSDError(
725
+ 'Usage: roadmap get-phase <phase-number>',
726
+ ErrorClassification.Validation,
727
+ );
728
+ }
729
+
730
+ const roadmapPath = planningPaths(projectDir, workstream).roadmap;
731
+
732
+ let rawContent: string;
733
+ try {
734
+ rawContent = await readFile(roadmapPath, 'utf-8');
735
+ } catch {
736
+ return { data: { found: false, error: 'ROADMAP.md not found' } };
737
+ }
738
+
739
+ const milestoneContent = await extractCurrentMilestone(rawContent, projectDir, workstream);
740
+ const fullContent = stripShippedMilestones(rawContent);
741
+
742
+ // Two-pass lookup (parity with bin/lib/roadmap.cjs #3599 path): if the input
743
+ // carries a project-code prefix like `PROJ-42`, try the EXACT escaped form
744
+ // first so we match `### Phase PROJ-42:` without cross-matching `### Phase 42:`.
745
+ // Only fall back to the padding-tolerant numeric form (which strips the
746
+ // prefix per the #3537 contract for CK-01 → Phase 1 directory layout) when
747
+ // the exact form misses.
748
+ const exactEscaped = phaseMarkdownRegexSourceExact(phaseNum);
749
+ // Padding-tolerant fragment (bug #2391): caller may pass "03" — match against
750
+ // unpadded ROADMAP headings ("Phase 3:") without forcing the caller to normalize.
751
+ const numericEscaped = phaseMarkdownRegexSource(phaseNum);
752
+
753
+ // Try exact-prefixed match first when applicable.
754
+ let milestoneResult: PhaseSection | null = null;
755
+ let fallbackFromFullContent: PhaseSection | null = null;
756
+ if (exactEscaped) {
757
+ milestoneResult = searchPhaseInContent(milestoneContent, exactEscaped, phaseNum);
758
+ if (!milestoneResult || milestoneResult.error) {
759
+ fallbackFromFullContent = searchPhaseInContent(fullContent, exactEscaped, phaseNum);
760
+ }
761
+ }
762
+ // Padding-tolerant fallback (#3537) — also covers the no-prefix case.
763
+ if (!milestoneResult || milestoneResult.error) {
764
+ milestoneResult = milestoneResult || searchPhaseInContent(milestoneContent, numericEscaped, phaseNum);
765
+ }
766
+ if (!fallbackFromFullContent) {
767
+ fallbackFromFullContent = searchPhaseInContent(fullContent, numericEscaped, phaseNum);
768
+ }
769
+ const result = (milestoneResult && !milestoneResult.error)
770
+ ? milestoneResult
771
+ : fallbackFromFullContent || milestoneResult;
772
+
773
+ if (!result) {
774
+ return { data: { found: false, phase_number: phaseNum } };
775
+ }
776
+
777
+ return { data: result };
778
+ };
779
+
780
+ /**
781
+ * Query handler for roadmap.analyze.
782
+ *
783
+ * Port of cmdRoadmapAnalyze from roadmap.cjs lines 115-248.
784
+ * Multi-pass regex parsing with disk status correlation.
785
+ *
786
+ * @param args - Unused
787
+ * @param projectDir - Project root directory
788
+ * @returns QueryResult with full roadmap analysis
789
+ */
790
+ export const roadmapAnalyze: QueryHandler = async (_args, projectDir, workstream) => {
791
+ const roadmapPath = planningPaths(projectDir, workstream).roadmap;
792
+
793
+ let rawContent: string;
794
+ try {
795
+ rawContent = await readFile(roadmapPath, 'utf-8');
796
+ } catch {
797
+ return { data: { error: 'ROADMAP.md not found', milestones: [], phases: [], current_phase: null } };
798
+ }
799
+
800
+ const rawMilestoneContent = await extractCurrentMilestone(rawContent, projectDir, workstream);
801
+ // #3816: exclude phases in the Backlog / Planned / Archived sections that
802
+ // may bleed into the active-milestone slice when those sections use plain
803
+ // headings (no version/emoji) that the boundary scanner does not stop at.
804
+ const backlogBoundaryIdx = rawMilestoneContent.search(/\n#{2,3}\s+(?:Backlog|Planned|Shipped|Archived)\b/i);
805
+ const content = backlogBoundaryIdx >= 0 ? rawMilestoneContent.slice(0, backlogBoundaryIdx) : rawMilestoneContent;
806
+ const phasesDir = planningPaths(projectDir, workstream).phases;
807
+
808
+ // IMPORTANT: Create regex INSIDE the function to avoid /g lastIndex persistence
809
+ // Heading-format phases: "### Phase N: Name"
810
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
811
+ // #3816: plain-bullet phases "- [ ] Phase N: Name" used by milestone-scoped layouts
812
+ const bulletPhasePattern = /^[-*]\s*\[[ x]\]\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gim;
813
+ const phases: Array<Record<string, unknown>> = [];
814
+ let match: RegExpExecArray | null;
815
+
816
+ while ((match = phasePattern.exec(content)) !== null) {
817
+ const phaseNum = match[1];
818
+ const phaseName = match[2].replace(/\(INSERTED\)/i, '').trim();
819
+
820
+ // Extract goal from the section
821
+ const sectionStart = match.index;
822
+ const restOfContent = content.slice(sectionStart);
823
+ const nextHeader = restOfContent.match(/\n#{2,4}\s+Phase\s+\d/i);
824
+ const sectionEnd = nextHeader ? sectionStart + nextHeader.index! : content.length;
825
+ const section = content.slice(sectionStart, sectionEnd);
826
+
827
+ const goalMatch = section.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i);
828
+ const goal = goalMatch ? goalMatch[1].trim() : null;
829
+
830
+ const dependsMatch = section.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i);
831
+ const depends_on = dependsMatch ? dependsMatch[1].trim() : null;
832
+
833
+ // **Mode:** field — vertical-MVP slice flag per CONTEXT.md "MVP Mode"
834
+ // glossary. Pattern mirrors the roadmapGetPhase extraction above so the
835
+ // analyze output surfaces the same value the get-phase handler returns.
836
+ const modeMatchPhase = section.match(/\*\*Mode(?::\*\*|\*\*:)\s*([^\n]+)/i);
837
+ const mode = modeMatchPhase ? modeMatchPhase[1].trim().toLowerCase() : null;
838
+
839
+ // Check completion on disk
840
+ const normalized = normalizePhaseName(phaseNum);
841
+ let diskStatus = 'no_directory';
842
+ let planCount = 0;
843
+ let summaryCount = 0;
844
+ let hasContext = false;
845
+ let hasResearch = false;
846
+
847
+ try {
848
+ const entries = await readdir(phasesDir, { withFileTypes: true });
849
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
850
+ const dirMatch = dirs.find(d => phaseTokenMatches(d, normalized));
851
+
852
+ if (dirMatch) {
853
+ const counts = await countPhasePlansAndSummaries(join(phasesDir, dirMatch));
854
+ planCount = counts.planCount;
855
+ summaryCount = counts.summaryCount;
856
+ hasContext = counts.hasContext;
857
+ hasResearch = counts.hasResearch;
858
+
859
+ if (summaryCount >= planCount && planCount > 0) diskStatus = 'complete';
860
+ else if (summaryCount > 0) diskStatus = 'partial';
861
+ else if (planCount > 0) diskStatus = 'planned';
862
+ else if (hasResearch) diskStatus = 'researched';
863
+ else if (hasContext) diskStatus = 'discussed';
864
+ else diskStatus = 'empty';
865
+ }
866
+ } catch { /* intentionally empty */ }
867
+
868
+ // Check ROADMAP checkbox status
869
+ const checkboxPattern = new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${escapeRegex(phaseNum)}[:\\s]`, 'i');
870
+ const checkboxMatch = content.match(checkboxPattern);
871
+ const roadmapComplete = checkboxMatch ? checkboxMatch[1] === 'x' : false;
872
+
873
+ // If roadmap marks phase complete, trust that over disk
874
+ if (roadmapComplete && diskStatus !== 'complete') {
875
+ diskStatus = 'complete';
876
+ }
877
+
878
+ phases.push({
879
+ number: phaseNum,
880
+ name: phaseName,
881
+ goal,
882
+ depends_on,
883
+ mode,
884
+ plan_count: planCount,
885
+ summary_count: summaryCount,
886
+ has_context: hasContext,
887
+ has_research: hasResearch,
888
+ disk_status: diskStatus,
889
+ roadmap_complete: roadmapComplete,
890
+ });
891
+ }
892
+
893
+ // #3816: second pass — plain-bullet phases not captured by the heading scan.
894
+ // Milestone-scoped ROADMAPs list phases as `- [ ] Phase N: Name` bullets under
895
+ // a milestone heading without companion `### Phase N:` detail headings.
896
+ // Only add phases not already discovered by the heading scan.
897
+ const headingPhaseNums = new Set(phases.map(p => p.number as string));
898
+ while ((match = bulletPhasePattern.exec(content)) !== null) {
899
+ const phaseNum = match[1];
900
+ if (headingPhaseNums.has(phaseNum)) continue; // already captured above
901
+
902
+ const rawName = match[2].replace(/\(INSERTED\)/i, '').trim();
903
+ const phaseName = rawName.replace(/\s*[-—].*$/, '').trim() || rawName;
904
+
905
+ const normalized = normalizePhaseName(phaseNum);
906
+ let diskStatus = 'no_directory';
907
+ let planCount = 0;
908
+ let summaryCount = 0;
909
+ let hasContext = false;
910
+ let hasResearch = false;
911
+
912
+ try {
913
+ const entries = await readdir(phasesDir, { withFileTypes: true });
914
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
915
+ const dirMatch = dirs.find(d => phaseTokenMatches(d, normalized));
916
+
917
+ if (dirMatch) {
918
+ const counts = await countPhasePlansAndSummaries(join(phasesDir, dirMatch));
919
+ planCount = counts.planCount;
920
+ summaryCount = counts.summaryCount;
921
+ hasContext = counts.hasContext;
922
+ hasResearch = counts.hasResearch;
923
+
924
+ if (summaryCount >= planCount && planCount > 0) diskStatus = 'complete';
925
+ else if (summaryCount > 0) diskStatus = 'partial';
926
+ else if (planCount > 0) diskStatus = 'planned';
927
+ else if (hasResearch) diskStatus = 'researched';
928
+ else if (hasContext) diskStatus = 'discussed';
929
+ else diskStatus = 'empty';
930
+ }
931
+ } catch { /* intentionally empty */ }
932
+
933
+ // Check ROADMAP checkbox status from the bullet itself
934
+ const checkboxMatch = match[0].match(/\[(x| )\]/i);
935
+ const roadmapComplete = checkboxMatch ? checkboxMatch[1].toLowerCase() === 'x' : false;
936
+ if (roadmapComplete && diskStatus !== 'complete') diskStatus = 'complete';
937
+
938
+ headingPhaseNums.add(phaseNum);
939
+ phases.push({
940
+ number: phaseNum,
941
+ name: phaseName,
942
+ goal: null,
943
+ depends_on: null,
944
+ mode: null,
945
+ plan_count: planCount,
946
+ summary_count: summaryCount,
947
+ has_context: hasContext,
948
+ has_research: hasResearch,
949
+ disk_status: diskStatus,
950
+ roadmap_complete: roadmapComplete,
951
+ });
952
+ }
953
+
954
+ // Extract milestone info
955
+ const milestones: Array<{ heading: string; version: string }> = [];
956
+ const milestonePattern = /##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi;
957
+ let mMatch: RegExpExecArray | null;
958
+ while ((mMatch = milestonePattern.exec(content)) !== null) {
959
+ milestones.push({
960
+ heading: mMatch[1].trim(),
961
+ version: 'v' + mMatch[2],
962
+ });
963
+ }
964
+
965
+ // Find current and next phase
966
+ const currentPhase = phases.find(p => p.disk_status === 'planned' || p.disk_status === 'partial') || null;
967
+ const nextPhase = phases.find(p => p.disk_status === 'empty' || p.disk_status === 'no_directory' || p.disk_status === 'discussed' || p.disk_status === 'researched') || null;
968
+
969
+ // Aggregated stats
970
+ const totalPlans = phases.reduce((sum, p) => sum + (p.plan_count as number), 0);
971
+ const totalSummaries = phases.reduce((sum, p) => sum + (p.summary_count as number), 0);
972
+ const completedPhases = phases.filter(p => p.disk_status === 'complete').length;
973
+
974
+ // Detect phases in summary list without detail sections (malformed ROADMAP)
975
+ const checklistPattern = /-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi;
976
+ const checklistPhases = new Set<string>();
977
+ let checklistMatch: RegExpExecArray | null;
978
+ while ((checklistMatch = checklistPattern.exec(content)) !== null) {
979
+ checklistPhases.add(checklistMatch[1]);
980
+ }
981
+ const detailPhases = new Set(phases.map(p => p.number as string));
982
+ const missingDetails = [...checklistPhases].filter(p => !detailPhases.has(p));
983
+
984
+ const result: Record<string, unknown> = {
985
+ milestones,
986
+ phases,
987
+ phase_count: phases.length,
988
+ completed_phases: completedPhases,
989
+ total_plans: totalPlans,
990
+ total_summaries: totalSummaries,
991
+ progress_percent: totalPlans > 0 ? Math.min(100, Math.round((totalSummaries / totalPlans) * 100)) : 0,
992
+ current_phase: currentPhase ? currentPhase.number : null,
993
+ next_phase: nextPhase ? nextPhase.number : null,
994
+ missing_phase_details: missingDetails.length > 0 ? missingDetails : null,
995
+ };
996
+
997
+ return { data: result };
998
+ };
999
+
1000
+
1001
+ // ─── roadmapAnnotateDependencies ─────────────────────────────────────────
1002
+
1003
+ /**
1004
+ * Annotate the ROADMAP.md plan list with wave dependency notes and
1005
+ * cross-cutting constraints derived from PLAN frontmatter.
1006
+ *
1007
+ * Delegates to gsd-tools.cjs which holds the full annotation logic.
1008
+ * Returns { updated, phase, waves, cross_cutting_constraints }.
1009
+ */
1010
+ export const roadmapAnnotateDependencies: QueryHandler = async (args, projectDir) => {
1011
+ const phase = args[0];
1012
+ if (!phase) {
1013
+ return { data: { updated: false, reason: 'phase argument required' } };
1014
+ }
1015
+
1016
+ const { spawnSync } = await import('node:child_process');
1017
+ const toolsPath = resolveGsdToolsPath(projectDir);
1018
+
1019
+ // CRITICAL: set GSD_SDK_NESTED=1 so the CJS router in the child process
1020
+ // detects nesting and routes directly to cmdRoadmapAnnotateDependencies
1021
+ // instead of dispatching back through executeForCjs. Without this guard,
1022
+ // SDK→spawn(gsd-tools)→router→SDK→spawn(gsd-tools)→… loops until the
1023
+ // synckit 15s timeout fires and bug-3537's annotate test surfaces a
1024
+ // misleading "code=null" failure.
1025
+ const childEnv: NodeJS.ProcessEnv = { ...process.env, GSD_SDK_NESTED: '1' };
1026
+
1027
+ const result = spawnSync(process.execPath, [toolsPath, 'roadmap', 'annotate-dependencies', phase], {
1028
+ cwd: projectDir,
1029
+ encoding: 'utf-8',
1030
+ stdio: ['pipe', 'pipe', 'pipe'],
1031
+ timeout: 15000,
1032
+ maxBuffer: 1024 * 1024,
1033
+ env: childEnv,
1034
+ });
1035
+
1036
+ if (result.error) {
1037
+ return { data: { updated: false, reason: result.error.message || 'gsd-tools invocation failed' } };
1038
+ }
1039
+
1040
+ if (result.status !== 0) {
1041
+ return { data: { updated: false, reason: result.stderr?.trim() || 'gsd-tools error' } };
1042
+ }
1043
+
1044
+ try {
1045
+ return { data: JSON.parse(result.stdout.trim()) };
1046
+ } catch {
1047
+ return { data: { updated: false, reason: 'failed to parse gsd-tools output' } };
1048
+ }
1049
+ };
1050
+
1051
+
1052
+ // ─── requirementsMarkComplete ─────────────────────────────────────────────
1053
+
1054
+ /**
1055
+ * Mark requirement IDs complete in REQUIREMENTS.md (checkbox + traceability table).
1056
+ * Port of `cmdRequirementsMarkComplete` from milestone.cjs lines 11–87.
1057
+ */
1058
+ export const requirementsMarkComplete: QueryHandler = async (args, projectDir, workstream) => {
1059
+ if (args.length === 0) {
1060
+ throw new GSDError(
1061
+ 'requirement IDs required. Usage: requirements mark-complete REQ-01,REQ-02 or REQ-01 REQ-02',
1062
+ ErrorClassification.Validation,
1063
+ );
1064
+ }
1065
+
1066
+ const reqIds = args
1067
+ .join(' ')
1068
+ .replace(/[\[\]]/g, '')
1069
+ .split(/[,\s]+/)
1070
+ .map(r => r.trim())
1071
+ .filter(Boolean);
1072
+
1073
+ if (reqIds.length === 0) {
1074
+ throw new GSDError('no valid requirement IDs found', ErrorClassification.Validation);
1075
+ }
1076
+
1077
+ const paths = planningPaths(projectDir, workstream);
1078
+ if (!existsSync(paths.requirements)) {
1079
+ return { data: { updated: false, reason: 'REQUIREMENTS.md not found', ids: reqIds } };
1080
+ }
1081
+
1082
+ let reqContent = (await readFile(paths.requirements, 'utf-8')).replace(/\r\n/g, '\n');
1083
+ const updated: string[] = [];
1084
+ const alreadyComplete: string[] = [];
1085
+ const notFound: string[] = [];
1086
+
1087
+ for (const reqId of reqIds) {
1088
+ let found = false;
1089
+ const reqEscaped = escapeRegex(reqId);
1090
+
1091
+ const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi');
1092
+ const afterCheckbox = reqContent.replace(checkboxPattern, '$1x$2');
1093
+ if (afterCheckbox !== reqContent) {
1094
+ reqContent = afterCheckbox;
1095
+ found = true;
1096
+ }
1097
+
1098
+ const tablePattern = new RegExp(`(\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`, 'gi');
1099
+ const afterTable = reqContent.replace(tablePattern, '$1 Complete $2');
1100
+ if (afterTable !== reqContent) {
1101
+ reqContent = afterTable;
1102
+ found = true;
1103
+ }
1104
+
1105
+ if (found) {
1106
+ updated.push(reqId);
1107
+ } else {
1108
+ const doneCheckbox = new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${reqEscaped}\\*\\*`, 'i');
1109
+ const doneTable = new RegExp(`\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`, 'i');
1110
+ if (doneCheckbox.test(reqContent) || doneTable.test(reqContent)) {
1111
+ alreadyComplete.push(reqId);
1112
+ } else {
1113
+ notFound.push(reqId);
1114
+ }
1115
+ }
1116
+ }
1117
+
1118
+ if (updated.length > 0) {
1119
+ await writeFile(paths.requirements, reqContent, 'utf-8');
1120
+ }
1121
+
1122
+ return {
1123
+ data: {
1124
+ updated: updated.length > 0,
1125
+ marked_complete: updated,
1126
+ already_complete: alreadyComplete,
1127
+ not_found: notFound,
1128
+ total: reqIds.length,
1129
+ },
1130
+ };
1131
+ };