@bhargavvc/sdd-cc 1.30.1 → 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 (1392) hide show
  1. package/README.ja-JP.md +165 -129
  2. package/README.ko-KR.md +161 -123
  3. package/README.md +103 -679
  4. package/README.pt-BR.md +92 -52
  5. package/README.zh-CN.md +145 -103
  6. package/agents/sdd-advisor-researcher.md +23 -0
  7. package/agents/sdd-ai-researcher.md +133 -0
  8. package/agents/sdd-code-fixer.md +668 -0
  9. package/agents/sdd-code-reviewer.md +387 -0
  10. package/agents/sdd-codebase-mapper.md +86 -3
  11. package/agents/sdd-debug-session-manager.md +314 -0
  12. package/agents/sdd-debugger.md +157 -78
  13. package/agents/sdd-doc-classifier.md +168 -0
  14. package/agents/sdd-doc-synthesizer.md +204 -0
  15. package/agents/sdd-doc-verifier.md +217 -0
  16. package/agents/sdd-doc-writer.md +615 -0
  17. package/agents/sdd-domain-researcher.md +153 -0
  18. package/agents/sdd-eval-auditor.md +191 -0
  19. package/agents/sdd-eval-planner.md +154 -0
  20. package/agents/sdd-executor.md +283 -40
  21. package/agents/sdd-framework-selector.md +160 -0
  22. package/agents/sdd-integration-checker.md +30 -3
  23. package/agents/sdd-intel-updater.md +342 -0
  24. package/agents/sdd-nyquist-auditor.md +31 -4
  25. package/agents/sdd-pattern-mapper.md +335 -0
  26. package/agents/sdd-phase-researcher.md +254 -24
  27. package/agents/sdd-plan-checker.md +223 -18
  28. package/agents/sdd-planner.md +286 -362
  29. package/agents/sdd-project-researcher.md +28 -5
  30. package/agents/sdd-research-synthesizer.md +4 -4
  31. package/agents/sdd-roadmapper.md +14 -5
  32. package/agents/sdd-security-auditor.md +155 -0
  33. package/agents/sdd-ui-auditor.md +60 -4
  34. package/agents/sdd-ui-checker.md +11 -2
  35. package/agents/sdd-ui-researcher.md +27 -4
  36. package/agents/sdd-user-profiler.md +2 -2
  37. package/agents/sdd-verifier.md +258 -41
  38. package/bin/install.js +6862 -618
  39. package/bin/sdd-sdk.js +37 -0
  40. package/commands/sdd/add-tests.md +3 -2
  41. package/commands/sdd/ai-integration-phase.md +37 -0
  42. package/commands/sdd/audit-fix.md +34 -0
  43. package/commands/sdd/audit-milestone.md +3 -2
  44. package/commands/sdd/autonomous.md +10 -5
  45. package/commands/sdd/capture.md +62 -0
  46. package/commands/sdd/cleanup.md +7 -1
  47. package/commands/sdd/code-review.md +59 -0
  48. package/commands/sdd/complete-milestone.md +11 -4
  49. package/commands/sdd/config.md +58 -0
  50. package/commands/sdd/debug.md +23 -144
  51. package/commands/sdd/discuss-phase.md +22 -10
  52. package/commands/sdd/docs-update.md +49 -0
  53. package/commands/sdd/eval-review.md +33 -0
  54. package/commands/sdd/execute-phase.md +9 -4
  55. package/commands/sdd/explore.md +27 -0
  56. package/commands/sdd/extract-learnings.md +23 -0
  57. package/commands/sdd/fast.md +2 -1
  58. package/commands/sdd/forensics.md +3 -2
  59. package/commands/sdd/graphify.md +199 -0
  60. package/commands/sdd/health.md +12 -3
  61. package/commands/sdd/help.md +3 -1
  62. package/commands/sdd/import.md +41 -0
  63. package/commands/sdd/inbox.md +39 -0
  64. package/commands/sdd/ingest-docs.md +42 -0
  65. package/commands/sdd/manager.md +9 -3
  66. package/commands/sdd/map-codebase.md +15 -3
  67. package/commands/sdd/milestone-summary.md +1 -1
  68. package/commands/sdd/mvp-phase.md +45 -0
  69. package/commands/sdd/new-milestone.md +3 -2
  70. package/commands/sdd/new-project.md +7 -2
  71. package/commands/sdd/ns-context.md +23 -0
  72. package/commands/sdd/ns-ideate.md +24 -0
  73. package/commands/sdd/ns-manage.md +29 -0
  74. package/commands/sdd/ns-project.md +22 -0
  75. package/commands/sdd/ns-review.md +26 -0
  76. package/commands/sdd/ns-workflow.md +28 -0
  77. package/commands/sdd/pause-work.md +6 -1
  78. package/commands/sdd/phase.md +56 -0
  79. package/commands/sdd/plan-phase.md +19 -4
  80. package/commands/sdd/plan-review-convergence.md +59 -0
  81. package/commands/sdd/pr-branch.md +2 -1
  82. package/commands/sdd/profile-user.md +2 -2
  83. package/commands/sdd/progress.md +27 -5
  84. package/commands/sdd/quick.md +132 -5
  85. package/commands/sdd/resume-work.md +2 -12
  86. package/commands/sdd/review-backlog.md +4 -2
  87. package/commands/sdd/review.md +7 -3
  88. package/commands/sdd/secure-phase.md +36 -0
  89. package/commands/sdd/settings.md +2 -9
  90. package/commands/sdd/ship.md +1 -0
  91. package/commands/sdd/sketch.md +60 -0
  92. package/commands/sdd/spec-phase.md +63 -0
  93. package/commands/sdd/spike.md +57 -0
  94. package/commands/sdd/stats.md +2 -1
  95. package/commands/sdd/surface.md +129 -0
  96. package/commands/sdd/thread.md +8 -111
  97. package/commands/sdd/ui-phase.md +3 -2
  98. package/commands/sdd/ui-review.md +3 -2
  99. package/commands/sdd/ultraplan-phase.md +34 -0
  100. package/commands/sdd/undo.md +35 -0
  101. package/commands/sdd/update.md +21 -10
  102. package/commands/sdd/validate-phase.md +3 -2
  103. package/commands/sdd/verify-work.md +4 -3
  104. package/commands/sdd/workspace.md +52 -0
  105. package/commands/sdd/workstreams.md +15 -8
  106. package/hooks/dist/sdd-check-update-worker.js +116 -0
  107. package/hooks/dist/sdd-check-update.js +19 -69
  108. package/hooks/dist/sdd-context-monitor.js +43 -7
  109. package/hooks/dist/sdd-phase-boundary.sh +47 -0
  110. package/hooks/dist/sdd-prompt-guard.js +1 -0
  111. package/hooks/dist/sdd-read-guard.js +101 -0
  112. package/hooks/dist/sdd-read-injection-scanner.js +152 -0
  113. package/hooks/dist/sdd-session-state.sh +59 -0
  114. package/hooks/dist/sdd-statusline.js +439 -21
  115. package/hooks/dist/sdd-update-banner.js +134 -0
  116. package/hooks/dist/sdd-validate-commit.sh +57 -0
  117. package/hooks/dist/sdd-workflow-guard.js +2 -2
  118. package/hooks/lib/git-cmd.js +150 -0
  119. package/hooks/sdd-check-update-worker.js +116 -0
  120. package/hooks/sdd-check-update.js +64 -0
  121. package/hooks/sdd-context-monitor.js +192 -0
  122. package/hooks/sdd-phase-boundary.sh +47 -0
  123. package/hooks/sdd-prompt-guard.js +97 -0
  124. package/hooks/sdd-read-guard.js +101 -0
  125. package/hooks/sdd-read-injection-scanner.js +152 -0
  126. package/hooks/sdd-session-state.sh +59 -0
  127. package/hooks/sdd-statusline.js +537 -0
  128. package/hooks/sdd-update-banner.js +134 -0
  129. package/hooks/sdd-validate-commit.sh +57 -0
  130. package/hooks/sdd-workflow-guard.js +94 -0
  131. package/package.json +34 -9
  132. package/scripts/audit-workflow-script-paths.cjs +73 -0
  133. package/scripts/build-hooks.js +114 -9
  134. package/scripts/changeset/cli.cjs +269 -0
  135. package/scripts/changeset/github-release-notes.cjs +198 -0
  136. package/scripts/changeset/lint.cjs +110 -0
  137. package/scripts/changeset/new.cjs +137 -0
  138. package/scripts/changeset/parse.cjs +60 -0
  139. package/scripts/changeset/render.cjs +34 -0
  140. package/scripts/changeset/serialize.cjs +74 -0
  141. package/scripts/command-contract-helpers.cjs +61 -0
  142. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  143. package/scripts/fix-slash-commands.cjs +106 -0
  144. package/scripts/gen-inventory-manifest.cjs +109 -0
  145. package/scripts/lint-command-contract.cjs +108 -0
  146. package/scripts/lint-descriptions.cjs +83 -0
  147. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  148. package/scripts/lint-no-source-grep.cjs +174 -0
  149. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  150. package/scripts/lint-skill-deps.cjs +180 -0
  151. package/scripts/pr-template-policy.cjs +169 -0
  152. package/scripts/prompt-injection-scan.sh +3 -0
  153. package/scripts/rebrand-gsd-to-sdd.sh +222 -220
  154. package/scripts/run-tests.cjs +5 -1
  155. package/scripts/strip-prose-atrefs.cjs +106 -0
  156. package/scripts/verify-tarball-sdk-dist.sh +69 -0
  157. package/sdd/bin/check-latest-version.cjs +104 -0
  158. package/sdd/bin/lib/active-workstream-store.cjs +85 -0
  159. package/sdd/bin/lib/adr-parser.cjs +394 -0
  160. package/sdd/bin/lib/artifacts.cjs +53 -0
  161. package/sdd/bin/lib/audit.cjs +755 -0
  162. package/sdd/bin/lib/cjs-command-router-adapter.cjs +39 -0
  163. package/sdd/bin/lib/clusters.cjs +135 -0
  164. package/sdd/bin/lib/command-aliases.generated.cjs +838 -0
  165. package/sdd/bin/lib/commands.cjs +179 -107
  166. package/sdd/bin/lib/config-schema.cjs +135 -0
  167. package/sdd/bin/lib/config.cjs +313 -86
  168. package/sdd/bin/lib/context-utilization.cjs +47 -0
  169. package/sdd/bin/lib/core.cjs +1146 -391
  170. package/sdd/bin/lib/decisions.cjs +48 -0
  171. package/sdd/bin/lib/docs.cjs +270 -0
  172. package/sdd/bin/lib/drift.cjs +379 -0
  173. package/sdd/bin/lib/fallow-runner.cjs +109 -0
  174. package/sdd/bin/lib/frontmatter.cjs +389 -336
  175. package/sdd/bin/lib/gap-checker.cjs +197 -0
  176. package/sdd/bin/lib/graphify.cjs +577 -0
  177. package/sdd/bin/lib/init-command-router.cjs +70 -0
  178. package/sdd/bin/lib/init.cjs +692 -97
  179. package/sdd/bin/lib/install-profiles.cjs +572 -0
  180. package/sdd/bin/lib/installer-migration-authoring.cjs +117 -0
  181. package/sdd/bin/lib/installer-migration-report.cjs +328 -0
  182. package/sdd/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  183. package/sdd/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  184. package/sdd/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  185. package/sdd/bin/lib/installer-migrations.cjs +703 -0
  186. package/sdd/bin/lib/intel.cjs +643 -0
  187. package/sdd/bin/lib/learnings.cjs +379 -0
  188. package/sdd/bin/lib/milestone.cjs +313 -252
  189. package/sdd/bin/lib/model-catalog.cjs +136 -0
  190. package/sdd/bin/lib/model-profiles.cjs +25 -68
  191. package/sdd/bin/lib/phase-command-router.cjs +96 -0
  192. package/sdd/bin/lib/phase.cjs +868 -335
  193. package/sdd/bin/lib/phases-command-router.cjs +39 -0
  194. package/sdd/bin/lib/plan-scan.cjs +138 -0
  195. package/sdd/bin/lib/planning-workspace.cjs +361 -0
  196. package/sdd/bin/lib/profile-output.cjs +197 -35
  197. package/sdd/bin/lib/profile-pipeline.cjs +1 -1
  198. package/sdd/bin/lib/review-reviewer-selection.cjs +125 -0
  199. package/sdd/bin/lib/roadmap-command-router.cjs +23 -0
  200. package/sdd/bin/lib/roadmap.cjs +416 -124
  201. package/sdd/bin/lib/runtime-homes.cjs +178 -0
  202. package/sdd/bin/lib/schema-detect.cjs +238 -0
  203. package/sdd/bin/lib/sdd2-import.cjs +511 -0
  204. package/sdd/bin/lib/secrets.cjs +33 -0
  205. package/sdd/bin/lib/security.cjs +131 -9
  206. package/sdd/bin/lib/shell-command-projection.cjs +548 -0
  207. package/sdd/bin/lib/state-command-router.cjs +100 -0
  208. package/sdd/bin/lib/state-document.cjs +12 -0
  209. package/sdd/bin/lib/state-document.generated.cjs +127 -0
  210. package/sdd/bin/lib/state.cjs +1253 -367
  211. package/sdd/bin/lib/surface.cjs +398 -0
  212. package/sdd/bin/lib/template.cjs +11 -5
  213. package/sdd/bin/lib/uat.cjs +9 -2
  214. package/sdd/bin/lib/validate-command-router.cjs +55 -0
  215. package/sdd/bin/lib/verify-command-router.cjs +34 -0
  216. package/sdd/bin/lib/verify.cjs +648 -140
  217. package/sdd/bin/lib/workstream-inventory.cjs +159 -0
  218. package/sdd/bin/lib/workstream-name-policy.cjs +33 -0
  219. package/sdd/bin/lib/workstream.cjs +78 -196
  220. package/sdd/bin/lib/worktree-safety.cjs +563 -0
  221. package/sdd/bin/sdd-tools.cjs +528 -222
  222. package/sdd/bin/verify-reapply-patches.cjs +247 -0
  223. package/sdd/contexts/dev.md +21 -0
  224. package/sdd/contexts/research.md +22 -0
  225. package/sdd/contexts/review.md +23 -0
  226. package/sdd/references/agent-contracts.md +79 -0
  227. package/sdd/references/ai-evals.md +156 -0
  228. package/sdd/references/ai-frameworks.md +186 -0
  229. package/sdd/references/artifact-types.md +131 -0
  230. package/sdd/references/autonomous-smart-discuss.md +277 -0
  231. package/sdd/references/checkpoints.md +36 -0
  232. package/sdd/references/common-bug-patterns.md +114 -0
  233. package/sdd/references/context-budget.md +85 -0
  234. package/sdd/references/continuation-format.md +30 -26
  235. package/sdd/references/debugger-philosophy.md +76 -0
  236. package/sdd/references/decimal-phase-calculation.md +5 -5
  237. package/sdd/references/doc-conflict-engine.md +91 -0
  238. package/sdd/references/domain-probes.md +125 -0
  239. package/sdd/references/execute-mvp-tdd.md +81 -0
  240. package/sdd/references/executor-examples.md +110 -0
  241. package/sdd/references/few-shot-examples/plan-checker.md +73 -0
  242. package/sdd/references/few-shot-examples/verifier.md +109 -0
  243. package/sdd/references/gate-prompts.md +100 -0
  244. package/sdd/references/gates.md +70 -0
  245. package/sdd/references/git-integration.md +9 -6
  246. package/sdd/references/git-planning-commit.md +6 -4
  247. package/sdd/references/ios-scaffold.md +123 -0
  248. package/sdd/references/mandatory-initial-read.md +2 -0
  249. package/sdd/references/model-profile-resolution.md +2 -0
  250. package/sdd/references/model-profiles.md +128 -22
  251. package/sdd/references/mvp-concepts.md +49 -0
  252. package/sdd/references/phase-argument-parsing.md +3 -3
  253. package/sdd/references/planner-antipatterns.md +89 -0
  254. package/sdd/references/planner-chunked.md +49 -0
  255. package/sdd/references/planner-gap-closure.md +62 -0
  256. package/sdd/references/planner-human-verify-mode.md +57 -0
  257. package/sdd/references/planner-mvp-mode.md +53 -0
  258. package/sdd/references/planner-reviews.md +39 -0
  259. package/sdd/references/planner-revision.md +87 -0
  260. package/sdd/references/planner-source-audit.md +73 -0
  261. package/sdd/references/planning-config.md +276 -7
  262. package/sdd/references/project-skills-discovery.md +19 -0
  263. package/sdd/references/revision-loop.md +97 -0
  264. package/sdd/references/scout-codebase.md +51 -0
  265. package/sdd/references/skeleton-template.md +48 -0
  266. package/sdd/references/sketch-interactivity.md +41 -0
  267. package/sdd/references/sketch-theme-system.md +94 -0
  268. package/sdd/references/sketch-tooling.md +45 -0
  269. package/sdd/references/sketch-variant-patterns.md +81 -0
  270. package/sdd/references/spidr-splitting.md +69 -0
  271. package/sdd/references/tdd.md +67 -0
  272. package/sdd/references/thinking-models-debug.md +44 -0
  273. package/sdd/references/thinking-models-execution.md +50 -0
  274. package/sdd/references/thinking-models-planning.md +62 -0
  275. package/sdd/references/thinking-models-research.md +50 -0
  276. package/sdd/references/thinking-models-verification.md +55 -0
  277. package/sdd/references/thinking-partner.md +96 -0
  278. package/sdd/references/ui-brand.md +4 -4
  279. package/sdd/references/universal-anti-patterns.md +63 -0
  280. package/sdd/references/user-story-template.md +58 -0
  281. package/sdd/references/verification-overrides.md +227 -0
  282. package/sdd/references/verify-mvp-mode.md +85 -0
  283. package/sdd/references/workstream-flag.md +63 -10
  284. package/sdd/references/worktree-path-safety.md +89 -0
  285. package/sdd/templates/AI-SPEC.md +246 -0
  286. package/sdd/templates/DEBUG.md +7 -2
  287. package/sdd/templates/README.md +77 -0
  288. package/sdd/templates/SECURITY.md +61 -0
  289. package/sdd/templates/VALIDATION.md +3 -3
  290. package/sdd/templates/claude-md.md +27 -4
  291. package/sdd/templates/config.json +20 -2
  292. package/sdd/templates/discovery.md +2 -2
  293. package/sdd/templates/research.md +40 -0
  294. package/sdd/templates/spec.md +307 -0
  295. package/sdd/templates/state.md +10 -2
  296. package/sdd/workflows/add-backlog.md +90 -0
  297. package/sdd/workflows/add-phase.md +12 -12
  298. package/sdd/workflows/add-tests.md +6 -3
  299. package/sdd/workflows/add-todo.md +8 -6
  300. package/sdd/workflows/ai-integration-phase.md +294 -0
  301. package/sdd/workflows/analyze-dependencies.md +96 -0
  302. package/sdd/workflows/audit-fix.md +177 -0
  303. package/sdd/workflows/audit-milestone.md +35 -18
  304. package/sdd/workflows/audit-uat.md +1 -1
  305. package/sdd/workflows/autonomous.md +202 -304
  306. package/sdd/workflows/check-todos.md +12 -10
  307. package/sdd/workflows/cleanup.md +3 -1
  308. package/sdd/workflows/code-review-fix.md +501 -0
  309. package/sdd/workflows/code-review.md +613 -0
  310. package/sdd/workflows/complete-milestone.md +115 -28
  311. package/sdd/workflows/debug.md +231 -0
  312. package/sdd/workflows/diagnose-issues.md +14 -5
  313. package/sdd/workflows/discovery-phase.md +3 -1
  314. package/sdd/workflows/discuss-phase/modes/advisor.md +175 -0
  315. package/sdd/workflows/discuss-phase/modes/all.md +28 -0
  316. package/sdd/workflows/discuss-phase/modes/analyze.md +44 -0
  317. package/sdd/workflows/discuss-phase/modes/auto.md +56 -0
  318. package/sdd/workflows/discuss-phase/modes/batch.md +52 -0
  319. package/sdd/workflows/discuss-phase/modes/chain.md +97 -0
  320. package/sdd/workflows/discuss-phase/modes/default.md +141 -0
  321. package/sdd/workflows/discuss-phase/modes/power.md +44 -0
  322. package/sdd/workflows/discuss-phase/modes/text.md +55 -0
  323. package/sdd/workflows/discuss-phase/templates/checkpoint.json +18 -0
  324. package/sdd/workflows/discuss-phase/templates/context.md +136 -0
  325. package/sdd/workflows/discuss-phase/templates/discussion-log.md +50 -0
  326. package/sdd/workflows/discuss-phase-assumptions.md +41 -20
  327. package/sdd/workflows/discuss-phase-power.md +291 -0
  328. package/sdd/workflows/discuss-phase.md +242 -792
  329. package/sdd/workflows/do.md +13 -7
  330. package/sdd/workflows/docs-update.md +1161 -0
  331. package/sdd/workflows/edit-phase.md +294 -0
  332. package/sdd/workflows/eval-review.md +155 -0
  333. package/sdd/workflows/execute-phase/steps/codebase-drift-gate.md +81 -0
  334. package/sdd/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  335. package/sdd/workflows/execute-phase/steps/post-merge-gate.md +116 -0
  336. package/sdd/workflows/execute-phase.md +1062 -108
  337. package/sdd/workflows/execute-plan.md +118 -107
  338. package/sdd/workflows/explore.md +143 -0
  339. package/sdd/workflows/extract-learnings.md +242 -0
  340. package/sdd/workflows/forensics.md +17 -4
  341. package/sdd/workflows/graduation.md +195 -0
  342. package/sdd/workflows/health.md +45 -3
  343. package/sdd/workflows/help.md +265 -88
  344. package/sdd/workflows/import.md +253 -0
  345. package/sdd/workflows/inbox.md +387 -0
  346. package/sdd/workflows/ingest-docs.md +339 -0
  347. package/sdd/workflows/insert-phase.md +37 -16
  348. package/sdd/workflows/list-phase-assumptions.md +2 -2
  349. package/sdd/workflows/list-workspaces.md +3 -3
  350. package/sdd/workflows/manager.md +62 -32
  351. package/sdd/workflows/map-codebase.md +90 -24
  352. package/sdd/workflows/milestone-summary.md +6 -6
  353. package/sdd/workflows/mvp-phase.md +221 -0
  354. package/sdd/workflows/new-milestone.md +168 -20
  355. package/sdd/workflows/new-project.md +273 -47
  356. package/sdd/workflows/new-workspace.md +8 -6
  357. package/sdd/workflows/next.md +127 -4
  358. package/sdd/workflows/note.md +7 -5
  359. package/sdd/workflows/pause-work.md +79 -12
  360. package/sdd/workflows/plan-milestone-gaps.md +14 -7
  361. package/sdd/workflows/plan-phase.md +987 -62
  362. package/sdd/workflows/plan-review-convergence.md +329 -0
  363. package/sdd/workflows/plant-seed.md +145 -85
  364. package/sdd/workflows/pr-branch.md +41 -13
  365. package/sdd/workflows/profile-user.md +20 -18
  366. package/sdd/workflows/progress.md +186 -44
  367. package/sdd/workflows/quick.md +470 -58
  368. package/sdd/workflows/reapply-patches.md +390 -0
  369. package/sdd/workflows/remove-phase.md +12 -12
  370. package/sdd/workflows/remove-workspace.md +24 -7
  371. package/sdd/workflows/resume-project.md +18 -15
  372. package/sdd/workflows/review.md +242 -11
  373. package/sdd/workflows/scan.md +104 -0
  374. package/sdd/workflows/secure-phase.md +179 -0
  375. package/sdd/workflows/session-report.md +2 -2
  376. package/sdd/workflows/settings-advanced.md +579 -0
  377. package/sdd/workflows/settings-integrations.md +281 -0
  378. package/sdd/workflows/settings.md +221 -16
  379. package/sdd/workflows/ship.md +140 -13
  380. package/sdd/workflows/sketch-wrap-up.md +285 -0
  381. package/sdd/workflows/sketch.md +360 -0
  382. package/sdd/workflows/spec-phase.md +262 -0
  383. package/sdd/workflows/spike-wrap-up.md +306 -0
  384. package/sdd/workflows/spike.md +452 -0
  385. package/sdd/workflows/stats.md +20 -1
  386. package/sdd/workflows/sync-skills.md +182 -0
  387. package/sdd/workflows/thread.md +221 -0
  388. package/sdd/workflows/transition.md +44 -22
  389. package/sdd/workflows/ui-phase.md +39 -14
  390. package/sdd/workflows/ui-review.md +33 -6
  391. package/sdd/workflows/ultraplan-phase.md +198 -0
  392. package/sdd/workflows/undo.md +314 -0
  393. package/sdd/workflows/update.md +350 -29
  394. package/sdd/workflows/validate-phase.md +10 -6
  395. package/sdd/workflows/verify-phase.md +307 -18
  396. package/sdd/workflows/verify-work.md +153 -10
  397. package/sdk/dist/cli-transport.d.ts +19 -0
  398. package/sdk/dist/cli-transport.d.ts.map +1 -0
  399. package/sdk/dist/cli-transport.js +104 -0
  400. package/sdk/dist/cli-transport.js.map +1 -0
  401. package/sdk/dist/cli.d.ts +46 -0
  402. package/sdk/dist/cli.d.ts.map +1 -0
  403. package/sdk/dist/cli.js +511 -0
  404. package/sdk/dist/cli.js.map +1 -0
  405. package/sdk/dist/config.d.ts +84 -0
  406. package/sdk/dist/config.d.ts.map +1 -0
  407. package/sdk/dist/config.js +135 -0
  408. package/sdk/dist/config.js.map +1 -0
  409. package/sdk/dist/context-engine.d.ts +49 -0
  410. package/sdk/dist/context-engine.d.ts.map +1 -0
  411. package/sdk/dist/context-engine.js +142 -0
  412. package/sdk/dist/context-engine.js.map +1 -0
  413. package/sdk/dist/context-truncation.d.ts +33 -0
  414. package/sdk/dist/context-truncation.d.ts.map +1 -0
  415. package/sdk/dist/context-truncation.js +197 -0
  416. package/sdk/dist/context-truncation.js.map +1 -0
  417. package/sdk/dist/errors.d.ts +46 -0
  418. package/sdk/dist/errors.d.ts.map +1 -0
  419. package/sdk/dist/errors.js +64 -0
  420. package/sdk/dist/errors.js.map +1 -0
  421. package/sdk/dist/event-stream.d.ts +53 -0
  422. package/sdk/dist/event-stream.d.ts.map +1 -0
  423. package/sdk/dist/event-stream.js +321 -0
  424. package/sdk/dist/event-stream.js.map +1 -0
  425. package/sdk/dist/golden/capture.d.ts +15 -0
  426. package/sdk/dist/golden/capture.d.ts.map +1 -0
  427. package/sdk/dist/golden/capture.js +67 -0
  428. package/sdk/dist/golden/capture.js.map +1 -0
  429. package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
  430. package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
  431. package/sdk/dist/golden/golden-integration-covered.js +30 -0
  432. package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
  433. package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
  434. package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
  435. package/sdk/dist/golden/golden-mutation-covered.js +17 -0
  436. package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
  437. package/sdk/dist/golden/golden-policy.d.ts +10 -0
  438. package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
  439. package/sdk/dist/golden/golden-policy.js +98 -0
  440. package/sdk/dist/golden/golden-policy.js.map +1 -0
  441. package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
  442. package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
  443. package/sdk/dist/golden/init-golden-normalize.js +14 -0
  444. package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
  445. package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
  446. package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
  447. package/sdk/dist/golden/read-only-golden-rows.js +67 -0
  448. package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
  449. package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
  450. package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
  451. package/sdk/dist/golden/registry-canonical-commands.js +30 -0
  452. package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
  453. package/sdk/dist/index.d.ts +125 -0
  454. package/sdk/dist/index.d.ts.map +1 -0
  455. package/sdk/dist/index.js +298 -0
  456. package/sdk/dist/index.js.map +1 -0
  457. package/sdk/dist/init-runner.d.ts +90 -0
  458. package/sdk/dist/init-runner.d.ts.map +1 -0
  459. package/sdk/dist/init-runner.js +613 -0
  460. package/sdk/dist/init-runner.js.map +1 -0
  461. package/sdk/dist/logger.d.ts +50 -0
  462. package/sdk/dist/logger.d.ts.map +1 -0
  463. package/sdk/dist/logger.js +70 -0
  464. package/sdk/dist/logger.js.map +1 -0
  465. package/sdk/dist/model-catalog.d.ts +31 -0
  466. package/sdk/dist/model-catalog.d.ts.map +1 -0
  467. package/sdk/dist/model-catalog.js +31 -0
  468. package/sdk/dist/model-catalog.js.map +1 -0
  469. package/sdk/dist/phase-prompt.d.ts +72 -0
  470. package/sdk/dist/phase-prompt.d.ts.map +1 -0
  471. package/sdk/dist/phase-prompt.js +213 -0
  472. package/sdk/dist/phase-prompt.js.map +1 -0
  473. package/sdk/dist/phase-runner.d.ts +145 -0
  474. package/sdk/dist/phase-runner.d.ts.map +1 -0
  475. package/sdk/dist/phase-runner.js +1206 -0
  476. package/sdk/dist/phase-runner.js.map +1 -0
  477. package/sdk/dist/plan-parser.d.ts +55 -0
  478. package/sdk/dist/plan-parser.d.ts.map +1 -0
  479. package/sdk/dist/plan-parser.js +389 -0
  480. package/sdk/dist/plan-parser.js.map +1 -0
  481. package/sdk/dist/planning-journal.d.ts +64 -0
  482. package/sdk/dist/planning-journal.d.ts.map +1 -0
  483. package/sdk/dist/planning-journal.js +88 -0
  484. package/sdk/dist/planning-journal.js.map +1 -0
  485. package/sdk/dist/planning-runtime.d.ts +67 -0
  486. package/sdk/dist/planning-runtime.d.ts.map +1 -0
  487. package/sdk/dist/planning-runtime.js +58 -0
  488. package/sdk/dist/planning-runtime.js.map +1 -0
  489. package/sdk/dist/prompt-builder.d.ts +44 -0
  490. package/sdk/dist/prompt-builder.d.ts.map +1 -0
  491. package/sdk/dist/prompt-builder.js +180 -0
  492. package/sdk/dist/prompt-builder.js.map +1 -0
  493. package/sdk/dist/prompt-sanitizer.d.ts +35 -0
  494. package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
  495. package/sdk/dist/prompt-sanitizer.js +101 -0
  496. package/sdk/dist/prompt-sanitizer.js.map +1 -0
  497. package/sdk/dist/query/active-workstream-store.d.ts +7 -0
  498. package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
  499. package/sdk/dist/query/active-workstream-store.js +56 -0
  500. package/sdk/dist/query/active-workstream-store.js.map +1 -0
  501. package/sdk/dist/query/agent-failure-classifier.d.ts +38 -0
  502. package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
  503. package/sdk/dist/query/agent-failure-classifier.js +83 -0
  504. package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
  505. package/sdk/dist/query/audit-open.d.ts +46 -0
  506. package/sdk/dist/query/audit-open.d.ts.map +1 -0
  507. package/sdk/dist/query/audit-open.js +662 -0
  508. package/sdk/dist/query/audit-open.js.map +1 -0
  509. package/sdk/dist/query/check-auto-mode.d.ts +13 -0
  510. package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
  511. package/sdk/dist/query/check-auto-mode.js +40 -0
  512. package/sdk/dist/query/check-auto-mode.js.map +1 -0
  513. package/sdk/dist/query/check-completion.d.ts +10 -0
  514. package/sdk/dist/query/check-completion.d.ts.map +1 -0
  515. package/sdk/dist/query/check-completion.js +157 -0
  516. package/sdk/dist/query/check-completion.js.map +1 -0
  517. package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
  518. package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
  519. package/sdk/dist/query/check-decision-coverage.js +472 -0
  520. package/sdk/dist/query/check-decision-coverage.js.map +1 -0
  521. package/sdk/dist/query/check-gates.d.ts +10 -0
  522. package/sdk/dist/query/check-gates.d.ts.map +1 -0
  523. package/sdk/dist/query/check-gates.js +89 -0
  524. package/sdk/dist/query/check-gates.js.map +1 -0
  525. package/sdk/dist/query/check-ship-ready.d.ts +10 -0
  526. package/sdk/dist/query/check-ship-ready.d.ts.map +1 -0
  527. package/sdk/dist/query/check-ship-ready.js +93 -0
  528. package/sdk/dist/query/check-ship-ready.js.map +1 -0
  529. package/sdk/dist/query/check-verification-status.d.ts +10 -0
  530. package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
  531. package/sdk/dist/query/check-verification-status.js +142 -0
  532. package/sdk/dist/query/check-verification-status.js.map +1 -0
  533. package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
  534. package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
  535. package/sdk/dist/query/command-aliases.generated.js +135 -0
  536. package/sdk/dist/query/command-aliases.generated.js.map +1 -0
  537. package/sdk/dist/query/command-catalog.d.ts +9 -0
  538. package/sdk/dist/query/command-catalog.d.ts.map +1 -0
  539. package/sdk/dist/query/command-catalog.js +17 -0
  540. package/sdk/dist/query/command-catalog.js.map +1 -0
  541. package/sdk/dist/query/command-definition.d.ts +19 -0
  542. package/sdk/dist/query/command-definition.d.ts.map +1 -0
  543. package/sdk/dist/query/command-definition.js +44 -0
  544. package/sdk/dist/query/command-definition.js.map +1 -0
  545. package/sdk/dist/query/command-family-handlers.d.ts +3 -0
  546. package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
  547. package/sdk/dist/query/command-family-handlers.js +94 -0
  548. package/sdk/dist/query/command-family-handlers.js.map +1 -0
  549. package/sdk/dist/query/command-manifest.d.ts +2 -0
  550. package/sdk/dist/query/command-manifest.d.ts.map +1 -0
  551. package/sdk/dist/query/command-manifest.init.d.ts +6 -0
  552. package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
  553. package/sdk/dist/query/command-manifest.init.js +23 -0
  554. package/sdk/dist/query/command-manifest.init.js.map +1 -0
  555. package/sdk/dist/query/command-manifest.js +17 -0
  556. package/sdk/dist/query/command-manifest.js.map +1 -0
  557. package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
  558. package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
  559. package/sdk/dist/query/command-manifest.non-family.js +59 -0
  560. package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
  561. package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
  562. package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
  563. package/sdk/dist/query/command-manifest.phase.js +15 -0
  564. package/sdk/dist/query/command-manifest.phase.js.map +1 -0
  565. package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
  566. package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
  567. package/sdk/dist/query/command-manifest.phases.js +10 -0
  568. package/sdk/dist/query/command-manifest.phases.js.map +1 -0
  569. package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
  570. package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
  571. package/sdk/dist/query/command-manifest.roadmap.js +10 -0
  572. package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
  573. package/sdk/dist/query/command-manifest.state.d.ts +9 -0
  574. package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
  575. package/sdk/dist/query/command-manifest.state.js +30 -0
  576. package/sdk/dist/query/command-manifest.state.js.map +1 -0
  577. package/sdk/dist/query/command-manifest.types.d.ts +12 -0
  578. package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
  579. package/sdk/dist/query/command-manifest.types.js +2 -0
  580. package/sdk/dist/query/command-manifest.types.js.map +1 -0
  581. package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
  582. package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
  583. package/sdk/dist/query/command-manifest.validate.js +10 -0
  584. package/sdk/dist/query/command-manifest.validate.js.map +1 -0
  585. package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
  586. package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
  587. package/sdk/dist/query/command-manifest.verify.js +14 -0
  588. package/sdk/dist/query/command-manifest.verify.js.map +1 -0
  589. package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
  590. package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
  591. package/sdk/dist/query/command-static-catalog-domain.js +116 -0
  592. package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
  593. package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
  594. package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
  595. package/sdk/dist/query/command-static-catalog-foundation.js +98 -0
  596. package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
  597. package/sdk/dist/query/command-topology.d.ts +32 -0
  598. package/sdk/dist/query/command-topology.d.ts.map +1 -0
  599. package/sdk/dist/query/command-topology.js +66 -0
  600. package/sdk/dist/query/command-topology.js.map +1 -0
  601. package/sdk/dist/query/commands-list.d.ts +14 -0
  602. package/sdk/dist/query/commands-list.d.ts.map +1 -0
  603. package/sdk/dist/query/commands-list.js +18 -0
  604. package/sdk/dist/query/commands-list.js.map +1 -0
  605. package/sdk/dist/query/commit.d.ts +79 -0
  606. package/sdk/dist/query/commit.d.ts.map +1 -0
  607. package/sdk/dist/query/commit.js +340 -0
  608. package/sdk/dist/query/commit.js.map +1 -0
  609. package/sdk/dist/query/config-gates.d.ts +12 -0
  610. package/sdk/dist/query/config-gates.d.ts.map +1 -0
  611. package/sdk/dist/query/config-gates.js +66 -0
  612. package/sdk/dist/query/config-gates.js.map +1 -0
  613. package/sdk/dist/query/config-mutation.d.ts +86 -0
  614. package/sdk/dist/query/config-mutation.d.ts.map +1 -0
  615. package/sdk/dist/query/config-mutation.js +518 -0
  616. package/sdk/dist/query/config-mutation.js.map +1 -0
  617. package/sdk/dist/query/config-query.d.ts +57 -0
  618. package/sdk/dist/query/config-query.d.ts.map +1 -0
  619. package/sdk/dist/query/config-query.js +208 -0
  620. package/sdk/dist/query/config-query.js.map +1 -0
  621. package/sdk/dist/query/config-schema.d.ts +36 -0
  622. package/sdk/dist/query/config-schema.d.ts.map +1 -0
  623. package/sdk/dist/query/config-schema.js +147 -0
  624. package/sdk/dist/query/config-schema.js.map +1 -0
  625. package/sdk/dist/query/decisions.d.ts +58 -0
  626. package/sdk/dist/query/decisions.d.ts.map +1 -0
  627. package/sdk/dist/query/decisions.js +161 -0
  628. package/sdk/dist/query/decisions.js.map +1 -0
  629. package/sdk/dist/query/detect-custom-files.d.ts +11 -0
  630. package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
  631. package/sdk/dist/query/detect-custom-files.js +89 -0
  632. package/sdk/dist/query/detect-custom-files.js.map +1 -0
  633. package/sdk/dist/query/detect-phase-type.d.ts +9 -0
  634. package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
  635. package/sdk/dist/query/detect-phase-type.js +124 -0
  636. package/sdk/dist/query/detect-phase-type.js.map +1 -0
  637. package/sdk/dist/query/docs-init.d.ts +26 -0
  638. package/sdk/dist/query/docs-init.d.ts.map +1 -0
  639. package/sdk/dist/query/docs-init.js +231 -0
  640. package/sdk/dist/query/docs-init.js.map +1 -0
  641. package/sdk/dist/query/fallow-audit.d.ts +44 -0
  642. package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
  643. package/sdk/dist/query/fallow-audit.js +44 -0
  644. package/sdk/dist/query/fallow-audit.js.map +1 -0
  645. package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
  646. package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
  647. package/sdk/dist/query/frontmatter-mutation.js +317 -0
  648. package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
  649. package/sdk/dist/query/frontmatter.d.ts +93 -0
  650. package/sdk/dist/query/frontmatter.d.ts.map +1 -0
  651. package/sdk/dist/query/frontmatter.js +365 -0
  652. package/sdk/dist/query/frontmatter.js.map +1 -0
  653. package/sdk/dist/query/helpers.d.ts +191 -0
  654. package/sdk/dist/query/helpers.d.ts.map +1 -0
  655. package/sdk/dist/query/helpers.js +613 -0
  656. package/sdk/dist/query/helpers.js.map +1 -0
  657. package/sdk/dist/query/index.d.ts +8 -0
  658. package/sdk/dist/query/index.d.ts.map +1 -0
  659. package/sdk/dist/query/index.js +6 -0
  660. package/sdk/dist/query/index.js.map +1 -0
  661. package/sdk/dist/query/init-complex.d.ts +47 -0
  662. package/sdk/dist/query/init-complex.d.ts.map +1 -0
  663. package/sdk/dist/query/init-complex.js +718 -0
  664. package/sdk/dist/query/init-complex.js.map +1 -0
  665. package/sdk/dist/query/init.d.ts +106 -0
  666. package/sdk/dist/query/init.d.ts.map +1 -0
  667. package/sdk/dist/query/init.js +1159 -0
  668. package/sdk/dist/query/init.js.map +1 -0
  669. package/sdk/dist/query/intel.d.ts +43 -0
  670. package/sdk/dist/query/intel.d.ts.map +1 -0
  671. package/sdk/dist/query/intel.js +416 -0
  672. package/sdk/dist/query/intel.js.map +1 -0
  673. package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
  674. package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
  675. package/sdk/dist/query/mutation-event-decorator.js +28 -0
  676. package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
  677. package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
  678. package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
  679. package/sdk/dist/query/mutation-event-mapper.js +70 -0
  680. package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
  681. package/sdk/dist/query/mvp.d.ts +113 -0
  682. package/sdk/dist/query/mvp.d.ts.map +1 -0
  683. package/sdk/dist/query/mvp.js +225 -0
  684. package/sdk/dist/query/mvp.js.map +1 -0
  685. package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
  686. package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
  687. package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
  688. package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
  689. package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
  690. package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
  691. package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
  692. package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
  693. package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
  694. package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
  695. package/sdk/dist/query/phase-lifecycle.js +1486 -0
  696. package/sdk/dist/query/phase-lifecycle.js.map +1 -0
  697. package/sdk/dist/query/phase-list-queries.d.ts +18 -0
  698. package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
  699. package/sdk/dist/query/phase-list-queries.js +129 -0
  700. package/sdk/dist/query/phase-list-queries.js.map +1 -0
  701. package/sdk/dist/query/phase-ready.d.ts +9 -0
  702. package/sdk/dist/query/phase-ready.d.ts.map +1 -0
  703. package/sdk/dist/query/phase-ready.js +132 -0
  704. package/sdk/dist/query/phase-ready.js.map +1 -0
  705. package/sdk/dist/query/phase-roadmap-mutation.d.ts +13 -0
  706. package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
  707. package/sdk/dist/query/phase-roadmap-mutation.js +65 -0
  708. package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
  709. package/sdk/dist/query/phase.d.ts +48 -0
  710. package/sdk/dist/query/phase.d.ts.map +1 -0
  711. package/sdk/dist/query/phase.js +451 -0
  712. package/sdk/dist/query/phase.js.map +1 -0
  713. package/sdk/dist/query/pipeline.d.ts +53 -0
  714. package/sdk/dist/query/pipeline.d.ts.map +1 -0
  715. package/sdk/dist/query/pipeline.js +198 -0
  716. package/sdk/dist/query/pipeline.js.map +1 -0
  717. package/sdk/dist/query/plan-scan.d.ts +14 -0
  718. package/sdk/dist/query/plan-scan.d.ts.map +1 -0
  719. package/sdk/dist/query/plan-scan.js +70 -0
  720. package/sdk/dist/query/plan-scan.js.map +1 -0
  721. package/sdk/dist/query/plan-task-structure.d.ts +9 -0
  722. package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
  723. package/sdk/dist/query/plan-task-structure.js +59 -0
  724. package/sdk/dist/query/plan-task-structure.js.map +1 -0
  725. package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
  726. package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
  727. package/sdk/dist/query/profile-extract-messages.js +195 -0
  728. package/sdk/dist/query/profile-extract-messages.js.map +1 -0
  729. package/sdk/dist/query/profile-output.d.ts +11 -0
  730. package/sdk/dist/query/profile-output.d.ts.map +1 -0
  731. package/sdk/dist/query/profile-output.js +873 -0
  732. package/sdk/dist/query/profile-output.js.map +1 -0
  733. package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
  734. package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
  735. package/sdk/dist/query/profile-questionnaire-data.js +171 -0
  736. package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
  737. package/sdk/dist/query/profile-sample.d.ts +22 -0
  738. package/sdk/dist/query/profile-sample.d.ts.map +1 -0
  739. package/sdk/dist/query/profile-sample.js +136 -0
  740. package/sdk/dist/query/profile-sample.js.map +1 -0
  741. package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
  742. package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
  743. package/sdk/dist/query/profile-scan-sessions.js +137 -0
  744. package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
  745. package/sdk/dist/query/profile.d.ts +61 -0
  746. package/sdk/dist/query/profile.d.ts.map +1 -0
  747. package/sdk/dist/query/profile.js +307 -0
  748. package/sdk/dist/query/profile.js.map +1 -0
  749. package/sdk/dist/query/progress.d.ts +77 -0
  750. package/sdk/dist/query/progress.d.ts.map +1 -0
  751. package/sdk/dist/query/progress.js +481 -0
  752. package/sdk/dist/query/progress.js.map +1 -0
  753. package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
  754. package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
  755. package/sdk/dist/query/query-cli-adapter.js +32 -0
  756. package/sdk/dist/query/query-cli-adapter.js.map +1 -0
  757. package/sdk/dist/query/query-cli-output.d.ts +9 -0
  758. package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
  759. package/sdk/dist/query/query-cli-output.js +28 -0
  760. package/sdk/dist/query/query-cli-output.js.map +1 -0
  761. package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
  762. package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
  763. package/sdk/dist/query/query-command-diagnosis.js +6 -0
  764. package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
  765. package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
  766. package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
  767. package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
  768. package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
  769. package/sdk/dist/query/query-command-semantics.d.ts +7 -0
  770. package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
  771. package/sdk/dist/query/query-command-semantics.js +7 -0
  772. package/sdk/dist/query/query-command-semantics.js.map +1 -0
  773. package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
  774. package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
  775. package/sdk/dist/query/query-dispatch-contract.js +2 -0
  776. package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
  777. package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
  778. package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
  779. package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
  780. package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
  781. package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
  782. package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
  783. package/sdk/dist/query/query-dispatch-formatting.js +6 -0
  784. package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
  785. package/sdk/dist/query/query-dispatch-input-validation.d.ts +6 -0
  786. package/sdk/dist/query/query-dispatch-input-validation.d.ts.map +1 -0
  787. package/sdk/dist/query/query-dispatch-input-validation.js +6 -0
  788. package/sdk/dist/query/query-dispatch-input-validation.js.map +1 -0
  789. package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
  790. package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
  791. package/sdk/dist/query/query-dispatch-observability.js +7 -0
  792. package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
  793. package/sdk/dist/query/query-dispatch-plan.d.ts +6 -0
  794. package/sdk/dist/query/query-dispatch-plan.d.ts.map +1 -0
  795. package/sdk/dist/query/query-dispatch-plan.js +6 -0
  796. package/sdk/dist/query/query-dispatch-plan.js.map +1 -0
  797. package/sdk/dist/query/query-dispatch-result-builder.d.ts +6 -0
  798. package/sdk/dist/query/query-dispatch-result-builder.d.ts.map +1 -0
  799. package/sdk/dist/query/query-dispatch-result-builder.js +6 -0
  800. package/sdk/dist/query/query-dispatch-result-builder.js.map +1 -0
  801. package/sdk/dist/query/query-dispatch.d.ts +48 -0
  802. package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
  803. package/sdk/dist/query/query-dispatch.js +175 -0
  804. package/sdk/dist/query/query-dispatch.js.map +1 -0
  805. package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
  806. package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
  807. package/sdk/dist/query/query-error-details-schema.js +10 -0
  808. package/sdk/dist/query/query-error-details-schema.js.map +1 -0
  809. package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
  810. package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
  811. package/sdk/dist/query/query-error-taxonomy.js +74 -0
  812. package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
  813. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
  814. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
  815. package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
  816. package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
  817. package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
  818. package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
  819. package/sdk/dist/query/query-fallback-executor.js +31 -0
  820. package/sdk/dist/query/query-fallback-executor.js.map +1 -0
  821. package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
  822. package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
  823. package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
  824. package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
  825. package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
  826. package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
  827. package/sdk/dist/query/query-fallback-policy.js +7 -0
  828. package/sdk/dist/query/query-fallback-policy.js.map +1 -0
  829. package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
  830. package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
  831. package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
  832. package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
  833. package/sdk/dist/query/query-policy-capability.d.ts +10 -0
  834. package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
  835. package/sdk/dist/query/query-policy-capability.js +17 -0
  836. package/sdk/dist/query/query-policy-capability.js.map +1 -0
  837. package/sdk/dist/query/query-runtime-context.d.ts +19 -0
  838. package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
  839. package/sdk/dist/query/query-runtime-context.js +31 -0
  840. package/sdk/dist/query/query-runtime-context.js.map +1 -0
  841. package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
  842. package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
  843. package/sdk/dist/query/query-unknown-command-hints.js +6 -0
  844. package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
  845. package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
  846. package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
  847. package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
  848. package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
  849. package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
  850. package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
  851. package/sdk/dist/query/registry-assembly-invariants.js +77 -0
  852. package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
  853. package/sdk/dist/query/registry-assembly.d.ts +10 -0
  854. package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
  855. package/sdk/dist/query/registry-assembly.js +53 -0
  856. package/sdk/dist/query/registry-assembly.js.map +1 -0
  857. package/sdk/dist/query/registry.d.ts +90 -0
  858. package/sdk/dist/query/registry.d.ts.map +1 -0
  859. package/sdk/dist/query/registry.js +129 -0
  860. package/sdk/dist/query/registry.js.map +1 -0
  861. package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
  862. package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
  863. package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
  864. package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
  865. package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
  866. package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
  867. package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
  868. package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
  869. package/sdk/dist/query/roadmap.d.ts +137 -0
  870. package/sdk/dist/query/roadmap.d.ts.map +1 -0
  871. package/sdk/dist/query/roadmap.js +753 -0
  872. package/sdk/dist/query/roadmap.js.map +1 -0
  873. package/sdk/dist/query/route-next-action.d.ts +9 -0
  874. package/sdk/dist/query/route-next-action.d.ts.map +1 -0
  875. package/sdk/dist/query/route-next-action.js +318 -0
  876. package/sdk/dist/query/route-next-action.js.map +1 -0
  877. package/sdk/dist/query/schema-detect.d.ts +21 -0
  878. package/sdk/dist/query/schema-detect.d.ts.map +1 -0
  879. package/sdk/dist/query/schema-detect.js +146 -0
  880. package/sdk/dist/query/schema-detect.js.map +1 -0
  881. package/sdk/dist/query/secrets.d.ts +27 -0
  882. package/sdk/dist/query/secrets.d.ts.map +1 -0
  883. package/sdk/dist/query/secrets.js +42 -0
  884. package/sdk/dist/query/secrets.js.map +1 -0
  885. package/sdk/dist/query/skill-manifest.d.ts +50 -0
  886. package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
  887. package/sdk/dist/query/skill-manifest.js +171 -0
  888. package/sdk/dist/query/skill-manifest.js.map +1 -0
  889. package/sdk/dist/query/skills.d.ts +27 -0
  890. package/sdk/dist/query/skills.d.ts.map +1 -0
  891. package/sdk/dist/query/skills.js +137 -0
  892. package/sdk/dist/query/skills.js.map +1 -0
  893. package/sdk/dist/query/state-document.d.ts +14 -0
  894. package/sdk/dist/query/state-document.d.ts.map +1 -0
  895. package/sdk/dist/query/state-document.js +110 -0
  896. package/sdk/dist/query/state-document.js.map +1 -0
  897. package/sdk/dist/query/state-mutation.d.ts +224 -0
  898. package/sdk/dist/query/state-mutation.d.ts.map +1 -0
  899. package/sdk/dist/query/state-mutation.js +1539 -0
  900. package/sdk/dist/query/state-mutation.js.map +1 -0
  901. package/sdk/dist/query/state-project-load.d.ts +23 -0
  902. package/sdk/dist/query/state-project-load.d.ts.map +1 -0
  903. package/sdk/dist/query/state-project-load.js +75 -0
  904. package/sdk/dist/query/state-project-load.js.map +1 -0
  905. package/sdk/dist/query/state.d.ts +78 -0
  906. package/sdk/dist/query/state.d.ts.map +1 -0
  907. package/sdk/dist/query/state.js +430 -0
  908. package/sdk/dist/query/state.js.map +1 -0
  909. package/sdk/dist/query/summary.d.ts +18 -0
  910. package/sdk/dist/query/summary.d.ts.map +1 -0
  911. package/sdk/dist/query/summary.js +249 -0
  912. package/sdk/dist/query/summary.js.map +1 -0
  913. package/sdk/dist/query/template.d.ts +46 -0
  914. package/sdk/dist/query/template.d.ts.map +1 -0
  915. package/sdk/dist/query/template.js +210 -0
  916. package/sdk/dist/query/template.js.map +1 -0
  917. package/sdk/dist/query/uat.d.ts +34 -0
  918. package/sdk/dist/query/uat.d.ts.map +1 -0
  919. package/sdk/dist/query/uat.js +339 -0
  920. package/sdk/dist/query/uat.js.map +1 -0
  921. package/sdk/dist/query/utils.d.ts +59 -0
  922. package/sdk/dist/query/utils.d.ts.map +1 -0
  923. package/sdk/dist/query/utils.js +74 -0
  924. package/sdk/dist/query/utils.js.map +1 -0
  925. package/sdk/dist/query/validate.d.ts +67 -0
  926. package/sdk/dist/query/validate.d.ts.map +1 -0
  927. package/sdk/dist/query/validate.js +908 -0
  928. package/sdk/dist/query/validate.js.map +1 -0
  929. package/sdk/dist/query/verify.d.ts +110 -0
  930. package/sdk/dist/query/verify.d.ts.map +1 -0
  931. package/sdk/dist/query/verify.js +631 -0
  932. package/sdk/dist/query/verify.js.map +1 -0
  933. package/sdk/dist/query/websearch.d.ts +24 -0
  934. package/sdk/dist/query/websearch.d.ts.map +1 -0
  935. package/sdk/dist/query/websearch.js +68 -0
  936. package/sdk/dist/query/websearch.js.map +1 -0
  937. package/sdk/dist/query/workspace.d.ts +62 -0
  938. package/sdk/dist/query/workspace.d.ts.map +1 -0
  939. package/sdk/dist/query/workspace.js +104 -0
  940. package/sdk/dist/query/workspace.js.map +1 -0
  941. package/sdk/dist/query/workstream-inventory.d.ts +52 -0
  942. package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
  943. package/sdk/dist/query/workstream-inventory.js +141 -0
  944. package/sdk/dist/query/workstream-inventory.js.map +1 -0
  945. package/sdk/dist/query/workstream.d.ts +35 -0
  946. package/sdk/dist/query/workstream.d.ts.map +1 -0
  947. package/sdk/dist/query/workstream.js +298 -0
  948. package/sdk/dist/query/workstream.js.map +1 -0
  949. package/sdk/dist/query/worktree.d.ts +3 -0
  950. package/sdk/dist/query/worktree.d.ts.map +1 -0
  951. package/sdk/dist/query/worktree.js +36 -0
  952. package/sdk/dist/query/worktree.js.map +1 -0
  953. package/sdk/dist/query-command-executor.d.ts +22 -0
  954. package/sdk/dist/query-command-executor.d.ts.map +1 -0
  955. package/sdk/dist/query-command-executor.js +22 -0
  956. package/sdk/dist/query-command-executor.js.map +1 -0
  957. package/sdk/dist/query-execution-policy.d.ts +24 -0
  958. package/sdk/dist/query-execution-policy.d.ts.map +1 -0
  959. package/sdk/dist/query-execution-policy.js +27 -0
  960. package/sdk/dist/query-execution-policy.js.map +1 -0
  961. package/sdk/dist/query-failure-classification.d.ts +9 -0
  962. package/sdk/dist/query-failure-classification.d.ts.map +1 -0
  963. package/sdk/dist/query-failure-classification.js +32 -0
  964. package/sdk/dist/query-failure-classification.js.map +1 -0
  965. package/sdk/dist/query-hotpath-methods.d.ts +19 -0
  966. package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
  967. package/sdk/dist/query-hotpath-methods.js +34 -0
  968. package/sdk/dist/query-hotpath-methods.js.map +1 -0
  969. package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
  970. package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
  971. package/sdk/dist/query-native-direct-adapter.js +52 -0
  972. package/sdk/dist/query-native-direct-adapter.js.map +1 -0
  973. package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
  974. package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
  975. package/sdk/dist/query-native-hotpath-adapter.js +32 -0
  976. package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
  977. package/sdk/dist/query-raw-output-projection.d.ts +6 -0
  978. package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
  979. package/sdk/dist/query-raw-output-projection.js +67 -0
  980. package/sdk/dist/query-raw-output-projection.js.map +1 -0
  981. package/sdk/dist/query-runtime-bridge.d.ts +61 -0
  982. package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
  983. package/sdk/dist/query-runtime-bridge.js +144 -0
  984. package/sdk/dist/query-runtime-bridge.js.map +1 -0
  985. package/sdk/dist/query-sdd-tools-path.d.ts +2 -0
  986. package/sdk/dist/query-sdd-tools-path.d.ts.map +1 -0
  987. package/sdk/dist/query-sdd-tools-path.js +2 -0
  988. package/sdk/dist/query-sdd-tools-path.js.map +1 -0
  989. package/sdk/dist/query-sdd-tools-runtime.d.ts +20 -0
  990. package/sdk/dist/query-sdd-tools-runtime.d.ts.map +1 -0
  991. package/sdk/dist/query-sdd-tools-runtime.js +47 -0
  992. package/sdk/dist/query-sdd-tools-runtime.js.map +1 -0
  993. package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
  994. package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
  995. package/sdk/dist/query-subprocess-adapter.js +92 -0
  996. package/sdk/dist/query-subprocess-adapter.js.map +1 -0
  997. package/sdk/dist/query-tools-error-factory.d.ts +16 -0
  998. package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
  999. package/sdk/dist/query-tools-error-factory.js +33 -0
  1000. package/sdk/dist/query-tools-error-factory.js.map +1 -0
  1001. package/sdk/dist/research-gate.d.ts +24 -0
  1002. package/sdk/dist/research-gate.d.ts.map +1 -0
  1003. package/sdk/dist/research-gate.js +70 -0
  1004. package/sdk/dist/research-gate.js.map +1 -0
  1005. package/sdk/dist/runtime-gate.d.ts +14 -0
  1006. package/sdk/dist/runtime-gate.d.ts.map +1 -0
  1007. package/sdk/dist/runtime-gate.js +48 -0
  1008. package/sdk/dist/runtime-gate.js.map +1 -0
  1009. package/sdk/dist/sdd-tools-error.d.ts +23 -0
  1010. package/sdk/dist/sdd-tools-error.d.ts.map +1 -0
  1011. package/sdk/dist/sdd-tools-error.js +29 -0
  1012. package/sdk/dist/sdd-tools-error.js.map +1 -0
  1013. package/sdk/dist/sdd-tools.d.ts +97 -0
  1014. package/sdk/dist/sdd-tools.d.ts.map +1 -0
  1015. package/sdk/dist/sdd-tools.js +168 -0
  1016. package/sdk/dist/sdd-tools.js.map +1 -0
  1017. package/sdk/dist/sdd-transport-policy.d.ts +10 -0
  1018. package/sdk/dist/sdd-transport-policy.d.ts.map +1 -0
  1019. package/sdk/dist/sdd-transport-policy.js +32 -0
  1020. package/sdk/dist/sdd-transport-policy.js.map +1 -0
  1021. package/sdk/dist/sdd-transport.d.ts +39 -0
  1022. package/sdk/dist/sdd-transport.d.ts.map +1 -0
  1023. package/sdk/dist/sdd-transport.js +78 -0
  1024. package/sdk/dist/sdd-transport.js.map +1 -0
  1025. package/sdk/dist/sdk-package-compatibility.d.ts +38 -0
  1026. package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
  1027. package/sdk/dist/sdk-package-compatibility.js +90 -0
  1028. package/sdk/dist/sdk-package-compatibility.js.map +1 -0
  1029. package/sdk/dist/session-runner.d.ts +40 -0
  1030. package/sdk/dist/session-runner.d.ts.map +1 -0
  1031. package/sdk/dist/session-runner.js +274 -0
  1032. package/sdk/dist/session-runner.js.map +1 -0
  1033. package/sdk/dist/tool-scoping.d.ts +31 -0
  1034. package/sdk/dist/tool-scoping.d.ts.map +1 -0
  1035. package/sdk/dist/tool-scoping.js +54 -0
  1036. package/sdk/dist/tool-scoping.js.map +1 -0
  1037. package/sdk/dist/types.d.ts +794 -0
  1038. package/sdk/dist/types.d.ts.map +1 -0
  1039. package/sdk/dist/types.js +77 -0
  1040. package/sdk/dist/types.js.map +1 -0
  1041. package/sdk/dist/workstream-name-policy.d.ts +13 -0
  1042. package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
  1043. package/sdk/dist/workstream-name-policy.js +24 -0
  1044. package/sdk/dist/workstream-name-policy.js.map +1 -0
  1045. package/sdk/dist/workstream-utils.d.ts +15 -0
  1046. package/sdk/dist/workstream-utils.d.ts.map +1 -0
  1047. package/sdk/dist/workstream-utils.js +21 -0
  1048. package/sdk/dist/workstream-utils.js.map +1 -0
  1049. package/sdk/dist/ws-transport.d.ts +32 -0
  1050. package/sdk/dist/ws-transport.d.ts.map +1 -0
  1051. package/sdk/dist/ws-transport.js +84 -0
  1052. package/sdk/dist/ws-transport.js.map +1 -0
  1053. package/sdk/package-lock.json +2502 -0
  1054. package/sdk/package.json +57 -0
  1055. package/sdk/prompts/templates/project.md +186 -0
  1056. package/sdk/prompts/templates/requirements.md +231 -0
  1057. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  1058. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  1059. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  1060. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  1061. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  1062. package/sdk/prompts/templates/roadmap.md +202 -0
  1063. package/sdk/prompts/templates/state.md +175 -0
  1064. package/sdk/shared/model-catalog.json +122 -0
  1065. package/sdk/src/assembled-prompts.test.ts +349 -0
  1066. package/sdk/src/bug-3591-sddtools-runtime-workstream.test.ts +179 -0
  1067. package/sdk/src/cli-transport.test.ts +388 -0
  1068. package/sdk/src/cli-transport.ts +130 -0
  1069. package/sdk/src/cli.test.ts +426 -0
  1070. package/sdk/src/cli.ts +589 -0
  1071. package/sdk/src/config.test.ts +271 -0
  1072. package/sdk/src/config.ts +218 -0
  1073. package/sdk/src/context-engine.test.ts +295 -0
  1074. package/sdk/src/context-engine.ts +170 -0
  1075. package/sdk/src/context-truncation.test.ts +163 -0
  1076. package/sdk/src/context-truncation.ts +233 -0
  1077. package/sdk/src/e2e.integration.test.ts +181 -0
  1078. package/sdk/src/errors.ts +72 -0
  1079. package/sdk/src/event-stream.test.ts +661 -0
  1080. package/sdk/src/event-stream.ts +441 -0
  1081. package/sdk/src/golden/capture.ts +95 -0
  1082. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  1083. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  1084. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  1085. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  1086. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  1087. package/sdk/src/golden/golden-mutation-covered.ts +17 -0
  1088. package/sdk/src/golden/golden-policy.test.ts +8 -0
  1089. package/sdk/src/golden/golden-policy.ts +120 -0
  1090. package/sdk/src/golden/golden.integration.test.ts +677 -0
  1091. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  1092. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  1093. package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
  1094. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  1095. package/sdk/src/index.ts +352 -0
  1096. package/sdk/src/init-e2e.integration.test.ts +138 -0
  1097. package/sdk/src/init-runner.test.ts +740 -0
  1098. package/sdk/src/init-runner.ts +734 -0
  1099. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  1100. package/sdk/src/logger.test.ts +149 -0
  1101. package/sdk/src/logger.ts +113 -0
  1102. package/sdk/src/milestone-runner.test.ts +421 -0
  1103. package/sdk/src/model-catalog.ts +70 -0
  1104. package/sdk/src/phase-prompt.test.ts +535 -0
  1105. package/sdk/src/phase-prompt.ts +259 -0
  1106. package/sdk/src/phase-runner-types.test.ts +421 -0
  1107. package/sdk/src/phase-runner.integration.test.ts +377 -0
  1108. package/sdk/src/phase-runner.test.ts +2720 -0
  1109. package/sdk/src/phase-runner.ts +1442 -0
  1110. package/sdk/src/plan-parser.test.ts +579 -0
  1111. package/sdk/src/plan-parser.ts +431 -0
  1112. package/sdk/src/planning-journal.test.ts +70 -0
  1113. package/sdk/src/planning-journal.ts +153 -0
  1114. package/sdk/src/planning-runtime.test.ts +29 -0
  1115. package/sdk/src/planning-runtime.ts +100 -0
  1116. package/sdk/src/prompt-builder.test.ts +318 -0
  1117. package/sdk/src/prompt-builder.ts +218 -0
  1118. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  1119. package/sdk/src/prompt-sanitizer.ts +116 -0
  1120. package/sdk/src/query/QUERY-HANDLERS.md +349 -0
  1121. package/sdk/src/query/active-workstream-store.ts +50 -0
  1122. package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
  1123. package/sdk/src/query/agent-failure-classifier.ts +105 -0
  1124. package/sdk/src/query/audit-open.ts +722 -0
  1125. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  1126. package/sdk/src/query/check-auto-mode.ts +49 -0
  1127. package/sdk/src/query/check-completion.test.ts +113 -0
  1128. package/sdk/src/query/check-completion.ts +182 -0
  1129. package/sdk/src/query/check-decision-coverage.test.ts +519 -0
  1130. package/sdk/src/query/check-decision-coverage.ts +554 -0
  1131. package/sdk/src/query/check-gates.test.ts +103 -0
  1132. package/sdk/src/query/check-gates.ts +112 -0
  1133. package/sdk/src/query/check-ship-ready.test.ts +111 -0
  1134. package/sdk/src/query/check-ship-ready.ts +104 -0
  1135. package/sdk/src/query/check-verification-status.test.ts +143 -0
  1136. package/sdk/src/query/check-verification-status.ts +160 -0
  1137. package/sdk/src/query/command-aliases.generated.ts +156 -0
  1138. package/sdk/src/query/command-catalog.ts +31 -0
  1139. package/sdk/src/query/command-definition.test.ts +47 -0
  1140. package/sdk/src/query/command-definition.ts +70 -0
  1141. package/sdk/src/query/command-family-handlers.ts +117 -0
  1142. package/sdk/src/query/command-manifest.init.ts +24 -0
  1143. package/sdk/src/query/command-manifest.non-family.ts +85 -0
  1144. package/sdk/src/query/command-manifest.phase.ts +16 -0
  1145. package/sdk/src/query/command-manifest.phases.ts +11 -0
  1146. package/sdk/src/query/command-manifest.roadmap.ts +11 -0
  1147. package/sdk/src/query/command-manifest.state.ts +31 -0
  1148. package/sdk/src/query/command-manifest.ts +17 -0
  1149. package/sdk/src/query/command-manifest.types.ts +13 -0
  1150. package/sdk/src/query/command-manifest.validate.ts +11 -0
  1151. package/sdk/src/query/command-manifest.verify.ts +15 -0
  1152. package/sdk/src/query/command-resolution.test.ts +70 -0
  1153. package/sdk/src/query/command-seam-coverage.test.ts +118 -0
  1154. package/sdk/src/query/command-static-catalog-domain.ts +117 -0
  1155. package/sdk/src/query/command-static-catalog-foundation.ts +103 -0
  1156. package/sdk/src/query/command-topology.test.ts +28 -0
  1157. package/sdk/src/query/command-topology.ts +114 -0
  1158. package/sdk/src/query/commands-list.test.ts +36 -0
  1159. package/sdk/src/query/commands-list.ts +19 -0
  1160. package/sdk/src/query/commit.test.ts +485 -0
  1161. package/sdk/src/query/commit.ts +383 -0
  1162. package/sdk/src/query/config-gates.test.ts +89 -0
  1163. package/sdk/src/query/config-gates.ts +69 -0
  1164. package/sdk/src/query/config-mutation.test.ts +598 -0
  1165. package/sdk/src/query/config-mutation.ts +575 -0
  1166. package/sdk/src/query/config-query.test.ts +367 -0
  1167. package/sdk/src/query/config-query.ts +244 -0
  1168. package/sdk/src/query/config-schema.ts +159 -0
  1169. package/sdk/src/query/decisions.test.ts +215 -0
  1170. package/sdk/src/query/decisions.ts +192 -0
  1171. package/sdk/src/query/decomposed-handlers.test.ts +431 -0
  1172. package/sdk/src/query/detect-custom-files.test.ts +115 -0
  1173. package/sdk/src/query/detect-custom-files.ts +96 -0
  1174. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  1175. package/sdk/src/query/detect-phase-type.ts +141 -0
  1176. package/sdk/src/query/docs-init.ts +258 -0
  1177. package/sdk/src/query/fallow-audit.ts +88 -0
  1178. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  1179. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  1180. package/sdk/src/query/frontmatter-mutation.ts +343 -0
  1181. package/sdk/src/query/frontmatter.test.ts +326 -0
  1182. package/sdk/src/query/frontmatter.ts +395 -0
  1183. package/sdk/src/query/helpers.test.ts +615 -0
  1184. package/sdk/src/query/helpers.ts +646 -0
  1185. package/sdk/src/query/index-thin-seam.test.ts +16 -0
  1186. package/sdk/src/query/index.ts +9 -0
  1187. package/sdk/src/query/init-complex.test.ts +616 -0
  1188. package/sdk/src/query/init-complex.ts +799 -0
  1189. package/sdk/src/query/init-progress-precedence.test.ts +177 -0
  1190. package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
  1191. package/sdk/src/query/init.test.ts +792 -0
  1192. package/sdk/src/query/init.ts +1262 -0
  1193. package/sdk/src/query/intel.test.ts +90 -0
  1194. package/sdk/src/query/intel.ts +404 -0
  1195. package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
  1196. package/sdk/src/query/mutation-event-decorator.ts +37 -0
  1197. package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
  1198. package/sdk/src/query/mutation-event-mapper.ts +102 -0
  1199. package/sdk/src/query/mvp.test.ts +335 -0
  1200. package/sdk/src/query/mvp.ts +292 -0
  1201. package/sdk/src/query/normalize-query-command.test.ts +102 -0
  1202. package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
  1203. package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
  1204. package/sdk/src/query/phase-lifecycle.test.ts +1750 -0
  1205. package/sdk/src/query/phase-lifecycle.ts +1833 -0
  1206. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  1207. package/sdk/src/query/phase-list-queries.ts +152 -0
  1208. package/sdk/src/query/phase-ready.test.ts +65 -0
  1209. package/sdk/src/query/phase-ready.ts +159 -0
  1210. package/sdk/src/query/phase-roadmap-mutation.ts +77 -0
  1211. package/sdk/src/query/phase.test.ts +651 -0
  1212. package/sdk/src/query/phase.ts +550 -0
  1213. package/sdk/src/query/pipeline.test.ts +169 -0
  1214. package/sdk/src/query/pipeline.ts +243 -0
  1215. package/sdk/src/query/plan-scan.test.ts +35 -0
  1216. package/sdk/src/query/plan-scan.ts +82 -0
  1217. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  1218. package/sdk/src/query/plan-task-structure.ts +63 -0
  1219. package/sdk/src/query/policy-convergence.test.ts +28 -0
  1220. package/sdk/src/query/profile-extract-messages.ts +247 -0
  1221. package/sdk/src/query/profile-output.ts +929 -0
  1222. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  1223. package/sdk/src/query/profile-sample.ts +184 -0
  1224. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  1225. package/sdk/src/query/profile.test.ts +136 -0
  1226. package/sdk/src/query/profile.ts +337 -0
  1227. package/sdk/src/query/progress.test.ts +156 -0
  1228. package/sdk/src/query/progress.ts +566 -0
  1229. package/sdk/src/query/query-cli-adapter.test.ts +79 -0
  1230. package/sdk/src/query/query-cli-adapter.ts +39 -0
  1231. package/sdk/src/query/query-cli-output.test.ts +33 -0
  1232. package/sdk/src/query/query-cli-output.ts +35 -0
  1233. package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
  1234. package/sdk/src/query/query-command-diagnosis.ts +5 -0
  1235. package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
  1236. package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
  1237. package/sdk/src/query/query-command-semantics.test.ts +22 -0
  1238. package/sdk/src/query/query-command-semantics.ts +22 -0
  1239. package/sdk/src/query/query-dispatch-contract.ts +30 -0
  1240. package/sdk/src/query/query-dispatch-error-mapper.test.ts +62 -0
  1241. package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
  1242. package/sdk/src/query/query-dispatch-formatting.test.ts +28 -0
  1243. package/sdk/src/query/query-dispatch-formatting.ts +5 -0
  1244. package/sdk/src/query/query-dispatch-input-validation.test.ts +23 -0
  1245. package/sdk/src/query/query-dispatch-input-validation.ts +5 -0
  1246. package/sdk/src/query/query-dispatch-observability.test.ts +10 -0
  1247. package/sdk/src/query/query-dispatch-observability.ts +6 -0
  1248. package/sdk/src/query/query-dispatch-plan.test.ts +25 -0
  1249. package/sdk/src/query/query-dispatch-plan.ts +5 -0
  1250. package/sdk/src/query/query-dispatch-result-builder.test.ts +16 -0
  1251. package/sdk/src/query/query-dispatch-result-builder.ts +5 -0
  1252. package/sdk/src/query/query-dispatch.test.ts +399 -0
  1253. package/sdk/src/query/query-dispatch.ts +243 -0
  1254. package/sdk/src/query/query-error-details-schema.ts +29 -0
  1255. package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
  1256. package/sdk/src/query/query-error-taxonomy.ts +117 -0
  1257. package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
  1258. package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
  1259. package/sdk/src/query/query-fallback-executor.test.ts +82 -0
  1260. package/sdk/src/query/query-fallback-executor.ts +44 -0
  1261. package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
  1262. package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
  1263. package/sdk/src/query/query-fallback-policy.test.ts +13 -0
  1264. package/sdk/src/query/query-fallback-policy.ts +11 -0
  1265. package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
  1266. package/sdk/src/query/query-policy-capability.test.ts +10 -0
  1267. package/sdk/src/query/query-policy-capability.ts +26 -0
  1268. package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
  1269. package/sdk/src/query/query-registry-capability.test.ts +14 -0
  1270. package/sdk/src/query/query-runtime-context.ts +44 -0
  1271. package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
  1272. package/sdk/src/query/query-unknown-command-hints.ts +5 -0
  1273. package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
  1274. package/sdk/src/query/registry-assembly-invariants.ts +127 -0
  1275. package/sdk/src/query/registry-assembly.test.ts +138 -0
  1276. package/sdk/src/query/registry-assembly.ts +78 -0
  1277. package/sdk/src/query/registry.test.ts +208 -0
  1278. package/sdk/src/query/registry.ts +142 -0
  1279. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  1280. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  1281. package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
  1282. package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
  1283. package/sdk/src/query/roadmap.test.ts +1181 -0
  1284. package/sdk/src/query/roadmap.ts +894 -0
  1285. package/sdk/src/query/route-next-action.test.ts +61 -0
  1286. package/sdk/src/query/route-next-action.ts +345 -0
  1287. package/sdk/src/query/schema-detect.ts +189 -0
  1288. package/sdk/src/query/secrets.test.ts +66 -0
  1289. package/sdk/src/query/secrets.ts +43 -0
  1290. package/sdk/src/query/skill-manifest.test.ts +62 -0
  1291. package/sdk/src/query/skill-manifest.ts +216 -0
  1292. package/sdk/src/query/skills.test.ts +234 -0
  1293. package/sdk/src/query/skills.ts +143 -0
  1294. package/sdk/src/query/state-document.test.ts +197 -0
  1295. package/sdk/src/query/state-document.ts +129 -0
  1296. package/sdk/src/query/state-mutation.test.ts +1198 -0
  1297. package/sdk/src/query/state-mutation.ts +1718 -0
  1298. package/sdk/src/query/state-project-load.ts +80 -0
  1299. package/sdk/src/query/state.test.ts +616 -0
  1300. package/sdk/src/query/state.ts +463 -0
  1301. package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
  1302. package/sdk/src/query/summary.test.ts +95 -0
  1303. package/sdk/src/query/summary.ts +296 -0
  1304. package/sdk/src/query/template.test.ts +180 -0
  1305. package/sdk/src/query/template.ts +242 -0
  1306. package/sdk/src/query/uat.test.ts +77 -0
  1307. package/sdk/src/query/uat.ts +365 -0
  1308. package/sdk/src/query/utils.test.ts +82 -0
  1309. package/sdk/src/query/utils.ts +106 -0
  1310. package/sdk/src/query/validate.test.ts +831 -0
  1311. package/sdk/src/query/validate.ts +952 -0
  1312. package/sdk/src/query/verify.test.ts +414 -0
  1313. package/sdk/src/query/verify.ts +692 -0
  1314. package/sdk/src/query/websearch.test.ts +31 -0
  1315. package/sdk/src/query/websearch.ts +82 -0
  1316. package/sdk/src/query/workspace.test.ts +120 -0
  1317. package/sdk/src/query/workspace.ts +145 -0
  1318. package/sdk/src/query/workstream-inventory.ts +195 -0
  1319. package/sdk/src/query/workstream.test.ts +153 -0
  1320. package/sdk/src/query/workstream.ts +324 -0
  1321. package/sdk/src/query/worktree.ts +39 -0
  1322. package/sdk/src/query-command-executor.ts +31 -0
  1323. package/sdk/src/query-execution-policy.test.ts +52 -0
  1324. package/sdk/src/query-execution-policy.ts +46 -0
  1325. package/sdk/src/query-failure-classification.test.ts +23 -0
  1326. package/sdk/src/query-failure-classification.ts +42 -0
  1327. package/sdk/src/query-hotpath-methods.ts +48 -0
  1328. package/sdk/src/query-native-direct-adapter.test.ts +35 -0
  1329. package/sdk/src/query-native-direct-adapter.ts +70 -0
  1330. package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
  1331. package/sdk/src/query-native-hotpath-adapter.ts +45 -0
  1332. package/sdk/src/query-raw-output-projection.test.ts +39 -0
  1333. package/sdk/src/query-raw-output-projection.ts +74 -0
  1334. package/sdk/src/query-runtime-bridge.test.ts +150 -0
  1335. package/sdk/src/query-runtime-bridge.ts +215 -0
  1336. package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
  1337. package/sdk/src/query-sdd-tools-path.ts +1 -0
  1338. package/sdk/src/query-sdd-tools-runtime.ts +89 -0
  1339. package/sdk/src/query-subprocess-adapter.test.ts +84 -0
  1340. package/sdk/src/query-subprocess-adapter.ts +146 -0
  1341. package/sdk/src/query-tools-error-factory.test.ts +35 -0
  1342. package/sdk/src/query-tools-error-factory.ts +76 -0
  1343. package/sdk/src/research-gate.test.ts +190 -0
  1344. package/sdk/src/research-gate.ts +94 -0
  1345. package/sdk/src/runtime-bridge-options.test.ts +33 -0
  1346. package/sdk/src/runtime-gate.test.ts +84 -0
  1347. package/sdk/src/runtime-gate.ts +52 -0
  1348. package/sdk/src/sdd-tools-error.test.ts +21 -0
  1349. package/sdk/src/sdd-tools-error.ts +65 -0
  1350. package/sdk/src/sdd-tools.test.ts +472 -0
  1351. package/sdk/src/sdd-tools.ts +237 -0
  1352. package/sdk/src/sdd-transport-policy.test.ts +34 -0
  1353. package/sdk/src/sdd-transport-policy.ts +48 -0
  1354. package/sdk/src/sdd-transport.test.ts +292 -0
  1355. package/sdk/src/sdd-transport.ts +117 -0
  1356. package/sdk/src/sdk-package-compatibility.test.ts +97 -0
  1357. package/sdk/src/sdk-package-compatibility.ts +141 -0
  1358. package/sdk/src/session-runner.test.ts +164 -0
  1359. package/sdk/src/session-runner.ts +327 -0
  1360. package/sdk/src/tool-scoping.test.ts +160 -0
  1361. package/sdk/src/tool-scoping.ts +61 -0
  1362. package/sdk/src/types.ts +927 -0
  1363. package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
  1364. package/sdk/src/workstream-name-policy.ts +24 -0
  1365. package/sdk/src/workstream-utils.ts +21 -0
  1366. package/sdk/src/ws-flag.test.ts +285 -0
  1367. package/sdk/src/ws-transport.test.ts +161 -0
  1368. package/sdk/src/ws-transport.ts +93 -0
  1369. package/sdk/tsconfig.json +20 -0
  1370. package/commands/sdd/add-backlog.md +0 -76
  1371. package/commands/sdd/add-phase.md +0 -43
  1372. package/commands/sdd/add-todo.md +0 -47
  1373. package/commands/sdd/check-todos.md +0 -45
  1374. package/commands/sdd/do.md +0 -30
  1375. package/commands/sdd/insert-phase.md +0 -32
  1376. package/commands/sdd/join-discord.md +0 -18
  1377. package/commands/sdd/list-phase-assumptions.md +0 -46
  1378. package/commands/sdd/list-workspaces.md +0 -19
  1379. package/commands/sdd/new-workspace.md +0 -44
  1380. package/commands/sdd/next.md +0 -24
  1381. package/commands/sdd/note.md +0 -34
  1382. package/commands/sdd/plan-milestone-gaps.md +0 -34
  1383. package/commands/sdd/plant-seed.md +0 -28
  1384. package/commands/sdd/reapply-patches.md +0 -123
  1385. package/commands/sdd/remove-phase.md +0 -31
  1386. package/commands/sdd/remove-workspace.md +0 -26
  1387. package/commands/sdd/research-phase.md +0 -195
  1388. package/commands/sdd/session-report.md +0 -19
  1389. package/commands/sdd/set-profile.md +0 -12
  1390. package/scripts/sync-upstream.sh +0 -56
  1391. package/sdd/commands/sdd/workstreams.md +0 -63
  1392. package/sdd/workflows/research-phase.md +0 -82
