@bhargavvc/sdd-cc 1.35.0 → 1.42.3

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 (1374) hide show
  1. package/README.ja-JP.md +54 -52
  2. package/README.ko-KR.md +47 -45
  3. package/README.md +86 -733
  4. package/README.pt-BR.md +14 -12
  5. package/README.zh-CN.md +31 -29
  6. package/agents/sdd-ai-researcher.md +2 -2
  7. package/agents/sdd-code-fixer.md +169 -17
  8. package/agents/sdd-code-reviewer.md +40 -8
  9. package/agents/sdd-codebase-mapper.md +89 -6
  10. package/agents/sdd-debug-session-manager.md +314 -0
  11. package/agents/sdd-debugger.md +147 -80
  12. package/agents/sdd-doc-classifier.md +168 -0
  13. package/agents/sdd-doc-synthesizer.md +204 -0
  14. package/agents/sdd-doc-verifier.md +20 -4
  15. package/agents/sdd-doc-writer.md +22 -9
  16. package/agents/sdd-domain-researcher.md +2 -2
  17. package/agents/sdd-eval-auditor.md +30 -3
  18. package/agents/sdd-eval-planner.md +2 -2
  19. package/agents/sdd-executor.md +203 -43
  20. package/agents/sdd-framework-selector.md +1 -1
  21. package/agents/sdd-integration-checker.md +30 -3
  22. package/agents/sdd-intel-updater.md +51 -23
  23. package/agents/sdd-nyquist-auditor.md +31 -4
  24. package/agents/sdd-pattern-mapper.md +335 -0
  25. package/agents/sdd-phase-researcher.md +195 -32
  26. package/agents/sdd-plan-checker.md +135 -24
  27. package/agents/sdd-planner.md +190 -205
  28. package/agents/sdd-project-researcher.md +7 -7
  29. package/agents/sdd-research-synthesizer.md +6 -6
  30. package/agents/sdd-roadmapper.md +19 -10
  31. package/agents/sdd-security-auditor.md +33 -6
  32. package/agents/sdd-ui-auditor.md +23 -7
  33. package/agents/sdd-ui-checker.md +16 -7
  34. package/agents/sdd-ui-researcher.md +8 -8
  35. package/agents/sdd-verifier.md +124 -27
  36. package/bin/install.js +5016 -372
  37. package/bin/sdd-sdk.js +37 -0
  38. package/commands/sdd/add-tests.md +5 -4
  39. package/commands/sdd/ai-integration-phase.md +4 -3
  40. package/commands/sdd/audit-fix.md +2 -1
  41. package/commands/sdd/audit-milestone.md +3 -2
  42. package/commands/sdd/autonomous.md +3 -3
  43. package/commands/sdd/capture.md +62 -0
  44. package/commands/sdd/cleanup.md +2 -1
  45. package/commands/sdd/code-review.md +8 -4
  46. package/commands/sdd/complete-milestone.md +15 -8
  47. package/commands/sdd/config.md +58 -0
  48. package/commands/sdd/debug.md +21 -155
  49. package/commands/sdd/discuss-phase.md +18 -11
  50. package/commands/sdd/docs-update.md +3 -2
  51. package/commands/sdd/eval-review.md +4 -3
  52. package/commands/sdd/execute-phase.md +5 -4
  53. package/commands/sdd/explore.md +3 -3
  54. package/commands/sdd/extract-learnings.md +23 -0
  55. package/commands/sdd/fast.md +4 -3
  56. package/commands/sdd/forensics.md +3 -2
  57. package/commands/sdd/graphify.md +199 -0
  58. package/commands/sdd/health.md +12 -3
  59. package/commands/sdd/help.md +1 -1
  60. package/commands/sdd/import.md +10 -5
  61. package/commands/sdd/inbox.md +39 -0
  62. package/commands/sdd/ingest-docs.md +42 -0
  63. package/commands/sdd/manager.md +8 -3
  64. package/commands/sdd/map-codebase.md +18 -6
  65. package/commands/sdd/milestone-summary.md +1 -1
  66. package/commands/sdd/mvp-phase.md +45 -0
  67. package/commands/sdd/new-milestone.md +4 -3
  68. package/commands/sdd/new-project.md +4 -3
  69. package/commands/sdd/ns-context.md +23 -0
  70. package/commands/sdd/ns-ideate.md +24 -0
  71. package/commands/sdd/ns-manage.md +29 -0
  72. package/commands/sdd/ns-project.md +22 -0
  73. package/commands/sdd/ns-review.md +26 -0
  74. package/commands/sdd/ns-workflow.md +28 -0
  75. package/commands/sdd/pause-work.md +6 -1
  76. package/commands/sdd/phase.md +56 -0
  77. package/commands/sdd/plan-phase.md +15 -5
  78. package/commands/sdd/plan-review-convergence.md +59 -0
  79. package/commands/sdd/pr-branch.md +2 -1
  80. package/commands/sdd/profile-user.md +1 -1
  81. package/commands/sdd/progress.md +27 -5
  82. package/commands/sdd/quick.md +128 -3
  83. package/commands/sdd/resume-work.md +2 -12
  84. package/commands/sdd/review-backlog.md +3 -2
  85. package/commands/sdd/review.md +3 -2
  86. package/commands/sdd/secure-phase.md +3 -2
  87. package/commands/sdd/settings.md +2 -9
  88. package/commands/sdd/ship.md +2 -1
  89. package/commands/sdd/sketch.md +60 -0
  90. package/commands/sdd/spec-phase.md +63 -0
  91. package/commands/sdd/spike.md +57 -0
  92. package/commands/sdd/stats.md +2 -1
  93. package/commands/sdd/surface.md +129 -0
  94. package/commands/sdd/thread.md +8 -111
  95. package/commands/sdd/ui-phase.md +3 -2
  96. package/commands/sdd/ui-review.md +3 -2
  97. package/commands/sdd/ultraplan-phase.md +34 -0
  98. package/commands/sdd/undo.md +2 -1
  99. package/commands/sdd/update.md +21 -10
  100. package/commands/sdd/validate-phase.md +3 -2
  101. package/commands/sdd/verify-work.md +5 -4
  102. package/commands/sdd/workspace.md +52 -0
  103. package/commands/sdd/workstreams.md +12 -11
  104. package/hooks/dist/sdd-check-update-worker.js +116 -0
  105. package/hooks/dist/sdd-check-update.js +13 -88
  106. package/hooks/dist/sdd-context-monitor.js +28 -1
  107. package/hooks/dist/sdd-phase-boundary.sh +23 -3
  108. package/hooks/dist/sdd-read-guard.js +21 -2
  109. package/hooks/dist/sdd-read-injection-scanner.js +152 -0
  110. package/hooks/dist/sdd-session-state.sh +38 -12
  111. package/hooks/dist/sdd-statusline.js +324 -28
  112. package/hooks/dist/sdd-update-banner.js +134 -0
  113. package/hooks/dist/sdd-validate-commit.sh +15 -5
  114. package/hooks/dist/sdd-workflow-guard.js +2 -2
  115. package/hooks/lib/git-cmd.js +150 -0
  116. package/hooks/sdd-check-update-worker.js +116 -0
  117. package/hooks/sdd-check-update.js +13 -88
  118. package/hooks/sdd-context-monitor.js +28 -1
  119. package/hooks/sdd-phase-boundary.sh +23 -3
  120. package/hooks/sdd-read-guard.js +21 -2
  121. package/hooks/sdd-read-injection-scanner.js +152 -0
  122. package/hooks/sdd-session-state.sh +38 -12
  123. package/hooks/sdd-statusline.js +324 -28
  124. package/hooks/sdd-update-banner.js +134 -0
  125. package/hooks/sdd-validate-commit.sh +15 -5
  126. package/hooks/sdd-workflow-guard.js +2 -2
  127. package/package.json +32 -7
  128. package/scripts/audit-workflow-script-paths.cjs +73 -0
  129. package/scripts/build-hooks.js +98 -4
  130. package/scripts/changeset/cli.cjs +269 -0
  131. package/scripts/changeset/github-release-notes.cjs +198 -0
  132. package/scripts/changeset/lint.cjs +110 -0
  133. package/scripts/changeset/new.cjs +137 -0
  134. package/scripts/changeset/parse.cjs +60 -0
  135. package/scripts/changeset/render.cjs +34 -0
  136. package/scripts/changeset/serialize.cjs +74 -0
  137. package/scripts/command-contract-helpers.cjs +61 -0
  138. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  139. package/scripts/fix-slash-commands.cjs +106 -0
  140. package/scripts/gen-inventory-manifest.cjs +109 -0
  141. package/scripts/lint-command-contract.cjs +108 -0
  142. package/scripts/lint-descriptions.cjs +83 -0
  143. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  144. package/scripts/lint-no-source-grep.cjs +174 -0
  145. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  146. package/scripts/lint-skill-deps.cjs +180 -0
  147. package/scripts/pr-template-policy.cjs +169 -0
  148. package/scripts/prompt-injection-scan.sh +2 -0
  149. package/scripts/rebrand-gsd-to-sdd.sh +4 -3
  150. package/scripts/strip-prose-atrefs.cjs +106 -0
  151. package/scripts/verify-tarball-sdk-dist.sh +69 -0
  152. package/sdd/bin/check-latest-version.cjs +104 -0
  153. package/sdd/bin/lib/active-workstream-store.cjs +85 -0
  154. package/sdd/bin/lib/adr-parser.cjs +394 -0
  155. package/sdd/bin/lib/artifacts.cjs +53 -0
  156. package/sdd/bin/lib/audit.cjs +755 -0
  157. package/sdd/bin/lib/cjs-command-router-adapter.cjs +39 -0
  158. package/sdd/bin/lib/clusters.cjs +135 -0
  159. package/sdd/bin/lib/command-aliases.generated.cjs +838 -0
  160. package/sdd/bin/lib/commands.cjs +108 -98
  161. package/sdd/bin/lib/config-schema.cjs +135 -0
  162. package/sdd/bin/lib/config.cjs +253 -68
  163. package/sdd/bin/lib/context-utilization.cjs +47 -0
  164. package/sdd/bin/lib/core.cjs +997 -607
  165. package/sdd/bin/lib/decisions.cjs +48 -0
  166. package/sdd/bin/lib/docs.cjs +36 -33
  167. package/sdd/bin/lib/drift.cjs +379 -0
  168. package/sdd/bin/lib/fallow-runner.cjs +109 -0
  169. package/sdd/bin/lib/frontmatter.cjs +19 -11
  170. package/sdd/bin/lib/gap-checker.cjs +197 -0
  171. package/sdd/bin/lib/graphify.cjs +577 -0
  172. package/sdd/bin/lib/init-command-router.cjs +70 -0
  173. package/sdd/bin/lib/init.cjs +603 -102
  174. package/sdd/bin/lib/install-profiles.cjs +572 -0
  175. package/sdd/bin/lib/installer-migration-authoring.cjs +117 -0
  176. package/sdd/bin/lib/installer-migration-report.cjs +328 -0
  177. package/sdd/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  178. package/sdd/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  179. package/sdd/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  180. package/sdd/bin/lib/installer-migrations.cjs +703 -0
  181. package/sdd/bin/lib/intel.cjs +35 -52
  182. package/sdd/bin/lib/learnings.cjs +2 -1
  183. package/sdd/bin/lib/milestone.cjs +313 -283
  184. package/sdd/bin/lib/model-catalog.cjs +136 -0
  185. package/sdd/bin/lib/model-profiles.cjs +25 -70
  186. package/sdd/bin/lib/phase-command-router.cjs +96 -0
  187. package/sdd/bin/lib/phase.cjs +556 -102
  188. package/sdd/bin/lib/phases-command-router.cjs +39 -0
  189. package/sdd/bin/lib/plan-scan.cjs +138 -0
  190. package/sdd/bin/lib/planning-workspace.cjs +361 -0
  191. package/sdd/bin/lib/profile-output.cjs +109 -43
  192. package/sdd/bin/lib/profile-pipeline.cjs +1 -1
  193. package/sdd/bin/lib/review-reviewer-selection.cjs +125 -0
  194. package/sdd/bin/lib/roadmap-command-router.cjs +23 -0
  195. package/sdd/bin/lib/roadmap.cjs +278 -17
  196. package/sdd/bin/lib/runtime-homes.cjs +178 -0
  197. package/sdd/bin/lib/sdd2-import.cjs +3 -3
  198. package/sdd/bin/lib/secrets.cjs +33 -0
  199. package/sdd/bin/lib/security.cjs +8 -7
  200. package/sdd/bin/lib/shell-command-projection.cjs +548 -0
  201. package/sdd/bin/lib/state-command-router.cjs +100 -0
  202. package/sdd/bin/lib/state-document.cjs +12 -0
  203. package/sdd/bin/lib/state-document.generated.cjs +127 -0
  204. package/sdd/bin/lib/state.cjs +720 -218
  205. package/sdd/bin/lib/surface.cjs +398 -0
  206. package/sdd/bin/lib/template.cjs +4 -2
  207. package/sdd/bin/lib/uat.cjs +9 -2
  208. package/sdd/bin/lib/validate-command-router.cjs +55 -0
  209. package/sdd/bin/lib/verify-command-router.cjs +34 -0
  210. package/sdd/bin/lib/verify.cjs +464 -137
  211. package/sdd/bin/lib/workstream-inventory.cjs +159 -0
  212. package/sdd/bin/lib/workstream-name-policy.cjs +33 -0
  213. package/sdd/bin/lib/workstream.cjs +73 -195
  214. package/sdd/bin/lib/worktree-safety.cjs +563 -0
  215. package/sdd/bin/sdd-tools.cjs +386 -252
  216. package/sdd/bin/verify-reapply-patches.cjs +247 -0
  217. package/sdd/contexts/review.md +1 -0
  218. package/sdd/references/artifact-types.md +18 -0
  219. package/sdd/references/autonomous-smart-discuss.md +277 -0
  220. package/sdd/references/checkpoints.md +36 -0
  221. package/sdd/references/context-budget.md +85 -49
  222. package/sdd/references/continuation-format.md +26 -22
  223. package/sdd/references/debugger-philosophy.md +76 -0
  224. package/sdd/references/decimal-phase-calculation.md +5 -5
  225. package/sdd/references/doc-conflict-engine.md +91 -0
  226. package/sdd/references/domain-probes.md +1 -1
  227. package/sdd/references/execute-mvp-tdd.md +81 -0
  228. package/sdd/references/executor-examples.md +110 -0
  229. package/sdd/references/gate-prompts.md +2 -2
  230. package/sdd/references/git-integration.md +10 -7
  231. package/sdd/references/git-planning-commit.md +6 -4
  232. package/sdd/references/mandatory-initial-read.md +2 -0
  233. package/sdd/references/model-profiles.md +106 -6
  234. package/sdd/references/mvp-concepts.md +49 -0
  235. package/sdd/references/phase-argument-parsing.md +3 -3
  236. package/sdd/references/planner-antipatterns.md +89 -0
  237. package/sdd/references/planner-chunked.md +49 -0
  238. package/sdd/references/planner-human-verify-mode.md +57 -0
  239. package/sdd/references/planner-mvp-mode.md +53 -0
  240. package/sdd/references/planner-revision.md +1 -1
  241. package/sdd/references/planner-source-audit.md +73 -0
  242. package/sdd/references/planning-config.md +30 -13
  243. package/sdd/references/project-skills-discovery.md +19 -0
  244. package/sdd/references/scout-codebase.md +51 -0
  245. package/sdd/references/skeleton-template.md +48 -0
  246. package/sdd/references/sketch-interactivity.md +41 -0
  247. package/sdd/references/sketch-theme-system.md +94 -0
  248. package/sdd/references/sketch-tooling.md +45 -0
  249. package/sdd/references/sketch-variant-patterns.md +81 -0
  250. package/sdd/references/spidr-splitting.md +69 -0
  251. package/sdd/references/tdd.md +67 -0
  252. package/sdd/references/thinking-partner.md +1 -1
  253. package/sdd/references/universal-anti-patterns.md +4 -4
  254. package/sdd/references/user-story-template.md +58 -0
  255. package/sdd/references/verification-overrides.md +3 -3
  256. package/sdd/references/verify-mvp-mode.md +85 -0
  257. package/sdd/references/workstream-flag.md +11 -11
  258. package/sdd/references/worktree-path-safety.md +89 -0
  259. package/sdd/templates/AI-SPEC.md +1 -1
  260. package/sdd/templates/DEBUG.md +8 -3
  261. package/sdd/templates/README.md +77 -0
  262. package/sdd/templates/UAT.md +4 -4
  263. package/sdd/templates/VALIDATION.md +1 -1
  264. package/sdd/templates/claude-md.md +5 -5
  265. package/sdd/templates/config.json +16 -2
  266. package/sdd/templates/debug-subagent-prompt.md +1 -1
  267. package/sdd/templates/dev-preferences.md +1 -1
  268. package/sdd/templates/discovery.md +2 -2
  269. package/sdd/templates/phase-prompt.md +1 -1
  270. package/sdd/templates/planner-subagent-prompt.md +3 -3
  271. package/sdd/templates/project.md +1 -1
  272. package/sdd/templates/research.md +41 -1
  273. package/sdd/templates/spec.md +307 -0
  274. package/sdd/templates/state.md +9 -1
  275. package/sdd/workflows/add-backlog.md +90 -0
  276. package/sdd/workflows/add-phase.md +7 -7
  277. package/sdd/workflows/add-tests.md +12 -12
  278. package/sdd/workflows/add-todo.md +4 -4
  279. package/sdd/workflows/ai-integration-phase.md +26 -16
  280. package/sdd/workflows/analyze-dependencies.md +3 -3
  281. package/sdd/workflows/audit-fix.md +23 -3
  282. package/sdd/workflows/audit-milestone.md +37 -20
  283. package/sdd/workflows/audit-uat.md +3 -3
  284. package/sdd/workflows/autonomous.md +31 -301
  285. package/sdd/workflows/check-todos.md +6 -6
  286. package/sdd/workflows/cleanup.md +1 -1
  287. package/sdd/workflows/code-review-fix.md +20 -16
  288. package/sdd/workflows/code-review.md +114 -16
  289. package/sdd/workflows/complete-milestone.md +68 -15
  290. package/sdd/workflows/debug.md +231 -0
  291. package/sdd/workflows/diagnose-issues.md +8 -6
  292. package/sdd/workflows/discovery-phase.md +3 -3
  293. package/sdd/workflows/discuss-phase/modes/advisor.md +175 -0
  294. package/sdd/workflows/discuss-phase/modes/all.md +28 -0
  295. package/sdd/workflows/discuss-phase/modes/analyze.md +44 -0
  296. package/sdd/workflows/discuss-phase/modes/auto.md +56 -0
  297. package/sdd/workflows/discuss-phase/modes/batch.md +52 -0
  298. package/sdd/workflows/discuss-phase/modes/chain.md +97 -0
  299. package/sdd/workflows/discuss-phase/modes/default.md +141 -0
  300. package/sdd/workflows/discuss-phase/modes/power.md +44 -0
  301. package/sdd/workflows/discuss-phase/modes/text.md +55 -0
  302. package/sdd/workflows/discuss-phase/templates/checkpoint.json +18 -0
  303. package/sdd/workflows/discuss-phase/templates/context.md +136 -0
  304. package/sdd/workflows/discuss-phase/templates/discussion-log.md +50 -0
  305. package/sdd/workflows/discuss-phase-assumptions.md +24 -21
  306. package/sdd/workflows/discuss-phase-power.md +3 -3
  307. package/sdd/workflows/discuss-phase.md +203 -905
  308. package/sdd/workflows/do.md +25 -21
  309. package/sdd/workflows/docs-update.md +23 -17
  310. package/sdd/workflows/edit-phase.md +294 -0
  311. package/sdd/workflows/eval-review.md +7 -7
  312. package/sdd/workflows/execute-phase/steps/codebase-drift-gate.md +81 -0
  313. package/sdd/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  314. package/sdd/workflows/execute-phase/steps/post-merge-gate.md +116 -0
  315. package/sdd/workflows/execute-phase.md +650 -252
  316. package/sdd/workflows/execute-plan.md +75 -35
  317. package/sdd/workflows/explore.md +7 -3
  318. package/sdd/workflows/extract-learnings.md +242 -0
  319. package/sdd/workflows/fast.md +5 -5
  320. package/sdd/workflows/forensics.md +19 -6
  321. package/sdd/workflows/graduation.md +195 -0
  322. package/sdd/workflows/health.md +49 -7
  323. package/sdd/workflows/help.md +323 -149
  324. package/sdd/workflows/import.md +20 -43
  325. package/sdd/workflows/inbox.md +5 -5
  326. package/sdd/workflows/ingest-docs.md +339 -0
  327. package/sdd/workflows/insert-phase.md +33 -12
  328. package/sdd/workflows/list-phase-assumptions.md +2 -2
  329. package/sdd/workflows/list-workspaces.md +2 -2
  330. package/sdd/workflows/manager.md +38 -11
  331. package/sdd/workflows/map-codebase.md +87 -23
  332. package/sdd/workflows/milestone-summary.md +8 -8
  333. package/sdd/workflows/mvp-phase.md +221 -0
  334. package/sdd/workflows/new-milestone.md +163 -23
  335. package/sdd/workflows/new-project.md +254 -53
  336. package/sdd/workflows/new-workspace.md +8 -8
  337. package/sdd/workflows/next.md +85 -18
  338. package/sdd/workflows/note.md +2 -2
  339. package/sdd/workflows/pause-work.md +13 -9
  340. package/sdd/workflows/plan-milestone-gaps.md +18 -11
  341. package/sdd/workflows/plan-phase.md +767 -94
  342. package/sdd/workflows/plan-review-convergence.md +329 -0
  343. package/sdd/workflows/plant-seed.md +146 -89
  344. package/sdd/workflows/pr-branch.md +1 -1
  345. package/sdd/workflows/profile-user.md +15 -15
  346. package/sdd/workflows/progress.md +198 -56
  347. package/sdd/workflows/quick.md +318 -54
  348. package/{commands/sdd → sdd/workflows}/reapply-patches.md +102 -23
  349. package/sdd/workflows/remove-phase.md +10 -10
  350. package/sdd/workflows/remove-workspace.md +21 -6
  351. package/sdd/workflows/resume-project.md +26 -23
  352. package/sdd/workflows/review.md +151 -20
  353. package/sdd/workflows/scan.md +5 -3
  354. package/sdd/workflows/secure-phase.md +26 -13
  355. package/sdd/workflows/settings-advanced.md +579 -0
  356. package/sdd/workflows/settings-integrations.md +281 -0
  357. package/sdd/workflows/settings.md +202 -23
  358. package/sdd/workflows/ship.md +131 -16
  359. package/sdd/workflows/sketch-wrap-up.md +285 -0
  360. package/sdd/workflows/sketch.md +360 -0
  361. package/sdd/workflows/spec-phase.md +262 -0
  362. package/sdd/workflows/spike-wrap-up.md +306 -0
  363. package/sdd/workflows/spike.md +452 -0
  364. package/sdd/workflows/stats.md +21 -2
  365. package/sdd/workflows/sync-skills.md +182 -0
  366. package/sdd/workflows/thread.md +221 -0
  367. package/sdd/workflows/transition.md +52 -30
  368. package/sdd/workflows/ui-phase.md +37 -20
  369. package/sdd/workflows/ui-review.md +12 -10
  370. package/sdd/workflows/ultraplan-phase.md +198 -0
  371. package/sdd/workflows/undo.md +9 -9
  372. package/sdd/workflows/update.md +187 -17
  373. package/sdd/workflows/validate-phase.md +12 -10
  374. package/sdd/workflows/verify-phase.md +112 -27
  375. package/sdd/workflows/verify-work.md +97 -28
  376. package/sdk/dist/cli-transport.d.ts +19 -0
  377. package/sdk/dist/cli-transport.d.ts.map +1 -0
  378. package/sdk/dist/cli-transport.js +104 -0
  379. package/sdk/dist/cli-transport.js.map +1 -0
  380. package/sdk/dist/cli.d.ts +46 -0
  381. package/sdk/dist/cli.d.ts.map +1 -0
  382. package/sdk/dist/cli.js +511 -0
  383. package/sdk/dist/cli.js.map +1 -0
  384. package/sdk/dist/config.d.ts +84 -0
  385. package/sdk/dist/config.d.ts.map +1 -0
  386. package/sdk/dist/config.js +135 -0
  387. package/sdk/dist/config.js.map +1 -0
  388. package/sdk/dist/context-engine.d.ts +49 -0
  389. package/sdk/dist/context-engine.d.ts.map +1 -0
  390. package/sdk/dist/context-engine.js +142 -0
  391. package/sdk/dist/context-engine.js.map +1 -0
  392. package/sdk/dist/context-truncation.d.ts +33 -0
  393. package/sdk/dist/context-truncation.d.ts.map +1 -0
  394. package/sdk/dist/context-truncation.js +197 -0
  395. package/sdk/dist/context-truncation.js.map +1 -0
  396. package/sdk/dist/errors.d.ts +46 -0
  397. package/sdk/dist/errors.d.ts.map +1 -0
  398. package/sdk/dist/errors.js +64 -0
  399. package/sdk/dist/errors.js.map +1 -0
  400. package/sdk/dist/event-stream.d.ts +53 -0
  401. package/sdk/dist/event-stream.d.ts.map +1 -0
  402. package/sdk/dist/event-stream.js +321 -0
  403. package/sdk/dist/event-stream.js.map +1 -0
  404. package/sdk/dist/golden/capture.d.ts +15 -0
  405. package/sdk/dist/golden/capture.d.ts.map +1 -0
  406. package/sdk/dist/golden/capture.js +67 -0
  407. package/sdk/dist/golden/capture.js.map +1 -0
  408. package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
  409. package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
  410. package/sdk/dist/golden/golden-integration-covered.js +30 -0
  411. package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
  412. package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
  413. package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
  414. package/sdk/dist/golden/golden-mutation-covered.js +17 -0
  415. package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
  416. package/sdk/dist/golden/golden-policy.d.ts +10 -0
  417. package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
  418. package/sdk/dist/golden/golden-policy.js +98 -0
  419. package/sdk/dist/golden/golden-policy.js.map +1 -0
  420. package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
  421. package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
  422. package/sdk/dist/golden/init-golden-normalize.js +14 -0
  423. package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
  424. package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
  425. package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
  426. package/sdk/dist/golden/read-only-golden-rows.js +67 -0
  427. package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
  428. package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
  429. package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
  430. package/sdk/dist/golden/registry-canonical-commands.js +30 -0
  431. package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
  432. package/sdk/dist/index.d.ts +125 -0
  433. package/sdk/dist/index.d.ts.map +1 -0
  434. package/sdk/dist/index.js +298 -0
  435. package/sdk/dist/index.js.map +1 -0
  436. package/sdk/dist/init-runner.d.ts +90 -0
  437. package/sdk/dist/init-runner.d.ts.map +1 -0
  438. package/sdk/dist/init-runner.js +613 -0
  439. package/sdk/dist/init-runner.js.map +1 -0
  440. package/sdk/dist/logger.d.ts +50 -0
  441. package/sdk/dist/logger.d.ts.map +1 -0
  442. package/sdk/dist/logger.js +70 -0
  443. package/sdk/dist/logger.js.map +1 -0
  444. package/sdk/dist/model-catalog.d.ts +31 -0
  445. package/sdk/dist/model-catalog.d.ts.map +1 -0
  446. package/sdk/dist/model-catalog.js +31 -0
  447. package/sdk/dist/model-catalog.js.map +1 -0
  448. package/sdk/dist/phase-prompt.d.ts +72 -0
  449. package/sdk/dist/phase-prompt.d.ts.map +1 -0
  450. package/sdk/dist/phase-prompt.js +213 -0
  451. package/sdk/dist/phase-prompt.js.map +1 -0
  452. package/sdk/dist/phase-runner.d.ts +145 -0
  453. package/sdk/dist/phase-runner.d.ts.map +1 -0
  454. package/sdk/dist/phase-runner.js +1206 -0
  455. package/sdk/dist/phase-runner.js.map +1 -0
  456. package/sdk/dist/plan-parser.d.ts +55 -0
  457. package/sdk/dist/plan-parser.d.ts.map +1 -0
  458. package/sdk/dist/plan-parser.js +389 -0
  459. package/sdk/dist/plan-parser.js.map +1 -0
  460. package/sdk/dist/planning-journal.d.ts +64 -0
  461. package/sdk/dist/planning-journal.d.ts.map +1 -0
  462. package/sdk/dist/planning-journal.js +88 -0
  463. package/sdk/dist/planning-journal.js.map +1 -0
  464. package/sdk/dist/planning-runtime.d.ts +67 -0
  465. package/sdk/dist/planning-runtime.d.ts.map +1 -0
  466. package/sdk/dist/planning-runtime.js +58 -0
  467. package/sdk/dist/planning-runtime.js.map +1 -0
  468. package/sdk/dist/prompt-builder.d.ts +44 -0
  469. package/sdk/dist/prompt-builder.d.ts.map +1 -0
  470. package/sdk/dist/prompt-builder.js +180 -0
  471. package/sdk/dist/prompt-builder.js.map +1 -0
  472. package/sdk/dist/prompt-sanitizer.d.ts +35 -0
  473. package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
  474. package/sdk/dist/prompt-sanitizer.js +101 -0
  475. package/sdk/dist/prompt-sanitizer.js.map +1 -0
  476. package/sdk/dist/query/active-workstream-store.d.ts +7 -0
  477. package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
  478. package/sdk/dist/query/active-workstream-store.js +56 -0
  479. package/sdk/dist/query/active-workstream-store.js.map +1 -0
  480. package/sdk/dist/query/agent-failure-classifier.d.ts +38 -0
  481. package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
  482. package/sdk/dist/query/agent-failure-classifier.js +83 -0
  483. package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
  484. package/sdk/dist/query/audit-open.d.ts +46 -0
  485. package/sdk/dist/query/audit-open.d.ts.map +1 -0
  486. package/sdk/dist/query/audit-open.js +662 -0
  487. package/sdk/dist/query/audit-open.js.map +1 -0
  488. package/sdk/dist/query/check-auto-mode.d.ts +13 -0
  489. package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
  490. package/sdk/dist/query/check-auto-mode.js +40 -0
  491. package/sdk/dist/query/check-auto-mode.js.map +1 -0
  492. package/sdk/dist/query/check-completion.d.ts +10 -0
  493. package/sdk/dist/query/check-completion.d.ts.map +1 -0
  494. package/sdk/dist/query/check-completion.js +157 -0
  495. package/sdk/dist/query/check-completion.js.map +1 -0
  496. package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
  497. package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
  498. package/sdk/dist/query/check-decision-coverage.js +472 -0
  499. package/sdk/dist/query/check-decision-coverage.js.map +1 -0
  500. package/sdk/dist/query/check-gates.d.ts +10 -0
  501. package/sdk/dist/query/check-gates.d.ts.map +1 -0
  502. package/sdk/dist/query/check-gates.js +89 -0
  503. package/sdk/dist/query/check-gates.js.map +1 -0
  504. package/sdk/dist/query/check-ship-ready.d.ts +10 -0
  505. package/sdk/dist/query/check-ship-ready.d.ts.map +1 -0
  506. package/sdk/dist/query/check-ship-ready.js +93 -0
  507. package/sdk/dist/query/check-ship-ready.js.map +1 -0
  508. package/sdk/dist/query/check-verification-status.d.ts +10 -0
  509. package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
  510. package/sdk/dist/query/check-verification-status.js +142 -0
  511. package/sdk/dist/query/check-verification-status.js.map +1 -0
  512. package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
  513. package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
  514. package/sdk/dist/query/command-aliases.generated.js +135 -0
  515. package/sdk/dist/query/command-aliases.generated.js.map +1 -0
  516. package/sdk/dist/query/command-catalog.d.ts +9 -0
  517. package/sdk/dist/query/command-catalog.d.ts.map +1 -0
  518. package/sdk/dist/query/command-catalog.js +17 -0
  519. package/sdk/dist/query/command-catalog.js.map +1 -0
  520. package/sdk/dist/query/command-definition.d.ts +19 -0
  521. package/sdk/dist/query/command-definition.d.ts.map +1 -0
  522. package/sdk/dist/query/command-definition.js +44 -0
  523. package/sdk/dist/query/command-definition.js.map +1 -0
  524. package/sdk/dist/query/command-family-handlers.d.ts +3 -0
  525. package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
  526. package/sdk/dist/query/command-family-handlers.js +94 -0
  527. package/sdk/dist/query/command-family-handlers.js.map +1 -0
  528. package/sdk/dist/query/command-manifest.d.ts +2 -0
  529. package/sdk/dist/query/command-manifest.d.ts.map +1 -0
  530. package/sdk/dist/query/command-manifest.init.d.ts +6 -0
  531. package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
  532. package/sdk/dist/query/command-manifest.init.js +23 -0
  533. package/sdk/dist/query/command-manifest.init.js.map +1 -0
  534. package/sdk/dist/query/command-manifest.js +17 -0
  535. package/sdk/dist/query/command-manifest.js.map +1 -0
  536. package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
  537. package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
  538. package/sdk/dist/query/command-manifest.non-family.js +59 -0
  539. package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
  540. package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
  541. package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
  542. package/sdk/dist/query/command-manifest.phase.js +15 -0
  543. package/sdk/dist/query/command-manifest.phase.js.map +1 -0
  544. package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
  545. package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
  546. package/sdk/dist/query/command-manifest.phases.js +10 -0
  547. package/sdk/dist/query/command-manifest.phases.js.map +1 -0
  548. package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
  549. package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
  550. package/sdk/dist/query/command-manifest.roadmap.js +10 -0
  551. package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
  552. package/sdk/dist/query/command-manifest.state.d.ts +9 -0
  553. package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
  554. package/sdk/dist/query/command-manifest.state.js +30 -0
  555. package/sdk/dist/query/command-manifest.state.js.map +1 -0
  556. package/sdk/dist/query/command-manifest.types.d.ts +12 -0
  557. package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
  558. package/sdk/dist/query/command-manifest.types.js +2 -0
  559. package/sdk/dist/query/command-manifest.types.js.map +1 -0
  560. package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
  561. package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
  562. package/sdk/dist/query/command-manifest.validate.js +10 -0
  563. package/sdk/dist/query/command-manifest.validate.js.map +1 -0
  564. package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
  565. package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
  566. package/sdk/dist/query/command-manifest.verify.js +14 -0
  567. package/sdk/dist/query/command-manifest.verify.js.map +1 -0
  568. package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
  569. package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
  570. package/sdk/dist/query/command-static-catalog-domain.js +116 -0
  571. package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
  572. package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
  573. package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
  574. package/sdk/dist/query/command-static-catalog-foundation.js +98 -0
  575. package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
  576. package/sdk/dist/query/command-topology.d.ts +32 -0
  577. package/sdk/dist/query/command-topology.d.ts.map +1 -0
  578. package/sdk/dist/query/command-topology.js +66 -0
  579. package/sdk/dist/query/command-topology.js.map +1 -0
  580. package/sdk/dist/query/commands-list.d.ts +14 -0
  581. package/sdk/dist/query/commands-list.d.ts.map +1 -0
  582. package/sdk/dist/query/commands-list.js +18 -0
  583. package/sdk/dist/query/commands-list.js.map +1 -0
  584. package/sdk/dist/query/commit.d.ts +79 -0
  585. package/sdk/dist/query/commit.d.ts.map +1 -0
  586. package/sdk/dist/query/commit.js +340 -0
  587. package/sdk/dist/query/commit.js.map +1 -0
  588. package/sdk/dist/query/config-gates.d.ts +12 -0
  589. package/sdk/dist/query/config-gates.d.ts.map +1 -0
  590. package/sdk/dist/query/config-gates.js +66 -0
  591. package/sdk/dist/query/config-gates.js.map +1 -0
  592. package/sdk/dist/query/config-mutation.d.ts +86 -0
  593. package/sdk/dist/query/config-mutation.d.ts.map +1 -0
  594. package/sdk/dist/query/config-mutation.js +518 -0
  595. package/sdk/dist/query/config-mutation.js.map +1 -0
  596. package/sdk/dist/query/config-query.d.ts +57 -0
  597. package/sdk/dist/query/config-query.d.ts.map +1 -0
  598. package/sdk/dist/query/config-query.js +208 -0
  599. package/sdk/dist/query/config-query.js.map +1 -0
  600. package/sdk/dist/query/config-schema.d.ts +36 -0
  601. package/sdk/dist/query/config-schema.d.ts.map +1 -0
  602. package/sdk/dist/query/config-schema.js +147 -0
  603. package/sdk/dist/query/config-schema.js.map +1 -0
  604. package/sdk/dist/query/decisions.d.ts +58 -0
  605. package/sdk/dist/query/decisions.d.ts.map +1 -0
  606. package/sdk/dist/query/decisions.js +161 -0
  607. package/sdk/dist/query/decisions.js.map +1 -0
  608. package/sdk/dist/query/detect-custom-files.d.ts +11 -0
  609. package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
  610. package/sdk/dist/query/detect-custom-files.js +89 -0
  611. package/sdk/dist/query/detect-custom-files.js.map +1 -0
  612. package/sdk/dist/query/detect-phase-type.d.ts +9 -0
  613. package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
  614. package/sdk/dist/query/detect-phase-type.js +124 -0
  615. package/sdk/dist/query/detect-phase-type.js.map +1 -0
  616. package/sdk/dist/query/docs-init.d.ts +26 -0
  617. package/sdk/dist/query/docs-init.d.ts.map +1 -0
  618. package/sdk/dist/query/docs-init.js +231 -0
  619. package/sdk/dist/query/docs-init.js.map +1 -0
  620. package/sdk/dist/query/fallow-audit.d.ts +44 -0
  621. package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
  622. package/sdk/dist/query/fallow-audit.js +44 -0
  623. package/sdk/dist/query/fallow-audit.js.map +1 -0
  624. package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
  625. package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
  626. package/sdk/dist/query/frontmatter-mutation.js +317 -0
  627. package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
  628. package/sdk/dist/query/frontmatter.d.ts +93 -0
  629. package/sdk/dist/query/frontmatter.d.ts.map +1 -0
  630. package/sdk/dist/query/frontmatter.js +365 -0
  631. package/sdk/dist/query/frontmatter.js.map +1 -0
  632. package/sdk/dist/query/helpers.d.ts +191 -0
  633. package/sdk/dist/query/helpers.d.ts.map +1 -0
  634. package/sdk/dist/query/helpers.js +613 -0
  635. package/sdk/dist/query/helpers.js.map +1 -0
  636. package/sdk/dist/query/index.d.ts +8 -0
  637. package/sdk/dist/query/index.d.ts.map +1 -0
  638. package/sdk/dist/query/index.js +6 -0
  639. package/sdk/dist/query/index.js.map +1 -0
  640. package/sdk/dist/query/init-complex.d.ts +47 -0
  641. package/sdk/dist/query/init-complex.d.ts.map +1 -0
  642. package/sdk/dist/query/init-complex.js +718 -0
  643. package/sdk/dist/query/init-complex.js.map +1 -0
  644. package/sdk/dist/query/init.d.ts +106 -0
  645. package/sdk/dist/query/init.d.ts.map +1 -0
  646. package/sdk/dist/query/init.js +1159 -0
  647. package/sdk/dist/query/init.js.map +1 -0
  648. package/sdk/dist/query/intel.d.ts +43 -0
  649. package/sdk/dist/query/intel.d.ts.map +1 -0
  650. package/sdk/dist/query/intel.js +416 -0
  651. package/sdk/dist/query/intel.js.map +1 -0
  652. package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
  653. package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
  654. package/sdk/dist/query/mutation-event-decorator.js +28 -0
  655. package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
  656. package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
  657. package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
  658. package/sdk/dist/query/mutation-event-mapper.js +70 -0
  659. package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
  660. package/sdk/dist/query/mvp.d.ts +113 -0
  661. package/sdk/dist/query/mvp.d.ts.map +1 -0
  662. package/sdk/dist/query/mvp.js +225 -0
  663. package/sdk/dist/query/mvp.js.map +1 -0
  664. package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
  665. package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
  666. package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
  667. package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
  668. package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
  669. package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
  670. package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
  671. package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
  672. package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
  673. package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
  674. package/sdk/dist/query/phase-lifecycle.js +1486 -0
  675. package/sdk/dist/query/phase-lifecycle.js.map +1 -0
  676. package/sdk/dist/query/phase-list-queries.d.ts +18 -0
  677. package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
  678. package/sdk/dist/query/phase-list-queries.js +129 -0
  679. package/sdk/dist/query/phase-list-queries.js.map +1 -0
  680. package/sdk/dist/query/phase-ready.d.ts +9 -0
  681. package/sdk/dist/query/phase-ready.d.ts.map +1 -0
  682. package/sdk/dist/query/phase-ready.js +132 -0
  683. package/sdk/dist/query/phase-ready.js.map +1 -0
  684. package/sdk/dist/query/phase-roadmap-mutation.d.ts +13 -0
  685. package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
  686. package/sdk/dist/query/phase-roadmap-mutation.js +65 -0
  687. package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
  688. package/sdk/dist/query/phase.d.ts +48 -0
  689. package/sdk/dist/query/phase.d.ts.map +1 -0
  690. package/sdk/dist/query/phase.js +451 -0
  691. package/sdk/dist/query/phase.js.map +1 -0
  692. package/sdk/dist/query/pipeline.d.ts +53 -0
  693. package/sdk/dist/query/pipeline.d.ts.map +1 -0
  694. package/sdk/dist/query/pipeline.js +198 -0
  695. package/sdk/dist/query/pipeline.js.map +1 -0
  696. package/sdk/dist/query/plan-scan.d.ts +14 -0
  697. package/sdk/dist/query/plan-scan.d.ts.map +1 -0
  698. package/sdk/dist/query/plan-scan.js +70 -0
  699. package/sdk/dist/query/plan-scan.js.map +1 -0
  700. package/sdk/dist/query/plan-task-structure.d.ts +9 -0
  701. package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
  702. package/sdk/dist/query/plan-task-structure.js +59 -0
  703. package/sdk/dist/query/plan-task-structure.js.map +1 -0
  704. package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
  705. package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
  706. package/sdk/dist/query/profile-extract-messages.js +195 -0
  707. package/sdk/dist/query/profile-extract-messages.js.map +1 -0
  708. package/sdk/dist/query/profile-output.d.ts +11 -0
  709. package/sdk/dist/query/profile-output.d.ts.map +1 -0
  710. package/sdk/dist/query/profile-output.js +873 -0
  711. package/sdk/dist/query/profile-output.js.map +1 -0
  712. package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
  713. package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
  714. package/sdk/dist/query/profile-questionnaire-data.js +171 -0
  715. package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
  716. package/sdk/dist/query/profile-sample.d.ts +22 -0
  717. package/sdk/dist/query/profile-sample.d.ts.map +1 -0
  718. package/sdk/dist/query/profile-sample.js +136 -0
  719. package/sdk/dist/query/profile-sample.js.map +1 -0
  720. package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
  721. package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
  722. package/sdk/dist/query/profile-scan-sessions.js +137 -0
  723. package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
  724. package/sdk/dist/query/profile.d.ts +61 -0
  725. package/sdk/dist/query/profile.d.ts.map +1 -0
  726. package/sdk/dist/query/profile.js +307 -0
  727. package/sdk/dist/query/profile.js.map +1 -0
  728. package/sdk/dist/query/progress.d.ts +77 -0
  729. package/sdk/dist/query/progress.d.ts.map +1 -0
  730. package/sdk/dist/query/progress.js +481 -0
  731. package/sdk/dist/query/progress.js.map +1 -0
  732. package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
  733. package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
  734. package/sdk/dist/query/query-cli-adapter.js +32 -0
  735. package/sdk/dist/query/query-cli-adapter.js.map +1 -0
  736. package/sdk/dist/query/query-cli-output.d.ts +9 -0
  737. package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
  738. package/sdk/dist/query/query-cli-output.js +28 -0
  739. package/sdk/dist/query/query-cli-output.js.map +1 -0
  740. package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
  741. package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
  742. package/sdk/dist/query/query-command-diagnosis.js +6 -0
  743. package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
  744. package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
  745. package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
  746. package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
  747. package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
  748. package/sdk/dist/query/query-command-semantics.d.ts +7 -0
  749. package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
  750. package/sdk/dist/query/query-command-semantics.js +7 -0
  751. package/sdk/dist/query/query-command-semantics.js.map +1 -0
  752. package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
  753. package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
  754. package/sdk/dist/query/query-dispatch-contract.js +2 -0
  755. package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
  756. package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
  757. package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
  758. package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
  759. package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
  760. package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
  761. package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
  762. package/sdk/dist/query/query-dispatch-formatting.js +6 -0
  763. package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
  764. package/sdk/dist/query/query-dispatch-input-validation.d.ts +6 -0
  765. package/sdk/dist/query/query-dispatch-input-validation.d.ts.map +1 -0
  766. package/sdk/dist/query/query-dispatch-input-validation.js +6 -0
  767. package/sdk/dist/query/query-dispatch-input-validation.js.map +1 -0
  768. package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
  769. package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
  770. package/sdk/dist/query/query-dispatch-observability.js +7 -0
  771. package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
  772. package/sdk/dist/query/query-dispatch-plan.d.ts +6 -0
  773. package/sdk/dist/query/query-dispatch-plan.d.ts.map +1 -0
  774. package/sdk/dist/query/query-dispatch-plan.js +6 -0
  775. package/sdk/dist/query/query-dispatch-plan.js.map +1 -0
  776. package/sdk/dist/query/query-dispatch-result-builder.d.ts +6 -0
  777. package/sdk/dist/query/query-dispatch-result-builder.d.ts.map +1 -0
  778. package/sdk/dist/query/query-dispatch-result-builder.js +6 -0
  779. package/sdk/dist/query/query-dispatch-result-builder.js.map +1 -0
  780. package/sdk/dist/query/query-dispatch.d.ts +48 -0
  781. package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
  782. package/sdk/dist/query/query-dispatch.js +175 -0
  783. package/sdk/dist/query/query-dispatch.js.map +1 -0
  784. package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
  785. package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
  786. package/sdk/dist/query/query-error-details-schema.js +10 -0
  787. package/sdk/dist/query/query-error-details-schema.js.map +1 -0
  788. package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
  789. package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
  790. package/sdk/dist/query/query-error-taxonomy.js +74 -0
  791. package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
  792. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
  793. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
  794. package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
  795. package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
  796. package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
  797. package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
  798. package/sdk/dist/query/query-fallback-executor.js +31 -0
  799. package/sdk/dist/query/query-fallback-executor.js.map +1 -0
  800. package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
  801. package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
  802. package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
  803. package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
  804. package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
  805. package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
  806. package/sdk/dist/query/query-fallback-policy.js +7 -0
  807. package/sdk/dist/query/query-fallback-policy.js.map +1 -0
  808. package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
  809. package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
  810. package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
  811. package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
  812. package/sdk/dist/query/query-policy-capability.d.ts +10 -0
  813. package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
  814. package/sdk/dist/query/query-policy-capability.js +17 -0
  815. package/sdk/dist/query/query-policy-capability.js.map +1 -0
  816. package/sdk/dist/query/query-runtime-context.d.ts +19 -0
  817. package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
  818. package/sdk/dist/query/query-runtime-context.js +31 -0
  819. package/sdk/dist/query/query-runtime-context.js.map +1 -0
  820. package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
  821. package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
  822. package/sdk/dist/query/query-unknown-command-hints.js +6 -0
  823. package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
  824. package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
  825. package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
  826. package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
  827. package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
  828. package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
  829. package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
  830. package/sdk/dist/query/registry-assembly-invariants.js +77 -0
  831. package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
  832. package/sdk/dist/query/registry-assembly.d.ts +10 -0
  833. package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
  834. package/sdk/dist/query/registry-assembly.js +53 -0
  835. package/sdk/dist/query/registry-assembly.js.map +1 -0
  836. package/sdk/dist/query/registry.d.ts +90 -0
  837. package/sdk/dist/query/registry.d.ts.map +1 -0
  838. package/sdk/dist/query/registry.js +129 -0
  839. package/sdk/dist/query/registry.js.map +1 -0
  840. package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
  841. package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
  842. package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
  843. package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
  844. package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
  845. package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
  846. package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
  847. package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
  848. package/sdk/dist/query/roadmap.d.ts +137 -0
  849. package/sdk/dist/query/roadmap.d.ts.map +1 -0
  850. package/sdk/dist/query/roadmap.js +753 -0
  851. package/sdk/dist/query/roadmap.js.map +1 -0
  852. package/sdk/dist/query/route-next-action.d.ts +9 -0
  853. package/sdk/dist/query/route-next-action.d.ts.map +1 -0
  854. package/sdk/dist/query/route-next-action.js +318 -0
  855. package/sdk/dist/query/route-next-action.js.map +1 -0
  856. package/sdk/dist/query/schema-detect.d.ts +21 -0
  857. package/sdk/dist/query/schema-detect.d.ts.map +1 -0
  858. package/sdk/dist/query/schema-detect.js +146 -0
  859. package/sdk/dist/query/schema-detect.js.map +1 -0
  860. package/sdk/dist/query/secrets.d.ts +27 -0
  861. package/sdk/dist/query/secrets.d.ts.map +1 -0
  862. package/sdk/dist/query/secrets.js +42 -0
  863. package/sdk/dist/query/secrets.js.map +1 -0
  864. package/sdk/dist/query/skill-manifest.d.ts +50 -0
  865. package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
  866. package/sdk/dist/query/skill-manifest.js +171 -0
  867. package/sdk/dist/query/skill-manifest.js.map +1 -0
  868. package/sdk/dist/query/skills.d.ts +27 -0
  869. package/sdk/dist/query/skills.d.ts.map +1 -0
  870. package/sdk/dist/query/skills.js +137 -0
  871. package/sdk/dist/query/skills.js.map +1 -0
  872. package/sdk/dist/query/state-document.d.ts +14 -0
  873. package/sdk/dist/query/state-document.d.ts.map +1 -0
  874. package/sdk/dist/query/state-document.js +110 -0
  875. package/sdk/dist/query/state-document.js.map +1 -0
  876. package/sdk/dist/query/state-mutation.d.ts +224 -0
  877. package/sdk/dist/query/state-mutation.d.ts.map +1 -0
  878. package/sdk/dist/query/state-mutation.js +1539 -0
  879. package/sdk/dist/query/state-mutation.js.map +1 -0
  880. package/sdk/dist/query/state-project-load.d.ts +23 -0
  881. package/sdk/dist/query/state-project-load.d.ts.map +1 -0
  882. package/sdk/dist/query/state-project-load.js +75 -0
  883. package/sdk/dist/query/state-project-load.js.map +1 -0
  884. package/sdk/dist/query/state.d.ts +78 -0
  885. package/sdk/dist/query/state.d.ts.map +1 -0
  886. package/sdk/dist/query/state.js +430 -0
  887. package/sdk/dist/query/state.js.map +1 -0
  888. package/sdk/dist/query/summary.d.ts +18 -0
  889. package/sdk/dist/query/summary.d.ts.map +1 -0
  890. package/sdk/dist/query/summary.js +249 -0
  891. package/sdk/dist/query/summary.js.map +1 -0
  892. package/sdk/dist/query/template.d.ts +46 -0
  893. package/sdk/dist/query/template.d.ts.map +1 -0
  894. package/sdk/dist/query/template.js +210 -0
  895. package/sdk/dist/query/template.js.map +1 -0
  896. package/sdk/dist/query/uat.d.ts +34 -0
  897. package/sdk/dist/query/uat.d.ts.map +1 -0
  898. package/sdk/dist/query/uat.js +339 -0
  899. package/sdk/dist/query/uat.js.map +1 -0
  900. package/sdk/dist/query/utils.d.ts +59 -0
  901. package/sdk/dist/query/utils.d.ts.map +1 -0
  902. package/sdk/dist/query/utils.js +74 -0
  903. package/sdk/dist/query/utils.js.map +1 -0
  904. package/sdk/dist/query/validate.d.ts +67 -0
  905. package/sdk/dist/query/validate.d.ts.map +1 -0
  906. package/sdk/dist/query/validate.js +908 -0
  907. package/sdk/dist/query/validate.js.map +1 -0
  908. package/sdk/dist/query/verify.d.ts +110 -0
  909. package/sdk/dist/query/verify.d.ts.map +1 -0
  910. package/sdk/dist/query/verify.js +631 -0
  911. package/sdk/dist/query/verify.js.map +1 -0
  912. package/sdk/dist/query/websearch.d.ts +24 -0
  913. package/sdk/dist/query/websearch.d.ts.map +1 -0
  914. package/sdk/dist/query/websearch.js +68 -0
  915. package/sdk/dist/query/websearch.js.map +1 -0
  916. package/sdk/dist/query/workspace.d.ts +62 -0
  917. package/sdk/dist/query/workspace.d.ts.map +1 -0
  918. package/sdk/dist/query/workspace.js +104 -0
  919. package/sdk/dist/query/workspace.js.map +1 -0
  920. package/sdk/dist/query/workstream-inventory.d.ts +52 -0
  921. package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
  922. package/sdk/dist/query/workstream-inventory.js +141 -0
  923. package/sdk/dist/query/workstream-inventory.js.map +1 -0
  924. package/sdk/dist/query/workstream.d.ts +35 -0
  925. package/sdk/dist/query/workstream.d.ts.map +1 -0
  926. package/sdk/dist/query/workstream.js +298 -0
  927. package/sdk/dist/query/workstream.js.map +1 -0
  928. package/sdk/dist/query/worktree.d.ts +3 -0
  929. package/sdk/dist/query/worktree.d.ts.map +1 -0
  930. package/sdk/dist/query/worktree.js +36 -0
  931. package/sdk/dist/query/worktree.js.map +1 -0
  932. package/sdk/dist/query-command-executor.d.ts +22 -0
  933. package/sdk/dist/query-command-executor.d.ts.map +1 -0
  934. package/sdk/dist/query-command-executor.js +22 -0
  935. package/sdk/dist/query-command-executor.js.map +1 -0
  936. package/sdk/dist/query-execution-policy.d.ts +24 -0
  937. package/sdk/dist/query-execution-policy.d.ts.map +1 -0
  938. package/sdk/dist/query-execution-policy.js +27 -0
  939. package/sdk/dist/query-execution-policy.js.map +1 -0
  940. package/sdk/dist/query-failure-classification.d.ts +9 -0
  941. package/sdk/dist/query-failure-classification.d.ts.map +1 -0
  942. package/sdk/dist/query-failure-classification.js +32 -0
  943. package/sdk/dist/query-failure-classification.js.map +1 -0
  944. package/sdk/dist/query-hotpath-methods.d.ts +19 -0
  945. package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
  946. package/sdk/dist/query-hotpath-methods.js +34 -0
  947. package/sdk/dist/query-hotpath-methods.js.map +1 -0
  948. package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
  949. package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
  950. package/sdk/dist/query-native-direct-adapter.js +52 -0
  951. package/sdk/dist/query-native-direct-adapter.js.map +1 -0
  952. package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
  953. package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
  954. package/sdk/dist/query-native-hotpath-adapter.js +32 -0
  955. package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
  956. package/sdk/dist/query-raw-output-projection.d.ts +6 -0
  957. package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
  958. package/sdk/dist/query-raw-output-projection.js +67 -0
  959. package/sdk/dist/query-raw-output-projection.js.map +1 -0
  960. package/sdk/dist/query-runtime-bridge.d.ts +61 -0
  961. package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
  962. package/sdk/dist/query-runtime-bridge.js +144 -0
  963. package/sdk/dist/query-runtime-bridge.js.map +1 -0
  964. package/sdk/dist/query-sdd-tools-path.d.ts +2 -0
  965. package/sdk/dist/query-sdd-tools-path.d.ts.map +1 -0
  966. package/sdk/dist/query-sdd-tools-path.js +2 -0
  967. package/sdk/dist/query-sdd-tools-path.js.map +1 -0
  968. package/sdk/dist/query-sdd-tools-runtime.d.ts +20 -0
  969. package/sdk/dist/query-sdd-tools-runtime.d.ts.map +1 -0
  970. package/sdk/dist/query-sdd-tools-runtime.js +47 -0
  971. package/sdk/dist/query-sdd-tools-runtime.js.map +1 -0
  972. package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
  973. package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
  974. package/sdk/dist/query-subprocess-adapter.js +92 -0
  975. package/sdk/dist/query-subprocess-adapter.js.map +1 -0
  976. package/sdk/dist/query-tools-error-factory.d.ts +16 -0
  977. package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
  978. package/sdk/dist/query-tools-error-factory.js +33 -0
  979. package/sdk/dist/query-tools-error-factory.js.map +1 -0
  980. package/sdk/dist/research-gate.d.ts +24 -0
  981. package/sdk/dist/research-gate.d.ts.map +1 -0
  982. package/sdk/dist/research-gate.js +70 -0
  983. package/sdk/dist/research-gate.js.map +1 -0
  984. package/sdk/dist/runtime-gate.d.ts +14 -0
  985. package/sdk/dist/runtime-gate.d.ts.map +1 -0
  986. package/sdk/dist/runtime-gate.js +48 -0
  987. package/sdk/dist/runtime-gate.js.map +1 -0
  988. package/sdk/dist/sdd-tools-error.d.ts +23 -0
  989. package/sdk/dist/sdd-tools-error.d.ts.map +1 -0
  990. package/sdk/dist/sdd-tools-error.js +29 -0
  991. package/sdk/dist/sdd-tools-error.js.map +1 -0
  992. package/sdk/dist/sdd-tools.d.ts +97 -0
  993. package/sdk/dist/sdd-tools.d.ts.map +1 -0
  994. package/sdk/dist/sdd-tools.js +168 -0
  995. package/sdk/dist/sdd-tools.js.map +1 -0
  996. package/sdk/dist/sdd-transport-policy.d.ts +10 -0
  997. package/sdk/dist/sdd-transport-policy.d.ts.map +1 -0
  998. package/sdk/dist/sdd-transport-policy.js +32 -0
  999. package/sdk/dist/sdd-transport-policy.js.map +1 -0
  1000. package/sdk/dist/sdd-transport.d.ts +39 -0
  1001. package/sdk/dist/sdd-transport.d.ts.map +1 -0
  1002. package/sdk/dist/sdd-transport.js +78 -0
  1003. package/sdk/dist/sdd-transport.js.map +1 -0
  1004. package/sdk/dist/sdk-package-compatibility.d.ts +38 -0
  1005. package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
  1006. package/sdk/dist/sdk-package-compatibility.js +90 -0
  1007. package/sdk/dist/sdk-package-compatibility.js.map +1 -0
  1008. package/sdk/dist/session-runner.d.ts +40 -0
  1009. package/sdk/dist/session-runner.d.ts.map +1 -0
  1010. package/sdk/dist/session-runner.js +274 -0
  1011. package/sdk/dist/session-runner.js.map +1 -0
  1012. package/sdk/dist/tool-scoping.d.ts +31 -0
  1013. package/sdk/dist/tool-scoping.d.ts.map +1 -0
  1014. package/sdk/dist/tool-scoping.js +54 -0
  1015. package/sdk/dist/tool-scoping.js.map +1 -0
  1016. package/sdk/dist/types.d.ts +794 -0
  1017. package/sdk/dist/types.d.ts.map +1 -0
  1018. package/sdk/dist/types.js +77 -0
  1019. package/sdk/dist/types.js.map +1 -0
  1020. package/sdk/dist/workstream-name-policy.d.ts +13 -0
  1021. package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
  1022. package/sdk/dist/workstream-name-policy.js +24 -0
  1023. package/sdk/dist/workstream-name-policy.js.map +1 -0
  1024. package/sdk/dist/workstream-utils.d.ts +15 -0
  1025. package/sdk/dist/workstream-utils.d.ts.map +1 -0
  1026. package/sdk/dist/workstream-utils.js +21 -0
  1027. package/sdk/dist/workstream-utils.js.map +1 -0
  1028. package/sdk/dist/ws-transport.d.ts +32 -0
  1029. package/sdk/dist/ws-transport.d.ts.map +1 -0
  1030. package/sdk/dist/ws-transport.js +84 -0
  1031. package/sdk/dist/ws-transport.js.map +1 -0
  1032. package/sdk/package-lock.json +2502 -0
  1033. package/sdk/package.json +57 -0
  1034. package/sdk/prompts/templates/project.md +186 -0
  1035. package/sdk/prompts/templates/requirements.md +231 -0
  1036. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  1037. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  1038. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  1039. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  1040. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  1041. package/sdk/prompts/templates/roadmap.md +202 -0
  1042. package/sdk/prompts/templates/state.md +175 -0
  1043. package/sdk/shared/model-catalog.json +122 -0
  1044. package/sdk/src/assembled-prompts.test.ts +349 -0
  1045. package/sdk/src/bug-3591-sddtools-runtime-workstream.test.ts +179 -0
  1046. package/sdk/src/cli-transport.test.ts +388 -0
  1047. package/sdk/src/cli-transport.ts +130 -0
  1048. package/sdk/src/cli.test.ts +426 -0
  1049. package/sdk/src/cli.ts +589 -0
  1050. package/sdk/src/config.test.ts +271 -0
  1051. package/sdk/src/config.ts +218 -0
  1052. package/sdk/src/context-engine.test.ts +295 -0
  1053. package/sdk/src/context-engine.ts +170 -0
  1054. package/sdk/src/context-truncation.test.ts +163 -0
  1055. package/sdk/src/context-truncation.ts +233 -0
  1056. package/sdk/src/e2e.integration.test.ts +181 -0
  1057. package/sdk/src/errors.ts +72 -0
  1058. package/sdk/src/event-stream.test.ts +661 -0
  1059. package/sdk/src/event-stream.ts +441 -0
  1060. package/sdk/src/golden/capture.ts +95 -0
  1061. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  1062. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  1063. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  1064. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  1065. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  1066. package/sdk/src/golden/golden-mutation-covered.ts +17 -0
  1067. package/sdk/src/golden/golden-policy.test.ts +8 -0
  1068. package/sdk/src/golden/golden-policy.ts +120 -0
  1069. package/sdk/src/golden/golden.integration.test.ts +677 -0
  1070. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  1071. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  1072. package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
  1073. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  1074. package/sdk/src/index.ts +352 -0
  1075. package/sdk/src/init-e2e.integration.test.ts +138 -0
  1076. package/sdk/src/init-runner.test.ts +740 -0
  1077. package/sdk/src/init-runner.ts +734 -0
  1078. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  1079. package/sdk/src/logger.test.ts +149 -0
  1080. package/sdk/src/logger.ts +113 -0
  1081. package/sdk/src/milestone-runner.test.ts +421 -0
  1082. package/sdk/src/model-catalog.ts +70 -0
  1083. package/sdk/src/phase-prompt.test.ts +535 -0
  1084. package/sdk/src/phase-prompt.ts +259 -0
  1085. package/sdk/src/phase-runner-types.test.ts +421 -0
  1086. package/sdk/src/phase-runner.integration.test.ts +377 -0
  1087. package/sdk/src/phase-runner.test.ts +2720 -0
  1088. package/sdk/src/phase-runner.ts +1442 -0
  1089. package/sdk/src/plan-parser.test.ts +579 -0
  1090. package/sdk/src/plan-parser.ts +431 -0
  1091. package/sdk/src/planning-journal.test.ts +70 -0
  1092. package/sdk/src/planning-journal.ts +153 -0
  1093. package/sdk/src/planning-runtime.test.ts +29 -0
  1094. package/sdk/src/planning-runtime.ts +100 -0
  1095. package/sdk/src/prompt-builder.test.ts +318 -0
  1096. package/sdk/src/prompt-builder.ts +218 -0
  1097. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  1098. package/sdk/src/prompt-sanitizer.ts +116 -0
  1099. package/sdk/src/query/QUERY-HANDLERS.md +349 -0
  1100. package/sdk/src/query/active-workstream-store.ts +50 -0
  1101. package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
  1102. package/sdk/src/query/agent-failure-classifier.ts +105 -0
  1103. package/sdk/src/query/audit-open.ts +722 -0
  1104. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  1105. package/sdk/src/query/check-auto-mode.ts +49 -0
  1106. package/sdk/src/query/check-completion.test.ts +113 -0
  1107. package/sdk/src/query/check-completion.ts +182 -0
  1108. package/sdk/src/query/check-decision-coverage.test.ts +519 -0
  1109. package/sdk/src/query/check-decision-coverage.ts +554 -0
  1110. package/sdk/src/query/check-gates.test.ts +103 -0
  1111. package/sdk/src/query/check-gates.ts +112 -0
  1112. package/sdk/src/query/check-ship-ready.test.ts +111 -0
  1113. package/sdk/src/query/check-ship-ready.ts +104 -0
  1114. package/sdk/src/query/check-verification-status.test.ts +143 -0
  1115. package/sdk/src/query/check-verification-status.ts +160 -0
  1116. package/sdk/src/query/command-aliases.generated.ts +156 -0
  1117. package/sdk/src/query/command-catalog.ts +31 -0
  1118. package/sdk/src/query/command-definition.test.ts +47 -0
  1119. package/sdk/src/query/command-definition.ts +70 -0
  1120. package/sdk/src/query/command-family-handlers.ts +117 -0
  1121. package/sdk/src/query/command-manifest.init.ts +24 -0
  1122. package/sdk/src/query/command-manifest.non-family.ts +85 -0
  1123. package/sdk/src/query/command-manifest.phase.ts +16 -0
  1124. package/sdk/src/query/command-manifest.phases.ts +11 -0
  1125. package/sdk/src/query/command-manifest.roadmap.ts +11 -0
  1126. package/sdk/src/query/command-manifest.state.ts +31 -0
  1127. package/sdk/src/query/command-manifest.ts +17 -0
  1128. package/sdk/src/query/command-manifest.types.ts +13 -0
  1129. package/sdk/src/query/command-manifest.validate.ts +11 -0
  1130. package/sdk/src/query/command-manifest.verify.ts +15 -0
  1131. package/sdk/src/query/command-resolution.test.ts +70 -0
  1132. package/sdk/src/query/command-seam-coverage.test.ts +118 -0
  1133. package/sdk/src/query/command-static-catalog-domain.ts +117 -0
  1134. package/sdk/src/query/command-static-catalog-foundation.ts +103 -0
  1135. package/sdk/src/query/command-topology.test.ts +28 -0
  1136. package/sdk/src/query/command-topology.ts +114 -0
  1137. package/sdk/src/query/commands-list.test.ts +36 -0
  1138. package/sdk/src/query/commands-list.ts +19 -0
  1139. package/sdk/src/query/commit.test.ts +485 -0
  1140. package/sdk/src/query/commit.ts +383 -0
  1141. package/sdk/src/query/config-gates.test.ts +89 -0
  1142. package/sdk/src/query/config-gates.ts +69 -0
  1143. package/sdk/src/query/config-mutation.test.ts +598 -0
  1144. package/sdk/src/query/config-mutation.ts +575 -0
  1145. package/sdk/src/query/config-query.test.ts +367 -0
  1146. package/sdk/src/query/config-query.ts +244 -0
  1147. package/sdk/src/query/config-schema.ts +159 -0
  1148. package/sdk/src/query/decisions.test.ts +215 -0
  1149. package/sdk/src/query/decisions.ts +192 -0
  1150. package/sdk/src/query/decomposed-handlers.test.ts +431 -0
  1151. package/sdk/src/query/detect-custom-files.test.ts +115 -0
  1152. package/sdk/src/query/detect-custom-files.ts +96 -0
  1153. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  1154. package/sdk/src/query/detect-phase-type.ts +141 -0
  1155. package/sdk/src/query/docs-init.ts +258 -0
  1156. package/sdk/src/query/fallow-audit.ts +88 -0
  1157. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  1158. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  1159. package/sdk/src/query/frontmatter-mutation.ts +343 -0
  1160. package/sdk/src/query/frontmatter.test.ts +326 -0
  1161. package/sdk/src/query/frontmatter.ts +395 -0
  1162. package/sdk/src/query/helpers.test.ts +615 -0
  1163. package/sdk/src/query/helpers.ts +646 -0
  1164. package/sdk/src/query/index-thin-seam.test.ts +16 -0
  1165. package/sdk/src/query/index.ts +9 -0
  1166. package/sdk/src/query/init-complex.test.ts +616 -0
  1167. package/sdk/src/query/init-complex.ts +799 -0
  1168. package/sdk/src/query/init-progress-precedence.test.ts +177 -0
  1169. package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
  1170. package/sdk/src/query/init.test.ts +792 -0
  1171. package/sdk/src/query/init.ts +1262 -0
  1172. package/sdk/src/query/intel.test.ts +90 -0
  1173. package/sdk/src/query/intel.ts +404 -0
  1174. package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
  1175. package/sdk/src/query/mutation-event-decorator.ts +37 -0
  1176. package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
  1177. package/sdk/src/query/mutation-event-mapper.ts +102 -0
  1178. package/sdk/src/query/mvp.test.ts +335 -0
  1179. package/sdk/src/query/mvp.ts +292 -0
  1180. package/sdk/src/query/normalize-query-command.test.ts +102 -0
  1181. package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
  1182. package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
  1183. package/sdk/src/query/phase-lifecycle.test.ts +1750 -0
  1184. package/sdk/src/query/phase-lifecycle.ts +1833 -0
  1185. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  1186. package/sdk/src/query/phase-list-queries.ts +152 -0
  1187. package/sdk/src/query/phase-ready.test.ts +65 -0
  1188. package/sdk/src/query/phase-ready.ts +159 -0
  1189. package/sdk/src/query/phase-roadmap-mutation.ts +77 -0
  1190. package/sdk/src/query/phase.test.ts +651 -0
  1191. package/sdk/src/query/phase.ts +550 -0
  1192. package/sdk/src/query/pipeline.test.ts +169 -0
  1193. package/sdk/src/query/pipeline.ts +243 -0
  1194. package/sdk/src/query/plan-scan.test.ts +35 -0
  1195. package/sdk/src/query/plan-scan.ts +82 -0
  1196. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  1197. package/sdk/src/query/plan-task-structure.ts +63 -0
  1198. package/sdk/src/query/policy-convergence.test.ts +28 -0
  1199. package/sdk/src/query/profile-extract-messages.ts +247 -0
  1200. package/sdk/src/query/profile-output.ts +929 -0
  1201. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  1202. package/sdk/src/query/profile-sample.ts +184 -0
  1203. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  1204. package/sdk/src/query/profile.test.ts +136 -0
  1205. package/sdk/src/query/profile.ts +337 -0
  1206. package/sdk/src/query/progress.test.ts +156 -0
  1207. package/sdk/src/query/progress.ts +566 -0
  1208. package/sdk/src/query/query-cli-adapter.test.ts +79 -0
  1209. package/sdk/src/query/query-cli-adapter.ts +39 -0
  1210. package/sdk/src/query/query-cli-output.test.ts +33 -0
  1211. package/sdk/src/query/query-cli-output.ts +35 -0
  1212. package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
  1213. package/sdk/src/query/query-command-diagnosis.ts +5 -0
  1214. package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
  1215. package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
  1216. package/sdk/src/query/query-command-semantics.test.ts +22 -0
  1217. package/sdk/src/query/query-command-semantics.ts +22 -0
  1218. package/sdk/src/query/query-dispatch-contract.ts +30 -0
  1219. package/sdk/src/query/query-dispatch-error-mapper.test.ts +62 -0
  1220. package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
  1221. package/sdk/src/query/query-dispatch-formatting.test.ts +28 -0
  1222. package/sdk/src/query/query-dispatch-formatting.ts +5 -0
  1223. package/sdk/src/query/query-dispatch-input-validation.test.ts +23 -0
  1224. package/sdk/src/query/query-dispatch-input-validation.ts +5 -0
  1225. package/sdk/src/query/query-dispatch-observability.test.ts +10 -0
  1226. package/sdk/src/query/query-dispatch-observability.ts +6 -0
  1227. package/sdk/src/query/query-dispatch-plan.test.ts +25 -0
  1228. package/sdk/src/query/query-dispatch-plan.ts +5 -0
  1229. package/sdk/src/query/query-dispatch-result-builder.test.ts +16 -0
  1230. package/sdk/src/query/query-dispatch-result-builder.ts +5 -0
  1231. package/sdk/src/query/query-dispatch.test.ts +399 -0
  1232. package/sdk/src/query/query-dispatch.ts +243 -0
  1233. package/sdk/src/query/query-error-details-schema.ts +29 -0
  1234. package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
  1235. package/sdk/src/query/query-error-taxonomy.ts +117 -0
  1236. package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
  1237. package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
  1238. package/sdk/src/query/query-fallback-executor.test.ts +82 -0
  1239. package/sdk/src/query/query-fallback-executor.ts +44 -0
  1240. package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
  1241. package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
  1242. package/sdk/src/query/query-fallback-policy.test.ts +13 -0
  1243. package/sdk/src/query/query-fallback-policy.ts +11 -0
  1244. package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
  1245. package/sdk/src/query/query-policy-capability.test.ts +10 -0
  1246. package/sdk/src/query/query-policy-capability.ts +26 -0
  1247. package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
  1248. package/sdk/src/query/query-registry-capability.test.ts +14 -0
  1249. package/sdk/src/query/query-runtime-context.ts +44 -0
  1250. package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
  1251. package/sdk/src/query/query-unknown-command-hints.ts +5 -0
  1252. package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
  1253. package/sdk/src/query/registry-assembly-invariants.ts +127 -0
  1254. package/sdk/src/query/registry-assembly.test.ts +138 -0
  1255. package/sdk/src/query/registry-assembly.ts +78 -0
  1256. package/sdk/src/query/registry.test.ts +208 -0
  1257. package/sdk/src/query/registry.ts +142 -0
  1258. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  1259. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  1260. package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
  1261. package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
  1262. package/sdk/src/query/roadmap.test.ts +1181 -0
  1263. package/sdk/src/query/roadmap.ts +894 -0
  1264. package/sdk/src/query/route-next-action.test.ts +61 -0
  1265. package/sdk/src/query/route-next-action.ts +345 -0
  1266. package/sdk/src/query/schema-detect.ts +189 -0
  1267. package/sdk/src/query/secrets.test.ts +66 -0
  1268. package/sdk/src/query/secrets.ts +43 -0
  1269. package/sdk/src/query/skill-manifest.test.ts +62 -0
  1270. package/sdk/src/query/skill-manifest.ts +216 -0
  1271. package/sdk/src/query/skills.test.ts +234 -0
  1272. package/sdk/src/query/skills.ts +143 -0
  1273. package/sdk/src/query/state-document.test.ts +197 -0
  1274. package/sdk/src/query/state-document.ts +129 -0
  1275. package/sdk/src/query/state-mutation.test.ts +1198 -0
  1276. package/sdk/src/query/state-mutation.ts +1718 -0
  1277. package/sdk/src/query/state-project-load.ts +80 -0
  1278. package/sdk/src/query/state.test.ts +616 -0
  1279. package/sdk/src/query/state.ts +463 -0
  1280. package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
  1281. package/sdk/src/query/summary.test.ts +95 -0
  1282. package/sdk/src/query/summary.ts +296 -0
  1283. package/sdk/src/query/template.test.ts +180 -0
  1284. package/sdk/src/query/template.ts +242 -0
  1285. package/sdk/src/query/uat.test.ts +77 -0
  1286. package/sdk/src/query/uat.ts +365 -0
  1287. package/sdk/src/query/utils.test.ts +82 -0
  1288. package/sdk/src/query/utils.ts +106 -0
  1289. package/sdk/src/query/validate.test.ts +831 -0
  1290. package/sdk/src/query/validate.ts +952 -0
  1291. package/sdk/src/query/verify.test.ts +414 -0
  1292. package/sdk/src/query/verify.ts +692 -0
  1293. package/sdk/src/query/websearch.test.ts +31 -0
  1294. package/sdk/src/query/websearch.ts +82 -0
  1295. package/sdk/src/query/workspace.test.ts +120 -0
  1296. package/sdk/src/query/workspace.ts +145 -0
  1297. package/sdk/src/query/workstream-inventory.ts +195 -0
  1298. package/sdk/src/query/workstream.test.ts +153 -0
  1299. package/sdk/src/query/workstream.ts +324 -0
  1300. package/sdk/src/query/worktree.ts +39 -0
  1301. package/sdk/src/query-command-executor.ts +31 -0
  1302. package/sdk/src/query-execution-policy.test.ts +52 -0
  1303. package/sdk/src/query-execution-policy.ts +46 -0
  1304. package/sdk/src/query-failure-classification.test.ts +23 -0
  1305. package/sdk/src/query-failure-classification.ts +42 -0
  1306. package/sdk/src/query-hotpath-methods.ts +48 -0
  1307. package/sdk/src/query-native-direct-adapter.test.ts +35 -0
  1308. package/sdk/src/query-native-direct-adapter.ts +70 -0
  1309. package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
  1310. package/sdk/src/query-native-hotpath-adapter.ts +45 -0
  1311. package/sdk/src/query-raw-output-projection.test.ts +39 -0
  1312. package/sdk/src/query-raw-output-projection.ts +74 -0
  1313. package/sdk/src/query-runtime-bridge.test.ts +150 -0
  1314. package/sdk/src/query-runtime-bridge.ts +215 -0
  1315. package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
  1316. package/sdk/src/query-sdd-tools-path.ts +1 -0
  1317. package/sdk/src/query-sdd-tools-runtime.ts +89 -0
  1318. package/sdk/src/query-subprocess-adapter.test.ts +84 -0
  1319. package/sdk/src/query-subprocess-adapter.ts +146 -0
  1320. package/sdk/src/query-tools-error-factory.test.ts +35 -0
  1321. package/sdk/src/query-tools-error-factory.ts +76 -0
  1322. package/sdk/src/research-gate.test.ts +190 -0
  1323. package/sdk/src/research-gate.ts +94 -0
  1324. package/sdk/src/runtime-bridge-options.test.ts +33 -0
  1325. package/sdk/src/runtime-gate.test.ts +84 -0
  1326. package/sdk/src/runtime-gate.ts +52 -0
  1327. package/sdk/src/sdd-tools-error.test.ts +21 -0
  1328. package/sdk/src/sdd-tools-error.ts +65 -0
  1329. package/sdk/src/sdd-tools.test.ts +472 -0
  1330. package/sdk/src/sdd-tools.ts +237 -0
  1331. package/sdk/src/sdd-transport-policy.test.ts +34 -0
  1332. package/sdk/src/sdd-transport-policy.ts +48 -0
  1333. package/sdk/src/sdd-transport.test.ts +292 -0
  1334. package/sdk/src/sdd-transport.ts +117 -0
  1335. package/sdk/src/sdk-package-compatibility.test.ts +97 -0
  1336. package/sdk/src/sdk-package-compatibility.ts +141 -0
  1337. package/sdk/src/session-runner.test.ts +164 -0
  1338. package/sdk/src/session-runner.ts +327 -0
  1339. package/sdk/src/tool-scoping.test.ts +160 -0
  1340. package/sdk/src/tool-scoping.ts +61 -0
  1341. package/sdk/src/types.ts +927 -0
  1342. package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
  1343. package/sdk/src/workstream-name-policy.ts +24 -0
  1344. package/sdk/src/workstream-utils.ts +21 -0
  1345. package/sdk/src/ws-flag.test.ts +285 -0
  1346. package/sdk/src/ws-transport.test.ts +161 -0
  1347. package/sdk/src/ws-transport.ts +93 -0
  1348. package/sdk/tsconfig.json +20 -0
  1349. package/commands/sdd/add-backlog.md +0 -76
  1350. package/commands/sdd/add-phase.md +0 -43
  1351. package/commands/sdd/add-todo.md +0 -47
  1352. package/commands/sdd/analyze-dependencies.md +0 -34
  1353. package/commands/sdd/check-todos.md +0 -45
  1354. package/commands/sdd/code-review-fix.md +0 -52
  1355. package/commands/sdd/do.md +0 -30
  1356. package/commands/sdd/from-sdd2.md +0 -45
  1357. package/commands/sdd/insert-phase.md +0 -32
  1358. package/commands/sdd/intel.md +0 -179
  1359. package/commands/sdd/join-discord.md +0 -19
  1360. package/commands/sdd/list-phase-assumptions.md +0 -46
  1361. package/commands/sdd/list-workspaces.md +0 -19
  1362. package/commands/sdd/new-workspace.md +0 -44
  1363. package/commands/sdd/next.md +0 -26
  1364. package/commands/sdd/note.md +0 -34
  1365. package/commands/sdd/plan-milestone-gaps.md +0 -34
  1366. package/commands/sdd/plant-seed.md +0 -28
  1367. package/commands/sdd/remove-phase.md +0 -31
  1368. package/commands/sdd/remove-workspace.md +0 -26
  1369. package/commands/sdd/research-phase.md +0 -195
  1370. package/commands/sdd/scan.md +0 -26
  1371. package/commands/sdd/session-report.md +0 -19
  1372. package/commands/sdd/set-profile.md +0 -12
  1373. package/scripts/sync-upstream.sh +0 -56
  1374. package/sdd/workflows/research-phase.md +0 -82
