@bhargavvc/sdd-cc 1.35.0 → 1.42.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1374) hide show
  1. package/README.ja-JP.md +54 -52
  2. package/README.ko-KR.md +47 -45
  3. package/README.md +86 -733
  4. package/README.pt-BR.md +14 -12
  5. package/README.zh-CN.md +31 -29
  6. package/agents/sdd-ai-researcher.md +2 -2
  7. package/agents/sdd-code-fixer.md +169 -17
  8. package/agents/sdd-code-reviewer.md +40 -8
  9. package/agents/sdd-codebase-mapper.md +89 -6
  10. package/agents/sdd-debug-session-manager.md +314 -0
  11. package/agents/sdd-debugger.md +147 -80
  12. package/agents/sdd-doc-classifier.md +168 -0
  13. package/agents/sdd-doc-synthesizer.md +204 -0
  14. package/agents/sdd-doc-verifier.md +20 -4
  15. package/agents/sdd-doc-writer.md +22 -9
  16. package/agents/sdd-domain-researcher.md +2 -2
  17. package/agents/sdd-eval-auditor.md +30 -3
  18. package/agents/sdd-eval-planner.md +2 -2
  19. package/agents/sdd-executor.md +203 -43
  20. package/agents/sdd-framework-selector.md +1 -1
  21. package/agents/sdd-integration-checker.md +30 -3
  22. package/agents/sdd-intel-updater.md +51 -23
  23. package/agents/sdd-nyquist-auditor.md +31 -4
  24. package/agents/sdd-pattern-mapper.md +335 -0
  25. package/agents/sdd-phase-researcher.md +195 -32
  26. package/agents/sdd-plan-checker.md +135 -24
  27. package/agents/sdd-planner.md +190 -205
  28. package/agents/sdd-project-researcher.md +7 -7
  29. package/agents/sdd-research-synthesizer.md +6 -6
  30. package/agents/sdd-roadmapper.md +19 -10
  31. package/agents/sdd-security-auditor.md +33 -6
  32. package/agents/sdd-ui-auditor.md +23 -7
  33. package/agents/sdd-ui-checker.md +16 -7
  34. package/agents/sdd-ui-researcher.md +8 -8
  35. package/agents/sdd-verifier.md +124 -27
  36. package/bin/install.js +5016 -372
  37. package/bin/sdd-sdk.js +37 -0
  38. package/commands/sdd/add-tests.md +5 -4
  39. package/commands/sdd/ai-integration-phase.md +4 -3
  40. package/commands/sdd/audit-fix.md +2 -1
  41. package/commands/sdd/audit-milestone.md +3 -2
  42. package/commands/sdd/autonomous.md +3 -3
  43. package/commands/sdd/capture.md +62 -0
  44. package/commands/sdd/cleanup.md +2 -1
  45. package/commands/sdd/code-review.md +8 -4
  46. package/commands/sdd/complete-milestone.md +15 -8
  47. package/commands/sdd/config.md +58 -0
  48. package/commands/sdd/debug.md +21 -155
  49. package/commands/sdd/discuss-phase.md +18 -11
  50. package/commands/sdd/docs-update.md +3 -2
  51. package/commands/sdd/eval-review.md +4 -3
  52. package/commands/sdd/execute-phase.md +5 -4
  53. package/commands/sdd/explore.md +3 -3
  54. package/commands/sdd/extract-learnings.md +23 -0
  55. package/commands/sdd/fast.md +4 -3
  56. package/commands/sdd/forensics.md +3 -2
  57. package/commands/sdd/graphify.md +199 -0
  58. package/commands/sdd/health.md +12 -3
  59. package/commands/sdd/help.md +1 -1
  60. package/commands/sdd/import.md +10 -5
  61. package/commands/sdd/inbox.md +39 -0
  62. package/commands/sdd/ingest-docs.md +42 -0
  63. package/commands/sdd/manager.md +8 -3
  64. package/commands/sdd/map-codebase.md +18 -6
  65. package/commands/sdd/milestone-summary.md +1 -1
  66. package/commands/sdd/mvp-phase.md +45 -0
  67. package/commands/sdd/new-milestone.md +4 -3
  68. package/commands/sdd/new-project.md +4 -3
  69. package/commands/sdd/ns-context.md +23 -0
  70. package/commands/sdd/ns-ideate.md +24 -0
  71. package/commands/sdd/ns-manage.md +29 -0
  72. package/commands/sdd/ns-project.md +22 -0
  73. package/commands/sdd/ns-review.md +26 -0
  74. package/commands/sdd/ns-workflow.md +28 -0
  75. package/commands/sdd/pause-work.md +6 -1
  76. package/commands/sdd/phase.md +56 -0
  77. package/commands/sdd/plan-phase.md +15 -5
  78. package/commands/sdd/plan-review-convergence.md +59 -0
  79. package/commands/sdd/pr-branch.md +2 -1
  80. package/commands/sdd/profile-user.md +1 -1
  81. package/commands/sdd/progress.md +27 -5
  82. package/commands/sdd/quick.md +128 -3
  83. package/commands/sdd/resume-work.md +2 -12
  84. package/commands/sdd/review-backlog.md +3 -2
  85. package/commands/sdd/review.md +3 -2
  86. package/commands/sdd/secure-phase.md +3 -2
  87. package/commands/sdd/settings.md +2 -9
  88. package/commands/sdd/ship.md +2 -1
  89. package/commands/sdd/sketch.md +60 -0
  90. package/commands/sdd/spec-phase.md +63 -0
  91. package/commands/sdd/spike.md +57 -0
  92. package/commands/sdd/stats.md +2 -1
  93. package/commands/sdd/surface.md +129 -0
  94. package/commands/sdd/thread.md +8 -111
  95. package/commands/sdd/ui-phase.md +3 -2
  96. package/commands/sdd/ui-review.md +3 -2
  97. package/commands/sdd/ultraplan-phase.md +34 -0
  98. package/commands/sdd/undo.md +2 -1
  99. package/commands/sdd/update.md +21 -10
  100. package/commands/sdd/validate-phase.md +3 -2
  101. package/commands/sdd/verify-work.md +5 -4
  102. package/commands/sdd/workspace.md +52 -0
  103. package/commands/sdd/workstreams.md +12 -11
  104. package/hooks/dist/sdd-check-update-worker.js +116 -0
  105. package/hooks/dist/sdd-check-update.js +13 -88
  106. package/hooks/dist/sdd-context-monitor.js +28 -1
  107. package/hooks/dist/sdd-phase-boundary.sh +23 -3
  108. package/hooks/dist/sdd-read-guard.js +21 -2
  109. package/hooks/dist/sdd-read-injection-scanner.js +152 -0
  110. package/hooks/dist/sdd-session-state.sh +38 -12
  111. package/hooks/dist/sdd-statusline.js +324 -28
  112. package/hooks/dist/sdd-update-banner.js +134 -0
  113. package/hooks/dist/sdd-validate-commit.sh +15 -5
  114. package/hooks/dist/sdd-workflow-guard.js +2 -2
  115. package/hooks/lib/git-cmd.js +150 -0
  116. package/hooks/sdd-check-update-worker.js +116 -0
  117. package/hooks/sdd-check-update.js +13 -88
  118. package/hooks/sdd-context-monitor.js +28 -1
  119. package/hooks/sdd-phase-boundary.sh +23 -3
  120. package/hooks/sdd-read-guard.js +21 -2
  121. package/hooks/sdd-read-injection-scanner.js +152 -0
  122. package/hooks/sdd-session-state.sh +38 -12
  123. package/hooks/sdd-statusline.js +324 -28
  124. package/hooks/sdd-update-banner.js +134 -0
  125. package/hooks/sdd-validate-commit.sh +15 -5
  126. package/hooks/sdd-workflow-guard.js +2 -2
  127. package/package.json +32 -7
  128. package/scripts/audit-workflow-script-paths.cjs +73 -0
  129. package/scripts/build-hooks.js +98 -4
  130. package/scripts/changeset/cli.cjs +269 -0
  131. package/scripts/changeset/github-release-notes.cjs +198 -0
  132. package/scripts/changeset/lint.cjs +110 -0
  133. package/scripts/changeset/new.cjs +137 -0
  134. package/scripts/changeset/parse.cjs +60 -0
  135. package/scripts/changeset/render.cjs +34 -0
  136. package/scripts/changeset/serialize.cjs +74 -0
  137. package/scripts/command-contract-helpers.cjs +61 -0
  138. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  139. package/scripts/fix-slash-commands.cjs +106 -0
  140. package/scripts/gen-inventory-manifest.cjs +109 -0
  141. package/scripts/lint-command-contract.cjs +108 -0
  142. package/scripts/lint-descriptions.cjs +83 -0
  143. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  144. package/scripts/lint-no-source-grep.cjs +174 -0
  145. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  146. package/scripts/lint-skill-deps.cjs +180 -0
  147. package/scripts/pr-template-policy.cjs +169 -0
  148. package/scripts/prompt-injection-scan.sh +2 -0
  149. package/scripts/rebrand-gsd-to-sdd.sh +4 -3
  150. package/scripts/strip-prose-atrefs.cjs +106 -0
  151. package/scripts/verify-tarball-sdk-dist.sh +69 -0
  152. package/sdd/bin/check-latest-version.cjs +104 -0
  153. package/sdd/bin/lib/active-workstream-store.cjs +85 -0
  154. package/sdd/bin/lib/adr-parser.cjs +394 -0
  155. package/sdd/bin/lib/artifacts.cjs +53 -0
  156. package/sdd/bin/lib/audit.cjs +755 -0
  157. package/sdd/bin/lib/cjs-command-router-adapter.cjs +39 -0
  158. package/sdd/bin/lib/clusters.cjs +135 -0
  159. package/sdd/bin/lib/command-aliases.generated.cjs +838 -0
  160. package/sdd/bin/lib/commands.cjs +108 -98
  161. package/sdd/bin/lib/config-schema.cjs +135 -0
  162. package/sdd/bin/lib/config.cjs +253 -68
  163. package/sdd/bin/lib/context-utilization.cjs +47 -0
  164. package/sdd/bin/lib/core.cjs +997 -607
  165. package/sdd/bin/lib/decisions.cjs +48 -0
  166. package/sdd/bin/lib/docs.cjs +36 -33
  167. package/sdd/bin/lib/drift.cjs +379 -0
  168. package/sdd/bin/lib/fallow-runner.cjs +109 -0
  169. package/sdd/bin/lib/frontmatter.cjs +19 -11
  170. package/sdd/bin/lib/gap-checker.cjs +197 -0
  171. package/sdd/bin/lib/graphify.cjs +577 -0
  172. package/sdd/bin/lib/init-command-router.cjs +70 -0
  173. package/sdd/bin/lib/init.cjs +603 -102
  174. package/sdd/bin/lib/install-profiles.cjs +572 -0
  175. package/sdd/bin/lib/installer-migration-authoring.cjs +117 -0
  176. package/sdd/bin/lib/installer-migration-report.cjs +328 -0
  177. package/sdd/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  178. package/sdd/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  179. package/sdd/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  180. package/sdd/bin/lib/installer-migrations.cjs +703 -0
  181. package/sdd/bin/lib/intel.cjs +35 -52
  182. package/sdd/bin/lib/learnings.cjs +2 -1
  183. package/sdd/bin/lib/milestone.cjs +313 -283
  184. package/sdd/bin/lib/model-catalog.cjs +136 -0
  185. package/sdd/bin/lib/model-profiles.cjs +25 -70
  186. package/sdd/bin/lib/phase-command-router.cjs +96 -0
  187. package/sdd/bin/lib/phase.cjs +556 -102
  188. package/sdd/bin/lib/phases-command-router.cjs +39 -0
  189. package/sdd/bin/lib/plan-scan.cjs +138 -0
  190. package/sdd/bin/lib/planning-workspace.cjs +361 -0
  191. package/sdd/bin/lib/profile-output.cjs +109 -43
  192. package/sdd/bin/lib/profile-pipeline.cjs +1 -1
  193. package/sdd/bin/lib/review-reviewer-selection.cjs +125 -0
  194. package/sdd/bin/lib/roadmap-command-router.cjs +23 -0
  195. package/sdd/bin/lib/roadmap.cjs +278 -17
  196. package/sdd/bin/lib/runtime-homes.cjs +178 -0
  197. package/sdd/bin/lib/sdd2-import.cjs +3 -3
  198. package/sdd/bin/lib/secrets.cjs +33 -0
  199. package/sdd/bin/lib/security.cjs +8 -7
  200. package/sdd/bin/lib/shell-command-projection.cjs +548 -0
  201. package/sdd/bin/lib/state-command-router.cjs +100 -0
  202. package/sdd/bin/lib/state-document.cjs +12 -0
  203. package/sdd/bin/lib/state-document.generated.cjs +127 -0
  204. package/sdd/bin/lib/state.cjs +720 -218
  205. package/sdd/bin/lib/surface.cjs +398 -0
  206. package/sdd/bin/lib/template.cjs +4 -2
  207. package/sdd/bin/lib/uat.cjs +9 -2
  208. package/sdd/bin/lib/validate-command-router.cjs +55 -0
  209. package/sdd/bin/lib/verify-command-router.cjs +34 -0
  210. package/sdd/bin/lib/verify.cjs +464 -137
  211. package/sdd/bin/lib/workstream-inventory.cjs +159 -0
  212. package/sdd/bin/lib/workstream-name-policy.cjs +33 -0
  213. package/sdd/bin/lib/workstream.cjs +73 -195
  214. package/sdd/bin/lib/worktree-safety.cjs +563 -0
  215. package/sdd/bin/sdd-tools.cjs +386 -252
  216. package/sdd/bin/verify-reapply-patches.cjs +247 -0
  217. package/sdd/contexts/review.md +1 -0
  218. package/sdd/references/artifact-types.md +18 -0
  219. package/sdd/references/autonomous-smart-discuss.md +277 -0
  220. package/sdd/references/checkpoints.md +36 -0
  221. package/sdd/references/context-budget.md +85 -49
  222. package/sdd/references/continuation-format.md +26 -22
  223. package/sdd/references/debugger-philosophy.md +76 -0
  224. package/sdd/references/decimal-phase-calculation.md +5 -5
  225. package/sdd/references/doc-conflict-engine.md +91 -0
  226. package/sdd/references/domain-probes.md +1 -1
  227. package/sdd/references/execute-mvp-tdd.md +81 -0
  228. package/sdd/references/executor-examples.md +110 -0
  229. package/sdd/references/gate-prompts.md +2 -2
  230. package/sdd/references/git-integration.md +10 -7
  231. package/sdd/references/git-planning-commit.md +6 -4
  232. package/sdd/references/mandatory-initial-read.md +2 -0
  233. package/sdd/references/model-profiles.md +106 -6
  234. package/sdd/references/mvp-concepts.md +49 -0
  235. package/sdd/references/phase-argument-parsing.md +3 -3
  236. package/sdd/references/planner-antipatterns.md +89 -0
  237. package/sdd/references/planner-chunked.md +49 -0
  238. package/sdd/references/planner-human-verify-mode.md +57 -0
  239. package/sdd/references/planner-mvp-mode.md +53 -0
  240. package/sdd/references/planner-revision.md +1 -1
  241. package/sdd/references/planner-source-audit.md +73 -0
  242. package/sdd/references/planning-config.md +30 -13
  243. package/sdd/references/project-skills-discovery.md +19 -0
  244. package/sdd/references/scout-codebase.md +51 -0
  245. package/sdd/references/skeleton-template.md +48 -0
  246. package/sdd/references/sketch-interactivity.md +41 -0
  247. package/sdd/references/sketch-theme-system.md +94 -0
  248. package/sdd/references/sketch-tooling.md +45 -0
  249. package/sdd/references/sketch-variant-patterns.md +81 -0
  250. package/sdd/references/spidr-splitting.md +69 -0
  251. package/sdd/references/tdd.md +67 -0
  252. package/sdd/references/thinking-partner.md +1 -1
  253. package/sdd/references/universal-anti-patterns.md +4 -4
  254. package/sdd/references/user-story-template.md +58 -0
  255. package/sdd/references/verification-overrides.md +3 -3
  256. package/sdd/references/verify-mvp-mode.md +85 -0
  257. package/sdd/references/workstream-flag.md +11 -11
  258. package/sdd/references/worktree-path-safety.md +89 -0
  259. package/sdd/templates/AI-SPEC.md +1 -1
  260. package/sdd/templates/DEBUG.md +8 -3
  261. package/sdd/templates/README.md +77 -0
  262. package/sdd/templates/UAT.md +4 -4
  263. package/sdd/templates/VALIDATION.md +1 -1
  264. package/sdd/templates/claude-md.md +5 -5
  265. package/sdd/templates/config.json +16 -2
  266. package/sdd/templates/debug-subagent-prompt.md +1 -1
  267. package/sdd/templates/dev-preferences.md +1 -1
  268. package/sdd/templates/discovery.md +2 -2
  269. package/sdd/templates/phase-prompt.md +1 -1
  270. package/sdd/templates/planner-subagent-prompt.md +3 -3
  271. package/sdd/templates/project.md +1 -1
  272. package/sdd/templates/research.md +41 -1
  273. package/sdd/templates/spec.md +307 -0
  274. package/sdd/templates/state.md +9 -1
  275. package/sdd/workflows/add-backlog.md +90 -0
  276. package/sdd/workflows/add-phase.md +7 -7
  277. package/sdd/workflows/add-tests.md +12 -12
  278. package/sdd/workflows/add-todo.md +4 -4
  279. package/sdd/workflows/ai-integration-phase.md +26 -16
  280. package/sdd/workflows/analyze-dependencies.md +3 -3
  281. package/sdd/workflows/audit-fix.md +23 -3
  282. package/sdd/workflows/audit-milestone.md +37 -20
  283. package/sdd/workflows/audit-uat.md +3 -3
  284. package/sdd/workflows/autonomous.md +31 -301
  285. package/sdd/workflows/check-todos.md +6 -6
  286. package/sdd/workflows/cleanup.md +1 -1
  287. package/sdd/workflows/code-review-fix.md +20 -16
  288. package/sdd/workflows/code-review.md +114 -16
  289. package/sdd/workflows/complete-milestone.md +68 -15
  290. package/sdd/workflows/debug.md +231 -0
  291. package/sdd/workflows/diagnose-issues.md +8 -6
  292. package/sdd/workflows/discovery-phase.md +3 -3
  293. package/sdd/workflows/discuss-phase/modes/advisor.md +175 -0
  294. package/sdd/workflows/discuss-phase/modes/all.md +28 -0
  295. package/sdd/workflows/discuss-phase/modes/analyze.md +44 -0
  296. package/sdd/workflows/discuss-phase/modes/auto.md +56 -0
  297. package/sdd/workflows/discuss-phase/modes/batch.md +52 -0
  298. package/sdd/workflows/discuss-phase/modes/chain.md +97 -0
  299. package/sdd/workflows/discuss-phase/modes/default.md +141 -0
  300. package/sdd/workflows/discuss-phase/modes/power.md +44 -0
  301. package/sdd/workflows/discuss-phase/modes/text.md +55 -0
  302. package/sdd/workflows/discuss-phase/templates/checkpoint.json +18 -0
  303. package/sdd/workflows/discuss-phase/templates/context.md +136 -0
  304. package/sdd/workflows/discuss-phase/templates/discussion-log.md +50 -0
  305. package/sdd/workflows/discuss-phase-assumptions.md +24 -21
  306. package/sdd/workflows/discuss-phase-power.md +3 -3
  307. package/sdd/workflows/discuss-phase.md +203 -905
  308. package/sdd/workflows/do.md +25 -21
  309. package/sdd/workflows/docs-update.md +23 -17
  310. package/sdd/workflows/edit-phase.md +294 -0
  311. package/sdd/workflows/eval-review.md +7 -7
  312. package/sdd/workflows/execute-phase/steps/codebase-drift-gate.md +81 -0
  313. package/sdd/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  314. package/sdd/workflows/execute-phase/steps/post-merge-gate.md +116 -0
  315. package/sdd/workflows/execute-phase.md +650 -252
  316. package/sdd/workflows/execute-plan.md +75 -35
  317. package/sdd/workflows/explore.md +7 -3
  318. package/sdd/workflows/extract-learnings.md +242 -0
  319. package/sdd/workflows/fast.md +5 -5
  320. package/sdd/workflows/forensics.md +19 -6
  321. package/sdd/workflows/graduation.md +195 -0
  322. package/sdd/workflows/health.md +49 -7
  323. package/sdd/workflows/help.md +323 -149
  324. package/sdd/workflows/import.md +20 -43
  325. package/sdd/workflows/inbox.md +5 -5
  326. package/sdd/workflows/ingest-docs.md +339 -0
  327. package/sdd/workflows/insert-phase.md +33 -12
  328. package/sdd/workflows/list-phase-assumptions.md +2 -2
  329. package/sdd/workflows/list-workspaces.md +2 -2
  330. package/sdd/workflows/manager.md +38 -11
  331. package/sdd/workflows/map-codebase.md +87 -23
  332. package/sdd/workflows/milestone-summary.md +8 -8
  333. package/sdd/workflows/mvp-phase.md +221 -0
  334. package/sdd/workflows/new-milestone.md +163 -23
  335. package/sdd/workflows/new-project.md +254 -53
  336. package/sdd/workflows/new-workspace.md +8 -8
  337. package/sdd/workflows/next.md +85 -18
  338. package/sdd/workflows/note.md +2 -2
  339. package/sdd/workflows/pause-work.md +13 -9
  340. package/sdd/workflows/plan-milestone-gaps.md +18 -11
  341. package/sdd/workflows/plan-phase.md +767 -94
  342. package/sdd/workflows/plan-review-convergence.md +329 -0
  343. package/sdd/workflows/plant-seed.md +146 -89
  344. package/sdd/workflows/pr-branch.md +1 -1
  345. package/sdd/workflows/profile-user.md +15 -15
  346. package/sdd/workflows/progress.md +198 -56
  347. package/sdd/workflows/quick.md +318 -54
  348. package/{commands/sdd → sdd/workflows}/reapply-patches.md +102 -23
  349. package/sdd/workflows/remove-phase.md +10 -10
  350. package/sdd/workflows/remove-workspace.md +21 -6
  351. package/sdd/workflows/resume-project.md +26 -23
  352. package/sdd/workflows/review.md +151 -20
  353. package/sdd/workflows/scan.md +5 -3
  354. package/sdd/workflows/secure-phase.md +26 -13
  355. package/sdd/workflows/settings-advanced.md +579 -0
  356. package/sdd/workflows/settings-integrations.md +281 -0
  357. package/sdd/workflows/settings.md +202 -23
  358. package/sdd/workflows/ship.md +131 -16
  359. package/sdd/workflows/sketch-wrap-up.md +285 -0
  360. package/sdd/workflows/sketch.md +360 -0
  361. package/sdd/workflows/spec-phase.md +262 -0
  362. package/sdd/workflows/spike-wrap-up.md +306 -0
  363. package/sdd/workflows/spike.md +452 -0
  364. package/sdd/workflows/stats.md +21 -2
  365. package/sdd/workflows/sync-skills.md +182 -0
  366. package/sdd/workflows/thread.md +221 -0
  367. package/sdd/workflows/transition.md +52 -30
  368. package/sdd/workflows/ui-phase.md +37 -20
  369. package/sdd/workflows/ui-review.md +12 -10
  370. package/sdd/workflows/ultraplan-phase.md +198 -0
  371. package/sdd/workflows/undo.md +9 -9
  372. package/sdd/workflows/update.md +187 -17
  373. package/sdd/workflows/validate-phase.md +12 -10
  374. package/sdd/workflows/verify-phase.md +112 -27
  375. package/sdd/workflows/verify-work.md +97 -28
  376. package/sdk/dist/cli-transport.d.ts +19 -0
  377. package/sdk/dist/cli-transport.d.ts.map +1 -0
  378. package/sdk/dist/cli-transport.js +104 -0
  379. package/sdk/dist/cli-transport.js.map +1 -0
  380. package/sdk/dist/cli.d.ts +46 -0
  381. package/sdk/dist/cli.d.ts.map +1 -0
  382. package/sdk/dist/cli.js +511 -0
  383. package/sdk/dist/cli.js.map +1 -0
  384. package/sdk/dist/config.d.ts +84 -0
  385. package/sdk/dist/config.d.ts.map +1 -0
  386. package/sdk/dist/config.js +135 -0
  387. package/sdk/dist/config.js.map +1 -0
  388. package/sdk/dist/context-engine.d.ts +49 -0
  389. package/sdk/dist/context-engine.d.ts.map +1 -0
  390. package/sdk/dist/context-engine.js +142 -0
  391. package/sdk/dist/context-engine.js.map +1 -0
  392. package/sdk/dist/context-truncation.d.ts +33 -0
  393. package/sdk/dist/context-truncation.d.ts.map +1 -0
  394. package/sdk/dist/context-truncation.js +197 -0
  395. package/sdk/dist/context-truncation.js.map +1 -0
  396. package/sdk/dist/errors.d.ts +46 -0
  397. package/sdk/dist/errors.d.ts.map +1 -0
  398. package/sdk/dist/errors.js +64 -0
  399. package/sdk/dist/errors.js.map +1 -0
  400. package/sdk/dist/event-stream.d.ts +53 -0
  401. package/sdk/dist/event-stream.d.ts.map +1 -0
  402. package/sdk/dist/event-stream.js +321 -0
  403. package/sdk/dist/event-stream.js.map +1 -0
  404. package/sdk/dist/golden/capture.d.ts +15 -0
  405. package/sdk/dist/golden/capture.d.ts.map +1 -0
  406. package/sdk/dist/golden/capture.js +67 -0
  407. package/sdk/dist/golden/capture.js.map +1 -0
  408. package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
  409. package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
  410. package/sdk/dist/golden/golden-integration-covered.js +30 -0
  411. package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
  412. package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
  413. package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
  414. package/sdk/dist/golden/golden-mutation-covered.js +17 -0
  415. package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
  416. package/sdk/dist/golden/golden-policy.d.ts +10 -0
  417. package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
  418. package/sdk/dist/golden/golden-policy.js +98 -0
  419. package/sdk/dist/golden/golden-policy.js.map +1 -0
  420. package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
  421. package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
  422. package/sdk/dist/golden/init-golden-normalize.js +14 -0
  423. package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
  424. package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
  425. package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
  426. package/sdk/dist/golden/read-only-golden-rows.js +67 -0
  427. package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
  428. package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
  429. package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
  430. package/sdk/dist/golden/registry-canonical-commands.js +30 -0
  431. package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
  432. package/sdk/dist/index.d.ts +125 -0
  433. package/sdk/dist/index.d.ts.map +1 -0
  434. package/sdk/dist/index.js +298 -0
  435. package/sdk/dist/index.js.map +1 -0
  436. package/sdk/dist/init-runner.d.ts +90 -0
  437. package/sdk/dist/init-runner.d.ts.map +1 -0
  438. package/sdk/dist/init-runner.js +613 -0
  439. package/sdk/dist/init-runner.js.map +1 -0
  440. package/sdk/dist/logger.d.ts +50 -0
  441. package/sdk/dist/logger.d.ts.map +1 -0
  442. package/sdk/dist/logger.js +70 -0
  443. package/sdk/dist/logger.js.map +1 -0
  444. package/sdk/dist/model-catalog.d.ts +31 -0
  445. package/sdk/dist/model-catalog.d.ts.map +1 -0
  446. package/sdk/dist/model-catalog.js +31 -0
  447. package/sdk/dist/model-catalog.js.map +1 -0
  448. package/sdk/dist/phase-prompt.d.ts +72 -0
  449. package/sdk/dist/phase-prompt.d.ts.map +1 -0
  450. package/sdk/dist/phase-prompt.js +213 -0
  451. package/sdk/dist/phase-prompt.js.map +1 -0
  452. package/sdk/dist/phase-runner.d.ts +145 -0
  453. package/sdk/dist/phase-runner.d.ts.map +1 -0
  454. package/sdk/dist/phase-runner.js +1206 -0
  455. package/sdk/dist/phase-runner.js.map +1 -0
  456. package/sdk/dist/plan-parser.d.ts +55 -0
  457. package/sdk/dist/plan-parser.d.ts.map +1 -0
  458. package/sdk/dist/plan-parser.js +389 -0
  459. package/sdk/dist/plan-parser.js.map +1 -0
  460. package/sdk/dist/planning-journal.d.ts +64 -0
  461. package/sdk/dist/planning-journal.d.ts.map +1 -0
  462. package/sdk/dist/planning-journal.js +88 -0
  463. package/sdk/dist/planning-journal.js.map +1 -0
  464. package/sdk/dist/planning-runtime.d.ts +67 -0
  465. package/sdk/dist/planning-runtime.d.ts.map +1 -0
  466. package/sdk/dist/planning-runtime.js +58 -0
  467. package/sdk/dist/planning-runtime.js.map +1 -0
  468. package/sdk/dist/prompt-builder.d.ts +44 -0
  469. package/sdk/dist/prompt-builder.d.ts.map +1 -0
  470. package/sdk/dist/prompt-builder.js +180 -0
  471. package/sdk/dist/prompt-builder.js.map +1 -0
  472. package/sdk/dist/prompt-sanitizer.d.ts +35 -0
  473. package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
  474. package/sdk/dist/prompt-sanitizer.js +101 -0
  475. package/sdk/dist/prompt-sanitizer.js.map +1 -0
  476. package/sdk/dist/query/active-workstream-store.d.ts +7 -0
  477. package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
  478. package/sdk/dist/query/active-workstream-store.js +56 -0
  479. package/sdk/dist/query/active-workstream-store.js.map +1 -0
  480. package/sdk/dist/query/agent-failure-classifier.d.ts +38 -0
  481. package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
  482. package/sdk/dist/query/agent-failure-classifier.js +83 -0
  483. package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
  484. package/sdk/dist/query/audit-open.d.ts +46 -0
  485. package/sdk/dist/query/audit-open.d.ts.map +1 -0
  486. package/sdk/dist/query/audit-open.js +662 -0
  487. package/sdk/dist/query/audit-open.js.map +1 -0
  488. package/sdk/dist/query/check-auto-mode.d.ts +13 -0
  489. package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
  490. package/sdk/dist/query/check-auto-mode.js +40 -0
  491. package/sdk/dist/query/check-auto-mode.js.map +1 -0
  492. package/sdk/dist/query/check-completion.d.ts +10 -0
  493. package/sdk/dist/query/check-completion.d.ts.map +1 -0
  494. package/sdk/dist/query/check-completion.js +157 -0
  495. package/sdk/dist/query/check-completion.js.map +1 -0
  496. package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
  497. package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
  498. package/sdk/dist/query/check-decision-coverage.js +472 -0
  499. package/sdk/dist/query/check-decision-coverage.js.map +1 -0
  500. package/sdk/dist/query/check-gates.d.ts +10 -0
  501. package/sdk/dist/query/check-gates.d.ts.map +1 -0
  502. package/sdk/dist/query/check-gates.js +89 -0
  503. package/sdk/dist/query/check-gates.js.map +1 -0
  504. package/sdk/dist/query/check-ship-ready.d.ts +10 -0
  505. package/sdk/dist/query/check-ship-ready.d.ts.map +1 -0
  506. package/sdk/dist/query/check-ship-ready.js +93 -0
  507. package/sdk/dist/query/check-ship-ready.js.map +1 -0
  508. package/sdk/dist/query/check-verification-status.d.ts +10 -0
  509. package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
  510. package/sdk/dist/query/check-verification-status.js +142 -0
  511. package/sdk/dist/query/check-verification-status.js.map +1 -0
  512. package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
  513. package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
  514. package/sdk/dist/query/command-aliases.generated.js +135 -0
  515. package/sdk/dist/query/command-aliases.generated.js.map +1 -0
  516. package/sdk/dist/query/command-catalog.d.ts +9 -0
  517. package/sdk/dist/query/command-catalog.d.ts.map +1 -0
  518. package/sdk/dist/query/command-catalog.js +17 -0
  519. package/sdk/dist/query/command-catalog.js.map +1 -0
  520. package/sdk/dist/query/command-definition.d.ts +19 -0
  521. package/sdk/dist/query/command-definition.d.ts.map +1 -0
  522. package/sdk/dist/query/command-definition.js +44 -0
  523. package/sdk/dist/query/command-definition.js.map +1 -0
  524. package/sdk/dist/query/command-family-handlers.d.ts +3 -0
  525. package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
  526. package/sdk/dist/query/command-family-handlers.js +94 -0
  527. package/sdk/dist/query/command-family-handlers.js.map +1 -0
  528. package/sdk/dist/query/command-manifest.d.ts +2 -0
  529. package/sdk/dist/query/command-manifest.d.ts.map +1 -0
  530. package/sdk/dist/query/command-manifest.init.d.ts +6 -0
  531. package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
  532. package/sdk/dist/query/command-manifest.init.js +23 -0
  533. package/sdk/dist/query/command-manifest.init.js.map +1 -0
  534. package/sdk/dist/query/command-manifest.js +17 -0
  535. package/sdk/dist/query/command-manifest.js.map +1 -0
  536. package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
  537. package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
  538. package/sdk/dist/query/command-manifest.non-family.js +59 -0
  539. package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
  540. package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
  541. package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
  542. package/sdk/dist/query/command-manifest.phase.js +15 -0
  543. package/sdk/dist/query/command-manifest.phase.js.map +1 -0
  544. package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
  545. package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
  546. package/sdk/dist/query/command-manifest.phases.js +10 -0
  547. package/sdk/dist/query/command-manifest.phases.js.map +1 -0
  548. package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
  549. package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
  550. package/sdk/dist/query/command-manifest.roadmap.js +10 -0
  551. package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
  552. package/sdk/dist/query/command-manifest.state.d.ts +9 -0
  553. package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
  554. package/sdk/dist/query/command-manifest.state.js +30 -0
  555. package/sdk/dist/query/command-manifest.state.js.map +1 -0
  556. package/sdk/dist/query/command-manifest.types.d.ts +12 -0
  557. package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
  558. package/sdk/dist/query/command-manifest.types.js +2 -0
  559. package/sdk/dist/query/command-manifest.types.js.map +1 -0
  560. package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
  561. package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
  562. package/sdk/dist/query/command-manifest.validate.js +10 -0
  563. package/sdk/dist/query/command-manifest.validate.js.map +1 -0
  564. package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
  565. package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
  566. package/sdk/dist/query/command-manifest.verify.js +14 -0
  567. package/sdk/dist/query/command-manifest.verify.js.map +1 -0
  568. package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
  569. package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
  570. package/sdk/dist/query/command-static-catalog-domain.js +116 -0
  571. package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
  572. package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
  573. package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
  574. package/sdk/dist/query/command-static-catalog-foundation.js +98 -0
  575. package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
  576. package/sdk/dist/query/command-topology.d.ts +32 -0
  577. package/sdk/dist/query/command-topology.d.ts.map +1 -0
  578. package/sdk/dist/query/command-topology.js +66 -0
  579. package/sdk/dist/query/command-topology.js.map +1 -0
  580. package/sdk/dist/query/commands-list.d.ts +14 -0
  581. package/sdk/dist/query/commands-list.d.ts.map +1 -0
  582. package/sdk/dist/query/commands-list.js +18 -0
  583. package/sdk/dist/query/commands-list.js.map +1 -0
  584. package/sdk/dist/query/commit.d.ts +79 -0
  585. package/sdk/dist/query/commit.d.ts.map +1 -0
  586. package/sdk/dist/query/commit.js +340 -0
  587. package/sdk/dist/query/commit.js.map +1 -0
  588. package/sdk/dist/query/config-gates.d.ts +12 -0
  589. package/sdk/dist/query/config-gates.d.ts.map +1 -0
  590. package/sdk/dist/query/config-gates.js +66 -0
  591. package/sdk/dist/query/config-gates.js.map +1 -0
  592. package/sdk/dist/query/config-mutation.d.ts +86 -0
  593. package/sdk/dist/query/config-mutation.d.ts.map +1 -0
  594. package/sdk/dist/query/config-mutation.js +518 -0
  595. package/sdk/dist/query/config-mutation.js.map +1 -0
  596. package/sdk/dist/query/config-query.d.ts +57 -0
  597. package/sdk/dist/query/config-query.d.ts.map +1 -0
  598. package/sdk/dist/query/config-query.js +208 -0
  599. package/sdk/dist/query/config-query.js.map +1 -0
  600. package/sdk/dist/query/config-schema.d.ts +36 -0
  601. package/sdk/dist/query/config-schema.d.ts.map +1 -0
  602. package/sdk/dist/query/config-schema.js +147 -0
  603. package/sdk/dist/query/config-schema.js.map +1 -0
  604. package/sdk/dist/query/decisions.d.ts +58 -0
  605. package/sdk/dist/query/decisions.d.ts.map +1 -0
  606. package/sdk/dist/query/decisions.js +161 -0
  607. package/sdk/dist/query/decisions.js.map +1 -0
  608. package/sdk/dist/query/detect-custom-files.d.ts +11 -0
  609. package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
  610. package/sdk/dist/query/detect-custom-files.js +89 -0
  611. package/sdk/dist/query/detect-custom-files.js.map +1 -0
  612. package/sdk/dist/query/detect-phase-type.d.ts +9 -0
  613. package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
  614. package/sdk/dist/query/detect-phase-type.js +124 -0
  615. package/sdk/dist/query/detect-phase-type.js.map +1 -0
  616. package/sdk/dist/query/docs-init.d.ts +26 -0
  617. package/sdk/dist/query/docs-init.d.ts.map +1 -0
  618. package/sdk/dist/query/docs-init.js +231 -0
  619. package/sdk/dist/query/docs-init.js.map +1 -0
  620. package/sdk/dist/query/fallow-audit.d.ts +44 -0
  621. package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
  622. package/sdk/dist/query/fallow-audit.js +44 -0
  623. package/sdk/dist/query/fallow-audit.js.map +1 -0
  624. package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
  625. package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
  626. package/sdk/dist/query/frontmatter-mutation.js +317 -0
  627. package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
  628. package/sdk/dist/query/frontmatter.d.ts +93 -0
  629. package/sdk/dist/query/frontmatter.d.ts.map +1 -0
  630. package/sdk/dist/query/frontmatter.js +365 -0
  631. package/sdk/dist/query/frontmatter.js.map +1 -0
  632. package/sdk/dist/query/helpers.d.ts +191 -0
  633. package/sdk/dist/query/helpers.d.ts.map +1 -0
  634. package/sdk/dist/query/helpers.js +613 -0
  635. package/sdk/dist/query/helpers.js.map +1 -0
  636. package/sdk/dist/query/index.d.ts +8 -0
  637. package/sdk/dist/query/index.d.ts.map +1 -0
  638. package/sdk/dist/query/index.js +6 -0
  639. package/sdk/dist/query/index.js.map +1 -0
  640. package/sdk/dist/query/init-complex.d.ts +47 -0
  641. package/sdk/dist/query/init-complex.d.ts.map +1 -0
  642. package/sdk/dist/query/init-complex.js +718 -0
  643. package/sdk/dist/query/init-complex.js.map +1 -0
  644. package/sdk/dist/query/init.d.ts +106 -0
  645. package/sdk/dist/query/init.d.ts.map +1 -0
  646. package/sdk/dist/query/init.js +1159 -0
  647. package/sdk/dist/query/init.js.map +1 -0
  648. package/sdk/dist/query/intel.d.ts +43 -0
  649. package/sdk/dist/query/intel.d.ts.map +1 -0
  650. package/sdk/dist/query/intel.js +416 -0
  651. package/sdk/dist/query/intel.js.map +1 -0
  652. package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
  653. package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
  654. package/sdk/dist/query/mutation-event-decorator.js +28 -0
  655. package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
  656. package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
  657. package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
  658. package/sdk/dist/query/mutation-event-mapper.js +70 -0
  659. package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
  660. package/sdk/dist/query/mvp.d.ts +113 -0
  661. package/sdk/dist/query/mvp.d.ts.map +1 -0
  662. package/sdk/dist/query/mvp.js +225 -0
  663. package/sdk/dist/query/mvp.js.map +1 -0
  664. package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
  665. package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
  666. package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
  667. package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
  668. package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
  669. package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
  670. package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
  671. package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
  672. package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
  673. package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
  674. package/sdk/dist/query/phase-lifecycle.js +1486 -0
  675. package/sdk/dist/query/phase-lifecycle.js.map +1 -0
  676. package/sdk/dist/query/phase-list-queries.d.ts +18 -0
  677. package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
  678. package/sdk/dist/query/phase-list-queries.js +129 -0
  679. package/sdk/dist/query/phase-list-queries.js.map +1 -0
  680. package/sdk/dist/query/phase-ready.d.ts +9 -0
  681. package/sdk/dist/query/phase-ready.d.ts.map +1 -0
  682. package/sdk/dist/query/phase-ready.js +132 -0
  683. package/sdk/dist/query/phase-ready.js.map +1 -0
  684. package/sdk/dist/query/phase-roadmap-mutation.d.ts +13 -0
  685. package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
  686. package/sdk/dist/query/phase-roadmap-mutation.js +65 -0
  687. package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
  688. package/sdk/dist/query/phase.d.ts +48 -0
  689. package/sdk/dist/query/phase.d.ts.map +1 -0
  690. package/sdk/dist/query/phase.js +451 -0
  691. package/sdk/dist/query/phase.js.map +1 -0
  692. package/sdk/dist/query/pipeline.d.ts +53 -0
  693. package/sdk/dist/query/pipeline.d.ts.map +1 -0
  694. package/sdk/dist/query/pipeline.js +198 -0
  695. package/sdk/dist/query/pipeline.js.map +1 -0
  696. package/sdk/dist/query/plan-scan.d.ts +14 -0
  697. package/sdk/dist/query/plan-scan.d.ts.map +1 -0
  698. package/sdk/dist/query/plan-scan.js +70 -0
  699. package/sdk/dist/query/plan-scan.js.map +1 -0
  700. package/sdk/dist/query/plan-task-structure.d.ts +9 -0
  701. package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
  702. package/sdk/dist/query/plan-task-structure.js +59 -0
  703. package/sdk/dist/query/plan-task-structure.js.map +1 -0
  704. package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
  705. package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
  706. package/sdk/dist/query/profile-extract-messages.js +195 -0
  707. package/sdk/dist/query/profile-extract-messages.js.map +1 -0
  708. package/sdk/dist/query/profile-output.d.ts +11 -0
  709. package/sdk/dist/query/profile-output.d.ts.map +1 -0
  710. package/sdk/dist/query/profile-output.js +873 -0
  711. package/sdk/dist/query/profile-output.js.map +1 -0
  712. package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
  713. package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
  714. package/sdk/dist/query/profile-questionnaire-data.js +171 -0
  715. package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
  716. package/sdk/dist/query/profile-sample.d.ts +22 -0
  717. package/sdk/dist/query/profile-sample.d.ts.map +1 -0
  718. package/sdk/dist/query/profile-sample.js +136 -0
  719. package/sdk/dist/query/profile-sample.js.map +1 -0
  720. package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
  721. package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
  722. package/sdk/dist/query/profile-scan-sessions.js +137 -0
  723. package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
  724. package/sdk/dist/query/profile.d.ts +61 -0
  725. package/sdk/dist/query/profile.d.ts.map +1 -0
  726. package/sdk/dist/query/profile.js +307 -0
  727. package/sdk/dist/query/profile.js.map +1 -0
  728. package/sdk/dist/query/progress.d.ts +77 -0
  729. package/sdk/dist/query/progress.d.ts.map +1 -0
  730. package/sdk/dist/query/progress.js +481 -0
  731. package/sdk/dist/query/progress.js.map +1 -0
  732. package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
  733. package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
  734. package/sdk/dist/query/query-cli-adapter.js +32 -0
  735. package/sdk/dist/query/query-cli-adapter.js.map +1 -0
  736. package/sdk/dist/query/query-cli-output.d.ts +9 -0
  737. package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
  738. package/sdk/dist/query/query-cli-output.js +28 -0
  739. package/sdk/dist/query/query-cli-output.js.map +1 -0
  740. package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
  741. package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
  742. package/sdk/dist/query/query-command-diagnosis.js +6 -0
  743. package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
  744. package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
  745. package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
  746. package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
  747. package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
  748. package/sdk/dist/query/query-command-semantics.d.ts +7 -0
  749. package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
  750. package/sdk/dist/query/query-command-semantics.js +7 -0
  751. package/sdk/dist/query/query-command-semantics.js.map +1 -0
  752. package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
  753. package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
  754. package/sdk/dist/query/query-dispatch-contract.js +2 -0
  755. package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
  756. package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
  757. package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
  758. package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
  759. package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
  760. package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
  761. package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
  762. package/sdk/dist/query/query-dispatch-formatting.js +6 -0
  763. package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
  764. package/sdk/dist/query/query-dispatch-input-validation.d.ts +6 -0
  765. package/sdk/dist/query/query-dispatch-input-validation.d.ts.map +1 -0
  766. package/sdk/dist/query/query-dispatch-input-validation.js +6 -0
  767. package/sdk/dist/query/query-dispatch-input-validation.js.map +1 -0
  768. package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
  769. package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
  770. package/sdk/dist/query/query-dispatch-observability.js +7 -0
  771. package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
  772. package/sdk/dist/query/query-dispatch-plan.d.ts +6 -0
  773. package/sdk/dist/query/query-dispatch-plan.d.ts.map +1 -0
  774. package/sdk/dist/query/query-dispatch-plan.js +6 -0
  775. package/sdk/dist/query/query-dispatch-plan.js.map +1 -0
  776. package/sdk/dist/query/query-dispatch-result-builder.d.ts +6 -0
  777. package/sdk/dist/query/query-dispatch-result-builder.d.ts.map +1 -0
  778. package/sdk/dist/query/query-dispatch-result-builder.js +6 -0
  779. package/sdk/dist/query/query-dispatch-result-builder.js.map +1 -0
  780. package/sdk/dist/query/query-dispatch.d.ts +48 -0
  781. package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
  782. package/sdk/dist/query/query-dispatch.js +175 -0
  783. package/sdk/dist/query/query-dispatch.js.map +1 -0
  784. package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
  785. package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
  786. package/sdk/dist/query/query-error-details-schema.js +10 -0
  787. package/sdk/dist/query/query-error-details-schema.js.map +1 -0
  788. package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
  789. package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
  790. package/sdk/dist/query/query-error-taxonomy.js +74 -0
  791. package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
  792. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
  793. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
  794. package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
  795. package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
  796. package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
  797. package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
  798. package/sdk/dist/query/query-fallback-executor.js +31 -0
  799. package/sdk/dist/query/query-fallback-executor.js.map +1 -0
  800. package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
  801. package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
  802. package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
  803. package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
  804. package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
  805. package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
  806. package/sdk/dist/query/query-fallback-policy.js +7 -0
  807. package/sdk/dist/query/query-fallback-policy.js.map +1 -0
  808. package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
  809. package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
  810. package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
  811. package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
  812. package/sdk/dist/query/query-policy-capability.d.ts +10 -0
  813. package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
  814. package/sdk/dist/query/query-policy-capability.js +17 -0
  815. package/sdk/dist/query/query-policy-capability.js.map +1 -0
  816. package/sdk/dist/query/query-runtime-context.d.ts +19 -0
  817. package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
  818. package/sdk/dist/query/query-runtime-context.js +31 -0
  819. package/sdk/dist/query/query-runtime-context.js.map +1 -0
  820. package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
  821. package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
  822. package/sdk/dist/query/query-unknown-command-hints.js +6 -0
  823. package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
  824. package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
  825. package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
  826. package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
  827. package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
  828. package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
  829. package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
  830. package/sdk/dist/query/registry-assembly-invariants.js +77 -0
  831. package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
  832. package/sdk/dist/query/registry-assembly.d.ts +10 -0
  833. package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
  834. package/sdk/dist/query/registry-assembly.js +53 -0
  835. package/sdk/dist/query/registry-assembly.js.map +1 -0
  836. package/sdk/dist/query/registry.d.ts +90 -0
  837. package/sdk/dist/query/registry.d.ts.map +1 -0
  838. package/sdk/dist/query/registry.js +129 -0
  839. package/sdk/dist/query/registry.js.map +1 -0
  840. package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
  841. package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
  842. package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
  843. package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
  844. package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
  845. package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
  846. package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
  847. package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
  848. package/sdk/dist/query/roadmap.d.ts +137 -0
  849. package/sdk/dist/query/roadmap.d.ts.map +1 -0
  850. package/sdk/dist/query/roadmap.js +753 -0
  851. package/sdk/dist/query/roadmap.js.map +1 -0
  852. package/sdk/dist/query/route-next-action.d.ts +9 -0
  853. package/sdk/dist/query/route-next-action.d.ts.map +1 -0
  854. package/sdk/dist/query/route-next-action.js +318 -0
  855. package/sdk/dist/query/route-next-action.js.map +1 -0
  856. package/sdk/dist/query/schema-detect.d.ts +21 -0
  857. package/sdk/dist/query/schema-detect.d.ts.map +1 -0
  858. package/sdk/dist/query/schema-detect.js +146 -0
  859. package/sdk/dist/query/schema-detect.js.map +1 -0
  860. package/sdk/dist/query/secrets.d.ts +27 -0
  861. package/sdk/dist/query/secrets.d.ts.map +1 -0
  862. package/sdk/dist/query/secrets.js +42 -0
  863. package/sdk/dist/query/secrets.js.map +1 -0
  864. package/sdk/dist/query/skill-manifest.d.ts +50 -0
  865. package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
  866. package/sdk/dist/query/skill-manifest.js +171 -0
  867. package/sdk/dist/query/skill-manifest.js.map +1 -0
  868. package/sdk/dist/query/skills.d.ts +27 -0
  869. package/sdk/dist/query/skills.d.ts.map +1 -0
  870. package/sdk/dist/query/skills.js +137 -0
  871. package/sdk/dist/query/skills.js.map +1 -0
  872. package/sdk/dist/query/state-document.d.ts +14 -0
  873. package/sdk/dist/query/state-document.d.ts.map +1 -0
  874. package/sdk/dist/query/state-document.js +110 -0
  875. package/sdk/dist/query/state-document.js.map +1 -0
  876. package/sdk/dist/query/state-mutation.d.ts +224 -0
  877. package/sdk/dist/query/state-mutation.d.ts.map +1 -0
  878. package/sdk/dist/query/state-mutation.js +1539 -0
  879. package/sdk/dist/query/state-mutation.js.map +1 -0
  880. package/sdk/dist/query/state-project-load.d.ts +23 -0
  881. package/sdk/dist/query/state-project-load.d.ts.map +1 -0
  882. package/sdk/dist/query/state-project-load.js +75 -0
  883. package/sdk/dist/query/state-project-load.js.map +1 -0
  884. package/sdk/dist/query/state.d.ts +78 -0
  885. package/sdk/dist/query/state.d.ts.map +1 -0
  886. package/sdk/dist/query/state.js +430 -0
  887. package/sdk/dist/query/state.js.map +1 -0
  888. package/sdk/dist/query/summary.d.ts +18 -0
  889. package/sdk/dist/query/summary.d.ts.map +1 -0
  890. package/sdk/dist/query/summary.js +249 -0
  891. package/sdk/dist/query/summary.js.map +1 -0
  892. package/sdk/dist/query/template.d.ts +46 -0
  893. package/sdk/dist/query/template.d.ts.map +1 -0
  894. package/sdk/dist/query/template.js +210 -0
  895. package/sdk/dist/query/template.js.map +1 -0
  896. package/sdk/dist/query/uat.d.ts +34 -0
  897. package/sdk/dist/query/uat.d.ts.map +1 -0
  898. package/sdk/dist/query/uat.js +339 -0
  899. package/sdk/dist/query/uat.js.map +1 -0
  900. package/sdk/dist/query/utils.d.ts +59 -0
  901. package/sdk/dist/query/utils.d.ts.map +1 -0
  902. package/sdk/dist/query/utils.js +74 -0
  903. package/sdk/dist/query/utils.js.map +1 -0
  904. package/sdk/dist/query/validate.d.ts +67 -0
  905. package/sdk/dist/query/validate.d.ts.map +1 -0
  906. package/sdk/dist/query/validate.js +908 -0
  907. package/sdk/dist/query/validate.js.map +1 -0
  908. package/sdk/dist/query/verify.d.ts +110 -0
  909. package/sdk/dist/query/verify.d.ts.map +1 -0
  910. package/sdk/dist/query/verify.js +631 -0
  911. package/sdk/dist/query/verify.js.map +1 -0
  912. package/sdk/dist/query/websearch.d.ts +24 -0
  913. package/sdk/dist/query/websearch.d.ts.map +1 -0
  914. package/sdk/dist/query/websearch.js +68 -0
  915. package/sdk/dist/query/websearch.js.map +1 -0
  916. package/sdk/dist/query/workspace.d.ts +62 -0
  917. package/sdk/dist/query/workspace.d.ts.map +1 -0
  918. package/sdk/dist/query/workspace.js +104 -0
  919. package/sdk/dist/query/workspace.js.map +1 -0
  920. package/sdk/dist/query/workstream-inventory.d.ts +52 -0
  921. package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
  922. package/sdk/dist/query/workstream-inventory.js +141 -0
  923. package/sdk/dist/query/workstream-inventory.js.map +1 -0
  924. package/sdk/dist/query/workstream.d.ts +35 -0
  925. package/sdk/dist/query/workstream.d.ts.map +1 -0
  926. package/sdk/dist/query/workstream.js +298 -0
  927. package/sdk/dist/query/workstream.js.map +1 -0
  928. package/sdk/dist/query/worktree.d.ts +3 -0
  929. package/sdk/dist/query/worktree.d.ts.map +1 -0
  930. package/sdk/dist/query/worktree.js +36 -0
  931. package/sdk/dist/query/worktree.js.map +1 -0
  932. package/sdk/dist/query-command-executor.d.ts +22 -0
  933. package/sdk/dist/query-command-executor.d.ts.map +1 -0
  934. package/sdk/dist/query-command-executor.js +22 -0
  935. package/sdk/dist/query-command-executor.js.map +1 -0
  936. package/sdk/dist/query-execution-policy.d.ts +24 -0
  937. package/sdk/dist/query-execution-policy.d.ts.map +1 -0
  938. package/sdk/dist/query-execution-policy.js +27 -0
  939. package/sdk/dist/query-execution-policy.js.map +1 -0
  940. package/sdk/dist/query-failure-classification.d.ts +9 -0
  941. package/sdk/dist/query-failure-classification.d.ts.map +1 -0
  942. package/sdk/dist/query-failure-classification.js +32 -0
  943. package/sdk/dist/query-failure-classification.js.map +1 -0
  944. package/sdk/dist/query-hotpath-methods.d.ts +19 -0
  945. package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
  946. package/sdk/dist/query-hotpath-methods.js +34 -0
  947. package/sdk/dist/query-hotpath-methods.js.map +1 -0
  948. package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
  949. package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
  950. package/sdk/dist/query-native-direct-adapter.js +52 -0
  951. package/sdk/dist/query-native-direct-adapter.js.map +1 -0
  952. package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
  953. package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
  954. package/sdk/dist/query-native-hotpath-adapter.js +32 -0
  955. package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
  956. package/sdk/dist/query-raw-output-projection.d.ts +6 -0
  957. package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
  958. package/sdk/dist/query-raw-output-projection.js +67 -0
  959. package/sdk/dist/query-raw-output-projection.js.map +1 -0
  960. package/sdk/dist/query-runtime-bridge.d.ts +61 -0
  961. package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
  962. package/sdk/dist/query-runtime-bridge.js +144 -0
  963. package/sdk/dist/query-runtime-bridge.js.map +1 -0
  964. package/sdk/dist/query-sdd-tools-path.d.ts +2 -0
  965. package/sdk/dist/query-sdd-tools-path.d.ts.map +1 -0
  966. package/sdk/dist/query-sdd-tools-path.js +2 -0
  967. package/sdk/dist/query-sdd-tools-path.js.map +1 -0
  968. package/sdk/dist/query-sdd-tools-runtime.d.ts +20 -0
  969. package/sdk/dist/query-sdd-tools-runtime.d.ts.map +1 -0
  970. package/sdk/dist/query-sdd-tools-runtime.js +47 -0
  971. package/sdk/dist/query-sdd-tools-runtime.js.map +1 -0
  972. package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
  973. package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
  974. package/sdk/dist/query-subprocess-adapter.js +92 -0
  975. package/sdk/dist/query-subprocess-adapter.js.map +1 -0
  976. package/sdk/dist/query-tools-error-factory.d.ts +16 -0
  977. package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
  978. package/sdk/dist/query-tools-error-factory.js +33 -0
  979. package/sdk/dist/query-tools-error-factory.js.map +1 -0
  980. package/sdk/dist/research-gate.d.ts +24 -0
  981. package/sdk/dist/research-gate.d.ts.map +1 -0
  982. package/sdk/dist/research-gate.js +70 -0
  983. package/sdk/dist/research-gate.js.map +1 -0
  984. package/sdk/dist/runtime-gate.d.ts +14 -0
  985. package/sdk/dist/runtime-gate.d.ts.map +1 -0
  986. package/sdk/dist/runtime-gate.js +48 -0
  987. package/sdk/dist/runtime-gate.js.map +1 -0
  988. package/sdk/dist/sdd-tools-error.d.ts +23 -0
  989. package/sdk/dist/sdd-tools-error.d.ts.map +1 -0
  990. package/sdk/dist/sdd-tools-error.js +29 -0
  991. package/sdk/dist/sdd-tools-error.js.map +1 -0
  992. package/sdk/dist/sdd-tools.d.ts +97 -0
  993. package/sdk/dist/sdd-tools.d.ts.map +1 -0
  994. package/sdk/dist/sdd-tools.js +168 -0
  995. package/sdk/dist/sdd-tools.js.map +1 -0
  996. package/sdk/dist/sdd-transport-policy.d.ts +10 -0
  997. package/sdk/dist/sdd-transport-policy.d.ts.map +1 -0
  998. package/sdk/dist/sdd-transport-policy.js +32 -0
  999. package/sdk/dist/sdd-transport-policy.js.map +1 -0
  1000. package/sdk/dist/sdd-transport.d.ts +39 -0
  1001. package/sdk/dist/sdd-transport.d.ts.map +1 -0
  1002. package/sdk/dist/sdd-transport.js +78 -0
  1003. package/sdk/dist/sdd-transport.js.map +1 -0
  1004. package/sdk/dist/sdk-package-compatibility.d.ts +38 -0
  1005. package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
  1006. package/sdk/dist/sdk-package-compatibility.js +90 -0
  1007. package/sdk/dist/sdk-package-compatibility.js.map +1 -0
  1008. package/sdk/dist/session-runner.d.ts +40 -0
  1009. package/sdk/dist/session-runner.d.ts.map +1 -0
  1010. package/sdk/dist/session-runner.js +274 -0
  1011. package/sdk/dist/session-runner.js.map +1 -0
  1012. package/sdk/dist/tool-scoping.d.ts +31 -0
  1013. package/sdk/dist/tool-scoping.d.ts.map +1 -0
  1014. package/sdk/dist/tool-scoping.js +54 -0
  1015. package/sdk/dist/tool-scoping.js.map +1 -0
  1016. package/sdk/dist/types.d.ts +794 -0
  1017. package/sdk/dist/types.d.ts.map +1 -0
  1018. package/sdk/dist/types.js +77 -0
  1019. package/sdk/dist/types.js.map +1 -0
  1020. package/sdk/dist/workstream-name-policy.d.ts +13 -0
  1021. package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
  1022. package/sdk/dist/workstream-name-policy.js +24 -0
  1023. package/sdk/dist/workstream-name-policy.js.map +1 -0
  1024. package/sdk/dist/workstream-utils.d.ts +15 -0
  1025. package/sdk/dist/workstream-utils.d.ts.map +1 -0
  1026. package/sdk/dist/workstream-utils.js +21 -0
  1027. package/sdk/dist/workstream-utils.js.map +1 -0
  1028. package/sdk/dist/ws-transport.d.ts +32 -0
  1029. package/sdk/dist/ws-transport.d.ts.map +1 -0
  1030. package/sdk/dist/ws-transport.js +84 -0
  1031. package/sdk/dist/ws-transport.js.map +1 -0
  1032. package/sdk/package-lock.json +2502 -0
  1033. package/sdk/package.json +57 -0
  1034. package/sdk/prompts/templates/project.md +186 -0
  1035. package/sdk/prompts/templates/requirements.md +231 -0
  1036. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  1037. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  1038. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  1039. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  1040. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  1041. package/sdk/prompts/templates/roadmap.md +202 -0
  1042. package/sdk/prompts/templates/state.md +175 -0
  1043. package/sdk/shared/model-catalog.json +122 -0
  1044. package/sdk/src/assembled-prompts.test.ts +349 -0
  1045. package/sdk/src/bug-3591-sddtools-runtime-workstream.test.ts +179 -0
  1046. package/sdk/src/cli-transport.test.ts +388 -0
  1047. package/sdk/src/cli-transport.ts +130 -0
  1048. package/sdk/src/cli.test.ts +426 -0
  1049. package/sdk/src/cli.ts +589 -0
  1050. package/sdk/src/config.test.ts +271 -0
  1051. package/sdk/src/config.ts +218 -0
  1052. package/sdk/src/context-engine.test.ts +295 -0
  1053. package/sdk/src/context-engine.ts +170 -0
  1054. package/sdk/src/context-truncation.test.ts +163 -0
  1055. package/sdk/src/context-truncation.ts +233 -0
  1056. package/sdk/src/e2e.integration.test.ts +181 -0
  1057. package/sdk/src/errors.ts +72 -0
  1058. package/sdk/src/event-stream.test.ts +661 -0
  1059. package/sdk/src/event-stream.ts +441 -0
  1060. package/sdk/src/golden/capture.ts +95 -0
  1061. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  1062. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  1063. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  1064. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  1065. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  1066. package/sdk/src/golden/golden-mutation-covered.ts +17 -0
  1067. package/sdk/src/golden/golden-policy.test.ts +8 -0
  1068. package/sdk/src/golden/golden-policy.ts +120 -0
  1069. package/sdk/src/golden/golden.integration.test.ts +677 -0
  1070. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  1071. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  1072. package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
  1073. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  1074. package/sdk/src/index.ts +352 -0
  1075. package/sdk/src/init-e2e.integration.test.ts +138 -0
  1076. package/sdk/src/init-runner.test.ts +740 -0
  1077. package/sdk/src/init-runner.ts +734 -0
  1078. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  1079. package/sdk/src/logger.test.ts +149 -0
  1080. package/sdk/src/logger.ts +113 -0
  1081. package/sdk/src/milestone-runner.test.ts +421 -0
  1082. package/sdk/src/model-catalog.ts +70 -0
  1083. package/sdk/src/phase-prompt.test.ts +535 -0
  1084. package/sdk/src/phase-prompt.ts +259 -0
  1085. package/sdk/src/phase-runner-types.test.ts +421 -0
  1086. package/sdk/src/phase-runner.integration.test.ts +377 -0
  1087. package/sdk/src/phase-runner.test.ts +2720 -0
  1088. package/sdk/src/phase-runner.ts +1442 -0
  1089. package/sdk/src/plan-parser.test.ts +579 -0
  1090. package/sdk/src/plan-parser.ts +431 -0
  1091. package/sdk/src/planning-journal.test.ts +70 -0
  1092. package/sdk/src/planning-journal.ts +153 -0
  1093. package/sdk/src/planning-runtime.test.ts +29 -0
  1094. package/sdk/src/planning-runtime.ts +100 -0
  1095. package/sdk/src/prompt-builder.test.ts +318 -0
  1096. package/sdk/src/prompt-builder.ts +218 -0
  1097. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  1098. package/sdk/src/prompt-sanitizer.ts +116 -0
  1099. package/sdk/src/query/QUERY-HANDLERS.md +349 -0
  1100. package/sdk/src/query/active-workstream-store.ts +50 -0
  1101. package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
  1102. package/sdk/src/query/agent-failure-classifier.ts +105 -0
  1103. package/sdk/src/query/audit-open.ts +722 -0
  1104. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  1105. package/sdk/src/query/check-auto-mode.ts +49 -0
  1106. package/sdk/src/query/check-completion.test.ts +113 -0
  1107. package/sdk/src/query/check-completion.ts +182 -0
  1108. package/sdk/src/query/check-decision-coverage.test.ts +519 -0
  1109. package/sdk/src/query/check-decision-coverage.ts +554 -0
  1110. package/sdk/src/query/check-gates.test.ts +103 -0
  1111. package/sdk/src/query/check-gates.ts +112 -0
  1112. package/sdk/src/query/check-ship-ready.test.ts +111 -0
  1113. package/sdk/src/query/check-ship-ready.ts +104 -0
  1114. package/sdk/src/query/check-verification-status.test.ts +143 -0
  1115. package/sdk/src/query/check-verification-status.ts +160 -0
  1116. package/sdk/src/query/command-aliases.generated.ts +156 -0
  1117. package/sdk/src/query/command-catalog.ts +31 -0
  1118. package/sdk/src/query/command-definition.test.ts +47 -0
  1119. package/sdk/src/query/command-definition.ts +70 -0
  1120. package/sdk/src/query/command-family-handlers.ts +117 -0
  1121. package/sdk/src/query/command-manifest.init.ts +24 -0
  1122. package/sdk/src/query/command-manifest.non-family.ts +85 -0
  1123. package/sdk/src/query/command-manifest.phase.ts +16 -0
  1124. package/sdk/src/query/command-manifest.phases.ts +11 -0
  1125. package/sdk/src/query/command-manifest.roadmap.ts +11 -0
  1126. package/sdk/src/query/command-manifest.state.ts +31 -0
  1127. package/sdk/src/query/command-manifest.ts +17 -0
  1128. package/sdk/src/query/command-manifest.types.ts +13 -0
  1129. package/sdk/src/query/command-manifest.validate.ts +11 -0
  1130. package/sdk/src/query/command-manifest.verify.ts +15 -0
  1131. package/sdk/src/query/command-resolution.test.ts +70 -0
  1132. package/sdk/src/query/command-seam-coverage.test.ts +118 -0
  1133. package/sdk/src/query/command-static-catalog-domain.ts +117 -0
  1134. package/sdk/src/query/command-static-catalog-foundation.ts +103 -0
  1135. package/sdk/src/query/command-topology.test.ts +28 -0
  1136. package/sdk/src/query/command-topology.ts +114 -0
  1137. package/sdk/src/query/commands-list.test.ts +36 -0
  1138. package/sdk/src/query/commands-list.ts +19 -0
  1139. package/sdk/src/query/commit.test.ts +485 -0
  1140. package/sdk/src/query/commit.ts +383 -0
  1141. package/sdk/src/query/config-gates.test.ts +89 -0
  1142. package/sdk/src/query/config-gates.ts +69 -0
  1143. package/sdk/src/query/config-mutation.test.ts +598 -0
  1144. package/sdk/src/query/config-mutation.ts +575 -0
  1145. package/sdk/src/query/config-query.test.ts +367 -0
  1146. package/sdk/src/query/config-query.ts +244 -0
  1147. package/sdk/src/query/config-schema.ts +159 -0
  1148. package/sdk/src/query/decisions.test.ts +215 -0
  1149. package/sdk/src/query/decisions.ts +192 -0
  1150. package/sdk/src/query/decomposed-handlers.test.ts +431 -0
  1151. package/sdk/src/query/detect-custom-files.test.ts +115 -0
  1152. package/sdk/src/query/detect-custom-files.ts +96 -0
  1153. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  1154. package/sdk/src/query/detect-phase-type.ts +141 -0
  1155. package/sdk/src/query/docs-init.ts +258 -0
  1156. package/sdk/src/query/fallow-audit.ts +88 -0
  1157. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  1158. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  1159. package/sdk/src/query/frontmatter-mutation.ts +343 -0
  1160. package/sdk/src/query/frontmatter.test.ts +326 -0
  1161. package/sdk/src/query/frontmatter.ts +395 -0
  1162. package/sdk/src/query/helpers.test.ts +615 -0
  1163. package/sdk/src/query/helpers.ts +646 -0
  1164. package/sdk/src/query/index-thin-seam.test.ts +16 -0
  1165. package/sdk/src/query/index.ts +9 -0
  1166. package/sdk/src/query/init-complex.test.ts +616 -0
  1167. package/sdk/src/query/init-complex.ts +799 -0
  1168. package/sdk/src/query/init-progress-precedence.test.ts +177 -0
  1169. package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
  1170. package/sdk/src/query/init.test.ts +792 -0
  1171. package/sdk/src/query/init.ts +1262 -0
  1172. package/sdk/src/query/intel.test.ts +90 -0
  1173. package/sdk/src/query/intel.ts +404 -0
  1174. package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
  1175. package/sdk/src/query/mutation-event-decorator.ts +37 -0
  1176. package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
  1177. package/sdk/src/query/mutation-event-mapper.ts +102 -0
  1178. package/sdk/src/query/mvp.test.ts +335 -0
  1179. package/sdk/src/query/mvp.ts +292 -0
  1180. package/sdk/src/query/normalize-query-command.test.ts +102 -0
  1181. package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
  1182. package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
  1183. package/sdk/src/query/phase-lifecycle.test.ts +1750 -0
  1184. package/sdk/src/query/phase-lifecycle.ts +1833 -0
  1185. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  1186. package/sdk/src/query/phase-list-queries.ts +152 -0
  1187. package/sdk/src/query/phase-ready.test.ts +65 -0
  1188. package/sdk/src/query/phase-ready.ts +159 -0
  1189. package/sdk/src/query/phase-roadmap-mutation.ts +77 -0
  1190. package/sdk/src/query/phase.test.ts +651 -0
  1191. package/sdk/src/query/phase.ts +550 -0
  1192. package/sdk/src/query/pipeline.test.ts +169 -0
  1193. package/sdk/src/query/pipeline.ts +243 -0
  1194. package/sdk/src/query/plan-scan.test.ts +35 -0
  1195. package/sdk/src/query/plan-scan.ts +82 -0
  1196. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  1197. package/sdk/src/query/plan-task-structure.ts +63 -0
  1198. package/sdk/src/query/policy-convergence.test.ts +28 -0
  1199. package/sdk/src/query/profile-extract-messages.ts +247 -0
  1200. package/sdk/src/query/profile-output.ts +929 -0
  1201. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  1202. package/sdk/src/query/profile-sample.ts +184 -0
  1203. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  1204. package/sdk/src/query/profile.test.ts +136 -0
  1205. package/sdk/src/query/profile.ts +337 -0
  1206. package/sdk/src/query/progress.test.ts +156 -0
  1207. package/sdk/src/query/progress.ts +566 -0
  1208. package/sdk/src/query/query-cli-adapter.test.ts +79 -0
  1209. package/sdk/src/query/query-cli-adapter.ts +39 -0
  1210. package/sdk/src/query/query-cli-output.test.ts +33 -0
  1211. package/sdk/src/query/query-cli-output.ts +35 -0
  1212. package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
  1213. package/sdk/src/query/query-command-diagnosis.ts +5 -0
  1214. package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
  1215. package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
  1216. package/sdk/src/query/query-command-semantics.test.ts +22 -0
  1217. package/sdk/src/query/query-command-semantics.ts +22 -0
  1218. package/sdk/src/query/query-dispatch-contract.ts +30 -0
  1219. package/sdk/src/query/query-dispatch-error-mapper.test.ts +62 -0
  1220. package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
  1221. package/sdk/src/query/query-dispatch-formatting.test.ts +28 -0
  1222. package/sdk/src/query/query-dispatch-formatting.ts +5 -0
  1223. package/sdk/src/query/query-dispatch-input-validation.test.ts +23 -0
  1224. package/sdk/src/query/query-dispatch-input-validation.ts +5 -0
  1225. package/sdk/src/query/query-dispatch-observability.test.ts +10 -0
  1226. package/sdk/src/query/query-dispatch-observability.ts +6 -0
  1227. package/sdk/src/query/query-dispatch-plan.test.ts +25 -0
  1228. package/sdk/src/query/query-dispatch-plan.ts +5 -0
  1229. package/sdk/src/query/query-dispatch-result-builder.test.ts +16 -0
  1230. package/sdk/src/query/query-dispatch-result-builder.ts +5 -0
  1231. package/sdk/src/query/query-dispatch.test.ts +399 -0
  1232. package/sdk/src/query/query-dispatch.ts +243 -0
  1233. package/sdk/src/query/query-error-details-schema.ts +29 -0
  1234. package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
  1235. package/sdk/src/query/query-error-taxonomy.ts +117 -0
  1236. package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
  1237. package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
  1238. package/sdk/src/query/query-fallback-executor.test.ts +82 -0
  1239. package/sdk/src/query/query-fallback-executor.ts +44 -0
  1240. package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
  1241. package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
  1242. package/sdk/src/query/query-fallback-policy.test.ts +13 -0
  1243. package/sdk/src/query/query-fallback-policy.ts +11 -0
  1244. package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
  1245. package/sdk/src/query/query-policy-capability.test.ts +10 -0
  1246. package/sdk/src/query/query-policy-capability.ts +26 -0
  1247. package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
  1248. package/sdk/src/query/query-registry-capability.test.ts +14 -0
  1249. package/sdk/src/query/query-runtime-context.ts +44 -0
  1250. package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
  1251. package/sdk/src/query/query-unknown-command-hints.ts +5 -0
  1252. package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
  1253. package/sdk/src/query/registry-assembly-invariants.ts +127 -0
  1254. package/sdk/src/query/registry-assembly.test.ts +138 -0
  1255. package/sdk/src/query/registry-assembly.ts +78 -0
  1256. package/sdk/src/query/registry.test.ts +208 -0
  1257. package/sdk/src/query/registry.ts +142 -0
  1258. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  1259. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  1260. package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
  1261. package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
  1262. package/sdk/src/query/roadmap.test.ts +1181 -0
  1263. package/sdk/src/query/roadmap.ts +894 -0
  1264. package/sdk/src/query/route-next-action.test.ts +61 -0
  1265. package/sdk/src/query/route-next-action.ts +345 -0
  1266. package/sdk/src/query/schema-detect.ts +189 -0
  1267. package/sdk/src/query/secrets.test.ts +66 -0
  1268. package/sdk/src/query/secrets.ts +43 -0
  1269. package/sdk/src/query/skill-manifest.test.ts +62 -0
  1270. package/sdk/src/query/skill-manifest.ts +216 -0
  1271. package/sdk/src/query/skills.test.ts +234 -0
  1272. package/sdk/src/query/skills.ts +143 -0
  1273. package/sdk/src/query/state-document.test.ts +197 -0
  1274. package/sdk/src/query/state-document.ts +129 -0
  1275. package/sdk/src/query/state-mutation.test.ts +1198 -0
  1276. package/sdk/src/query/state-mutation.ts +1718 -0
  1277. package/sdk/src/query/state-project-load.ts +80 -0
  1278. package/sdk/src/query/state.test.ts +616 -0
  1279. package/sdk/src/query/state.ts +463 -0
  1280. package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
  1281. package/sdk/src/query/summary.test.ts +95 -0
  1282. package/sdk/src/query/summary.ts +296 -0
  1283. package/sdk/src/query/template.test.ts +180 -0
  1284. package/sdk/src/query/template.ts +242 -0
  1285. package/sdk/src/query/uat.test.ts +77 -0
  1286. package/sdk/src/query/uat.ts +365 -0
  1287. package/sdk/src/query/utils.test.ts +82 -0
  1288. package/sdk/src/query/utils.ts +106 -0
  1289. package/sdk/src/query/validate.test.ts +831 -0
  1290. package/sdk/src/query/validate.ts +952 -0
  1291. package/sdk/src/query/verify.test.ts +414 -0
  1292. package/sdk/src/query/verify.ts +692 -0
  1293. package/sdk/src/query/websearch.test.ts +31 -0
  1294. package/sdk/src/query/websearch.ts +82 -0
  1295. package/sdk/src/query/workspace.test.ts +120 -0
  1296. package/sdk/src/query/workspace.ts +145 -0
  1297. package/sdk/src/query/workstream-inventory.ts +195 -0
  1298. package/sdk/src/query/workstream.test.ts +153 -0
  1299. package/sdk/src/query/workstream.ts +324 -0
  1300. package/sdk/src/query/worktree.ts +39 -0
  1301. package/sdk/src/query-command-executor.ts +31 -0
  1302. package/sdk/src/query-execution-policy.test.ts +52 -0
  1303. package/sdk/src/query-execution-policy.ts +46 -0
  1304. package/sdk/src/query-failure-classification.test.ts +23 -0
  1305. package/sdk/src/query-failure-classification.ts +42 -0
  1306. package/sdk/src/query-hotpath-methods.ts +48 -0
  1307. package/sdk/src/query-native-direct-adapter.test.ts +35 -0
  1308. package/sdk/src/query-native-direct-adapter.ts +70 -0
  1309. package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
  1310. package/sdk/src/query-native-hotpath-adapter.ts +45 -0
  1311. package/sdk/src/query-raw-output-projection.test.ts +39 -0
  1312. package/sdk/src/query-raw-output-projection.ts +74 -0
  1313. package/sdk/src/query-runtime-bridge.test.ts +150 -0
  1314. package/sdk/src/query-runtime-bridge.ts +215 -0
  1315. package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
  1316. package/sdk/src/query-sdd-tools-path.ts +1 -0
  1317. package/sdk/src/query-sdd-tools-runtime.ts +89 -0
  1318. package/sdk/src/query-subprocess-adapter.test.ts +84 -0
  1319. package/sdk/src/query-subprocess-adapter.ts +146 -0
  1320. package/sdk/src/query-tools-error-factory.test.ts +35 -0
  1321. package/sdk/src/query-tools-error-factory.ts +76 -0
  1322. package/sdk/src/research-gate.test.ts +190 -0
  1323. package/sdk/src/research-gate.ts +94 -0
  1324. package/sdk/src/runtime-bridge-options.test.ts +33 -0
  1325. package/sdk/src/runtime-gate.test.ts +84 -0
  1326. package/sdk/src/runtime-gate.ts +52 -0
  1327. package/sdk/src/sdd-tools-error.test.ts +21 -0
  1328. package/sdk/src/sdd-tools-error.ts +65 -0
  1329. package/sdk/src/sdd-tools.test.ts +472 -0
  1330. package/sdk/src/sdd-tools.ts +237 -0
  1331. package/sdk/src/sdd-transport-policy.test.ts +34 -0
  1332. package/sdk/src/sdd-transport-policy.ts +48 -0
  1333. package/sdk/src/sdd-transport.test.ts +292 -0
  1334. package/sdk/src/sdd-transport.ts +117 -0
  1335. package/sdk/src/sdk-package-compatibility.test.ts +97 -0
  1336. package/sdk/src/sdk-package-compatibility.ts +141 -0
  1337. package/sdk/src/session-runner.test.ts +164 -0
  1338. package/sdk/src/session-runner.ts +327 -0
  1339. package/sdk/src/tool-scoping.test.ts +160 -0
  1340. package/sdk/src/tool-scoping.ts +61 -0
  1341. package/sdk/src/types.ts +927 -0
  1342. package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
  1343. package/sdk/src/workstream-name-policy.ts +24 -0
  1344. package/sdk/src/workstream-utils.ts +21 -0
  1345. package/sdk/src/ws-flag.test.ts +285 -0
  1346. package/sdk/src/ws-transport.test.ts +161 -0
  1347. package/sdk/src/ws-transport.ts +93 -0
  1348. package/sdk/tsconfig.json +20 -0
  1349. package/commands/sdd/add-backlog.md +0 -76
  1350. package/commands/sdd/add-phase.md +0 -43
  1351. package/commands/sdd/add-todo.md +0 -47
  1352. package/commands/sdd/analyze-dependencies.md +0 -34
  1353. package/commands/sdd/check-todos.md +0 -45
  1354. package/commands/sdd/code-review-fix.md +0 -52
  1355. package/commands/sdd/do.md +0 -30
  1356. package/commands/sdd/from-sdd2.md +0 -45
  1357. package/commands/sdd/insert-phase.md +0 -32
  1358. package/commands/sdd/intel.md +0 -179
  1359. package/commands/sdd/join-discord.md +0 -19
  1360. package/commands/sdd/list-phase-assumptions.md +0 -46
  1361. package/commands/sdd/list-workspaces.md +0 -19
  1362. package/commands/sdd/new-workspace.md +0 -44
  1363. package/commands/sdd/next.md +0 -26
  1364. package/commands/sdd/note.md +0 -34
  1365. package/commands/sdd/plan-milestone-gaps.md +0 -34
  1366. package/commands/sdd/plant-seed.md +0 -28
  1367. package/commands/sdd/remove-phase.md +0 -31
  1368. package/commands/sdd/remove-workspace.md +0 -26
  1369. package/commands/sdd/research-phase.md +0 -195
  1370. package/commands/sdd/scan.md +0 -26
  1371. package/commands/sdd/session-report.md +0 -19
  1372. package/commands/sdd/set-profile.md +0 -12
  1373. package/scripts/sync-upstream.sh +0 -56
  1374. package/sdd/workflows/research-phase.md +0 -82