@@ -4,24 +4,38 @@
4
4
 
5
5
  const fs = require('fs');
6
6
  const path = require('path');
7
- const { execSync } = require('child_process');
8
- const { loadConfig, resolveModelInternal, findPhaseInternal, getRoadmapPhaseInternal, pathExistsInternal, generateSlugInternal, getMilestoneInfo, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, normalizePhaseName, planningPaths, planningDir, planningRoot, toPosixPath, output, error, checkAgentsInstalled } = require('./core.cjs');
7
+ const { execGit, platformWriteSync, platformReadSync } = require('./shell-command-projection.cjs');
8
+ const { loadConfig, resolveModelInternal, findPhaseInternal, getRoadmapPhaseInternal, pathExistsInternal, gitWorktreeInfoInternal, generateSlugInternal, getMilestoneInfo, getMilestonePhaseFilter, stripShippedMilestones, extractCurrentMilestone, normalizePhaseName, toPosixPath, output, error, checkAgentsInstalled, phaseTokenMatches } = require('./core.cjs');
9
+ const { planningPaths, planningDir, planningRoot } = require('./planning-workspace.cjs');
10
+ const { maskIfSecret } = require('./secrets.cjs');
11
+ const scanPhasePlans = require('./plan-scan.cjs');
12
+ const { stateExtractField } = require('./state-document.cjs');
13
+ const { determinePhaseStatus } = require('./commands.cjs');
14
+
15
+ // Accept all bold/colon variants of the Requirements header (#2769):
16
+ // **Requirements:** / **Requirements**: / **Requirements** : render the
17
+ // same in markdown but differ textually.
18
+ const REQUIREMENTS_HEADER_RE = /^\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]*)$/m;
19
+
20
+ function listPhaseSummaryFiles(phaseDir) {
21
+ return scanPhasePlans(phaseDir).summaryFiles;
22
+ }
23
+
24
+ function listPhasePlanFiles(phaseDir) {
25
+ return scanPhasePlans(phaseDir).planFiles;
26
+ }
9
27
 