@@ -4,10 +4,64 @@
4
4
 
5
5
  const fs = require('fs');
6
6
  const path = require('path');
7
- const { escapeRegex, loadConfig, normalizePhaseName, comparePhaseNum, findPhaseInternal, getArchivedPhaseDirs, generateSlugInternal, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, replaceInCurrentMilestone, toPosixPath, planningDir, withPlanningLock, output, error, readSubdirectories, phaseTokenMatches } = require('./core.cjs');
7
+ const { escapeRegex, loadConfig, normalizePhaseName, phaseMarkdownRegexSource, comparePhaseNum, findPhaseInternal, getArchivedPhaseDirs, generateSlugInternal, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, replaceInCurrentMilestone, toPosixPath, output, error, readSubdirectories, phaseTokenMatches, ERROR_REASON } = require('./core.cjs');
8
+ const { platformWriteSync, platformReadSync, platformEnsureDir } = require('./shell-command-projection.cjs');
9
+ const { planningDir, withPlanningLock } = require('./planning-workspace.cjs');
8
10
  const { extractFrontmatter } = require('./frontmatter.cjs');
9
11
  const { writeStateMd, readModifyWriteStateMd, stateExtractField, stateReplaceField, stateReplaceFieldWithFallback, updatePerformanceMetricsSection } = require('./state.cjs');