@@ -0,0 +1,1262 @@
1
+ /**
2
+ * Init composition handlers — compound init commands for workflow bootstrapping.
3
+ *
4
+ * Composes existing atomic SDK queries into the same flat JSON bundles
5
+ * that CJS init.cjs produces, enabling workflow migration. Each handler
6
+ * follows the QueryHandler signature and returns { data: <flat JSON> }.
7
+ *
8
+ * Port of sdd/bin/lib/init.cjs (13 of 16 handlers).
9
+ * The 3 complex handlers (new-project, progress, manager) are in init-complex.ts.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { initExecutePhase, withProjectRoot } from './init.js';
14
+ *
15
+ * const result = await initExecutePhase(['9'], '/project');
16
+ * // { data: { executor_model: 'opus', phase_found: true, ... } }
17
+ * ```
18
+ */
19
+
20
+ import { existsSync, readdirSync, readFileSync, statSync, type Dirent } from 'node:fs';
21
+ import { readFile, readdir } from 'node:fs/promises';
22
+ import { join, relative, basename } from 'node:path';
23
+ import { execSync } from 'node:child_process';
24
+ import { homedir } from 'node:os';
25
+
26
+ import { loadConfig, type SDDConfig } from '../config.js';
27
+ import { resolveModel, MODEL_PROFILES } from './config-query.js';
28
+ import { maskIfSecret } from './secrets.js';
29
+ import { findPhase } from './phase.js';
30
+ import { roadmapGetPhase, getMilestoneInfo, extractCurrentMilestone, extractPhasesFromSection } from './roadmap.js';
31
+ import { determinePhaseStatus } from './progress.js';
32
+ import { planningPaths, normalizePhaseName, toPosixPath, resolveAgentsDir, detectRuntime } from './helpers.js';
33
+ import { generatePhaseSlug, assertSafeProjectCode } from './phase-lifecycle-policy.js';
34
+ import type { QueryHandler } from './utils.js';
35
+
36
+ // ─── Internal helpers ──────────────────────────────────────────────────────
37
+
38
+ /**
39
+ * Extract model alias string from a resolveModel result.
40
+ */
41
+ async function getModelAlias(agentType: string, projectDir: string): Promise<string> {
42
+ const result = await resolveModel([agentType], projectDir);
43
+ const data = result.data as Record<string, unknown>;
44
+ return (data.model as string) || 'sonnet';
45
+ }
46
+
47
+ /**
48
+ * Generate a slug from text (inline, matches CJS generateSlugInternal).
49
+ */
50
+ function generateSlugInternal(text: string): string {
51
+ return text
52
+ .toLowerCase()
53
+ .replace(/[^a-z0-9]+/g, '-')
54
+ .replace(/^-+|-+$/g, '')
55
+ .substring(0, 60);
56
+ }
57
+
58
+ function extractPhaseArg(args: string[]): string | undefined {
59
+ const equalsArg = args.find((arg) => arg.startsWith('--phase='));
60
+ if (equalsArg) {
61
+ const value = equalsArg.slice('--phase='.length).trim();
62
+ return value || undefined;
63
+ }
64
+
65
+ const flagIndex = args.indexOf('--phase');
66
+ if (flagIndex !== -1) {
67
+ const value = args[flagIndex + 1];
68
+ return value && !value.startsWith('--') ? value : undefined;
69
+ }
70
+
71
+ const first = args[0];
72
+ return first && !first.startsWith('--') ? first : undefined;
73
+ }
74
+
75
+ /**
76
+ * Check if a path exists on disk.
77
+ */
78
+ function pathExists(base: string, relPath: string): boolean {
79
+ return existsSync(join(base, relPath));
80
+ }
81
+
82
+ /**
83
+ * Bug #3491: detect whether `base` is inside any git worktree, and if so,
84
+ * return the absolute worktree root. Mirrors the CJS `gitWorktreeInfoInternal`
85
+ * in sdd/bin/lib/core.cjs — keep these two implementations behaviour-
86
+ * identical so the SDK and CJS init handlers emit the same has_git semantics.
87
+ *
88
+ * Returns { inside, worktreeRoot } — both fall back to false/null on any error
89
+ * (git unavailable, not a repo, timeout) so callers see the conservative
90
+ * default that preserves pre-fix behaviour for non-git environments.
91
+ */
92
+ function gitWorktreeInfo(base: string): { inside: boolean; worktreeRoot: string | null } {
93
+ try {
94
+ const inside = execSync('git rev-parse --is-inside-work-tree', {
95
+ cwd: base,
96
+ stdio: ['ignore', 'pipe', 'ignore'],
97
+ encoding: 'utf-8',
98
+ timeout: 5000,
99
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
100
+ }).trim();
101
+ if (inside !== 'true') return { inside: false, worktreeRoot: null };
102
+ try {
103
+ const root = execSync('git rev-parse --show-toplevel', {
104
+ cwd: base,
105
+ stdio: ['ignore', 'pipe', 'ignore'],
106
+ encoding: 'utf-8',
107
+ timeout: 5000,
108
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
109
+ }).trim();
110
+ return { inside: true, worktreeRoot: root || null };
111
+ } catch {
112
+ return { inside: true, worktreeRoot: null };
113
+ }
114
+ } catch {
115
+ return { inside: false, worktreeRoot: null };
116
+ }
117
+ }
118
+
119
+
120
+ /**
121
+ * Compute the canonical phase directory name for a known phase entry from the
122
+ * roadmap when no directory exists yet. Applies the project_code prefix so
123
+ * the first-touch creation path used by /sdd-discuss-phase and /sdd-plan-phase
124
+ * stays consistent with the prefix produced by `phase.add` / `phase.insert`.
125
+ *
126
+ * Returns null when phaseNumber or phaseName cannot be determined.
127
+ */
128
+ function computeExpectedPhaseDirName(
129
+ phaseNumber: string | null,
130
+ phaseName: string | null,
131
+ projectCode: string,
132
+ ): string | null {
133
+ if (!phaseNumber || !phaseName) return null;
134
+ const paddedNum = normalizePhaseName(phaseNumber);
135
+ const slug = generatePhaseSlug(phaseName);
136
+ if (!slug) return null;
137
+ const prefix = projectCode ? `${projectCode}-` : '';
138
+ return `${prefix}${paddedNum}-${slug}`;
139
+ }
140
+
141
+ async function shouldDropArchivedPhaseMatch(
142
+ phaseInfo: Record<string, unknown> | null,
143
+ roadmapPhase: Record<string, unknown> | null,
144
+ projectDir: string,
145
+ workstream?: string,
146
+ ): Promise<boolean> {
147
+ if (!phaseInfo?.archived || !roadmapPhase || !roadmapPhase.found) return false;
148
+ const archivedTag = String(phaseInfo.archived ?? '');
149
+ const milestone = await getMilestoneInfo(projectDir, workstream);
150
+ if (milestone?.version && archivedTag === milestone.version) return false;
151
+ return true;
152
+ }
153
+
154
+ /**
155
+ * Get the latest completed milestone from MILESTONES.md.
156
+ * Port of getLatestCompletedMilestone from init.cjs lines 10-25.
157
+ */
158
+ function getLatestCompletedMilestone(projectDir: string): { version: string; name: string } | null {
159
+ const milestonesPath = join(projectDir, '.planning', 'MILESTONES.md');
160
+ if (!existsSync(milestonesPath)) return null;
161
+
162
+ try {
163
+ const content = readFileSync(milestonesPath, 'utf-8');
164
+ const match = content.match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);
165
+ if (!match) return null;
166
+ return { version: match[1], name: match[2].trim() };
167
+ } catch {
168
+ return null;
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Check which SDD agents are installed on disk.
174
+ *
175
+ * Runtime-aware per issue #2402: detects the invoking runtime
176
+ * (`SDD_RUNTIME` → `config.runtime` → 'claude') and probes that runtime's
177
+ * canonical `agents/` directory. `SDD_AGENTS_DIR` still short-circuits.
178
+ *
179
+ * Port of checkAgentsInstalled from core.cjs lines 1274-1306.
180
+ */
181
+ function checkAgentsInstalled(config?: { runtime?: unknown }): { agents_installed: boolean; missing_agents: string[] } {
182
+ const runtime = detectRuntime(config);
183
+ const agentsDir = resolveAgentsDir(runtime);
184
+ const expectedAgents = Object.keys(MODEL_PROFILES);
185
+
186
+ if (!existsSync(agentsDir)) {
187
+ return { agents_installed: false, missing_agents: expectedAgents };
188
+ }
189
+
190
+ const missing: string[] = [];
191
+ for (const agent of expectedAgents) {
192
+ const agentFile = join(agentsDir, `${agent}.md`);
193
+ const agentFileCopilot = join(agentsDir, `${agent}.agent.md`);
194
+ if (!existsSync(agentFile) && !existsSync(agentFileCopilot)) {
195
+ missing.push(agent);
196
+ }
197
+ }
198
+
199
+ return {
200
+ agents_installed: missing.length === 0,
201
+ missing_agents: missing,
202
+ };
203
+ }
204
+
205
+ /**
206
+ * Extract phase info from findPhase result, or build fallback from roadmap.
207
+ */
208
+ async function getPhaseInfoWithFallback(
209
+ phase: string,
210
+ projectDir: string,
211
+ workstream?: string,
212
+ ): Promise<{ phaseInfo: Record<string, unknown> | null; roadmapPhase: Record<string, unknown> | null }> {
213
+ const phaseResult = await findPhase([phase], projectDir, workstream);
214
+ let phaseInfo = phaseResult.data as Record<string, unknown> | null;
215
+ // findPhase returns { found: false } when missing; findPhaseInternal returns null — align for init parity.
216
+ if (phaseInfo && phaseInfo.found === false) {
217
+ phaseInfo = null;
218
+ }
219
+
220
+ const roadmapResult = await roadmapGetPhase([phase], projectDir, workstream);
221
+ const roadmapPhase = roadmapResult.data as Record<string, unknown> | null;
222
+
223
+ // Match init.cjs: drop archived disk match when the phase is listed in the current ROADMAP
224
+ if (await shouldDropArchivedPhaseMatch(phaseInfo, roadmapPhase, projectDir, workstream)) {
225
+ phaseInfo = null;
226
+ }
227
+
228
+ // Fallback to ROADMAP.md if no phase directory exists yet
229
+ if ((!phaseInfo || !phaseInfo.found) && roadmapPhase?.found) {
230
+ const phaseName = roadmapPhase.phase_name as string;
231
+ phaseInfo = {
232
+ found: true,
233
+ directory: null,
234
+ phase_number: roadmapPhase.phase_number,
235
+ phase_name: phaseName,
236
+ phase_slug: phaseName ? generateSlugInternal(phaseName) : null,
237
+ plans: [],
238
+ summaries: [],
239
+ incomplete_plans: [],
240
+ has_research: false,
241
+ has_context: false,
242
+ has_verification: false,
243
+ has_reviews: false,
244
+ };
245
+ }
246
+
247
+ return { phaseInfo, roadmapPhase };
248
+ }
249
+
250
+ /**
251
+ * Phase resolution for `init verify-work` — matches init.cjs cmdInitVerifyWork (archived + fallback).
252
+ */
253
+ async function getPhaseInfoForVerifyWork(
254
+ phase: string,
255
+ projectDir: string,
256
+ workstream?: string,
257
+ ): Promise<{ phaseInfo: Record<string, unknown> | null }> {
258
+ const phaseResult = await findPhase([phase], projectDir, workstream);
259
+ let phaseInfo = phaseResult.data as Record<string, unknown> | null;
260
+ if (phaseInfo && phaseInfo.found === false) {
261
+ phaseInfo = null;
262
+ }
263
+
264
+ const roadmapResult = await roadmapGetPhase([phase], projectDir, workstream);
265
+ const roadmapPhase = roadmapResult.data as Record<string, unknown> | null;
266
+
267
+ if (await shouldDropArchivedPhaseMatch(phaseInfo, roadmapPhase, projectDir, workstream)) {
268
+ phaseInfo = null;
269
+ }
270
+
271
+ if (!phaseInfo && roadmapPhase?.found) {
272
+ const phaseName = roadmapPhase.phase_name as string;
273
+ phaseInfo = {
274
+ found: true,
275
+ directory: null,
276
+ phase_number: roadmapPhase.phase_number,
277
+ phase_name: phaseName,
278
+ phase_slug: phaseName ? generateSlugInternal(phaseName) : null,
279
+ plans: [],
280
+ summaries: [],
281
+ incomplete_plans: [],
282
+ has_research: false,
283
+ has_context: false,
284
+ has_verification: false,
285
+ };
286
+ }
287
+
288
+ return { phaseInfo };
289
+ }
290
+
291
+ /**
292
+ * Extract requirement IDs from roadmap section text.
293
+ */
294
+ function extractReqIds(roadmapPhase: Record<string, unknown> | null): string | null {
295
+ const section = roadmapPhase?.section as string | undefined;
296
+ // Accept all bold/colon variants of the Requirements header. The forms
297
+ // **Requirements:** (colon inside bold)
298
+ // **Requirements**: (colon outside bold)
299
+ // **Requirements** : (space before outside colon)
300
+ // render identically in markdown but differ textually. Issue #2769.
301
+ const reqMatch = section?.match(/^\*\*Requirements:?\*\*[^\S\n]*:?[^\S\n]*([^\n]*)$/m);
302
+ const reqExtracted = reqMatch
303
+ ? reqMatch[1].replace(/[\[\]]/g, '').split(',').map((s: string) => s.trim()).filter(Boolean).join(', ')
304
+ : null;
305
+ return (reqExtracted && reqExtracted !== 'TBD') ? reqExtracted : null;
306
+ }
307
+
308
+ // ─── withProjectRoot ─────────────────────────────────────────────────────
309
+
310
+ /**
311
+ * Inject project_root, agents_installed, missing_agents, and response_language
312
+ * into an init result object.
313
+ *
314
+ * Port of withProjectRoot from init.cjs lines 32-63.
315
+ *
316
+ * @param projectDir - Absolute project root path
317
+ * @param result - The result object to augment
318
+ * @param config - Optional loaded config (avoids re-reading config.json)
319
+ * @returns The augmented result object
320
+ */
321
+ export function withProjectRoot(
322
+ projectDir: string,
323
+ result: Record<string, unknown>,
324
+ config?: Record<string, unknown>,
325
+ ): Record<string, unknown> {
326
+ result.project_root = projectDir;
327
+
328
+ const agentStatus = checkAgentsInstalled(config);
329
+ result.agents_installed = agentStatus.agents_installed;
330
+ result.missing_agents = agentStatus.missing_agents;
331
+
332
+ const responseLang = config?.response_language;
333
+ if (responseLang) {
334
+ result.response_language = responseLang;
335
+ }
336
+
337
+ const projectCode = config?.project_code;
338
+ if (projectCode) {
339
+ result.project_code = projectCode;
340
+ }
341
+
342
+ const projectMdPath = join(projectDir, '.planning', 'PROJECT.md');
343
+ try {
344
+ if (existsSync(projectMdPath)) {
345
+ const content = readFileSync(projectMdPath, 'utf-8');
346
+ const h1Match = content.match(/^#\s+(.+)$/m);
347
+ if (h1Match) {
348
+ result.project_title = h1Match[1].trim();
349
+ }
350
+ }
351
+ } catch {
352
+ /* intentionally empty */
353
+ }
354
+
355
+ return result;
356
+ }
357
+
358
+ // ─── initExecutePhase ─────────────────────────────────────────────────────
359
+
360
+ /**
361
+ * Init handler for execute-phase workflow.
362
+ * Port of cmdInitExecutePhase from init.cjs lines 50-171.
363
+ */
364
+ export const initExecutePhase: QueryHandler = async (args, projectDir, workstream) => {
365
+ const phase = extractPhaseArg(args);
366
+ if (!phase) {
367
+ return { data: { error: 'phase required for init execute-phase' } };
368
+ }
369
+
370
+ const config = await loadConfig(projectDir);
371
+ const paths = planningPaths(projectDir, workstream);
372
+ const planningDir = paths.planning;
373
+
374
+ const { phaseInfo, roadmapPhase } = await getPhaseInfoWithFallback(phase, projectDir, workstream);
375
+ const phase_req_ids = extractReqIds(roadmapPhase);
376
+
377
+ const configExists = existsSync(join(planningDir, 'config.json'));
378
+ const [executorModel, verifierModel] = configExists
379
+ ? await Promise.all([
380
+ getModelAlias('sdd-executor', projectDir),
381
+ getModelAlias('sdd-verifier', projectDir),
382
+ ])
383
+ : ['', ''];
384
+
385
+ const milestone = await getMilestoneInfo(projectDir, workstream);
386
+
387
+ const phaseNumber = (phaseInfo?.phase_number as string) || null;
388
+ const phaseSlug = (phaseInfo?.phase_slug as string) || null;
389
+ const plans = (phaseInfo?.plans || []) as string[];
390
+ const summaries = (phaseInfo?.summaries || []) as string[];
391
+ const incompletePlans = (phaseInfo?.incomplete_plans || []) as string[];
392
+ const projectCode = (config as Record<string, unknown>).project_code as string || '';
393
+
394
+ const result: Record<string, unknown> = {
395
+ executor_model: executorModel,
396
+ verifier_model: verifierModel,
397
+ tdd_mode: config.workflow.tdd_mode ?? false,
398
+ commit_docs: config.commit_docs,
399
+ sub_repos: (config as Record<string, unknown>).sub_repos ?? [],
400
+ parallelization: config.parallelization,
401
+ context_window: (config as Record<string, unknown>).context_window ?? 200000,
402
+ branching_strategy: config.git.branching_strategy,
403
+ phase_branch_template: config.git.phase_branch_template,
404
+ milestone_branch_template: config.git.milestone_branch_template,
405
+ verifier_enabled: config.workflow.verifier,
406
+ phase_found: !!phaseInfo,
407
+ phase_dir: (phaseInfo?.directory as string) ?? null,
408
+ phase_number: phaseNumber,
409
+ phase_name: (phaseInfo?.phase_name as string) ?? null,
410
+ phase_slug: phaseSlug,
411
+ phase_req_ids,
412
+ plans,
413
+ summaries,
414
+ incomplete_plans: incompletePlans,
415
+ plan_count: plans.length,
416
+ incomplete_count: incompletePlans.length,
417
+ branch_name: config.git.branching_strategy === 'phase' && phaseInfo
418
+ ? config.git.phase_branch_template
419
+ .replace('{project}', projectCode)
420
+ .replace('{phase}', phaseNumber || '')
421
+ .replace('{slug}', phaseSlug || 'phase')
422
+ : config.git.branching_strategy === 'milestone'
423
+ ? config.git.milestone_branch_template
424
+ .replace('{milestone}', milestone.version)
425
+ .replace('{slug}', generateSlugInternal(milestone.name) || 'milestone')
426
+ : null,
427
+ milestone_version: milestone.version,
428
+ milestone_name: milestone.name,
429
+ milestone_slug: generateSlugInternal(milestone.name),
430
+ state_exists: existsSync(join(planningDir, 'STATE.md')),
431
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
432
+ config_exists: configExists,
433
+ state_path: toPosixPath(relative(projectDir, join(planningDir, 'STATE.md'))),
434
+ roadmap_path: toPosixPath(relative(projectDir, join(planningDir, 'ROADMAP.md'))),
435
+ config_path: toPosixPath(relative(projectDir, join(planningDir, 'config.json'))),
436
+ };
437
+
438
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
439
+ };
440
+
441
+ // ─── initPlanPhase ────────────────────────────────────────────────────────
442
+
443
+ /**
444
+ * Init handler for plan-phase workflow.
445
+ * Port of cmdInitPlanPhase from init.cjs lines 173-293.
446
+ */
447
+ export const initPlanPhase: QueryHandler = async (args, projectDir, workstream) => {
448
+ const phase = extractPhaseArg(args);
449
+ if (!phase) {
450
+ return { data: { error: 'phase required for init plan-phase' } };
451
+ }
452
+
453
+ const config = await loadConfig(projectDir);
454
+ const paths = planningPaths(projectDir, workstream);
455
+ const planningDir = paths.planning;
456
+
457
+ const { phaseInfo, roadmapPhase } = await getPhaseInfoWithFallback(phase, projectDir, workstream);
458
+ const phase_req_ids = extractReqIds(roadmapPhase);
459
+
460
+ const configExists = existsSync(join(planningDir, 'config.json'));
461
+ const [researcherModel, plannerModel, checkerModel] = configExists
462
+ ? await Promise.all([
463
+ getModelAlias('sdd-phase-researcher', projectDir),
464
+ getModelAlias('sdd-planner', projectDir),
465
+ getModelAlias('sdd-plan-checker', projectDir),
466
+ ])
467
+ : ['', '', ''];
468
+
469
+ const phaseNumber = (phaseInfo?.phase_number as string) || null;
470
+ const phaseName = (phaseInfo?.phase_name as string) ?? null;
471
+ const phaseDir = (phaseInfo?.directory as string) ?? null;
472
+ const plans = (phaseInfo?.plans || []) as string[];
473
+ const summaries = (phaseInfo?.summaries || []) as string[];
474
+
475
+ // #3569: surface phase lifecycle status so /sdd-plan-phase can short-circuit
476
+ // on closed (Complete) phases instead of silently replanning over shipped
477
+ // code. Reuses determinePhaseStatus — the project-wide vocabulary used by
478
+ // `progress` (Pending | Planned | In Progress | Executed | Complete |
479
+ // Needs Review). When the phase has no directory on disk yet, treat it as
480
+ // Pending (it has not been started).
481
+ const phaseStatus = phaseDir
482
+ ? await determinePhaseStatus(plans.length, summaries.length, join(projectDir, phaseDir))
483
+ : 'Pending';
484
+
485
+ // #3287: compute the canonical directory name with project_code prefix so
486
+ // the first-touch mkdir in /sdd-plan-phase stays consistent with phase.add.
487
+ const rawProjectCode = (config as Record<string, unknown>).project_code as string || '';
488
+ assertSafeProjectCode(rawProjectCode);
489
+ const expectedPhaseDirName = phaseDir
490
+ ? null // directory already exists — no need to create
491
+ : computeExpectedPhaseDirName(phaseNumber, phaseName, rawProjectCode);
492
+ const expectedPhaseDir = expectedPhaseDirName
493
+ ? toPosixPath(relative(projectDir, join(paths.phases, expectedPhaseDirName)))
494
+ : null;
495
+
496
+ const cfg = config as SDDConfig;
497
+ const result: Record<string, unknown> = {
498
+ researcher_model: researcherModel,
499
+ planner_model: plannerModel,
500
+ checker_model: checkerModel,
501
+ tdd_mode: config.workflow.tdd_mode ?? false,
502
+ research_enabled: config.workflow.research,
503
+ plan_checker_enabled: config.workflow.plan_check,
504
+ nyquist_validation_enabled: config.workflow.nyquist_validation,
505
+ commit_docs: config.commit_docs,
506
+ text_mode: config.workflow.text_mode,
507
+ auto_advance: !!config.workflow.auto_advance,
508
+ auto_chain_active: !!config.workflow._auto_chain_active,
509
+ mode: cfg.mode ?? 'interactive',
510
+ phase_found: !!phaseInfo,
511
+ phase_dir: phaseDir,
512
+ expected_phase_dir: expectedPhaseDir,
513
+ phase_number: phaseNumber,
514
+ phase_name: phaseName,
515
+ phase_slug: (phaseInfo?.phase_slug as string) ?? null,
516
+ padded_phase: phaseNumber ? normalizePhaseName(phaseNumber) : null,
517
+ phase_req_ids,
518
+ phase_status: phaseStatus,
519
+ has_research: (phaseInfo?.has_research as boolean) || false,
520
+ has_context: (phaseInfo?.has_context as boolean) || false,
521
+ has_reviews: (phaseInfo?.has_reviews as boolean) || false,
522
+ has_plans: plans.length > 0,
523
+ plan_count: plans.length,
524
+ planning_exists: existsSync(planningDir),
525
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
526
+ state_path: toPosixPath(relative(projectDir, join(planningDir, 'STATE.md'))),
527
+ roadmap_path: toPosixPath(relative(projectDir, join(planningDir, 'ROADMAP.md'))),
528
+ requirements_path: toPosixPath(relative(projectDir, join(planningDir, 'REQUIREMENTS.md'))),
529
+ patterns_path: null,
530
+ };
531
+
532
+ // Add artifact paths if phase directory exists
533
+ if (phaseDir) {
534
+ const phaseDirFull = join(projectDir, phaseDir);
535
+ try {
536
+ const files = readdirSync(phaseDirFull);
537
+ const contextFile = files.find(f => f.endsWith('-CONTEXT.md') || f === 'CONTEXT.md');
538
+ if (contextFile) result.context_path = toPosixPath(join(phaseDir, contextFile));
539
+ const researchFile = files.find(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md');
540
+ if (researchFile) result.research_path = toPosixPath(join(phaseDir, researchFile));
541
+ const verificationFile = files.find(f => f.endsWith('-VERIFICATION.md') || f === 'VERIFICATION.md');
542
+ if (verificationFile) result.verification_path = toPosixPath(join(phaseDir, verificationFile));
543
+ const uatFile = files.find(f => f.endsWith('-UAT.md') || f === 'UAT.md');
544
+ if (uatFile) result.uat_path = toPosixPath(join(phaseDir, uatFile));
545
+ const reviewsFile = files.find(f => f.endsWith('-REVIEWS.md') || f === 'REVIEWS.md');
546
+ if (reviewsFile) result.reviews_path = toPosixPath(join(phaseDir, reviewsFile));
547
+ const patternsFile = files.find(f => f.endsWith('-PATTERNS.md') || f === 'PATTERNS.md');
548
+ if (patternsFile) result.patterns_path = toPosixPath(join(phaseDir, patternsFile));
549
+ } catch { /* intentionally empty */ }
550
+ }
551
+
552
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
553
+ };
554
+
555
+ // ─── initNewMilestone ─────────────────────────────────────────────────────
556
+
557
+ /**
558
+ * Init handler for new-milestone workflow.
559
+ * Port of cmdInitNewMilestone from init.cjs lines 401-446.
560
+ */
561
+ export const initNewMilestone: QueryHandler = async (_args, projectDir) => {
562
+ const config = await loadConfig(projectDir);
563
+ const planningDir = join(projectDir, '.planning');
564
+ const milestone = await getMilestoneInfo(projectDir);
565
+ const latestCompleted = getLatestCompletedMilestone(projectDir);
566
+
567
+ const phasesDir = join(planningDir, 'phases');
568
+ let phaseDirCount = 0;
569
+ try {
570
+ if (existsSync(phasesDir)) {
571
+ phaseDirCount = readdirSync(phasesDir, { withFileTypes: true })
572
+ .filter(entry => entry.isDirectory())
573
+ .length;
574
+ }
575
+ } catch { /* intentionally empty */ }
576
+
577
+ const [researcherModel, synthesizerModel, roadmapperModel] = await Promise.all([
578
+ getModelAlias('sdd-project-researcher', projectDir),
579
+ getModelAlias('sdd-research-synthesizer', projectDir),
580
+ getModelAlias('sdd-roadmapper', projectDir),
581
+ ]);
582
+
583
+ const result: Record<string, unknown> = {
584
+ researcher_model: researcherModel,
585
+ synthesizer_model: synthesizerModel,
586
+ roadmapper_model: roadmapperModel,
587
+ commit_docs: config.commit_docs,
588
+ research_enabled: config.workflow.research,
589
+ current_milestone: milestone.version,
590
+ current_milestone_name: milestone.name,
591
+ latest_completed_milestone: latestCompleted?.version || null,
592
+ latest_completed_milestone_name: latestCompleted?.name || null,
593
+ phase_dir_count: phaseDirCount,
594
+ phase_archive_path: latestCompleted
595
+ ? toPosixPath(relative(projectDir, join(projectDir, '.planning', 'milestones', `${latestCompleted.version}-phases`)))
596
+ : null,
597
+ project_exists: pathExists(projectDir, '.planning/PROJECT.md'),
598
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
599
+ state_exists: existsSync(join(planningDir, 'STATE.md')),
600
+ project_path: '.planning/PROJECT.md',
601
+ roadmap_path: toPosixPath(relative(projectDir, join(planningDir, 'ROADMAP.md'))),
602
+ state_path: toPosixPath(relative(projectDir, join(planningDir, 'STATE.md'))),
603
+ };
604
+
605
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
606
+ };
607
+
608
+ // ─── initQuick ────────────────────────────────────────────────────────────
609
+
610
+ /**
611
+ * Init handler for quick workflow.
612
+ * Port of cmdInitQuick from init.cjs lines 448-504.
613
+ */
614
+ export const initQuick: QueryHandler = async (args, projectDir) => {
615
+ const description = args[0] || null;
616
+ const config = await loadConfig(projectDir);
617
+ const planningDir = join(projectDir, '.planning');
618
+ const now = new Date();
619
+ const slug = description ? generateSlugInternal(description).substring(0, 40) : null;
620
+
621
+ // Generate collision-resistant quick task ID: YYMMDD-xxx
622
+ const yy = String(now.getFullYear()).slice(-2);
623
+ const mm = String(now.getMonth() + 1).padStart(2, '0');
624
+ const dd = String(now.getDate()).padStart(2, '0');
625
+ const dateStr = yy + mm + dd;
626
+ const secondsSinceMidnight = now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds();
627
+ const timeBlocks = Math.floor(secondsSinceMidnight / 2);
628
+ const timeEncoded = timeBlocks.toString(36).padStart(3, '0');
629
+ const quickId = dateStr + '-' + timeEncoded;
630
+ const branchSlug = slug || 'quick';
631
+ const quickBranchName = config.git.quick_branch_template
632
+ ? config.git.quick_branch_template
633
+ .replace('{num}', quickId)
634
+ .replace('{quick}', quickId)
635
+ .replace('{slug}', branchSlug)
636
+ : null;
637
+
638
+ const configExists = existsSync(join(planningDir, 'config.json'));
639
+ const [plannerModel, executorModel, checkerModel, verifierModel] = configExists
640
+ ? await Promise.all([
641
+ getModelAlias('sdd-planner', projectDir),
642
+ getModelAlias('sdd-executor', projectDir),
643
+ getModelAlias('sdd-plan-checker', projectDir),
644
+ getModelAlias('sdd-verifier', projectDir),
645
+ ])
646
+ : ['', '', '', ''];
647
+
648
+ const result: Record<string, unknown> = {
649
+ planner_model: plannerModel,
650
+ executor_model: executorModel,
651
+ checker_model: checkerModel,
652
+ verifier_model: verifierModel,
653
+ commit_docs: config.commit_docs,
654
+ branch_name: quickBranchName,
655
+ quick_id: quickId,
656
+ slug,
657
+ description,
658
+ date: now.toISOString().split('T')[0],
659
+ timestamp: now.toISOString(),
660
+ quick_dir: '.planning/quick',
661
+ task_dir: slug ? `.planning/quick/${quickId}-${slug}` : null,
662
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
663
+ planning_exists: existsSync(join(projectDir, '.planning')),
664
+ };
665
+
666
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
667
+ };
668
+
669
+ // ─── initResume ───────────────────────────────────────────────────────────
670
+
671
+ /**
672
+ * Init handler for resume-project workflow.
673
+ * Port of cmdInitResume from init.cjs lines 506-536.
674
+ */
675
+ export const initResume: QueryHandler = async (_args, projectDir) => {
676
+ const config = await loadConfig(projectDir);
677
+ const planningDir = join(projectDir, '.planning');
678
+
679
+ let interruptedAgentId: string | null = null;
680
+ try {
681
+ interruptedAgentId = readFileSync(join(projectDir, '.planning', 'current-agent-id.txt'), 'utf-8').trim();
682
+ } catch { /* intentionally empty */ }
683
+
684
+ const result: Record<string, unknown> = {
685
+ state_exists: existsSync(join(planningDir, 'STATE.md')),
686
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
687
+ project_exists: pathExists(projectDir, '.planning/PROJECT.md'),
688
+ planning_exists: existsSync(join(projectDir, '.planning')),
689
+ state_path: toPosixPath(relative(projectDir, join(planningDir, 'STATE.md'))),
690
+ roadmap_path: toPosixPath(relative(projectDir, join(planningDir, 'ROADMAP.md'))),
691
+ project_path: '.planning/PROJECT.md',
692
+ has_interrupted_agent: !!interruptedAgentId,
693
+ interrupted_agent_id: interruptedAgentId,
694
+ commit_docs: config.commit_docs,
695
+ };
696
+
697
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
698
+ };
699
+
700
+ // ─── initVerifyWork ───────────────────────────────────────────────────────
701
+
702
+ /**
703
+ * Init handler for verify-work workflow.
704
+ * Port of cmdInitVerifyWork from init.cjs lines 538-586.
705
+ */
706
+ export const initVerifyWork: QueryHandler = async (args, projectDir, workstream) => {
707
+ const phase = extractPhaseArg(args);
708
+ if (!phase) {
709
+ return { data: { error: 'phase required for init verify-work' } };
710
+ }
711
+
712
+ const config = await loadConfig(projectDir, workstream);
713
+ const { phaseInfo } = await getPhaseInfoForVerifyWork(phase, projectDir, workstream);
714
+
715
+ const configExists = existsSync(join(projectDir, '.planning', 'config.json'));
716
+ const [plannerModel, checkerModel] = configExists
717
+ ? await Promise.all([
718
+ getModelAlias('sdd-planner', projectDir),
719
+ getModelAlias('sdd-plan-checker', projectDir),
720
+ ])
721
+ : ['', ''];
722
+
723
+ const result: Record<string, unknown> = {
724
+ planner_model: plannerModel,
725
+ checker_model: checkerModel,
726
+ commit_docs: config.commit_docs,
727
+ phase_found: !!phaseInfo,
728
+ phase_dir: (phaseInfo?.directory as string) ?? null,
729
+ phase_number: (phaseInfo?.phase_number as string) ?? null,
730
+ phase_name: (phaseInfo?.phase_name as string) ?? null,
731
+ has_verification: (phaseInfo?.has_verification as boolean) || false,
732
+ };
733
+
734
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
735
+ };
736
+
737
+ // ─── initPhaseOp ──────────────────────────────────────────────────────────
738
+
739
+ /**
740
+ * Init handler for discuss-phase and similar phase operations.
741
+ * Port of cmdInitPhaseOp from init.cjs lines 588-697.
742
+ */
743
+ export const initPhaseOp: QueryHandler = async (args, projectDir, workstream) => {
744
+ const phase = extractPhaseArg(args);
745
+ if (!phase) {
746
+ return { data: { error: 'phase required for init phase-op' } };
747
+ }
748
+
749
+ const config = await loadConfig(projectDir);
750
+ const paths = planningPaths(projectDir, workstream);
751
+ const planningDir = paths.planning;
752
+
753
+ // findPhase with archived override: if only match is archived, prefer ROADMAP
754
+ const phaseResult = await findPhase([phase], projectDir, workstream);
755
+ let phaseInfo = phaseResult.data as Record<string, unknown> | null;
756
+
757
+ const roadmapResult = await roadmapGetPhase([phase], projectDir, workstream);
758
+ const roadmapPhase = roadmapResult.data as Record<string, unknown> | null;
759
+
760
+ // If the only match comes from an archived milestone, prefer current ROADMAP
761
+ if (roadmapPhase?.found && await shouldDropArchivedPhaseMatch(phaseInfo, roadmapPhase, projectDir, workstream)) {
762
+ const phaseName = roadmapPhase.phase_name as string;
763
+ phaseInfo = {
764
+ found: true,
765
+ directory: null,
766
+ phase_number: roadmapPhase.phase_number,
767
+ phase_name: phaseName,
768
+ phase_slug: phaseName ? generateSlugInternal(phaseName) : null,
769
+ plans: [],
770
+ summaries: [],
771
+ incomplete_plans: [],
772
+ has_research: false,
773
+ has_context: false,
774
+ has_verification: false,
775
+ };
776
+ }
777
+
778
+ // Fallback to ROADMAP.md if no directory exists
779
+ if (!phaseInfo || !phaseInfo.found) {
780
+ if (roadmapPhase?.found) {
781
+ const phaseName = roadmapPhase.phase_name as string;
782
+ phaseInfo = {
783
+ found: true,
784
+ directory: null,
785
+ phase_number: roadmapPhase.phase_number,
786
+ phase_name: phaseName,
787
+ phase_slug: phaseName ? generateSlugInternal(phaseName) : null,
788
+ plans: [],
789
+ summaries: [],
790
+ incomplete_plans: [],
791
+ has_research: false,
792
+ has_context: false,
793
+ has_verification: false,
794
+ };
795
+ }
796
+ }
797
+
798
+ const phaseFound = !!(phaseInfo && phaseInfo.found);
799
+ const phaseNumber = (phaseInfo?.phase_number as string) || null;
800
+ const phaseName = (phaseInfo?.phase_name as string) ?? null;
801
+ const phaseDir = (phaseInfo?.directory as string) ?? null;
802
+ const plans = (phaseInfo?.plans || []) as string[];
803
+
804
+ // #3287: compute the canonical directory name with project_code prefix so
805
+ // the first-touch mkdir in /sdd-discuss-phase stays consistent with phase.add.
806
+ const rawProjectCode = (config as Record<string, unknown>).project_code as string || '';
807
+ assertSafeProjectCode(rawProjectCode);
808
+ const expectedPhaseDirName = phaseDir
809
+ ? null // directory already exists — no need to create
810
+ : computeExpectedPhaseDirName(phaseNumber, phaseName, rawProjectCode);
811
+ const expectedPhaseDir = expectedPhaseDirName
812
+ ? toPosixPath(relative(projectDir, join(paths.phases, expectedPhaseDirName)))
813
+ : null;
814
+
815
+ const result: Record<string, unknown> = {
816
+ commit_docs: config.commit_docs,
817
+ // #2997: secret config keys (brave_search, firecrawl, exa_search) may be
818
+ // either boolean availability flags OR string API keys depending on how the
819
+ // user configured them. Pass booleans through; mask string values so the
820
+ // init bundle never echoes plaintext credentials. Mirrors the masking added
821
+ // to config-get/config-set in the same fix.
822
+ brave_search: typeof config.brave_search === 'string' ? maskIfSecret('brave_search', config.brave_search) : config.brave_search,
823
+ firecrawl: typeof config.firecrawl === 'string' ? maskIfSecret('firecrawl', config.firecrawl) : config.firecrawl,
824
+ exa_search: typeof config.exa_search === 'string' ? maskIfSecret('exa_search', config.exa_search) : config.exa_search,
825
+ phase_found: phaseFound,
826
+ phase_dir: phaseDir,
827
+ expected_phase_dir: expectedPhaseDir,
828
+ phase_number: phaseNumber,
829
+ phase_name: phaseName,
830
+ phase_slug: (phaseInfo?.phase_slug as string) ?? null,
831
+ padded_phase: phaseNumber ? normalizePhaseName(phaseNumber) : null,
832
+ has_research: (phaseInfo?.has_research as boolean) || false,
833
+ has_context: (phaseInfo?.has_context as boolean) || false,
834
+ has_plans: plans.length > 0,
835
+ has_verification: (phaseInfo?.has_verification as boolean) || false,
836
+ has_reviews: (phaseInfo?.has_reviews as boolean) || false,
837
+ plan_count: plans.length,
838
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
839
+ planning_exists: existsSync(planningDir),
840
+ state_path: toPosixPath(relative(projectDir, join(planningDir, 'STATE.md'))),
841
+ roadmap_path: toPosixPath(relative(projectDir, join(planningDir, 'ROADMAP.md'))),
842
+ requirements_path: toPosixPath(relative(projectDir, join(planningDir, 'REQUIREMENTS.md'))),
843
+ };
844
+
845
+ // Add artifact paths if phase directory exists
846
+ if (phaseDir) {
847
+ const phaseDirFull = join(projectDir, phaseDir);
848
+ try {
849
+ const files = readdirSync(phaseDirFull);
850
+ const contextFile = files.find(f => f.endsWith('-CONTEXT.md') || f === 'CONTEXT.md');
851
+ if (contextFile) result.context_path = toPosixPath(join(phaseDir, contextFile));
852
+ const researchFile = files.find(f => f.endsWith('-RESEARCH.md') || f === 'RESEARCH.md');
853
+ if (researchFile) result.research_path = toPosixPath(join(phaseDir, researchFile));
854
+ const verificationFile = files.find(f => f.endsWith('-VERIFICATION.md') || f === 'VERIFICATION.md');
855
+ if (verificationFile) result.verification_path = toPosixPath(join(phaseDir, verificationFile));
856
+ const uatFile = files.find(f => f.endsWith('-UAT.md') || f === 'UAT.md');
857
+ if (uatFile) result.uat_path = toPosixPath(join(phaseDir, uatFile));
858
+ const reviewsFile = files.find(f => f.endsWith('-REVIEWS.md') || f === 'REVIEWS.md');
859
+ if (reviewsFile) result.reviews_path = toPosixPath(join(phaseDir, reviewsFile));
860
+ } catch { /* intentionally empty */ }
861
+ }
862
+
863
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
864
+ };
865
+
866
+ // ─── initTodos ────────────────────────────────────────────────────────────
867
+
868
+ /**
869
+ * Init handler for check-todos and add-todo workflows.
870
+ * Port of cmdInitTodos from init.cjs lines 699-756.
871
+ */
872
+ export const initTodos: QueryHandler = async (args, projectDir) => {
873
+ const area = args[0] || null;
874
+ const config = await loadConfig(projectDir);
875
+ const planningDir = join(projectDir, '.planning');
876
+ const now = new Date();
877
+
878
+ const pendingDir = join(planningDir, 'todos', 'pending');
879
+ let count = 0;
880
+ const todos: Array<Record<string, unknown>> = [];
881
+
882
+ try {
883
+ const files = readdirSync(pendingDir).filter(f => f.endsWith('.md'));
884
+ for (const file of files) {
885
+ try {
886
+ const content = readFileSync(join(pendingDir, file), 'utf-8');
887
+ const createdMatch = content.match(/^created:\s*(.+)$/m);
888
+ const titleMatch = content.match(/^title:\s*(.+)$/m);
889
+ const areaMatch = content.match(/^area:\s*(.+)$/m);
890
+ const todoArea = areaMatch ? areaMatch[1].trim() : 'general';
891
+
892
+ if (area && todoArea !== area) continue;
893
+
894
+ count++;
895
+ todos.push({
896
+ file,
897
+ created: createdMatch ? createdMatch[1].trim() : 'unknown',
898
+ title: titleMatch ? titleMatch[1].trim() : 'Untitled',
899
+ area: todoArea,
900
+ path: toPosixPath(relative(projectDir, join(pendingDir, file))),
901
+ });
902
+ } catch { /* intentionally empty */ }
903
+ }
904
+ } catch { /* intentionally empty */ }
905
+
906
+ const result: Record<string, unknown> = {
907
+ commit_docs: config.commit_docs,
908
+ date: now.toISOString().split('T')[0],
909
+ timestamp: now.toISOString(),
910
+ todo_count: count,
911
+ todos,
912
+ area_filter: area,
913
+ pending_dir: toPosixPath(relative(projectDir, join(planningDir, 'todos', 'pending'))),
914
+ completed_dir: toPosixPath(relative(projectDir, join(planningDir, 'todos', 'completed'))),
915
+ planning_exists: existsSync(planningDir),
916
+ todos_dir_exists: existsSync(join(planningDir, 'todos')),
917
+ pending_dir_exists: existsSync(pendingDir),
918
+ };
919
+
920
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
921
+ };
922
+
923
+ // ─── initMilestoneOp ─────────────────────────────────────────────────────
924
+
925
+ /**
926
+ * Init handler for complete-milestone and audit-milestone workflows.
927
+ * Port of cmdInitMilestoneOp from init.cjs lines 758-817.
928
+ */
929
+ export const initMilestoneOp: QueryHandler = async (_args, projectDir, workstream) => {
930
+ const config = await loadConfig(projectDir);
931
+ const paths = planningPaths(projectDir, workstream);
932
+ const planningDir = paths.planning;
933
+ const milestone = await getMilestoneInfo(projectDir, workstream);
934
+
935
+ const phasesDir = join(planningDir, 'phases');
936
+ let phaseCount = 0;
937
+ let completedPhases = 0;
938
+
939
+ // Bug #2633 — ROADMAP.md (current milestone section) is the authority for
940
+ // phase counts, NOT the on-disk `.planning/phases/` directory. After
941
+ // `phases clear` between milestones, on-disk dirs will be a subset of the
942
+ // roadmap until each phase is materialized, and reading from disk causes
943
+ // `all_phases_complete: true` to fire as soon as the materialized subset
944
+ // gets summaries — even though the roadmap has phases still to do.
945
+ let roadmapPhaseNumbers: string[] = [];
946
+ try {
947
+ const { readFile } = await import('node:fs/promises');
948
+ const roadmapRaw = await readFile(join(planningDir, 'ROADMAP.md'), 'utf-8');
949
+ const currentSection = await extractCurrentMilestone(roadmapRaw, projectDir, workstream);
950
+ roadmapPhaseNumbers = extractPhasesFromSection(currentSection).map(p => p.number);
951
+ } catch { /* intentionally empty */ }
952
+
953
+ // Build the on-disk index keyed by the canonical full phase token (e.g.
954
+ // "3", "3A", "3.1") so distinct tokens with the same integer prefix never
955
+ // collide. Roadmap writes "Phase 3", "Phase 3A", and "Phase 3.1" as
956
+ // distinct phases and disk dirs preserve those tokens.
957
+ // Canonicalize a phase token by stripping leading zeros from the integer
958
+ // head while preserving any [A-Z]? suffix and dotted segments. So "03" →
959
+ // "3", "03A" → "3A", "03.1" → "3.1", "3A" → "3A". This lets disk dirs that
960
+ // pad ("03-alpha") match roadmap tokens ("Phase 3") without ever collapsing
961
+ // distinct tokens like "3" / "3A" / "3.1" into the same bucket.
962
+ const canonicalizePhase = (tok: string): string => {
963
+ const m = tok.match(/^(\d+)([A-Z]?(?:\.\d+)*)$/);
964
+ return m ? String(parseInt(m[1], 10)) + m[2] : tok;
965
+ };
966
+ const diskPhaseDirs: Map<string, string> = new Map();
967
+ try {
968
+ const entries = readdirSync(phasesDir, { withFileTypes: true });
969
+ for (const e of entries) {
970
+ if (!e.isDirectory()) continue;
971
+ const m = e.name.match(/^(\d+[A-Z]?(?:\.\d+)*)/);
972
+ if (!m) continue;
973
+ diskPhaseDirs.set(canonicalizePhase(m[1]), e.name);
974
+ }
975
+ } catch { /* intentionally empty */ }
976
+
977
+ if (roadmapPhaseNumbers.length > 0) {
978
+ phaseCount = roadmapPhaseNumbers.length;
979
+ for (const num of roadmapPhaseNumbers) {
980
+ const dirName = diskPhaseDirs.get(canonicalizePhase(num));
981
+ if (!dirName) continue;
982
+ try {
983
+ const phaseFiles = readdirSync(join(phasesDir, dirName));
984
+ const hasSummary = phaseFiles.some(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
985
+ if (hasSummary) completedPhases++;
986
+ } catch { /* intentionally empty */ }
987
+ }
988
+ } else {
989
+ // Fallback: no parseable ROADMAP (e.g. brand-new project). Preserve the
990
+ // legacy on-disk-count behavior so existing no-roadmap tests still pass.
991
+ try {
992
+ const entries = readdirSync(phasesDir, { withFileTypes: true });
993
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
994
+ phaseCount = dirs.length;
995
+ for (const dir of dirs) {
996
+ try {
997
+ const phaseFiles = readdirSync(join(phasesDir, dir));
998
+ const hasSummary = phaseFiles.some(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
999
+ if (hasSummary) completedPhases++;
1000
+ } catch { /* intentionally empty */ }
1001
+ }
1002
+ } catch { /* intentionally empty */ }
1003
+ }
1004
+
1005
+ const archiveDir = join(planningDir, 'archive');
1006
+ let archivedMilestones: string[] = [];
1007
+ try {
1008
+ archivedMilestones = readdirSync(archiveDir, { withFileTypes: true })
1009
+ .filter(e => e.isDirectory())
1010
+ .map(e => e.name);
1011
+ } catch { /* intentionally empty */ }
1012
+
1013
+ const result: Record<string, unknown> = {
1014
+ commit_docs: config.commit_docs,
1015
+ milestone_version: milestone.version,
1016
+ milestone_name: milestone.name,
1017
+ milestone_slug: generateSlugInternal(milestone.name),
1018
+ phase_count: phaseCount,
1019
+ completed_phases: completedPhases,
1020
+ all_phases_complete: phaseCount > 0 && phaseCount === completedPhases,
1021
+ archived_milestones: archivedMilestones,
1022
+ archive_count: archivedMilestones.length,
1023
+ project_exists: pathExists(projectDir, '.planning/PROJECT.md'),
1024
+ roadmap_exists: existsSync(join(planningDir, 'ROADMAP.md')),
1025
+ state_exists: existsSync(join(planningDir, 'STATE.md')),
1026
+ archive_exists: existsSync(archiveDir),
1027
+ phases_dir_exists: existsSync(phasesDir),
1028
+ };
1029
+
1030
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
1031
+ };
1032
+
1033
+ // ─── initMapCodebase ──────────────────────────────────────────────────────
1034
+
1035
+ /**
1036
+ * Init handler for map-codebase workflow.
1037
+ * Port of cmdInitMapCodebase from init.cjs lines 819-852.
1038
+ */
1039
+ export const initMapCodebase: QueryHandler = async (_args, projectDir) => {
1040
+ const config = await loadConfig(projectDir);
1041
+ const now = new Date();
1042
+ const codebaseDir = join(projectDir, '.planning', 'codebase');
1043
+ let existingMaps: string[] = [];
1044
+ try {
1045
+ existingMaps = readdirSync(codebaseDir).filter(f => f.endsWith('.md'));
1046
+ } catch { /* intentionally empty */ }
1047
+
1048
+ const mapperModel = await getModelAlias('sdd-codebase-mapper', projectDir);
1049
+
1050
+ const result: Record<string, unknown> = {
1051
+ mapper_model: mapperModel,
1052
+ commit_docs: config.commit_docs,
1053
+ search_gitignored: config.search_gitignored,
1054
+ parallelization: config.parallelization,
1055
+ subagent_timeout: (config as Record<string, unknown>).subagent_timeout ?? undefined,
1056
+ date: now.toISOString().split('T')[0],
1057
+ timestamp: now.toISOString(),
1058
+ codebase_dir: '.planning/codebase',
1059
+ existing_maps: existingMaps,
1060
+ has_maps: existingMaps.length > 0,
1061
+ planning_exists: pathExists(projectDir, '.planning'),
1062
+ codebase_dir_exists: pathExists(projectDir, '.planning/codebase'),
1063
+ };
1064
+
1065
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
1066
+ };
1067
+
1068
+ // ─── initNewWorkspace ─────────────────────────────────────────────────────
1069
+
1070
+ /**
1071
+ * Init handler for new-workspace workflow.
1072
+ * Port of cmdInitNewWorkspace from init.cjs lines 1311-1335.
1073
+ * T-14-01: Validates workspace name rejects path separators.
1074
+ */
1075
+ export const initNewWorkspace: QueryHandler = async (_args, projectDir) => {
1076
+ const home = process.env.HOME || homedir();
1077
+ const defaultBase = join(home, 'sdd-workspaces');
1078
+
1079
+ // Detect child git repos (one level deep)
1080
+ const childRepos: Array<{ name: string; path: string; has_uncommitted: boolean }> = [];
1081
+ try {
1082
+ const entries = readdirSync(projectDir, { withFileTypes: true });
1083
+ for (const entry of entries) {
1084
+ if (!entry.isDirectory() || entry.name.startsWith('.')) continue;
1085
+ const fullPath = join(projectDir, entry.name);
1086
+ if (existsSync(join(fullPath, '.git'))) {
1087
+ let hasUncommitted = false;
1088
+ try {
1089
+ const status = execSync('git status --porcelain', { cwd: fullPath, encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
1090
+ hasUncommitted = status.trim().length > 0;
1091
+ } catch { /* best-effort */ }
1092
+ childRepos.push({ name: entry.name, path: fullPath, has_uncommitted: hasUncommitted });
1093
+ }
1094
+ }
1095
+ } catch { /* intentionally empty */ }
1096
+
1097
+ let worktreeAvailable = false;
1098
+ try {
1099
+ execSync('git --version', { encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
1100
+ worktreeAvailable = true;
1101
+ } catch { /* no git */ }
1102
+
1103
+ const result: Record<string, unknown> = {
1104
+ default_workspace_base: defaultBase,
1105
+ child_repos: childRepos,
1106
+ child_repo_count: childRepos.length,
1107
+ worktree_available: worktreeAvailable,
1108
+ is_git_repo: pathExists(projectDir, '.git'),
1109
+ cwd_repo_name: basename(projectDir),
1110
+ };
1111
+
1112
+ return { data: withProjectRoot(projectDir, result) };
1113
+ };
1114
+
1115
+ // ─── initListWorkspaces ───────────────────────────────────────────────────
1116
+
1117
+ /**
1118
+ * Init handler for list-workspaces workflow.
1119
+ * Port of cmdInitListWorkspaces from init.cjs lines 1337-1381.
1120
+ */
1121
+ export const initListWorkspaces: QueryHandler = async (_args, _projectDir) => {
1122
+ const home = process.env.HOME || homedir();
1123
+ const defaultBase = join(home, 'sdd-workspaces');
1124
+
1125
+ const workspaces: Array<Record<string, unknown>> = [];
1126
+ if (existsSync(defaultBase)) {
1127
+ let entries: Dirent[] = [];
1128
+ try {
1129
+ entries = readdirSync(defaultBase, { withFileTypes: true });
1130
+ } catch { entries = []; }
1131
+ for (const entry of entries) {
1132
+ if (!entry.isDirectory()) continue;
1133
+ const wsPath = join(defaultBase, String(entry.name));
1134
+ const manifestPath = join(wsPath, 'WORKSPACE.md');
1135
+ if (!existsSync(manifestPath)) continue;
1136
+
1137
+ let repoCount = 0;
1138
+ let strategy = 'unknown';
1139
+ try {
1140
+ const manifest = readFileSync(manifestPath, 'utf8');
1141
+ const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
1142
+ if (strategyMatch) strategy = strategyMatch[1].trim();
1143
+ const tableRows = manifest.split('\n').filter(l => l.match(/^\|\s*\w/) && !l.includes('Repo') && !l.includes('---'));
1144
+ repoCount = tableRows.length;
1145
+ } catch { /* best-effort */ }
1146
+ const hasProject = existsSync(join(wsPath, '.planning', 'PROJECT.md'));
1147
+
1148
+ workspaces.push({
1149
+ name: entry.name,
1150
+ path: wsPath,
1151
+ repo_count: repoCount,
1152
+ strategy,
1153
+ has_project: hasProject,
1154
+ });
1155
+ }
1156
+ }
1157
+
1158
+ const result: Record<string, unknown> = {
1159
+ workspace_base: defaultBase,
1160
+ workspaces,
1161
+ workspace_count: workspaces.length,
1162
+ };
1163
+
1164
+ return { data: result };
1165
+ };
1166
+
1167
+ // ─── initRemoveWorkspace ──────────────────────────────────────────────────
1168
+
1169
+ /**
1170
+ * Init handler for remove-workspace workflow.
1171
+ * Port of cmdInitRemoveWorkspace from init.cjs lines 1383-1443.
1172
+ * T-14-01: Validates workspace name rejects path separators and '..' sequences.
1173
+ */
1174
+ export const initRemoveWorkspace: QueryHandler = async (args, _projectDir) => {
1175
+ const name = args[0];
1176
+ if (!name) {
1177
+ return { data: { error: 'workspace name required for init remove-workspace' } };
1178
+ }
1179
+
1180
+ // T-14-01: Reject path traversal attempts
1181
+ if (name.includes('/') || name.includes('\\') || name.includes('..')) {
1182
+ return { data: { error: `Invalid workspace name: ${name} (path separators not allowed)` } };
1183
+ }
1184
+
1185
+ const home = process.env.HOME || homedir();
1186
+ const defaultBase = join(home, 'sdd-workspaces');
1187
+ const wsPath = join(defaultBase, name);
1188
+ const manifestPath = join(wsPath, 'WORKSPACE.md');
1189
+
1190
+ if (!existsSync(wsPath)) {
1191
+ return { data: { error: `Workspace not found: ${wsPath}` } };
1192
+ }
1193
+
1194
+ const repos: Array<Record<string, unknown>> = [];
1195
+ let strategy = 'unknown';
1196
+ if (existsSync(manifestPath)) {
1197
+ try {
1198
+ const manifest = readFileSync(manifestPath, 'utf8');
1199
+ const strategyMatch = manifest.match(/^Strategy:\s*(.+)$/m);
1200
+ if (strategyMatch) strategy = strategyMatch[1].trim();
1201
+
1202
+ const lines = manifest.split('\n');
1203
+ for (const line of lines) {
1204
+ const match = line.match(/^\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|$/);
1205
+ if (match && match[1] !== 'Repo' && !match[1].includes('---')) {
1206
+ repos.push({ name: match[1], source: match[2], branch: match[3], strategy: match[4] });
1207
+ }
1208
+ }
1209
+ } catch { /* best-effort */ }
1210
+ }
1211
+
1212
+ // Check for uncommitted changes in workspace repos
1213
+ const dirtyRepos: string[] = [];
1214
+ for (const repo of repos) {
1215
+ const repoPath = join(wsPath, repo.name as string);
1216
+ if (!existsSync(repoPath)) continue;
1217
+ try {
1218
+ const status = execSync('git status --porcelain', { cwd: repoPath, encoding: 'utf8', timeout: 5000, stdio: 'pipe' });
1219
+ if (status.trim().length > 0) {
1220
+ dirtyRepos.push(repo.name as string);
1221
+ }
1222
+ } catch { /* best-effort */ }
1223
+ }
1224
+
1225
+ const result: Record<string, unknown> = {
1226
+ workspace_name: name,
1227
+ workspace_path: wsPath,
1228
+ has_manifest: existsSync(manifestPath),
1229
+ strategy,
1230
+ repos,
1231
+ repo_count: repos.length,
1232
+ dirty_repos: dirtyRepos,
1233
+ has_dirty_repos: dirtyRepos.length > 0,
1234
+ };
1235
+
1236
+ return { data: result };
1237
+ };
1238
+ // ─── initIngestDocs ───────────────────────────────────────────────────────
1239
+
1240
+ /**
1241
+ * Init handler for ingest-docs workflow.
1242
+ * Mirrors `initResume` shape but without current-agent-id lookup — the
1243
+ * ingest-docs workflow reads `project_exists`, `planning_exists`, `has_git`,
1244
+ * and `project_path` to branch between new-project vs merge-milestone modes.
1245
+ */
1246
+ export const initIngestDocs: QueryHandler = async (_args, projectDir) => {
1247
+ const config = await loadConfig(projectDir);
1248
+ const result: Record<string, unknown> = {
1249
+ project_exists: pathExists(projectDir, '.planning/PROJECT.md'),
1250
+ planning_exists: pathExists(projectDir, '.planning'),
1251
+ // Bug #3491: detect parent worktree to avoid nested .git init.
1252
+ has_git: (() => gitWorktreeInfo(projectDir).inside)(),
1253
+ git_worktree_root: (() => gitWorktreeInfo(projectDir).worktreeRoot)(),
1254
+ in_nested_subdir: (() => {
1255
+ const info = gitWorktreeInfo(projectDir);
1256
+ return info.inside && info.worktreeRoot !== null && info.worktreeRoot !== projectDir;
1257
+ })(),
1258
+ project_path: '.planning/PROJECT.md',
1259
+ commit_docs: config.commit_docs,
1260
+ };
1261
+ return { data: withProjectRoot(projectDir, result, config as Record<string, unknown>) };
1262
+ };