10
28
  function getLatestCompletedMilestone(cwd) {
11
29
  const milestonesPath = path.join(planningRoot(cwd), 'MILESTONES.md');
12
- if (!fs.existsSync(milestonesPath)) return null;
13
-
14
- try {
15
- const content = fs.readFileSync(milestonesPath, 'utf-8');
16
- const match = content.match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);
17
- if (!match) return null;
18
- return {
19
- version: match[1],
20
- name: match[2].trim(),
21
- };
22
- } catch {
23
- return null;
24
- }
30
+ const content = platformReadSync(milestonesPath);
31
+ if (content === null) return null;
32
+
33
+ const match = content.match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);
34
+ if (!match) return null;
35
+ return {
36
+ version: match[1],
37
+ name: match[2].trim(),
38
+ };
25
39
  }
26
40
 
27
41
  /**
@@ -37,10 +51,31 @@ function withProjectRoot(cwd, result) {
37
51
  const agentStatus = checkAgentsInstalled();
38
52
  result.agents_installed = agentStatus.agents_installed;
39
53
  result.missing_agents = agentStatus.missing_agents;
54
+ // Inject response_language into all init outputs (#1399).
55
+ // Workflows propagate this to subagent prompts so user-facing questions
56
+ // stay in the configured language across phase boundaries.
57
+ const config = loadConfig(cwd);
58
+ if (config.response_language) {
59
+ result.response_language = config.response_language;
60
+ }
61
+ // Inject project identity into all init outputs so handoff blocks
62
+ // can include project context for cross-session continuity.
63
+ if (config.project_code) {
64
+ result.project_code = config.project_code;
65
+ }
66
+ // Extract project title from PROJECT.md first H1 heading.
67
+ const projectMdPath = path.join(planningDir(cwd), 'PROJECT.md');
68
+ const content = platformReadSync(projectMdPath);
69
+ if (content) {
70
+ const h1Match = content.match(/^#\s+(.+)$/m);
71
+ if (h1Match) {
72
+ result.project_title = h1Match[1].trim();
73
+ }
74
+ }
40
75
  return result;
41
76
  }
42
77
 
43
- function cmdInitExecutePhase(cwd, phase, raw) {
78
+ function cmdInitExecutePhase(cwd, phase, raw, options = {}) {
44
79
  if (!phase) {
45
80
  error('phase required for init execute-phase');
46
81
  }
@@ -51,6 +86,16 @@ function cmdInitExecutePhase(cwd, phase, raw) {
51
86
 
52
87
  const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
53
88
 
89
+ // If findPhaseInternal matched an archived phase from a prior milestone, but
90
+ // the phase exists in the current milestone's ROADMAP.md, ignore the archive
91
+ // match — we are initializing a new phase in the current milestone that
92
+ // happens to share a number with an archived one. Without this, phase_dir,
93
+ // phase_slug and related fields would point at artifacts from a previous
94
+ // milestone.
95
+ if (phaseInfo?.archived && roadmapPhase?.found) {
96
+ phaseInfo = null;
97
+ }
98
+
54
99
  // Fallback to ROADMAP.md if no phase directory exists yet
55
100
  if (!phaseInfo && roadmapPhase?.found) {
56
101
  const phaseName = roadmapPhase.phase_name;
@@ -69,7 +114,7 @@ function cmdInitExecutePhase(cwd, phase, raw) {
69
114
  has_reviews: false,
70
115
  };
71
116
  }
72
- const reqMatch = roadmapPhase?.section?.match(/^\*\*Requirements\*\*:[^\S\n]*([^\n]*)$/m);
117
+ const reqMatch = roadmapPhase?.section?.match(REQUIREMENTS_HEADER_RE);
73
118
  const reqExtracted = reqMatch
74
119
  ? reqMatch[1].replace(/[\[\]]/g, '').split(',').map(s => s.trim()).filter(Boolean).join(', ')
75
120
  : null;
@@ -81,6 +126,7 @@ function cmdInitExecutePhase(cwd, phase, raw) {
81
126
  verifier_model: resolveModelInternal(cwd, 'sdd-verifier'),
82
127
 
83
128
  // Config flags
129
+ tdd_mode: options.tdd || config.tdd_mode || false,
84
130
  commit_docs: config.commit_docs,
85
131
  sub_repos: config.sub_repos,
86
132
  parallelization: config.parallelization,
@@ -108,6 +154,7 @@ function cmdInitExecutePhase(cwd, phase, raw) {
108
154
  // Branch name (pre-computed)
109
155
  branch_name: config.branching_strategy === 'phase' && phaseInfo
110
156
  ? config.phase_branch_template
157
+ .replace('{project}', config.project_code || '')
111
158
  .replace('{phase}', phaseInfo.phase_number)
112
159
  .replace('{slug}', phaseInfo.phase_slug || 'phase')
113
160
  : config.branching_strategy === 'milestone'
@@ -131,10 +178,34 @@ function cmdInitExecutePhase(cwd, phase, raw) {
131
178
  config_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'config.json'))),
132
179
  };
133
180
 
181
+ // Optional --validate: run state validation and include warnings (#1627)
182
+ if (options.validate) {
183
+ try {
184
+ const statePath = path.join(planningDir(cwd), 'STATE.md');
185
+ const stateContent = platformReadSync(statePath);
186
+ if (stateContent !== null) {
187
+ const status = stateExtractField(stateContent, 'Status') || '';
188
+ result.state_validation_ran = true;
189
+ // Simple inline validation — check for obvious drift
190
+ const warnings = [];
191
+ const phasesPath = planningPaths(cwd).phases;
192
+ if (phaseInfo && phaseInfo.directory && fs.existsSync(path.join(cwd, phaseInfo.directory))) {
193
+ const diskPlans = listPhasePlanFiles(path.join(cwd, phaseInfo.directory)).length;
194
+ const totalPlansRaw = stateExtractField(stateContent, 'Total Plans in Phase');
195
+ const totalPlansInPhase = totalPlansRaw ? parseInt(totalPlansRaw, 10) : null;
196
+ if (totalPlansInPhase !== null && diskPlans !== totalPlansInPhase) {
197
+ warnings.push(`Plan count mismatch: STATE.md says ${totalPlansInPhase}, disk has ${diskPlans}`);
198
+ }
199
+ }
200
+ result.state_warnings = warnings;
201
+ }
202
+ } catch { /* intentionally empty */ }
203
+ }
204
+
134
205
  output(withProjectRoot(cwd, result), raw);