10
12
 
13
+ // #2893 — strict canonical filter: `{padded_phase}-{NN}-PLAN.md` or `PLAN.md`.
14
+ // Documented in agents/sdd-planner.md (write_phase_prompt step). The wider
15
+ // "looks like a plan but isn't canonical" probe below is used to surface a
16
+ // loud warning instead of silently returning zero plans.
17
+ const isCanonicalPlanFile = (f) => f.endsWith('-PLAN.md') || f === 'PLAN.md';
18
+
19
+ // Any .md file with PLAN anywhere in the basename — the diagnostic net for
20
+ // catching agent deviations like `01-PLAN-01-foundation.md` (#2893).
21
+ // Excludes derivative files (`-PLAN-OUTLINE.md`, `*.pre-bounce.md`, etc.) that
22
+ // the planner legitimately produces alongside canonical plans.
23
+ const PLAN_OUTLINE_RE = /-PLAN-OUTLINE\.md$/i;
24
+ const PLAN_PRE_BOUNCE_RE = /-PLAN.*\.pre-bounce\.md$/i;
25
+ const looksLikePlanFile = (f) =>
26
+ /\.md$/i.test(f)
27
+ && /PLAN/i.test(f)
28
+ && !PLAN_OUTLINE_RE.test(f)
29
+ && !PLAN_PRE_BOUNCE_RE.test(f);
30
+
31
+ /**
32
+ * Detect plan-shaped files that the canonical filter would reject. Returns
33
+ * a warning string when offenders exist, else null. Centralised so every
34
+ * read site (phase-plan-index, phases list --type plans, find-phase) emits
35
+ * the same message.
36
+ *
37
+ * @param {string[]} dirFiles — readdirSync output for one phase directory
38
+ * @param {string[]} matchedFiles — what the canonical filter accepted
39
+ * @returns {string|null}
40
+ */
41
+ function describeNonCanonicalPlans(dirFiles, matchedFiles) {
42
+ const matched = new Set(matchedFiles);
43
+ const offenders = dirFiles.filter((f) => looksLikePlanFile(f) && !matched.has(f));
44
+ if (offenders.length === 0) return null;
45
+ return (
46
+ `Found ${offenders.length} plan-shaped file(s) in this phase that don't match the canonical ` +
47
+ `naming convention "{padded_phase}-{NN}-PLAN.md" (or bare "PLAN.md") and were skipped: ` +
48
+ offenders.map((f) => `"${f}"`).join(', ') +
49
+ `. Rename to the canonical form (e.g. "01-01-PLAN.md") so the executor can detect them. ` +
50
+ `See agents/sdd-planner.md write_phase_prompt step for the full contract.`
51
+ );
52
+ }
53
+
54
+ function extractCanonicalPlanId(filename) {
55
+ const base = filename.replace(/-PLAN\.md$/i, '').replace(/-SUMMARY\.md$/i, '').replace(/\.md$/i, '');
56
+ const parts = base.split('-').filter(Boolean);
57
+ const tokenRe = /^\d+[A-Z]?(?:\.\d+)*$/i;
58
+ const phaseIdx = parts.findIndex(p => tokenRe.test(p));
59
+ if (phaseIdx >= 0 && phaseIdx + 1 < parts.length && tokenRe.test(parts[phaseIdx + 1])) {
60
+ return `${parts[phaseIdx]}-${parts[phaseIdx + 1]}`;
61
+ }
62
+ return base;
63
+ }
64
+
11
65
  function cmdPhasesList(cwd, options, raw) {
12
66
  const phasesDir = path.join(planningDir(cwd), 'phases');
13
67
  const { type, phase, includeArchived } = options;
@@ -52,13 +106,18 @@ function cmdPhasesList(cwd, options, raw) {
52
106
  // If listing files of a specific type
53
107
  if (type) {
54
108
  const files = [];
109
+ const warnings = [];
55
110
  for (const dir of dirs) {
56
111
  const dirPath = path.join(phasesDir, dir);
57
112
  const dirFiles = fs.readdirSync(dirPath);
58
113
 
59
114
  let filtered;
60
115
  if (type === 'plans') {
61
- filtered = dirFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
116
+ filtered = dirFiles.filter(isCanonicalPlanFile);
117
+ // #2893 — surface plan-shaped files the canonical filter rejected
118
+ // so callers (executor init, etc.) don't silently see zero plans.
119
+ const w = describeNonCanonicalPlans(dirFiles, filtered);
120
+ if (w) warnings.push(`${dir}: ${w}`);
62
121
  } else if (type === 'summaries') {
63
122
  filtered = dirFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
64
123
  } else {
@@ -73,6 +132,7 @@ function cmdPhasesList(cwd, options, raw) {
73
132
  count: files.length,
74
133
  phase_dir: phase ? dirs[0].replace(/^\d+(?:\.\d+)*-?/, '') : null,
75
134
  };
135
+ if (warnings.length) result.warning = warnings.join(' | ');
76
136
  output(result, raw, files.join('\n'));
77
137
  return;
78
138
  }
@@ -110,8 +170,10 @@ function cmdPhaseNextDecimal(cwd, basePhase, raw) {
110
170
  if (fs.existsSync(roadmapPath)) {
111
171
  try {
112
172
  const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
173
+ // #3537: padding-tolerant on both sides — `0*${escapeRegex(...)}`
174
+ // tolerated extra padding but not missing.
113
175
  const phasePattern = new RegExp(
114
- `#{2,4}\\s*Phase\\s+0*${escapeRegex(normalized)}\\.(\\d+)\\s*:`, 'gi'
176
+ `#{2,4}\\s*Phase\\s+${phaseMarkdownRegexSource(normalized)}\\.(\\d+)\\s*:`, 'gi'
115
177
  );
116
178
  let pm;
117
179
  while ((pm = phasePattern.exec(roadmapContent)) !== null) {
@@ -148,50 +210,128 @@ function cmdPhaseNextDecimal(cwd, basePhase, raw) {
148
210
  }
149
211
  }
150
212
 
213
+ function getRoadmapModeForPhase(cwd, phaseNum) {
214
+ const roadmapPath = path.join(planningDir(cwd), 'ROADMAP.md');
215
+ if (!fs.existsSync(roadmapPath)) return null;
216
+
217
+ const rawContent = fs.readFileSync(roadmapPath, 'utf-8');
218
+ const milestoneContent = extractCurrentMilestone(rawContent, cwd);
219
+ const fullContent = stripShippedMilestones(rawContent);
220
+ const escapedPhase = phaseMarkdownRegexSource(phaseNum);
221
+ const phaseHeader = new RegExp(`#{2,4}\\s*Phase\\s+${escapedPhase}\\s*:`, 'i');
222
+
223
+ for (const content of [milestoneContent, fullContent]) {
224
+ const headerMatch = content.match(phaseHeader);
225
+ if (!headerMatch || headerMatch.index === undefined) continue;
226
+
227
+ const sectionStart = headerMatch.index;
228
+ const rest = content.slice(sectionStart);
229
+ const nextHeader = rest.slice(headerMatch[0].length).match(/\n#{2,4}\s+Phase\s+\S/i);
230
+ const sectionEnd = nextHeader ? sectionStart + headerMatch[0].length + nextHeader.index : content.length;
231
+ const section = content.slice(sectionStart, sectionEnd);
232
+ const modeMatch = section.match(/\*\*Mode(?::\*\*|\*\*:)\s*([^\n]+)/i);
233
+ if (modeMatch) return modeMatch[1].trim().toLowerCase();
234
+ }
235
+
236
+ return null;
237
+ }
238
+
239
+ function cmdPhaseMvpMode(cwd, args, raw) {
240
+ const phaseNum = args[0];
241
+ if (!phaseNum) {
242
+ error('Usage: phase.mvp-mode <phase-number> [--cli-flag]', ERROR_REASON.USAGE);
243
+ }
244
+
245
+ const cliFlagPresent = args.includes('--cli-flag');
246
+ const roadmapMode = getRoadmapModeForPhase(cwd, phaseNum);
247
+ const config = loadConfig(cwd);
248
+ const configMvpMode = Boolean(config.mvp_mode);
249
+
250
+ let active = false;
251
+ let source = 'none';
252
+ if (cliFlagPresent) {
253
+ active = true;
254
+ source = 'cli_flag';
255
+ } else if (roadmapMode === 'mvp') {
256
+ active = true;
257
+ source = 'roadmap';
258
+ } else if (configMvpMode) {
259
+ active = true;
260
+ source = 'config';
261
+ }
262
+
263
+ output({
264
+ active,
265
+ source,
266
+ roadmap_mode: roadmapMode,
267
+ config_mvp_mode: configMvpMode,
268
+ cli_flag_present: cliFlagPresent,
269
+ }, raw);
270
+ }
271
+
151
272
  function cmdFindPhase(cwd, phase, raw) {
152
273
  if (!phase) {
153
274
  error('phase identifier required');
154
275
  }
155
276
 
156
- const phasesDir = path.join(planningDir(cwd), 'phases');
277
+ const planBase = planningDir(cwd);
157
278
  const normalized = normalizePhaseName(phase);
279
+ const notFound = { found: false, directory: null, phase_number: null, phase_name: null, plans: [], summaries: [], searched_directories: [] };
158
280
 
159
- const notFound = { found: false, directory: null, phase_number: null, phase_name: null, plans: [], summaries: [] };
160
-
281
+ // Build candidate search dirs: flat layout first, then milestone-archive layout.
282
+ const searchDirs = [];
283
+ const flatPhasesDir = path.join(planBase, 'phases');
284
+ if (fs.existsSync(flatPhasesDir)) searchDirs.push(flatPhasesDir);
161
285
  try {
162
- const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
163
- const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort((a, b) => comparePhaseNum(a, b));
164
-
165
- const match = dirs.find(d => phaseTokenMatches(d, normalized));
166
- if (!match) {
167
- output(notFound, raw, '');
168
- return;
286
+ const milestonesDir = path.join(planBase, 'milestones');
287
+ const entries = fs.readdirSync(milestonesDir, { withFileTypes: true })
288
+ .filter(e => e.isDirectory() && /^v\d+.*-phases$/.test(e.name))
289
+ .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));
290
+ for (const e of entries) {
291
+ searchDirs.push(path.join(milestonesDir, e.name));
169
292
  }
293
+ } catch { /* no milestones dir */ }
170
294
 
171
- // Extract phase number — supports project-code-prefixed (CK-01-name), numeric (01-name), and custom IDs
172
- const dirMatch = match.match(/^(?:[A-Z]{1,6}-)(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)
173
- || match.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);
174
- const phaseNumber = dirMatch ? dirMatch[1] : normalized;
175
- const phaseName = dirMatch && dirMatch[2] ? dirMatch[2] : null;
176
-
177
- const phaseDir = path.join(phasesDir, match);
178
- const phaseFiles = fs.readdirSync(phaseDir);
179
- const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md').sort();
180
- const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md').sort();
181
-
182
- const result = {
183
- found: true,
184
- directory: toPosixPath(path.join(path.relative(cwd, planningDir(cwd)), 'phases', match)),
185
- phase_number: phaseNumber,
186
- phase_name: phaseName,
187
- plans,
188
- summaries,
189
- };
295
+ notFound.searched_directories = searchDirs.map((searchDir) =>
296
+ toPosixPath(path.join(path.relative(cwd, planBase), path.relative(planBase, searchDir))));
190
297
 
191
- output(result, raw, result.directory);
192
- } catch {
193
- output(notFound, raw, '');
298
+ for (const searchDir of searchDirs) {
299
+ try {
300
+ const entries = fs.readdirSync(searchDir, { withFileTypes: true });
301
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort((a, b) => comparePhaseNum(a, b));
302
+
303
+ const match = dirs.find(d => phaseTokenMatches(d, normalized));
304
+ if (!match) continue;
305
+
306
+ // Extract phase number — supports project-code-prefixed (CK-01-name), numeric (01-name), and custom IDs
307
+ const dirMatch = match.match(/^(?:[A-Z]{1,6}-)(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)
308
+ || match.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);
309
+ const phaseNumber = dirMatch ? dirMatch[1] : normalized;
310
+ const phaseName = dirMatch && dirMatch[2] ? dirMatch[2] : null;
311
+
312
+ const phaseDir = path.join(searchDir, match);
313
+ const phaseFiles = fs.readdirSync(phaseDir);
314
+ const plans = phaseFiles.filter(isCanonicalPlanFile).sort();
315
+ const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md').sort();
316
+ // #2893 — same diagnostic as phase-plan-index for consistency.
317
+ const planNamingWarning = describeNonCanonicalPlans(phaseFiles, plans);
318
+
319
+ const result = {
320
+ found: true,
321
+ directory: toPosixPath(path.join(path.relative(cwd, planBase), path.relative(planBase, searchDir), match)),
322
+ phase_number: phaseNumber,
323
+ phase_name: phaseName,
324
+ plans,
325
+ summaries,
326
+ };
327
+ if (planNamingWarning) result.warning = planNamingWarning;
328
+
329
+ output(result, raw, result.directory);
330
+ return;
331
+ } catch { continue; }
194
332
  }
333
+
334
+ output(notFound, raw, '');
195
335
  }
196
336
 
197
337
  function extractObjective(content) {
@@ -229,18 +369,24 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
229
369
 
230
370
  // Get all files in phase directory
231
371
  const phaseFiles = fs.readdirSync(phaseDir);
232
- const planFiles = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md').sort();
372
+ const planFiles = phaseFiles.filter(isCanonicalPlanFile).sort();
233
373
  const summaryFiles = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
374
+ // #2893 — surface plan-shaped files the canonical filter rejected so a
375
+ // misnamed plan never silently produces plan_count: 0 at executor init.
376
+ const planNamingWarning = describeNonCanonicalPlans(phaseFiles, planFiles);
234
377
 
235
378
  // Build set of plan IDs with summaries
236
379
  const completedPlanIds = new Set(
237
- summaryFiles.map(s => s.replace('-SUMMARY.md', '').replace('SUMMARY.md', ''))
380
+ summaryFiles.flatMap(s => {
381
+ const exact = s.replace('-SUMMARY.md', '').replace('SUMMARY.md', '');
382
+ const canonical = extractCanonicalPlanId(s);
383
+ return canonical === exact ? [exact] : [exact, canonical];
384
+ })
238
385
  );
239
386
 
240
- const plans = [];
241
- const waves = {};
242
- const incomplete = [];
243
- let hasCheckpoints = false;
387
+ // ── Pass 1: parse each plan file ─────────────────────────────────────────
388
+
389
+ const rawPlans = [];
244
390
 
245
391
  for (const planFile of planFiles) {
246
392
  const planId = planFile.replace('-PLAN.md', '').replace('PLAN.md', '');
@@ -253,8 +399,20 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
253
399
  const mdTasks = content.match(/##\s*Task\s*\d+/gi) || [];
254
400
  const taskCount = xmlTasks.length || mdTasks.length;
255
401
 
256
- // Parse wave as integer
257
- const wave = parseInt(fm.wave, 10) || 1;
402
+ // Parse wave as integer — use nullish handling so wave: 0 is preserved.
403
+ // parseInt returns NaN for missing/non-numeric values; fall back to null
404
+ // (meaning "no declared wave") so downstream can apply the topo default.
405
+ const parsedWave = parseInt(fm.wave, 10);
406
+ const declaredWave = Number.isNaN(parsedWave) ? null : parsedWave;
407
+
408
+ // Parse depends_on — normalise to string[]
409
+ let dependsOn = [];
410
+ const fmDeps = fm['depends_on'];
411
+ if (Array.isArray(fmDeps)) {
412
+ dependsOn = fmDeps.map(String);
413
+ } else if (typeof fmDeps === 'string' && fmDeps.trim() !== '') {
414
+ dependsOn = [fmDeps];
415
+ }
258
416
 
259
417
  // Parse autonomous (default true if not specified)
260
418
  let autonomous = true;
@@ -262,10 +420,6 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
262
420
  autonomous = fm.autonomous === 'true' || fm.autonomous === true;
263
421
  }
264
422
 
265
- if (!autonomous) {
266
- hasCheckpoints = true;
267
- }
268
-
269
423
  // Parse files_modified (underscore is canonical; also accept hyphenated for compat)
270
424
  let filesModified = [];
271
425
  const fmFiles = fm['files_modified'] || fm['files-modified'];
@@ -273,29 +427,130 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
273
427
  filesModified = Array.isArray(fmFiles) ? fmFiles : [fmFiles];
274
428
  }
275
429
 
276
- const hasSummary = completedPlanIds.has(planId);
277
- if (!hasSummary) {
278
- incomplete.push(planId);
279
- }
430
+ const hasSummary = completedPlanIds.has(planId) || completedPlanIds.has(extractCanonicalPlanId(planFile));
280
431
 
281
- const plan = {
432
+ rawPlans.push({
282
433
  id: planId,
283
- wave,
434
+ declaredWave,
435
+ dependsOn,
284
436
  autonomous,
285
437
  objective: extractObjective(content) || fm.objective || null,
286
- files_modified: filesModified,
287
- task_count: taskCount,
288
- has_summary: hasSummary,
438
+ filesModified,
439
+ taskCount,
440
+ hasSummary,
441
+ });
442
+ }
443
+
444
+ // ── Pass 2: topological level assignment via depends_on DAG ──────────────
445
+
446
+ // Build a map from plan ID → raw plan for fast lookup.
447
+ // Deps that reference plans outside this phase are treated as external and ignored.
448
+ const planMap = new Map(rawPlans.map(p => [p.id, p]));
449
+ // Secondary index: canonical prefix → full plan ID, so depends_on: ['03-01'] resolves
450
+ // to '03-01-auth-hardening-PLAN.md'-derived ID '03-01-auth-hardening' (k015).
451
+ const canonicalToId = new Map(rawPlans.map(p => [extractCanonicalPlanId(p.id), p.id]));
452
+
453
+ // Kahn's algorithm — compute in-degree and adjacency for in-phase deps only.
454
+ const level = new Map();
455
+ const inDeg = new Map();
456
+ const adj = new Map();
457
+
458
+ for (const p of rawPlans) {
459
+ if (!inDeg.has(p.id)) inDeg.set(p.id, 0);
460
+ if (!adj.has(p.id)) adj.set(p.id, []);
461
+ for (const dep of p.dependsOn) {
462
+ // Accept both full-stem ('03-01-auth-hardening') and canonical-prefix ('03-01') forms.
463
+ const resolvedDep = planMap.has(dep) ? dep : canonicalToId.get(dep);
464
+ if (!resolvedDep) continue; // external dep — ignore
465
+ if (!adj.has(resolvedDep)) adj.set(resolvedDep, []);
466
+ adj.get(resolvedDep).push(p.id);
467
+ inDeg.set(p.id, (inDeg.get(p.id) ?? 0) + 1);
468
+ }
469
+ }
470
+
471
+ // Start with nodes that have no in-phase dependencies.
472
+ const queue = [];
473
+ for (const p of rawPlans) {
474
+ if ((inDeg.get(p.id) ?? 0) === 0) {
475
+ queue.push(p.id);
476
+ level.set(p.id, 0);
477
+ }
478
+ }
479
+
480
+ let visited = 0;
481
+ while (queue.length > 0) {
482
+ const cur = queue.shift();
483
+ visited++;
484
+ const curLevel = level.get(cur);
485
+ for (const dep of (adj.get(cur) ?? [])) {
486
+ const newLevel = curLevel + 1;
487
+ if (newLevel > (level.get(dep) ?? -1)) {
488
+ level.set(dep, newLevel);
489
+ }
490
+ inDeg.set(dep, inDeg.get(dep) - 1);
491
+ if (inDeg.get(dep) === 0) {
492
+ queue.push(dep);
493
+ }
494
+ }
495
+ }
496
+
497
+ // Cycle detection — any node not visited has a cycle.
498
+ if (visited < rawPlans.length) {
499
+ const cycleNodes = rawPlans.filter(p => !level.has(p.id)).map(p => p.id);
500
+ error(`depends_on cycle detected in phase ${normalized} — cycle involves: ${cycleNodes.join(', ')}`);
501
+ return;
502
+ }
503
+
504
+ // ── Pass 3: determine lowest bucket key and build output ─────────────────
505
+
506
+ // If any plan has declared wave: 0, the lowest level maps to "0"; otherwise "1".
507
+ const anyWaveZero = rawPlans.some(p => p.declaredWave === 0);
508
+ const levelOffset = anyWaveZero ? 0 : 1;
509
+
510
+ const plans = [];
511
+ const waves = {};
512
+ const incomplete = [];
513
+ let hasCheckpoints = false;
514
+ const warnings = [];
515
+
516
+ for (const raw of rawPlans) {
517
+ if (!raw.autonomous) {
518
+ hasCheckpoints = true;
519
+ }
520
+ if (!raw.hasSummary) {
521
+ incomplete.push(raw.id);
522
+ }
523
+
524
+ // Computed wave = topological level + offset (so lowest level → 0 or 1).
525
+ const computedWave = (level.get(raw.id) ?? 0) + levelOffset;
526
+
527
+ // The effective wave used for bucketing is always the computed topo level.
528
+ // If the plan declared a wave that disagrees, emit a non-fatal warning.
529
+ const effectiveWave = computedWave;
530
+ if (raw.declaredWave !== null && raw.declaredWave !== computedWave) {
531
+ warnings.push(
532
+ `Plan ${raw.id}: declared wave: ${raw.declaredWave} but depends_on DAG places it in wave ${computedWave}`,
533
+ );
534
+ }
535
+
536
+ const plan = {
537
+ id: raw.id,
538
+ wave: effectiveWave,
539
+ depends_on: raw.dependsOn,
540
+ autonomous: raw.autonomous,
541
+ objective: raw.objective,
542
+ files_modified: raw.filesModified,
543
+ task_count: raw.taskCount,
544
+ has_summary: raw.hasSummary,
289
545
  };
290
546
 
291
547
  plans.push(plan);
292
548
 
293
- // Group by wave
294
- const waveKey = String(wave);
549
+ const waveKey = String(effectiveWave);
295
550
  if (!waves[waveKey]) {
296
551
  waves[waveKey] = [];
297
552
  }
298
- waves[waveKey].push(planId);
553
+ waves[waveKey].push(raw.id);
299
554
  }
300
555
 
301
556
  const result = {
@@ -305,6 +560,8 @@ function cmdPhasePlanIndex(cwd, phase, raw) {
305
560
  incomplete,
306
561
  has_checkpoints: hasCheckpoints,
307
562
  };
563
+ if (planNamingWarning) result.warning = planNamingWarning;
564
+ if (warnings.length > 0) result.warnings = warnings;
308
565
 
309
566
  output(result, raw);
310
567
  }
@@ -376,12 +633,12 @@ function cmdPhaseAdd(cwd, description, raw, customId) {
376
633
  const dirPath = path.join(planningDir(cwd), 'phases', _dirName);
377
634
 
378
635
  // Create directory with .gitkeep so git tracks empty folders
379
- fs.mkdirSync(dirPath, { recursive: true });
380
- fs.writeFileSync(path.join(dirPath, '.gitkeep'), '');
636
+ platformEnsureDir(dirPath);
637
+ platformWriteSync(path.join(dirPath, '.gitkeep'), '');
381
638
 
382
639
  // Build phase entry
383
640
  const dependsOn = config.phase_naming === 'custom' ? '' : `\n**Depends on:** Phase ${typeof _newPhaseId === 'number' ? _newPhaseId - 1 : 'TBD'}`;
384
- const phaseEntry = `\n### Phase ${_newPhaseId}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD${dependsOn}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd-plan-phase ${_newPhaseId} to break down)\n`;
641
+ const phaseEntry = `\n### Phase ${_newPhaseId}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD${dependsOn}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd:plan-phase ${_newPhaseId} to break down)\n`;
385
642
 
386
643
  // Find insertion point: before last "---" or at end
387
644
  let updatedContent;
@@ -392,7 +649,7 @@ function cmdPhaseAdd(cwd, description, raw, customId) {
392
649
  updatedContent = rawContent + phaseEntry;
393
650
  }
394
651
 
395
- fs.writeFileSync(roadmapPath, updatedContent, 'utf-8');
652
+ platformWriteSync(roadmapPath, updatedContent);
396
653
  return { newPhaseId: _newPhaseId, dirName: _dirName };
397
654
  });
398
655
 
@@ -408,6 +665,76 @@ function cmdPhaseAdd(cwd, description, raw, customId) {
408
665
  output(result, raw, result.padded);
409
666
  }
410
667
 
668
+ function cmdPhaseAddBatch(cwd, descriptions, raw) {
669
+ if (!Array.isArray(descriptions) || descriptions.length === 0) {
670
+ error('descriptions array required for phase add-batch');
671
+ }
672
+ const config = loadConfig(cwd);
673
+ const roadmapPath = path.join(planningDir(cwd), 'ROADMAP.md');
674
+ if (!fs.existsSync(roadmapPath)) { error('ROADMAP.md not found'); }
675
+ const projectCode = config.project_code || '';
676
+ const prefix = projectCode ? `${projectCode}-` : '';
677
+
678
+ const results = withPlanningLock(cwd, () => {
679
+ let rawContent = fs.readFileSync(roadmapPath, 'utf-8');
680
+ const content = extractCurrentMilestone(rawContent, cwd);
681
+ let maxPhase = 0;
682
+ if (config.phase_naming !== 'custom') {
683
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi;
684
+ let m;
685
+ while ((m = phasePattern.exec(content)) !== null) {
686
+ const num = parseInt(m[1], 10);
687
+ if (num >= 999) continue;
688
+ if (num > maxPhase) maxPhase = num;
689
+ }
690
+ const phasesOnDisk = path.join(planningDir(cwd), 'phases');
691
+ if (fs.existsSync(phasesOnDisk)) {
692
+ const dirNumPattern = /^(?:[A-Z][A-Z0-9]*-)?(\d+)-/;
693
+ for (const entry of fs.readdirSync(phasesOnDisk)) {
694
+ const match = entry.match(dirNumPattern);
695
+ if (!match) continue;
696
+ const num = parseInt(match[1], 10);
697
+ if (num >= 999) continue;
698
+ if (num > maxPhase) maxPhase = num;
699
+ }
700
+ }
701
+ }
702
+ const added = [];
703
+ for (const description of descriptions) {
704
+ const slug = generateSlugInternal(description);
705
+ let newPhaseId, dirName;
706
+ if (config.phase_naming === 'custom') {
707
+ newPhaseId = slug.toUpperCase().replace(/-/g, '-');
708
+ dirName = `${prefix}${newPhaseId}-${slug}`;
709
+ } else {
710
+ maxPhase += 1;
711
+ newPhaseId = maxPhase;
712
+ dirName = `${prefix}${String(newPhaseId).padStart(2, '0')}-${slug}`;
713
+ }
714
+ const dirPath = path.join(planningDir(cwd), 'phases', dirName);
715
+ platformEnsureDir(dirPath);
716
+ platformWriteSync(path.join(dirPath, '.gitkeep'), '');
717
+ const dependsOn = config.phase_naming === 'custom' ? '' : `\n**Depends on:** Phase ${typeof newPhaseId === 'number' ? newPhaseId - 1 : 'TBD'}`;
718
+ const phaseEntry = `\n### Phase ${newPhaseId}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD${dependsOn}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd:plan-phase ${newPhaseId} to break down)\n`;
719
+ const lastSeparator = rawContent.lastIndexOf('\n---');
720
+ rawContent = lastSeparator > 0
721
+ ? rawContent.slice(0, lastSeparator) + phaseEntry + rawContent.slice(lastSeparator)
722
+ : rawContent + phaseEntry;
723
+ added.push({
724
+ phase_number: typeof newPhaseId === 'number' ? newPhaseId : String(newPhaseId),
725
+ padded: typeof newPhaseId === 'number' ? String(newPhaseId).padStart(2, '0') : String(newPhaseId),
726
+ name: description,
727
+ slug,
728
+ directory: toPosixPath(path.join(path.relative(cwd, planningDir(cwd)), 'phases', dirName)),
729
+ naming_mode: config.phase_naming,
730
+ });
731
+ }
732
+ platformWriteSync(roadmapPath, rawContent);
733
+ return added;
734
+ });
735
+ output({ phases: results, count: results.length }, raw);
736
+ }
737
+
411
738
  function cmdPhaseInsert(cwd, afterPhase, description, raw) {
412
739
  if (!afterPhase || !description) {
413
740
  error('after-phase and description required for phase insert');
@@ -425,12 +752,17 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
425
752
  const rawContent = fs.readFileSync(roadmapPath, 'utf-8');
426
753
  const content = extractCurrentMilestone(rawContent, cwd);
427
754
 
428
- // Normalize input then strip leading zeros for flexible matching
755
+ // Normalize input then route through canonical padding-tolerant fragment
756
+ // (#3537). The prior hand-rolled `0*${unpadded}` worked for the integer
757
+ // base but duplicated logic — funnel it through the shared helper.
429
758
  const normalizedAfter = normalizePhaseName(afterPhase);
430
- const unpadded = normalizedAfter.replace(/^0+/, '');
431
- const afterPhaseEscaped = unpadded.replace(/\./g, '\\.');
432
- const targetPattern = new RegExp(`#{2,4}\\s*Phase\\s+0*${afterPhaseEscaped}:`, 'i');
759
+ const afterPhaseEscaped = phaseMarkdownRegexSource(normalizedAfter);
760
+ const targetPattern = new RegExp(`#{2,4}\\s*Phase\\s+${afterPhaseEscaped}:`, 'i');
433
761
  if (!targetPattern.test(content)) {
762
+ const checklistPattern = new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${afterPhaseEscaped}:`, 'i');
763
+ if (checklistPattern.test(content)) {
764
+ error(`Phase ${afterPhase} exists in roadmap summary but is missing a detail section (### Phase ${afterPhase}: ...).`);
765
+ }
434
766
  error(`Phase ${afterPhase} not found in ROADMAP.md`);
435
767
  }
436
768
 
@@ -449,9 +781,11 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
449
781
  }
450
782
  } catch { /* intentionally empty */ }
451
783
 
452
- // Also scan ROADMAP.md content (already loaded) for decimal entries
784
+ // Also scan ROADMAP.md content (already loaded) for decimal entries.
785
+ // #3537: padding-tolerant fragment so un-padded `Phase 2.7:` is found
786
+ // when caller passes the padded base `02`.
453
787
  const rmPhasePattern = new RegExp(
454
- `#{2,4}\\s*Phase\\s+0*${escapeRegex(normalizedBase)}\\.(\\d+)\\s*:`, 'gi'
788
+ `#{2,4}\\s*Phase\\s+${phaseMarkdownRegexSource(normalizedBase)}\\.(\\d+)\\s*:`, 'gi'
455
789
  );
456
790
  let rmMatch;
457
791
  while ((rmMatch = rmPhasePattern.exec(rawContent)) !== null) {
@@ -468,14 +802,14 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
468
802
  const dirPath = path.join(planningDir(cwd), 'phases', _dirName);
469
803
 
470
804
  // Create directory with .gitkeep so git tracks empty folders
471
- fs.mkdirSync(dirPath, { recursive: true });
472
- fs.writeFileSync(path.join(dirPath, '.gitkeep'), '');
805
+ platformEnsureDir(dirPath);
806
+ platformWriteSync(path.join(dirPath, '.gitkeep'), '');
473
807
 
474
808
  // Build phase entry
475
- const phaseEntry = `\n### Phase ${_decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd-plan-phase ${_decimalPhase} to break down)\n`;
809
+ const phaseEntry = `\n### Phase ${_decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /sdd:plan-phase ${_decimalPhase} to break down)\n`;
476
810
 
477
811
  // Insert after the target phase section
478
- const headerPattern = new RegExp(`(#{2,4}\\s*Phase\\s+0*${afterPhaseEscaped}:[^\\n]*\\n)`, 'i');
812
+ const headerPattern = new RegExp(`(#{2,4}\\s*Phase\\s+${afterPhaseEscaped}:[^\\n]*\\n)`, 'i');
479
813
  const headerMatch = rawContent.match(headerPattern);
480
814
  if (!headerMatch) {
481
815
  error(`Could not find Phase ${afterPhase} header`);
@@ -493,7 +827,7 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
493
827
  }
494
828
 
495
829
  const updatedContent = rawContent.slice(0, insertIdx) + phaseEntry + rawContent.slice(insertIdx);
496
- fs.writeFileSync(roadmapPath, updatedContent, 'utf-8');
830
+ platformWriteSync(roadmapPath, updatedContent);
497
831
  return { decimalPhase: _decimalPhase, dirName: _dirName };
498
832
  });
499
833
 
@@ -515,10 +849,12 @@ function cmdPhaseInsert(cwd, afterPhase, description, raw) {
515
849
  */
516
850
  function renameDecimalPhases(phasesDir, baseInt, removedDecimal) {
517
851
  const renamedDirs = [], renamedFiles = [];
518
- const decPattern = new RegExp(`^${baseInt}\\.(\\d+)-(.+)$`);
852
+ // Capture the zero-padded prefix (e.g. "06" from "06.3-slug") so the renamed
853
+ // directory preserves the original padding format.
854
+ const decPattern = new RegExp(`^(0*${baseInt})\\.(\\d+)-(.+)$`);
519
855
  const dirs = readSubdirectories(phasesDir, true);
520
856
  const toRename = dirs
521
- .map(dir => { const m = dir.match(decPattern); return m ? { dir, oldDecimal: parseInt(m[1], 10), slug: m[2] } : null; })
857
+ .map(dir => { const m = dir.match(decPattern); return m ? { dir, prefix: m[1], oldDecimal: parseInt(m[2], 10), slug: m[3] } : null; })
522
858
  .filter(item => item && item.oldDecimal > removedDecimal)
523
859
  .sort((a, b) => b.oldDecimal - a.oldDecimal); // descending to avoid conflicts
524
860
 
@@ -526,7 +862,7 @@ function renameDecimalPhases(phasesDir, baseInt, removedDecimal) {
526
862
  const newDecimal = item.oldDecimal - 1;
527
863
  const oldPhaseId = `${baseInt}.${item.oldDecimal}`;
528
864
  const newPhaseId = `${baseInt}.${newDecimal}`;
529
- const newDirName = `${baseInt}.${newDecimal}-${item.slug}`;
865
+ const newDirName = `${item.prefix}.${newDecimal}-${item.slug}`;
530
866
  fs.renameSync(path.join(phasesDir, item.dir), path.join(phasesDir, newDirName));
531
867
  renamedDirs.push({ from: item.dir, to: newDirName });
532
868
  for (const f of fs.readdirSync(path.join(phasesDir, newDirName))) {
@@ -553,7 +889,7 @@ function renameIntegerPhases(phasesDir, removedInt) {
553
889
  const m = dir.match(/^(\d+)([A-Z])?(?:\.(\d+))?-(.+)$/i);
554
890
  if (!m) return null;
555
891
  const dirInt = parseInt(m[1], 10);
556
- return dirInt > removedInt ? { dir, oldInt: dirInt, letter: m[2] ? m[2].toUpperCase() : '', decimal: m[3] ? parseInt(m[3], 10) : null, slug: m[4] } : null;
892
+ return (dirInt > removedInt && dirInt < 999) ? { dir, oldInt: dirInt, letter: m[2] ? m[2].toUpperCase() : '', decimal: m[3] ? parseInt(m[3], 10) : null, slug: m[4] } : null;
557
893
  })
558
894
  .filter(Boolean)
559
895
  .sort((a, b) => a.oldInt !== b.oldInt ? b.oldInt - a.oldInt : (b.decimal || 0) - (a.decimal || 0));
@@ -580,6 +916,26 @@ function renameIntegerPhases(phasesDir, removedInt) {
580
916
  return { renamedDirs, renamedFiles };
581
917
  }
582
918
 
919
+ function decrementRoadmapPhaseNumber(raw, removedInt) {
920
+ const num = parseInt(raw, 10);
921
+ if (!Number.isInteger(num) || num <= removedInt || num >= 999) return raw;
922
+ return String(num - 1);
923
+ }
924
+
925
+ function decrementRoadmapPhaseToken(raw, removedInt) {
926
+ const match = String(raw).match(/^(\d+)(\.\d+)?$/);
927
+ if (!match) return raw;
928
+ const num = parseInt(match[1], 10);
929
+ if (!Number.isInteger(num) || num <= removedInt || num >= 999) return raw;
930
+ return `${num - 1}${match[2] || ''}`;
931
+ }
932
+
933
+ function decrementRoadmapPaddedPhaseNumber(raw, removedInt) {
934
+ const num = parseInt(raw, 10);
935
+ if (!Number.isInteger(num) || num <= removedInt || num >= 999) return raw;
936
+ return String(num - 1).padStart(raw.length, '0');
937
+ }
938
+
583
939
  /**
584
940
  * Remove a phase section from ROADMAP.md and renumber all subsequent integer phases.
585
941
  */
@@ -589,25 +945,64 @@ function updateRoadmapAfterPhaseRemoval(roadmapPath, targetPhase, isDecimal, rem
589
945
  let content = fs.readFileSync(roadmapPath, 'utf-8');
590
946
  const escaped = escapeRegex(targetPhase);
591
947
 
592
- content = content.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${escaped}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`, 'i'), '');
948
+ // #3601: the end-of-section lookahead is depth-aware. It captures the
949
+ // hash count of the header being removed and stops only at a subsequent
950
+ // header of the SAME depth, whether integer or decimal. This preserves
951
+ // two existing contracts:
952
+ //
953
+ // (#3601 case) Remove `### Phase 2:` and stop at `### Phase 2.1:` —
954
+ // `Phase 2.1` is a peer-level decimal phase (depth 3) and must be
955
+ // preserved.
956
+ //
957
+ // (#3355 case) Remove `### Phase 27:` and continue past
958
+ // `#### Phase 27.1:` (depth 4 — a child of Phase 27) until the next
959
+ // depth-3 header. The child decimal is part of the integer phase
960
+ // being removed.
961
+ //
962
+ // The `(?!#)` negative lookahead after the backreference prevents the
963
+ // depth-3 match from being satisfied by a depth-4+ header that starts
964
+ // with the same three hashes.
965
+ content = content.replace(new RegExp(`\\n?(?<h>#{2,4})\\s*Phase\\s+${escaped}\\s*:[\\s\\S]*?(?=\\n\\k<h>(?!#)\\s+Phase\\s+[^\\n:]+\\s*:|$)`, 'i'), '');
593
966
  content = content.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${escaped}[:\\s][^\\n]*`, 'gi'), '');
594
967
  content = content.replace(new RegExp(`\\n?\\|\\s*${escaped}\\.?\\s[^|]*\\|[^\\n]*`, 'gi'), '');
595
968
 
596
969
  if (!isDecimal) {
597
- const MAX_PHASE = 99;
598
- for (let oldNum = MAX_PHASE; oldNum > removedInt; oldNum--) {
599
- const newNum = oldNum - 1;
600
- const oldStr = String(oldNum), newStr = String(newNum);
601
- const oldPad = oldStr.padStart(2, '0'), newPad = newStr.padStart(2, '0');
602
- content = content.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${oldStr}(\\s*:)`, 'gi'), `$1${newStr}$2`);
603
- content = content.replace(new RegExp(`(Phase\\s+)${oldStr}([:\\s])`, 'g'), `$1${newStr}$2`);
604
- content = content.replace(new RegExp(`${oldPad}-(\\d{2})`, 'g'), `${newPad}-$1`);
605
- content = content.replace(new RegExp(`(\\|\\s*)${oldStr}\\.\\s`, 'g'), `$1${newStr}. `);
606
- content = content.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${oldStr}\\b`, 'gi'), `$1${newStr}`);
607
- }
970
+ content = content.replace(
971
+ /(#{2,4}\s*Phase\s+)(\d+(?:\.\d+)?)(\s*:)/gi,
972
+ (_match, prefix, num, suffix) => `${prefix}${decrementRoadmapPhaseToken(num, removedInt)}${suffix}`
973
+ );
974
+ content = content.replace(
975
+ /(-\s*\[[ x]\]\s*.*?Phase\s+)(\d+)(\s*:|\s+)/gi,
976
+ (_match, prefix, num, suffix) => `${prefix}${decrementRoadmapPhaseNumber(num, removedInt)}${suffix}`
977
+ );
978
+ content = content.replace(
979
+ /(\|\s*)(\d+)(\.\s)/g,
980
+ (_match, prefix, num, suffix) => `${prefix}${decrementRoadmapPhaseNumber(num, removedInt)}${suffix}`
981
+ );
982
+ // #3602: extend the suffix lookahead so slugged plan filenames like
983
+ // `07-01-cherry-pick-foundation-PLAN.md` match too. The previous
984
+ // pattern only allowed a compact `-(PLAN|SUMMARY).md` immediately
985
+ // after the plan number (or no suffix at all); a slug between the
986
+ // number and the `-PLAN.md` / `-SUMMARY.md` suffix made the
987
+ // lookahead fail and left the stale `07-01-` prefix in ROADMAP
988
+ // text while the on-disk file was already renamed to `06-01-…`.
989
+ // The slug segment `(?:-[A-Za-z][A-Za-z0-9-]*)*` allows any number
990
+ // of kebab-case tokens before the canonical PLAN/SUMMARY suffix.
991
+ content = content.replace(
992
+ /(?<![0-9-])(\d{2})-(\d{2})(?=(?:(?:-[A-Za-z][A-Za-z0-9-]*)*-(?:PLAN|SUMMARY)\.md)|(?![0-9-]))/g,
993
+ (_match, phaseNum, planNum) => `${decrementRoadmapPaddedPhaseNumber(phaseNum, removedInt)}-${planNum}`
994
+ );
995
+ content = content.replace(
996
+ /(\*\*Depends on\*\*\s*:\s*Phase\s+)(\d+(?:\.\d+)?)\b/gi,
997
+ (_match, prefix, num) => `${prefix}${decrementRoadmapPhaseToken(num, removedInt)}`
998
+ );
999
+ content = content.replace(
1000
+ /(Depends on:\*\*\s*Phase\s+)(\d+(?:\.\d+)?)\b/gi,
1001
+ (_match, prefix, num) => `${prefix}${decrementRoadmapPhaseToken(num, removedInt)}`
1002
+ );
608
1003
  }
609
1004
 
610
- fs.writeFileSync(roadmapPath, content, 'utf-8');
1005
+ platformWriteSync(roadmapPath, content);
611
1006
  });
612
1007
  }
613
1008
 
@@ -642,7 +1037,7 @@ function cmdPhaseRemove(cwd, targetPhase, options, raw) {
642
1037
  let renamedDirs = [], renamedFiles = [];
643
1038
  try {
644
1039
  const renamed = isDecimal
645
- ? renameDecimalPhases(phasesDir, normalized.split('.')[0], parseInt(normalized.split('.')[1], 10))
1040
+ ? renameDecimalPhases(phasesDir, parseInt(normalized.split('.')[0], 10), parseInt(normalized.split('.')[1], 10))
646
1041
  : renameIntegerPhases(phasesDir, parseInt(normalized, 10));
647
1042
  renamedDirs = renamed.renamedDirs;
648
1043
  renamedFiles = renamed.renamedFiles;
@@ -725,14 +1120,16 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
725
1120
  let roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
726
1121
 
727
1122
  // Checkbox: - [ ] Phase N: → - [x] Phase N: (...completed DATE)
1123
+ // #3537: padding-tolerant fragment so the caller-resolved padded id
1124
+ // matches un-padded ROADMAP prose.
1125
+ const phaseEscaped = phaseMarkdownRegexSource(phaseNum);
728
1126
  const checkboxPattern = new RegExp(
729
- `(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${escapeRegex(phaseNum)}[:\\s][^\\n]*)`,
1127
+ `(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${phaseEscaped}[:\\s][^\\n]*)`,
730
1128
  'i'
731
1129
  );
732
1130
  roadmapContent = roadmapContent.replace(checkboxPattern, `$1x$2 (completed ${today})`);
733
1131
 
734
1132
  // Progress table: update Status to Complete, add date (handles 4 or 5 column tables)
735
- const phaseEscaped = escapeRegex(phaseNum);
736
1133
  const tableRowPattern = new RegExp(
737
1134
  `^(\\|\\s*${phaseEscaped}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,
738
1135
  'im'
@@ -756,7 +1153,7 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
756
1153
  // Update plan count in phase section.
757
1154
  // Use direct .replace() rather than replaceInCurrentMilestone() so this
758
1155
  // works when the current milestone section is itself inside a <details>
759
- // block (the standard /sdd-new-project layout). replaceInCurrentMilestone
1156
+ // block (the standard /sdd:new-project layout). replaceInCurrentMilestone
760
1157
  // scopes to content after the last </details>, which misses content inside
761
1158
  // the current milestone's own <details> wrapper (#2005).
762
1159
  // The phase-scoped heading pattern is specific enough to avoid matching
@@ -783,24 +1180,31 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
783
1180
  roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
784
1181
  }
785
1182
 
786
- fs.writeFileSync(roadmapPath, roadmapContent, 'utf-8');
1183
+ platformWriteSync(roadmapPath, roadmapContent);
787
1184
 
788
1185
  // Update REQUIREMENTS.md traceability for this phase's requirements
789
1186
  const reqPath = path.join(planningDir(cwd), 'REQUIREMENTS.md');
790
1187
  if (fs.existsSync(reqPath)) {
791
- // Extract the current phase section from roadmap (scoped to avoid cross-phase matching)
792
- const phaseEsc = escapeRegex(phaseNum);
1188
+ // Extract the current phase section from roadmap (scoped to avoid cross-phase matching).
1189
+ // #3537: padding-tolerant fragment so an un-padded `Phase 2.7:` heading
1190
+ // is found when caller resolved to padded `02.7`.
1191
+ const phaseEsc = phaseMarkdownRegexSource(phaseNum);
793
1192
  const currentMilestoneRoadmap = extractCurrentMilestone(roadmapContent, cwd);
794
1193
  const phaseSectionMatch = currentMilestoneRoadmap.match(
795
1194
  new RegExp(`(#{2,4}\\s*Phase\\s+${phaseEsc}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`, 'i')
796
1195
  );
797
1196
 
798
1197
  const sectionText = phaseSectionMatch ? phaseSectionMatch[1] : '';
799
- const reqMatch = sectionText.match(/\*\*Requirements:\*\*\s*([^\n]+)/i);
1198
+ // Accept all bold/colon variants (#2769) — the previous pattern only
1199
+ // matched **Requirements:** (colon inside bold) and silently skipped
1200
+ // **Requirements**: (colon outside), preventing the matching REQ-IDs
1201
+ // from being ticked off in REQUIREMENTS.md on phase completion.
1202
+ const reqMatch = sectionText.match(/\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]+)/i);
1203
+
1204
+ let reqContent = fs.readFileSync(reqPath, 'utf-8');
800
1205
 
801
1206
  if (reqMatch) {
802
1207
  const reqIds = reqMatch[1].replace(/[\[\]]/g, '').split(/[,\s]+/).map(r => r.trim()).filter(Boolean);
803
- let reqContent = fs.readFileSync(reqPath, 'utf-8');
804
1208
 
805
1209
  for (const reqId of reqIds) {
806
1210
  const reqEscaped = escapeRegex(reqId);
@@ -815,10 +1219,40 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
815
1219
  '$1 Complete $2'
816
1220
  );
817
1221
  }
1222
+ }
818
1223
 
819
- fs.writeFileSync(reqPath, reqContent, 'utf-8');
820
- requirementsUpdated = true;
1224
+ // Scan body for all **REQ-ID** patterns, warn about any missing from the Traceability table.
1225
+ // Always runs regardless of whether the roadmap has a Requirements: line.
1226
+ const bodyReqIds = [];
1227
+ const bodyReqPattern = /\*\*([A-Z][A-Z0-9]*-\d+)\*\*/g;
1228
+ let bodyMatch;
1229
+ while ((bodyMatch = bodyReqPattern.exec(reqContent)) !== null) {
1230
+ const id = bodyMatch[1];
1231
+ if (!bodyReqIds.includes(id)) bodyReqIds.push(id);
821
1232
  }
1233
+
1234
+ // Collect REQ-IDs present in the Traceability section only, to avoid
1235
+ // picking up IDs from other tables in the document.
1236
+ const traceabilityHeadingMatch = reqContent.match(/^#{1,6}\s+Traceability\b/im);
1237
+ const traceabilitySection = traceabilityHeadingMatch
1238
+ ? reqContent.slice(traceabilityHeadingMatch.index)
1239
+ : '';
1240
+ const tableReqIds = new Set();
1241
+ const tableRowPattern = /^\|\s*([A-Z][A-Z0-9]*-\d+)\s*\|/gm;
1242
+ let tableMatch;
1243
+ while ((tableMatch = tableRowPattern.exec(traceabilitySection)) !== null) {
1244
+ tableReqIds.add(tableMatch[1]);
1245
+ }
1246
+
1247
+ const unregistered = bodyReqIds.filter(id => !tableReqIds.has(id));
1248
+ if (unregistered.length > 0) {
1249
+ warnings.push(
1250
+ `REQUIREMENTS.md: ${unregistered.length} REQ-ID(s) found in body but missing from Traceability table: ${unregistered.join(', ')} — add them manually to keep traceability in sync`
1251
+ );
1252
+ }
1253
+
1254
+ platformWriteSync(reqPath, reqContent);
1255
+ requirementsUpdated = true;
822
1256
  }
823
1257
  });
824
1258
  }
@@ -838,9 +1272,11 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
838
1272
  .sort((a, b) => comparePhaseNum(a, b));
839
1273
 
840
1274
  // Find the next phase directory after current
1275
+ // Skip backlog phases (999.x) — they are parked ideas, not sequential work (#2129)
841
1276
  for (const dir of dirs) {
842
1277
  const dm = dir.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);
843
1278
  if (dm) {
1279
+ if (/^999(?:\.|$)/.test(dm[1])) continue;
844
1280
  if (comparePhaseNum(dm[1], phaseNum) > 0) {
845
1281
  nextPhaseNum = dm[1];
846
1282
  nextPhaseName = dm[2] || null;
@@ -937,6 +1373,21 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
937
1373
  }, cwd);
938
1374
  }
939
1375
 
1376
+ // Auto-prune STATE.md on phase boundary when configured (#2087)
1377
+ let autoPruned = false;
1378
+ try {
1379
+ const configPath = path.join(planningDir(cwd), 'config.json');
1380
+ if (fs.existsSync(configPath)) {
1381
+ const rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
1382
+ const autoPruneEnabled = rawConfig.workflow && rawConfig.workflow.auto_prune_state === true;
1383
+ if (autoPruneEnabled && fs.existsSync(statePath)) {
1384
+ const { cmdStatePrune } = require('./state.cjs');
1385
+ cmdStatePrune(cwd, { keepRecent: '3', dryRun: false, silent: true }, true);
1386
+ autoPruned = true;
1387
+ }
1388
+ }
1389
+ } catch { /* intentionally empty — auto-prune is best-effort */ }
1390
+
940
1391
  const result = {
941
1392
  completed_phase: phaseNum,
942
1393
  phase_name: phaseInfo.phase_name,
@@ -948,6 +1399,7 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
948
1399
  roadmap_updated: fs.existsSync(roadmapPath),
949
1400
  state_updated: fs.existsSync(statePath),
950
1401
  requirements_updated: requirementsUpdated,
1402
+ auto_pruned: autoPruned,
951
1403
  warnings,
952
1404
  has_warnings: warnings.length > 0,
953
1405
  };
@@ -961,6 +1413,8 @@ module.exports = {
961
1413
  cmdFindPhase,
962
1414
  cmdPhasePlanIndex,
963
1415
  cmdPhaseAdd,
1416
+ cmdPhaseAddBatch,
1417
+ cmdPhaseMvpMode,
964
1418
  cmdPhaseInsert,
965
1419
  cmdPhaseRemove,
966
1420
  cmdPhaseComplete,