135
206
  }
136
207
 
137
- function cmdInitPlanPhase(cwd, phase, raw) {
208
+ function cmdInitPlanPhase(cwd, phase, raw, options = {}) {
138
209
  if (!phase) {
139
210
  error('phase required for init plan-phase');
140
211
  }
@@ -144,6 +215,16 @@ function cmdInitPlanPhase(cwd, phase, raw) {
144
215
 
145
216
  const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
146
217
 
218
+ // If findPhaseInternal matched an archived phase from a prior milestone, but
219
+ // the phase exists in the current milestone's ROADMAP.md, ignore the archive
220
+ // match — we are planning a new phase in the current milestone that happens
221
+ // to share a number with an archived one. Without this, phase_dir,
222
+ // phase_slug, has_context and has_research would point at artifacts from a
223
+ // previous milestone.
224
+ if (phaseInfo?.archived && roadmapPhase?.found) {
225
+ phaseInfo = null;
226
+ }
227
+
147
228
  // Fallback to ROADMAP.md if no phase directory exists yet
148
229
  if (!phaseInfo && roadmapPhase?.found) {
149
230
  const phaseName = roadmapPhase.phase_name;
@@ -162,12 +243,29 @@ function cmdInitPlanPhase(cwd, phase, raw) {
162
243
  has_reviews: false,
163
244
  };
164
245
  }
165
- const reqMatch = roadmapPhase?.section?.match(/^\*\*Requirements\*\*:[^\S\n]*([^\n]*)$/m);
246
+ const reqMatch = roadmapPhase?.section?.match(REQUIREMENTS_HEADER_RE);
166
247
  const reqExtracted = reqMatch
167
248
  ? reqMatch[1].replace(/[\[\]]/g, '').split(',').map(s => s.trim()).filter(Boolean).join(', ')
168
249
  : null;
169
250
  const phase_req_ids = (reqExtracted && reqExtracted !== 'TBD') ? reqExtracted : null;
170
251
 
252
+ // #3287: compute the canonical directory name with project_code prefix so
253
+ // the first-touch mkdir in /sdd:plan-phase stays consistent with phase.add.
254
+ const phaseDirPlan = phaseInfo?.directory || null;
255
+ const phaseNumberPlan = phaseInfo?.phase_number || null;
256
+ const phaseNamePlan = phaseInfo?.phase_name || null;
257
+ const rawProjectCodePlan = config.project_code || '';
258
+ let expectedPhaseDirPlan = null;
259
+ if (!phaseDirPlan && phaseNumberPlan && phaseNamePlan) {
260
+ const paddedNum = normalizePhaseName(phaseNumberPlan);
261
+ const slug = generateSlugInternal(phaseNamePlan).substring(0, 60);
262
+ if (slug) {
263
+ const prefix = rawProjectCodePlan ? `${rawProjectCodePlan}-` : '';
264
+ const dirName = `${prefix}${paddedNum}-${slug}`;
265
+ expectedPhaseDirPlan = toPosixPath(path.relative(cwd, path.join(planningPaths(cwd).phases, dirName)));
266
+ }
267
+ }
268
+
171
269
  const result = {
172
270
  // Models
173
271
  researcher_model: resolveModelInternal(cwd, 'sdd-phase-researcher'),
@@ -175,21 +273,43 @@ function cmdInitPlanPhase(cwd, phase, raw) {
175
273
  checker_model: resolveModelInternal(cwd, 'sdd-plan-checker'),
176
274
 
177
275
  // Workflow flags
276
+ tdd_mode: options.tdd || config.tdd_mode || false,
178
277
  research_enabled: config.research,
179
278
  plan_checker_enabled: config.plan_checker,
180
279
  nyquist_validation_enabled: config.nyquist_validation,
181
280
  commit_docs: config.commit_docs,
182
281
  text_mode: config.text_mode,
282
+ // Auto-advance config — included so workflows don't need separate config-get
283
+ // calls for these values, which causes infinite config-read loops on some models
284
+ // (e.g. Kimi K2.5). See #2192.
285
+ auto_advance: !!(config.auto_advance),
286
+ auto_chain_active: !!(config._auto_chain_active),
287
+ mode: config.mode || 'interactive',
183
288
 
184
289
  // Phase info
185
290
  phase_found: !!phaseInfo,
186
- phase_dir: phaseInfo?.directory || null,
187
- phase_number: phaseInfo?.phase_number || null,
188
- phase_name: phaseInfo?.phase_name || null,
291
+ phase_dir: phaseDirPlan,
292
+ expected_phase_dir: expectedPhaseDirPlan,
293
+ phase_number: phaseNumberPlan,
294
+ phase_name: phaseNamePlan,
189
295
  phase_slug: phaseInfo?.phase_slug || null,
190
- padded_phase: phaseInfo?.phase_number ? normalizePhaseName(phaseInfo.phase_number) : null,
296
+ padded_phase: phaseNumberPlan ? normalizePhaseName(phaseNumberPlan) : null,
191
297
  phase_req_ids,
192
298
 
299
+ // #3569: surface phase lifecycle status so /sdd:plan-phase can short-circuit
300
+ // on closed (Complete) phases instead of silently replanning over shipped
301
+ // code. Reuses determinePhaseStatus — the project-wide vocabulary
302
+ // (Pending | Planned | In Progress | Executed | Complete | Needs Review).
303
+ // No directory yet → Pending (phase has not been started).
304
+ phase_status: phaseDirPlan
305
+ ? determinePhaseStatus(
306
+ phaseInfo?.plans?.length || 0,
307
+ phaseInfo?.summaries?.length || 0,
308
+ path.join(cwd, phaseDirPlan),
309
+ 'Pending',
310
+ )
311
+ : 'Pending',
312
+
193
313
  // Existing artifacts
194
314
  has_research: phaseInfo?.has_research || false,
195
315
  has_context: phaseInfo?.has_context || false,
@@ -205,6 +325,9 @@ function cmdInitPlanPhase(cwd, phase, raw) {
205
325
  state_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'STATE.md'))),
206
326
  roadmap_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'ROADMAP.md'))),
207
327
  requirements_path: toPosixPath(path.relative(cwd, path.join(planningDir(cwd), 'REQUIREMENTS.md'))),
328
+
329
+ // Pattern mapper output (null until PATTERNS.md exists in phase dir)
330
+ patterns_path: null,
208
331
  };
209
332
 
210
333
  if (phaseInfo?.directory) {
@@ -232,6 +355,28 @@ function cmdInitPlanPhase(cwd, phase, raw) {
232
355
  if (reviewsFile) {
233
356
  result.reviews_path = toPosixPath(path.join(phaseInfo.directory, reviewsFile));
234
357
  }
358
+ const patternsFile = files.find(f => f.endsWith('-PATTERNS.md') || f === 'PATTERNS.md');
359
+ if (patternsFile) {
360
+ result.patterns_path = toPosixPath(path.join(phaseInfo.directory, patternsFile));
361
+ }
362
+ } catch { /* intentionally empty */ }
363
+ }
364
+
365
+ // Optional --validate: run state validation and include warnings (#1627)
366
+ if (options.validate) {
367
+ try {
368
+ const statePath = path.join(planningDir(cwd), 'STATE.md');
369
+ const stateContent = platformReadSync(statePath);
370
+ if (stateContent !== null) {
371
+ const warnings = [];
372
+ result.state_validation_ran = true;
373
+ const totalPlansRaw = stateExtractField(stateContent, 'Total Plans in Phase');
374
+ const totalPlansInPhase = totalPlansRaw ? parseInt(totalPlansRaw, 10) : null;
375
+ if (totalPlansInPhase !== null && phaseInfo && totalPlansInPhase !== (phaseInfo.plans?.length || 0)) {
376
+ warnings.push(`Plan count mismatch: STATE.md says ${totalPlansInPhase}, disk has ${phaseInfo.plans?.length || 0}`);
377
+ }
378
+ result.state_warnings = warnings;
379
+ }
235
380
  } catch { /* intentionally empty */ }
236
381
  }
237
382
 
@@ -275,7 +420,7 @@ function cmdInitNewProject(cwd, raw) {
275
420
  '.ex', '.exs', // Elixir
276
421
  '.clj', // Clojure
277
422
  ]);
278
- const skipDirs = new Set(['node_modules', '.git', '.planning', '.claude', '__pycache__', 'target', 'dist', 'build']);
423
+ const skipDirs = new Set(['node_modules', '.git', '.planning', '.claude', '.codex', '__pycache__', 'target', 'dist', 'build']);
279
424
  function findCodeFiles(dir, depth) {
280
425
  if (depth > 3) return false;
281
426
  let entries;
@@ -328,8 +473,17 @@ function cmdInitNewProject(cwd, raw) {
328
473
  is_brownfield: hasCode || hasPackageFile,
329
474
  needs_codebase_map: (hasCode || hasPackageFile) && !pathExistsInternal(cwd, '.planning/codebase'),
330
475
 
331
- // Git state
332
- has_git: pathExistsInternal(cwd, '.git'),
476
+ // Git state (Bug #3491: detect parent worktree to avoid nested .git init)
477
+ ...(() => {
478
+ const info = gitWorktreeInfoInternal(cwd);
479
+ const worktreeRoot = info.worktreeRoot;
480
+ const inNestedSubdir = info.inside && worktreeRoot !== null && worktreeRoot !== cwd;
481
+ return {
482
+ has_git: info.inside,
483
+ git_worktree_root: worktreeRoot,
484
+ in_nested_subdir: inNestedSubdir,
485
+ };
486
+ })(),
333
487
 
334
488
  // Enhanced search
335
489
  brave_search_available: hasBraveSearch,
@@ -352,8 +506,11 @@ function cmdInitNewMilestone(cwd, raw) {
352
506
 
353
507
  try {
354
508
  if (fs.existsSync(phasesDir)) {
509
+ // Bug #2445: filter phase dirs to current milestone only so stale dirs
510
+ // from a prior milestone that were not archived don't inflate the count.
511
+ const isDirInMilestone = getMilestonePhaseFilter(cwd);
355
512
  phaseDirCount = fs.readdirSync(phasesDir, { withFileTypes: true })
356
- .filter(entry => entry.isDirectory())
513
+ .filter(entry => entry.isDirectory() && isDirInMilestone(entry.name))
357
514
  .length;
358
515
  }
359
516
  } catch {}
@@ -448,14 +605,42 @@ function cmdInitQuick(cwd, description, raw) {
448
605
  output(withProjectRoot(cwd, result), raw);
449
606
  }
450
607
 
608
+ /**
609
+ * Init handler for ingest-docs workflow (#2801).
610
+ *
611
+ * Returns the minimal set of fields that ingest-docs.md needs to detect
612
+ * whether a project/planning dir exists and choose new vs merge mode.
613
+ * Mirrors the initIngestDocs SDK handler in sdk/src/query/init.ts.
614
+ */
615
+ function cmdInitIngestDocs(cwd, raw) {
616
+ const config = loadConfig(cwd);
617
+ const result = {
618
+ project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'),
619
+ planning_exists: fs.existsSync(planningRoot(cwd)),
620
+ ...(() => {
621
+ // Bug #3491 — see cmdInitNewProject above. Same shallow-check bug.
622
+ const info = gitWorktreeInfoInternal(cwd);
623
+ const worktreeRoot = info.worktreeRoot;
624
+ const inNestedSubdir = info.inside && worktreeRoot !== null && worktreeRoot !== cwd;
625
+ return {
626
+ has_git: info.inside,
627
+ git_worktree_root: worktreeRoot,
628
+ in_nested_subdir: inNestedSubdir,
629
+ };
630
+ })(),
631
+ project_path: '.planning/PROJECT.md',
632
+ commit_docs: config.commit_docs,
633
+ };
634
+ output(withProjectRoot(cwd, result), raw);
635
+ }
636
+
451
637
  function cmdInitResume(cwd, raw) {
452
638
  const config = loadConfig(cwd);
453
639
 
454
640
  // Check for interrupted agent
455
641
  let interruptedAgentId = null;
456
- try {
457
- interruptedAgentId = fs.readFileSync(path.join(planningRoot(cwd), 'current-agent-id.txt'), 'utf-8').trim();
458
- } catch { /* intentionally empty */ }
642
+ const agentIdRaw = platformReadSync(path.join(planningRoot(cwd), 'current-agent-id.txt'));
643
+ if (agentIdRaw !== null) interruptedAgentId = agentIdRaw.trim();
459
644
 
460
645
  const result = {
461
646
  // File existence
@@ -488,6 +673,16 @@ function cmdInitVerifyWork(cwd, phase, raw) {
488
673
  const config = loadConfig(cwd);
489
674
  let phaseInfo = findPhaseInternal(cwd, phase);
490
675
 
676
+ // If findPhaseInternal matched an archived phase from a prior milestone, but
677
+ // the phase exists in the current milestone's ROADMAP.md, ignore the archive
678
+ // match — same pattern as cmdInitPhaseOp.
679
+ if (phaseInfo?.archived) {
680
+ const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
681
+ if (roadmapPhase?.found) {
682
+ phaseInfo = null;
683
+ }
684
+ }
685
+
491
686
  // Fallback to ROADMAP.md if no phase directory exists yet
492
687
  if (!phaseInfo) {
493
688
  const roadmapPhase = getRoadmapPhaseInternal(cwd, phase);
@@ -578,20 +773,42 @@ function cmdInitPhaseOp(cwd, phase, raw) {
578
773
  }
579
774
  }
580
775
 
776
+ // #3287: compute the canonical directory name with project_code prefix so
777
+ // the first-touch mkdir in /sdd:discuss-phase stays consistent with phase.add.
778
+ const phaseDir = phaseInfo?.directory || null;
779
+ const phaseNumber = phaseInfo?.phase_number || null;
780
+ const phaseName = phaseInfo?.phase_name || null;
781
+ const rawProjectCode = config.project_code || '';
782
+ let expectedPhaseDir = null;
783
+ if (!phaseDir && phaseNumber && phaseName) {
784
+ const paddedNum = normalizePhaseName(phaseNumber);
785
+ const slug = generateSlugInternal(phaseName).substring(0, 60);
786
+ if (slug) {
787
+ const prefix = rawProjectCode ? `${rawProjectCode}-` : '';
788
+ const dirName = `${prefix}${paddedNum}-${slug}`;
789
+ expectedPhaseDir = toPosixPath(path.relative(cwd, path.join(planningPaths(cwd).phases, dirName)));
790
+ }
791
+ }
792
+
581
793
  const result = {
582
794
  // Config
583
795
  commit_docs: config.commit_docs,
584
- brave_search: config.brave_search,
585
- firecrawl: config.firecrawl,
586
- exa_search: config.exa_search,
796
+ // #2997: secret config keys may be either booleans (availability flags) or
797
+ // string API keys (when user did `sdd-tools config-set brave_search XXX`).
798
+ // Pass booleans through; mask string values so the init bundle never echoes
799
+ // plaintext credentials. SDK init.ts mirrors this masking.
800
+ brave_search: typeof config.brave_search === 'string' ? maskIfSecret('brave_search', config.brave_search) : config.brave_search,
801
+ firecrawl: typeof config.firecrawl === 'string' ? maskIfSecret('firecrawl', config.firecrawl) : config.firecrawl,
802
+ exa_search: typeof config.exa_search === 'string' ? maskIfSecret('exa_search', config.exa_search) : config.exa_search,
587
803
 
588
804
  // Phase info
589
805
  phase_found: !!phaseInfo,
590
- phase_dir: phaseInfo?.directory || null,
591
- phase_number: phaseInfo?.phase_number || null,
592
- phase_name: phaseInfo?.phase_name || null,
806
+ phase_dir: phaseDir,
807
+ expected_phase_dir: expectedPhaseDir,
808
+ phase_number: phaseNumber,
809
+ phase_name: phaseName,
593
810
  phase_slug: phaseInfo?.phase_slug || null,
594
- padded_phase: phaseInfo?.phase_number ? normalizePhaseName(phaseInfo.phase_number) : null,
811
+ padded_phase: phaseNumber ? normalizePhaseName(phaseNumber) : null,
595
812
 
596
813
  // Existing artifacts
597
814
  has_research: phaseInfo?.has_research || false,
@@ -653,8 +870,9 @@ function cmdInitTodos(cwd, area, raw) {
653
870
  try {
654
871
  const files = fs.readdirSync(pendingDir).filter(f => f.endsWith('.md'));
655
872
  for (const file of files) {
873
+ const content = platformReadSync(path.join(pendingDir, file));
874
+ if (content === null) continue;
656
875
  try {
657
- const content = fs.readFileSync(path.join(pendingDir, file), 'utf-8');
658
876
  const createdMatch = content.match(/^created:\s*(.+)$/m);
659
877
  const titleMatch = content.match(/^title:\s*(.+)$/m);
660
878
  const areaMatch = content.match(/^area:\s*(.+)$/m);
@@ -708,20 +926,68 @@ function cmdInitMilestoneOp(cwd, raw) {
708
926
  let phaseCount = 0;
709
927
  let completedPhases = 0;
710
928
  const phasesDir = path.join(planningDir(cwd), 'phases');
929
+
930
+ // Bug #2633 — ROADMAP.md (current milestone section) is the authority for
931
+ // phase counts, NOT the on-disk `.planning/phases/` directory. After
932
+ // `phases clear` between milestones, on-disk dirs will be a subset of the
933
+ // roadmap until each phase is materialized; reading from disk causes
934
+ // `all_phases_complete: true` to fire prematurely.
935
+ let roadmapPhaseNumbers = [];
936
+ try {
937
+ const roadmapPath = path.join(planningDir(cwd), 'ROADMAP.md');
938
+ const roadmapRaw = fs.readFileSync(roadmapPath, 'utf-8');
939
+ const currentSection = extractCurrentMilestone(roadmapRaw, cwd);
940
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi;
941
+ let m;
942
+ while ((m = phasePattern.exec(currentSection)) !== null) {
943
+ roadmapPhaseNumbers.push(m[1]);
944
+ }
945
+ } catch { /* intentionally empty */ }
946
+
947
+ // Canonicalize a phase token by stripping leading zeros from the integer
948
+ // head while preserving any [A-Z]? suffix and dotted segments. So "03" →
949
+ // "3", "03A" → "3A", "03.1" → "3.1", "3A" → "3A". Disk dirs that pad
950
+ // ("03-alpha") then match roadmap tokens ("Phase 3") without ever
951
+ // collapsing distinct tokens like "3" / "3A" / "3.1" into the same bucket.
952
+ const canonicalizePhase = (tok) => {
953
+ const m = tok.match(/^(\d+)([A-Z]?(?:\.\d+)*)$/);
954
+ return m ? String(parseInt(m[1], 10)) + m[2] : tok;
955
+ };
956
+ const diskPhaseDirs = new Map();
711
957
  try {
712
958
  const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
713
- const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
714
- phaseCount = dirs.length;
959
+ for (const e of entries) {
960
+ if (!e.isDirectory()) continue;
961
+ const m = e.name.match(/^(\d+[A-Z]?(?:\.\d+)*)/);
962
+ if (!m) continue;
963
+ diskPhaseDirs.set(canonicalizePhase(m[1]), e.name);
964
+ }
965
+ } catch { /* intentionally empty */ }
715
966
 
716
- // Count phases with summaries (completed)
717
- for (const dir of dirs) {
967
+ if (roadmapPhaseNumbers.length > 0) {
968
+ phaseCount = roadmapPhaseNumbers.length;
969
+ for (const num of roadmapPhaseNumbers) {
970
+ const dirName = diskPhaseDirs.get(canonicalizePhase(num));
971
+ if (!dirName) continue;
718
972
  try {
719
- const phaseFiles = fs.readdirSync(path.join(phasesDir, dir));
720
- const hasSummary = phaseFiles.some(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
973
+ const hasSummary = listPhaseSummaryFiles(path.join(phasesDir, dirName)).length > 0;
721
974
  if (hasSummary) completedPhases++;
722
975
  } catch { /* intentionally empty */ }
723
976
  }
724
- } catch { /* intentionally empty */ }
977
+ } else {
978
+ // Fallback: no parseable ROADMAP — preserve legacy on-disk behavior.
979
+ try {
980
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
981
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
982
+ phaseCount = dirs.length;
983
+ for (const dir of dirs) {
984
+ try {
985
+ const hasSummary = listPhaseSummaryFiles(path.join(phasesDir, dir)).length > 0;
986
+ if (hasSummary) completedPhases++;
987
+ } catch { /* intentionally empty */ }
988
+ }
989
+ } catch { /* intentionally empty */ }
990
+ }
725
991
 
726
992
  // Check archive
727
993
  const archiveDir = path.join(planningRoot(cwd), 'archive');
@@ -763,6 +1029,7 @@ function cmdInitMilestoneOp(cwd, raw) {
763
1029
 
764
1030
  function cmdInitMapCodebase(cwd, raw) {
765
1031
  const config = loadConfig(cwd);
1032
+ const now = new Date();
766
1033
 
767
1034
  // Check for existing codebase maps
768
1035
  const codebaseDir = path.join(planningRoot(cwd), 'codebase');
@@ -779,6 +1046,11 @@ function cmdInitMapCodebase(cwd, raw) {
779
1046
  commit_docs: config.commit_docs,
780
1047
  search_gitignored: config.search_gitignored,
781
1048
  parallelization: config.parallelization,
1049
+ subagent_timeout: config.subagent_timeout,
1050
+
1051
+ // Timestamps
1052
+ date: now.toISOString().split('T')[0],
1053
+ timestamp: now.toISOString(),
782
1054
 
783
1055
  // Paths
784
1056
  codebase_dir: '.planning/codebase',
@@ -814,6 +1086,23 @@ function cmdInitManager(cwd, raw) {
814
1086
  const phasesDir = paths.phases;
815
1087
  const isDirInMilestone = getMilestonePhaseFilter(cwd);
816
1088
 
1089
+ // Pre-compute directory listing once (avoids O(N) readdirSync per phase)
1090
+ const _phaseDirEntries = (() => {
1091
+ try {
1092
+ return fs.readdirSync(phasesDir, { withFileTypes: true })
1093
+ .filter(e => e.isDirectory())
1094
+ .map(e => e.name);
1095
+ } catch { return []; }
1096
+ })();
1097
+
1098
+ // Pre-extract all checkbox states in a single pass (avoids O(N) regex per phase)
1099
+ const _checkboxStates = new Map();
1100
+ const _cbPattern = /-\s*\[(x| )\]\s*.*Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s]/gi;
1101
+ let _cbMatch;
1102
+ while ((_cbMatch = _cbPattern.exec(content)) !== null) {
1103
+ _checkboxStates.set(_cbMatch[2], _cbMatch[1].toLowerCase() === 'x');
1104
+ }
1105
+
817
1106
  const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
818
1107
  const phases = [];
819
1108
  let match;
@@ -844,15 +1133,14 @@ function cmdInitManager(cwd, raw) {
844
1133
  let isActive = false;
845
1134
 
846
1135
  try {
847
- const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
848
- const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).filter(isDirInMilestone);
849
- const dirMatch = dirs.find(d => d.startsWith(normalized + '-') || d === normalized);
1136
+ const dirs = _phaseDirEntries.filter(isDirInMilestone);
1137
+ const dirMatch = dirs.find(d => phaseTokenMatches(d, normalized));
850
1138
 
851
1139
  if (dirMatch) {
852
1140
  const fullDir = path.join(phasesDir, dirMatch);
853
1141
  const phaseFiles = fs.readdirSync(fullDir);
854
- planCount = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md').length;
855
- summaryCount = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md').length;
1142
+ planCount = listPhasePlanFiles(fullDir).length;
1143
+ summaryCount = listPhaseSummaryFiles(fullDir).length;
856
1144
  hasContext = phaseFiles.some(f => f.endsWith('-CONTEXT.md') || f === 'CONTEXT.md');
857
1145
  hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md');
858
1146
 
@@ -879,10 +1167,8 @@ function cmdInitManager(cwd, raw) {
879
1167
  }
880
1168
  } catch { /* intentionally empty */ }
881
1169
 
882
- // Check ROADMAP checkbox status
883
- const checkboxPattern = new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${phaseNum.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}[:\\s]`, 'i');
884
- const checkboxMatch = content.match(checkboxPattern);
885
- const roadmapComplete = checkboxMatch ? checkboxMatch[1] === 'x' : false;
1170
+ // Check ROADMAP checkbox status (pre-extracted above the loop)
1171
+ const roadmapComplete = _checkboxStates.get(phaseNum) || false;
886
1172
  if (roadmapComplete && diskStatus !== 'complete') {
887
1173
  diskStatus = 'complete';
888
1174
  }
@@ -915,6 +1201,17 @@ function cmdInitManager(cwd, raw) {
915
1201
 
916
1202
  // Dependency satisfaction: check if all depends_on phases are complete
917
1203
  const completedNums = new Set(phases.filter(p => p.disk_status === 'complete').map(p => p.number));
1204
+
1205
+ // Also include phases from previously shipped milestones — they are all
1206
+ // complete by definition (a milestone only ships when all phases are done).
1207
+ // rawContent is the full ROADMAP.md (including <details>-wrapped shipped
1208
+ // milestone sections that extractCurrentMilestone strips out).
1209
+ const _allCompletedPattern = /-\s*\[x\]\s*.*Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s]/gi;
1210
+ let _allMatch;
1211
+ while ((_allMatch = _allCompletedPattern.exec(rawContent)) !== null) {
1212
+ completedNums.add(_allMatch[1]);
1213
+ }
1214
+
918
1215
  for (const phase of phases) {
919
1216
  if (!phase.depends_on || /^none$/i.test(phase.depends_on.trim())) {
920
1217
  phase.deps_satisfied = true;
@@ -933,30 +1230,28 @@ function cmdInitManager(cwd, raw) {
933
1230
  : '—';
934
1231
  }
935
1232
 
936
- // Sliding window: discuss is sequential — only the first undiscussed phase is available
937
- let foundNextToDiscuss = false;
938
1233
  for (const phase of phases) {
939
- if (!foundNextToDiscuss && (phase.disk_status === 'empty' || phase.disk_status === 'no_directory')) {
940
- phase.is_next_to_discuss = true;
941
- foundNextToDiscuss = true;
942
- } else {
943
- phase.is_next_to_discuss = false;
944
- }
1234
+ phase.is_next_to_discuss =
1235
+ (phase.disk_status === 'empty' || phase.disk_status === 'no_directory') &&
1236
+ phase.deps_satisfied;
945
1237
  }
946
1238
 
947
1239
  // Check for WAITING.json signal
948
1240
  let waitingSignal = null;
949
1241
  try {
950
1242
  const waitingPath = path.join(cwd, '.planning', 'WAITING.json');
951
- if (fs.existsSync(waitingPath)) {
952
- waitingSignal = JSON.parse(fs.readFileSync(waitingPath, 'utf-8'));
1243
+ const waitingRaw = platformReadSync(waitingPath);
1244
+ if (waitingRaw !== null) {
1245
+ waitingSignal = JSON.parse(waitingRaw);
953
1246
  }
954
1247
  } catch { /* intentionally empty */ }
955
1248
 
956
1249
  // Compute recommended actions (execute > plan > discuss)
1250
+ // Skip BACKLOG phases (999.x numbering) — they are parked ideas, not active work
957
1251
  const recommendedActions = [];
958
1252
  for (const phase of phases) {
959
1253
  if (phase.disk_status === 'complete') continue;
1254
+ if (/^999(?:\.|$)/.test(phase.number)) continue;
960
1255
 
961
1256
  if (phase.disk_status === 'planned' && phase.deps_satisfied) {
962
1257
  recommendedActions.push({
@@ -1023,7 +1318,30 @@ function cmdInitManager(cwd, raw) {
1023
1318
  return true;
1024
1319
  });
1025
1320
 
1026
- const completedCount = phases.filter(p => p.disk_status === 'complete').length;
1321
+ // Exclude backlog phases (999.x) from completion accounting (#2129)
1322
+ const nonBacklogPhases = phases.filter(p => !/^999(?:\.|$)/.test(p.number));
1323
+ const completedCount = nonBacklogPhases.filter(p => p.disk_status === 'complete').length;
1324
+
1325
+ // Read manager flags from config (passthrough flags for each step)
1326
+ // Validate: flags must be CLI-safe (only --flags, alphanumeric, hyphens, spaces)
1327
+ const sanitizeFlags = (raw) => {
1328
+ const val = typeof raw === 'string' ? raw : '';
1329
+ if (!val) return '';
1330
+ // Allow only --flag patterns with alphanumeric/hyphen values separated by spaces
1331
+ const tokens = val.split(/\s+/).filter(Boolean);
1332
+ const safe = tokens.every(t => /^--[a-zA-Z0-9][-a-zA-Z0-9]*$/.test(t) || /^[a-zA-Z0-9][-a-zA-Z0-9_.]*$/.test(t));
1333
+ if (!safe) {
1334
+ process.stderr.write(`sdd-tools: warning: manager.flags contains invalid tokens, ignoring: ${val}\n`);
1335
+ return '';
1336
+ }
1337
+ return val;
1338
+ };
1339
+ const managerFlags = {
1340
+ discuss: sanitizeFlags(config.manager && config.manager.flags && config.manager.flags.discuss),
1341
+ plan: sanitizeFlags(config.manager && config.manager.flags && config.manager.flags.plan),
1342
+ execute: sanitizeFlags(config.manager && config.manager.flags && config.manager.flags.execute),
1343
+ };
1344
+
1027
1345
  const result = {
1028
1346
  milestone_version: milestone.version,
1029
1347
  milestone_name: milestone.name,
@@ -1033,16 +1351,21 @@ function cmdInitManager(cwd, raw) {
1033
1351
  in_progress_count: phases.filter(p => ['partial', 'planned', 'discussed', 'researched'].includes(p.disk_status)).length,
1034
1352
  recommended_actions: filteredActions,
1035
1353
  waiting_signal: waitingSignal,
1036
- all_complete: completedCount === phases.length && phases.length > 0,
1354
+ all_complete: completedCount === nonBacklogPhases.length && nonBacklogPhases.length > 0,
1037
1355
  project_exists: pathExistsInternal(cwd, '.planning/PROJECT.md'),
1038
1356
  roadmap_exists: true,
1039
1357
  state_exists: true,
1358
+ manager_flags: managerFlags,
1040
1359
  };
1041
1360
 
1042
1361
  output(withProjectRoot(cwd, result), raw);
1043
1362
  }
1044
1363
 
1045
1364
  function cmdInitProgress(cwd, raw) {
1365
+ try {
1366
+ const { pruneOrphanedWorktrees } = require('./core.cjs');
1367
+ pruneOrphanedWorktrees(cwd);
1368
+ } catch (_) {}
1046
1369
  const config = loadConfig(cwd);
1047
1370
  const milestone = getMilestoneInfo(cwd);
1048
1371
 
@@ -1055,6 +1378,7 @@ function cmdInitProgress(cwd, raw) {
1055
1378
  // Build set of phases defined in ROADMAP for the current milestone
1056
1379
  const roadmapPhaseNums = new Set();
1057
1380
  const roadmapPhaseNames = new Map();
1381
+ const roadmapCheckboxStates = new Map();
1058
1382
  try {
1059
1383
  const roadmapContent = extractCurrentMilestone(
1060
1384
  fs.readFileSync(path.join(planningDir(cwd), 'ROADMAP.md'), 'utf-8'), cwd
@@ -1065,6 +1389,13 @@ function cmdInitProgress(cwd, raw) {
1065
1389
  roadmapPhaseNums.add(hm[1]);
1066
1390
  roadmapPhaseNames.set(hm[1], hm[2].replace(/\(INSERTED\)/i, '').trim());
1067
1391
  }
1392
+ // #2646: parse `- [x] Phase N` checkbox states so ROADMAP-only phases
1393
+ // inherit completion from the ROADMAP when no phase directory exists.
1394
+ const cbPattern = /-\s*\[(x| )\]\s*.*Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s]/gi;
1395
+ let cbm;
1396
+ while ((cbm = cbPattern.exec(roadmapContent)) !== null) {
1397
+ roadmapCheckboxStates.set(cbm[2], cbm[1].toLowerCase() === 'x');
1398
+ }
1068
1399
  } catch { /* intentionally empty */ }
1069
1400
 
1070
1401
  const isDirInMilestone = getMilestonePhaseFilter(cwd);
@@ -1090,8 +1421,8 @@ function cmdInitProgress(cwd, raw) {
1090
1421
  const phasePath = path.join(phasesDir, dir);
1091
1422
  const phaseFiles = fs.readdirSync(phasePath);
1092
1423
 
1093
- const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
1094
- const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
1424
+ const plans = listPhasePlanFiles(phasePath);
1425
+ const summaries = listPhaseSummaryFiles(phasePath);
1095
1426
  const hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md');
1096
1427
 
1097
1428
  const status = summaries.length >= plans.length && plans.length > 0 ? 'complete' :
@@ -1120,21 +1451,27 @@ function cmdInitProgress(cwd, raw) {
1120
1451
  }
1121
1452
  } catch { /* intentionally empty */ }
1122
1453
 
1123
- // Add phases defined in ROADMAP but not yet scaffolded to disk
1454
+ // Add phases defined in ROADMAP but not yet scaffolded to disk. When the
1455
+ // ROADMAP has a `- [x] Phase N` checkbox, honor it as 'complete' so
1456
+ // completed_count and status reflect the ROADMAP source of truth (#2646).
1124
1457
  for (const [num, name] of roadmapPhaseNames) {
1125
1458
  const stripped = num.replace(/^0+/, '') || '0';
1126
1459
  if (!seenPhaseNums.has(stripped)) {
1460
+ const checkboxComplete =
1461
+ roadmapCheckboxStates.get(num) === true ||
1462
+ roadmapCheckboxStates.get(stripped) === true;
1463
+ const status = checkboxComplete ? 'complete' : 'not_started';
1127
1464
  const phaseInfo = {
1128
1465
  number: num,
1129
1466
  name: name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, ''),
1130
1467
  directory: null,
1131
- status: 'not_started',
1468
+ status,
1132
1469
  plan_count: 0,
1133
1470
  summary_count: 0,
1134
1471
  has_research: false,
1135
1472
  };
1136
1473
  phases.push(phaseInfo);
1137
- if (!nextPhase && !currentPhase) {
1474
+ if (!nextPhase && !currentPhase && status !== 'complete') {
1138
1475
  nextPhase = phaseInfo;
1139
1476
  }
1140
1477
  }
@@ -1145,11 +1482,11 @@ function cmdInitProgress(cwd, raw) {
1145
1482
 
1146
1483
  // Check for paused work
1147
1484
  let pausedAt = null;
1148
- try {
1149
- const state = fs.readFileSync(path.join(planningDir(cwd), 'STATE.md'), 'utf-8');
1485
+ const state = platformReadSync(path.join(planningDir(cwd), 'STATE.md'));
1486
+ if (state !== null) {
1150
1487
  const pauseMatch = state.match(/\*\*Paused At:\*\*\s*(.+)/);
1151
1488
  if (pauseMatch) pausedAt = pauseMatch[1].trim();
1152
- } catch { /* intentionally empty */ }
1489
+ }
1153
1490
 
1154
1491
  const result = {
1155
1492
  // Models
@@ -1203,11 +1540,8 @@ function detectChildRepos(dir) {
1203
1540
  const fullPath = path.join(dir, entry.name);
1204
1541
  const gitDir = path.join(fullPath, '.git');
1205
1542
  if (fs.existsSync(gitDir)) {
1206
- let hasUncommitted = false;
1207
- try {
1208
- const status = execSync('git status --porcelain', { cwd: fullPath, encoding: 'utf8', timeout: 5000 });
1209
- hasUncommitted = status.trim().length > 0;
1210
- } catch { /* best-effort */ }
1543
+ const statusResult = execGit(['status', '--porcelain'], { cwd: fullPath, timeout: 5000 });
1544
+ const hasUncommitted = statusResult.exitCode === 0 && statusResult.stdout.length > 0;
1211
1545
  repos.push({ name: entry.name, path: fullPath, has_uncommitted: hasUncommitted });
1212
1546
  }
1213
1547
  }
@@ -1222,11 +1556,8 @@ function cmdInitNewWorkspace(cwd, raw) {
1222
1556
  const childRepos = detectChildRepos(cwd);
1223
1557
 
1224
1558
  // Check if git worktree is available
1225
- let worktreeAvailable = false;
1226
- try {
1227
- execSync('git --version', { encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
1228
- worktreeAvailable = true;
1229
- } catch { /* no git at all */ }
1559
+ const gitVersion = execGit(['--version'], { timeout: 5000 });
1560
+ const worktreeAvailable = gitVersion.exitCode === 0;
1230
1561
 
1231
1562
  const result = {
1232
1563
  default_workspace_base: defaultBase,
@@ -1257,14 +1588,14 @@ function cmdInitListWorkspaces(cwd, raw) {
1257
1588
  let repoCount = 0;
1258
1589
  let hasProject = false;
1259
1590
  let strategy = 'unknown';
1260
- try {
1261
- const manifest = fs.readFileSync(manifestPath, 'utf8');
1591
+ const manifest = platformReadSync(manifestPath);
1592
+ if (manifest !== null) {
1262
1593
  const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
1263
1594
  if (strategyMatch) strategy = strategyMatch[1].trim();
1264
1595
  // Count table rows (lines starting with |, excluding header and separator)
1265
1596
  const tableRows = manifest.split('\n').filter(l => l.match(/^\|\s*\w/) && !l.includes('Repo') && !l.includes('---'));
1266
1597
  repoCount = tableRows.length;
1267
- } catch { /* best-effort */ }
1598
+ }
1268
1599
  hasProject = fs.existsSync(path.join(wsPath, '.planning', 'PROJECT.md'));
1269
1600
 
1270
1601
  workspaces.push({
@@ -1304,9 +1635,10 @@ function cmdInitRemoveWorkspace(cwd, name, raw) {
1304
1635
  // Parse manifest for repo info
1305
1636
  const repos = [];
1306
1637
  let strategy = 'unknown';
1307
- if (fs.existsSync(manifestPath)) {
1638
+ const manifestContent = platformReadSync(manifestPath);
1639
+ if (manifestContent !== null) {
1308
1640
  try {
1309
- const manifest = fs.readFileSync(manifestPath, 'utf8');
1641
+ const manifest = manifestContent;
1310
1642
  const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
1311
1643
  if (strategyMatch) strategy = strategyMatch[1].trim();
1312
1644
 
@@ -1326,12 +1658,10 @@ function cmdInitRemoveWorkspace(cwd, name, raw) {
1326
1658
  for (const repo of repos) {
1327
1659
  const repoPath = path.join(wsPath, repo.name);
1328
1660
  if (!fs.existsSync(repoPath)) continue;
1329
- try {
1330
- const status = execSync('git status --porcelain', { cwd: repoPath, encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
1331
- if (status.trim().length > 0) {
1332
- dirtyRepos.push(repo.name);
1333
- }
1334
- } catch { /* best-effort */ }
1661
+ const statusResult = execGit(['status', '--porcelain'], { cwd: repoPath, timeout: 5000 });
1662
+ if (statusResult.exitCode === 0 && statusResult.stdout.length > 0) {
1663
+ dirtyRepos.push(repo.name);
1664
+ }
1335
1665
  }
1336
1666
 
1337
1667
  const result = {
@@ -1362,6 +1692,10 @@ function cmdInitRemoveWorkspace(cwd, name, raw) {
1362
1692
  */
1363
1693
  function buildAgentSkillsBlock(config, agentType, projectRoot) {
1364
1694
  const { validatePath } = require('./security.cjs');
1695
+ const os = require('os');
1696
+ const { getGlobalSkillDir, getGlobalSkillDisplayPath } = require('./runtime-homes.cjs');
1697
+ const runtime = (config && config.runtime) || 'claude';
1698
+ const globalSkillsBase = require('./runtime-homes.cjs').getGlobalSkillsBase(runtime);
1365
1699
 
1366
1700
  if (!config || !config.agent_skills || !agentType) return '';
1367
1701
 
@@ -1376,6 +1710,43 @@ function buildAgentSkillsBlock(config, agentType, projectRoot) {
1376
1710
  for (const skillPath of skillPaths) {
1377
1711
  if (typeof skillPath !== 'string') continue;
1378
1712
 
1713
+ // Support global: prefix for skills installed at the runtime's global skills directory (#1992, #3126)
1714
+ if (skillPath.startsWith('global:')) {
1715
+ const skillName = skillPath.slice(7);
1716
+ // Explicit empty-name guard before regex for clearer error message
1717
+ if (!skillName) {
1718
+ process.stderr.write(`[agent-skills] WARNING: "global:" prefix with empty skill name — skipping\n`);
1719
+ continue;
1720
+ }
1721
+ // Sanitize: skill name must be alphanumeric, hyphens, or underscores only
1722
+ if (!/^[a-zA-Z0-9_-]+$/.test(skillName)) {
1723
+ process.stderr.write(`[agent-skills] WARNING: Invalid global skill name "${skillName}" — skipping\n`);
1724
+ continue;
1725
+ }
1726
+ // Cline is rules-based and has no global skills directory
1727
+ if (globalSkillsBase === null) {
1728
+ process.stderr.write(`[agent-skills] WARNING: Runtime "${runtime}" does not use a skills directory — "global:${skillName}" is not supported on this runtime\n`);
1729
+ continue;
1730
+ }
1731
+ const globalSkillDir = getGlobalSkillDir(runtime, skillName);
1732
+ const globalSkillMd = path.join(globalSkillDir, 'SKILL.md');
1733
+ const displayPath = getGlobalSkillDisplayPath(runtime, skillName);
1734
+ if (!fs.existsSync(globalSkillMd)) {
1735
+ process.stderr.write(`[agent-skills] WARNING: Global skill not found at "${displayPath}/SKILL.md" — skipping\n`);
1736
+ continue;
1737
+ }
1738
+ // Symlink escape guard: validatePath resolves symlinks and enforces
1739
+ // containment within globalSkillsBase. Prevents a skill directory
1740
+ // symlinked to an arbitrary location from being injected (#1992).
1741
+ const pathCheck = validatePath(globalSkillMd, globalSkillsBase, { allowAbsolute: true });
1742
+ if (!pathCheck.safe) {
1743
+ process.stderr.write(`[agent-skills] WARNING: Global skill "${skillName}" failed path check (symlink escape?) — skipping\n`);
1744
+ continue;
1745
+ }
1746
+ validPaths.push({ ref: `${globalSkillDir}/SKILL.md`, display: displayPath });
1747
+ continue;
1748
+ }
1749
+
1379
1750
  // Validate path safety — must resolve within project root
1380
1751
  const pathCheck = validatePath(skillPath, projectRoot);
1381
1752
  if (!pathCheck.safe) {
@@ -1390,12 +1761,12 @@ function buildAgentSkillsBlock(config, agentType, projectRoot) {
1390
1761
  continue;
1391
1762
  }
1392
1763
 
1393
- validPaths.push(skillPath);
1764
+ validPaths.push({ ref: `${skillPath}/SKILL.md`, display: skillPath });
1394
1765
  }
1395
1766
 
1396
1767
  if (validPaths.length === 0) return '';
1397
1768
 
1398
- const lines = validPaths.map(p => `- @${p}/SKILL.md`).join('\n');
1769
+ const lines = validPaths.map(p => `- @${p.ref}`).join('\n');
1399
1770
  return `<agent_skills>\nRead these user-configured skills:\n${lines}\n</agent_skills>`;
1400
1771
  }
1401
1772
 
@@ -1419,12 +1790,234 @@ function cmdAgentSkills(cwd, agentType, raw) {
1419
1790
  process.exit(0);
1420
1791
  }
1421
1792
 
1793
+ /**
1794
+ * Generate a skill manifest from a skills directory.
1795
+ *
1796
+ * Scans the canonical skill discovery roots and returns a normalized
1797
+ * inventory object with discovered skills, root metadata, and installation
1798
+ * summary flags. A legacy `skillsDir` override is still accepted for focused
1799
+ * scans, but the default mode is multi-root discovery.
1800
+ *
1801
+ * @param {string} cwd - Project root directory
1802
+ * @param {string|null} [skillsDir] - Optional absolute path to a specific skills directory
1803
+ * @returns {{
1804
+ * skills: Array<{name: string, description: string, triggers: string[], path: string, file_path: string, root: string, scope: string, installed: boolean, deprecated: boolean}>,
1805
+ * roots: Array<{root: string, path: string, scope: string, present: boolean, skill_count?: number, command_count?: number, deprecated?: boolean}>,
1806
+ * installation: { sdd_skills_installed: boolean, legacy_claude_commands_installed: boolean },
1807
+ * counts: { skills: number, roots: number }
1808
+ * }}
1809
+ */
1810
+ function buildSkillManifest(cwd, skillsDir = null) {
1811
+ const { extractFrontmatter } = require('./frontmatter.cjs');
1812
+ const { getGlobalSkillsBase } = require('./runtime-homes.cjs');
1813
+ const os = require('os');
1814
+
1815
+ const canonicalRoots = skillsDir ? [{
1816
+ root: path.resolve(skillsDir),
1817
+ path: path.resolve(skillsDir),
1818
+ scope: 'custom',
1819
+ present: fs.existsSync(skillsDir),
1820
+ kind: 'skills',
1821
+ }] : [
1822
+ {
1823
+ root: '.claude/skills',
1824
+ path: path.join(cwd, '.claude', 'skills'),
1825
+ scope: 'project',
1826
+ kind: 'skills',
1827
+ },
1828
+ {
1829
+ root: '.agents/skills',
1830
+ path: path.join(cwd, '.agents', 'skills'),
1831
+ scope: 'project',
1832
+ kind: 'skills',
1833
+ },
1834
+ {
1835
+ root: '.cursor/skills',
1836
+ path: path.join(cwd, '.cursor', 'skills'),
1837
+ scope: 'project',
1838
+ kind: 'skills',
1839
+ },
1840
+ {
1841
+ root: '.github/skills',
1842
+ path: path.join(cwd, '.github', 'skills'),
1843
+ scope: 'project',
1844
+ kind: 'skills',
1845
+ },
1846
+ {
1847
+ root: '.codex/skills',
1848
+ path: path.join(cwd, '.codex', 'skills'),
1849
+ scope: 'project',
1850
+ kind: 'skills',
1851
+ },
1852
+ {
1853
+ root: '~/.claude/skills',
1854
+ path: getGlobalSkillsBase('claude'),
1855
+ scope: 'global',
1856
+ kind: 'skills',
1857
+ },
1858
+ {
1859
+ root: '~/.codex/skills',
1860
+ path: getGlobalSkillsBase('codex'),
1861
+ scope: 'global',
1862
+ kind: 'skills',
1863
+ },
1864
+ {
1865
+ root: '.claude/sdd/skills',
1866
+ path: path.join(os.homedir(), '.claude', 'sdd', 'skills'),
1867
+ scope: 'import-only',
1868
+ kind: 'skills',
1869
+ deprecated: true,
1870
+ },
1871
+ {
1872
+ root: '.claude/commands/sdd',
1873
+ path: path.join(os.homedir(), '.claude', 'commands', 'sdd'),
1874
+ scope: 'legacy-commands',
1875
+ kind: 'commands',
1876
+ deprecated: true,
1877
+ },
1878
+ ];
1879
+
1880
+ const skills = [];
1881
+ const roots = [];
1882
+ let legacyClaudeCommandsInstalled = false;
1883
+ for (const rootInfo of canonicalRoots) {
1884
+ const rootPath = rootInfo.path;
1885
+ const rootSummary = {
1886
+ root: rootInfo.root,
1887
+ path: rootPath,
1888
+ scope: rootInfo.scope,
1889
+ present: fs.existsSync(rootPath),
1890
+ deprecated: !!rootInfo.deprecated,
1891
+ };
1892
+
1893
+ if (!rootSummary.present) {
1894
+ roots.push(rootSummary);
1895
+ continue;
1896
+ }
1897
+
1898
+ if (rootInfo.kind === 'commands') {
1899
+ let entries = [];
1900
+ try {
1901
+ entries = fs.readdirSync(rootPath, { withFileTypes: true });
1902
+ } catch {
1903
+ roots.push(rootSummary);
1904
+ continue;
1905
+ }
1906
+
1907
+ const commandFiles = entries.filter(entry => entry.isFile() && entry.name.endsWith('.md'));
1908
+ rootSummary.command_count = commandFiles.length;
1909
+ if (rootSummary.command_count > 0) legacyClaudeCommandsInstalled = true;
1910
+ roots.push(rootSummary);
1911
+ continue;
1912
+ }
1913
+
1914
+ let entries;
1915
+ try {
1916
+ entries = fs.readdirSync(rootPath, { withFileTypes: true });
1917
+ } catch {
1918
+ roots.push(rootSummary);
1919
+ continue;
1920
+ }
1921
+
1922
+ let skillCount = 0;
1923
+ for (const entry of entries) {
1924
+ if (!entry.isDirectory()) continue;
1925
+
1926
+ const skillMdPath = path.join(rootPath, entry.name, 'SKILL.md');
1927
+ const content = platformReadSync(skillMdPath);
1928
+ if (content === null) continue;
1929
+
1930
+ const frontmatter = extractFrontmatter(content);
1931
+ const name = frontmatter.name || entry.name;
1932
+ const description = frontmatter.description || '';
1933
+
1934
+ // Extract trigger lines from body text (after frontmatter)
1935
+ const triggers = [];
1936
+ const bodyMatch = content.match(/^---[\s\S]*?---\s*\n([\s\S]*)$/);
1937
+ if (bodyMatch) {
1938
+ const body = bodyMatch[1];
1939
+ const triggerLines = body.match(/^TRIGGER\s+when:\s*(.+)$/gmi);
1940
+ if (triggerLines) {
1941
+ for (const line of triggerLines) {
1942
+ const m = line.match(/^TRIGGER\s+when:\s*(.+)$/i);
1943
+ if (m) triggers.push(m[1].trim());
1944
+ }
1945
+ }
1946
+ }
1947
+
1948
+ skills.push({
1949
+ name,
1950
+ description,
1951
+ triggers,
1952
+ path: entry.name,
1953
+ file_path: `${entry.name}/SKILL.md`,
1954
+ root: rootInfo.root,
1955
+ scope: rootInfo.scope,
1956
+ installed: rootInfo.scope !== 'import-only',
1957
+ deprecated: !!rootInfo.deprecated,
1958
+ });
1959
+ skillCount++;
1960
+ }
1961
+
1962
+ rootSummary.skill_count = skillCount;
1963
+ roots.push(rootSummary);
1964
+ }
1965
+
1966
+ skills.sort((a, b) => {
1967
+ const rootCmp = a.root.localeCompare(b.root);
1968
+ return rootCmp !== 0 ? rootCmp : a.name.localeCompare(b.name);
1969
+ });
1970
+
1971
+ const sddSkillsInstalled = skills.some(skill => skill.name.startsWith('sdd-'));
1972
+
1973
+ return {
1974
+ skills,
1975
+ roots,
1976
+ installation: {
1977
+ sdd_skills_installed: sddSkillsInstalled,
1978
+ legacy_claude_commands_installed: legacyClaudeCommandsInstalled,
1979
+ },
1980
+ counts: {
1981
+ skills: skills.length,
1982
+ roots: roots.length,
1983
+ },
1984
+ };
1985
+ }
1986
+
1987
+ /**
1988
+ * Command: generate skill manifest JSON.
1989
+ *
1990
+ * Options:
1991
+ * --skills-dir <path> Optional absolute path to a single skills directory
1992
+ * --write Also write to .planning/skill-manifest.json
1993
+ */
1994
+ function cmdSkillManifest(cwd, args, raw) {
1995
+ const skillsDirIdx = args.indexOf('--skills-dir');
1996
+ const skillsDir = skillsDirIdx >= 0 && args[skillsDirIdx + 1]
1997
+ ? args[skillsDirIdx + 1]
1998
+ : null;
1999
+
2000
+ const manifest = buildSkillManifest(cwd, skillsDir);
2001
+
2002
+ // Optionally write to .planning/skill-manifest.json
2003
+ if (args.includes('--write')) {
2004
+ const planningDir = path.join(cwd, '.planning');
2005
+ if (fs.existsSync(planningDir)) {
2006
+ const manifestPath = path.join(planningDir, 'skill-manifest.json');
2007
+ platformWriteSync(manifestPath, JSON.stringify(manifest, null, 2));
2008
+ }
2009
+ }
2010
+
2011
+ output(manifest, raw);
2012
+ }
2013
+
1422
2014
  module.exports = {
1423
2015
  cmdInitExecutePhase,
1424
2016
  cmdInitPlanPhase,
1425
2017
  cmdInitNewProject,
1426
2018
  cmdInitNewMilestone,
1427
2019
  cmdInitQuick,
2020
+ cmdInitIngestDocs,
1428
2021
  cmdInitResume,
1429
2022
  cmdInitVerifyWork,
1430
2023
  cmdInitPhaseOp,
@@ -1439,4 +2032,6 @@ module.exports = {
1439
2032
  detectChildRepos,
1440
2033
  buildAgentSkillsBlock,
1441
2034
  cmdAgentSkills,
2035
+ buildSkillManifest,
2036
+ cmdSkillManifest,
1442
2037
  };