@ai-is-gonna/get-tasks-done 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1517) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/agents/gtd-advisor-researcher.md +127 -0
  4. package/agents/gtd-ai-researcher.md +133 -0
  5. package/agents/gtd-assumptions-analyzer.md +105 -0
  6. package/agents/gtd-code-fixer.md +668 -0
  7. package/agents/gtd-code-reviewer.md +387 -0
  8. package/agents/gtd-codebase-mapper.md +853 -0
  9. package/agents/gtd-debug-session-manager.md +314 -0
  10. package/agents/gtd-debugger.md +1452 -0
  11. package/agents/gtd-doc-classifier.md +168 -0
  12. package/agents/gtd-doc-synthesizer.md +204 -0
  13. package/agents/gtd-doc-verifier.md +217 -0
  14. package/agents/gtd-doc-writer.md +615 -0
  15. package/agents/gtd-domain-researcher.md +153 -0
  16. package/agents/gtd-eval-auditor.md +191 -0
  17. package/agents/gtd-eval-planner.md +154 -0
  18. package/agents/gtd-framework-selector.md +160 -0
  19. package/agents/gtd-integration-checker.md +470 -0
  20. package/agents/gtd-intel-updater.md +342 -0
  21. package/agents/gtd-nyquist-auditor.md +203 -0
  22. package/agents/gtd-pattern-mapper.md +335 -0
  23. package/agents/gtd-phase-researcher.md +928 -0
  24. package/agents/gtd-plan-checker.md +1000 -0
  25. package/agents/gtd-planner.md +926 -0
  26. package/agents/gtd-project-researcher.md +677 -0
  27. package/agents/gtd-research-synthesizer.md +247 -0
  28. package/agents/gtd-roadmapper.md +688 -0
  29. package/agents/gtd-security-auditor.md +155 -0
  30. package/agents/gtd-task-executor.md +166 -0
  31. package/agents/gtd-ui-auditor.md +495 -0
  32. package/agents/gtd-ui-checker.md +309 -0
  33. package/agents/gtd-ui-researcher.md +380 -0
  34. package/agents/gtd-user-profiler.md +171 -0
  35. package/agents/gtd-verifier.md +917 -0
  36. package/bin/gtd-sdk.js +37 -0
  37. package/bin/install.js +11358 -0
  38. package/commands/gtd/add-tests.md +42 -0
  39. package/commands/gtd/ai-integration-phase.md +37 -0
  40. package/commands/gtd/audit-fix.md +34 -0
  41. package/commands/gtd/audit-milestone.md +37 -0
  42. package/commands/gtd/audit-uat.md +24 -0
  43. package/commands/gtd/autonomous.md +46 -0
  44. package/commands/gtd/capture.md +62 -0
  45. package/commands/gtd/cleanup.md +24 -0
  46. package/commands/gtd/code-review.md +59 -0
  47. package/commands/gtd/complete-milestone.md +143 -0
  48. package/commands/gtd/config.md +58 -0
  49. package/commands/gtd/debug.md +52 -0
  50. package/commands/gtd/discuss-phase.md +76 -0
  51. package/commands/gtd/docs-update.md +49 -0
  52. package/commands/gtd/eval-review.md +33 -0
  53. package/commands/gtd/explore.md +27 -0
  54. package/commands/gtd/export-phase-issues.md +43 -0
  55. package/commands/gtd/extract-learnings.md +23 -0
  56. package/commands/gtd/fast.md +31 -0
  57. package/commands/gtd/forensics.md +57 -0
  58. package/commands/gtd/graphify.md +199 -0
  59. package/commands/gtd/health.md +31 -0
  60. package/commands/gtd/help.md +28 -0
  61. package/commands/gtd/import.md +35 -0
  62. package/commands/gtd/inbox.md +39 -0
  63. package/commands/gtd/ingest-docs.md +42 -0
  64. package/commands/gtd/manager.md +45 -0
  65. package/commands/gtd/map-codebase.md +83 -0
  66. package/commands/gtd/milestone-summary.md +51 -0
  67. package/commands/gtd/mvp-phase.md +45 -0
  68. package/commands/gtd/new-milestone.md +45 -0
  69. package/commands/gtd/new-project.md +47 -0
  70. package/commands/gtd/ns-context.md +23 -0
  71. package/commands/gtd/ns-ideate.md +24 -0
  72. package/commands/gtd/ns-manage.md +28 -0
  73. package/commands/gtd/ns-project.md +22 -0
  74. package/commands/gtd/ns-review.md +26 -0
  75. package/commands/gtd/ns-workflow.md +30 -0
  76. package/commands/gtd/orchestrate-tasks.md +83 -0
  77. package/commands/gtd/pause-work.md +43 -0
  78. package/commands/gtd/phase.md +56 -0
  79. package/commands/gtd/plan-phase.md +62 -0
  80. package/commands/gtd/plan-review-convergence.md +59 -0
  81. package/commands/gtd/pr-branch.md +26 -0
  82. package/commands/gtd/profile-user.md +46 -0
  83. package/commands/gtd/progress.md +46 -0
  84. package/commands/gtd/quick.md +174 -0
  85. package/commands/gtd/resume-work.md +30 -0
  86. package/commands/gtd/review-backlog.md +63 -0
  87. package/commands/gtd/review.md +41 -0
  88. package/commands/gtd/secure-phase.md +36 -0
  89. package/commands/gtd/settings.md +29 -0
  90. package/commands/gtd/sketch.md +60 -0
  91. package/commands/gtd/spec-phase.md +63 -0
  92. package/commands/gtd/spike.md +57 -0
  93. package/commands/gtd/stats.md +19 -0
  94. package/commands/gtd/surface.md +130 -0
  95. package/commands/gtd/thread.md +24 -0
  96. package/commands/gtd/ui-phase.md +35 -0
  97. package/commands/gtd/ui-review.md +33 -0
  98. package/commands/gtd/ultraplan-phase.md +34 -0
  99. package/commands/gtd/undo.md +35 -0
  100. package/commands/gtd/update.md +48 -0
  101. package/commands/gtd/validate-phase.md +36 -0
  102. package/commands/gtd/verify-work.md +39 -0
  103. package/commands/gtd/work-task-issue.md +45 -0
  104. package/commands/gtd/workspace.md +52 -0
  105. package/commands/gtd/workstreams.md +70 -0
  106. package/get-tasks-done/bin/check-latest-version.cjs +104 -0
  107. package/get-tasks-done/bin/gtd-tools.cjs +1264 -0
  108. package/get-tasks-done/bin/lib/active-workstream-store.cjs +85 -0
  109. package/get-tasks-done/bin/lib/adr-parser.cjs +394 -0
  110. package/get-tasks-done/bin/lib/artifacts.cjs +53 -0
  111. package/get-tasks-done/bin/lib/audit.cjs +755 -0
  112. package/get-tasks-done/bin/lib/cjs-command-router-adapter.cjs +39 -0
  113. package/get-tasks-done/bin/lib/clusters.cjs +147 -0
  114. package/get-tasks-done/bin/lib/command-aliases.generated.cjs +830 -0
  115. package/get-tasks-done/bin/lib/commands.cjs +1031 -0
  116. package/get-tasks-done/bin/lib/config-schema.cjs +31 -0
  117. package/get-tasks-done/bin/lib/config.cjs +621 -0
  118. package/get-tasks-done/bin/lib/configuration.generated.cjs +253 -0
  119. package/get-tasks-done/bin/lib/context-utilization.cjs +47 -0
  120. package/get-tasks-done/bin/lib/core.cjs +1921 -0
  121. package/get-tasks-done/bin/lib/decisions.cjs +48 -0
  122. package/get-tasks-done/bin/lib/docs.cjs +270 -0
  123. package/get-tasks-done/bin/lib/drift.cjs +388 -0
  124. package/get-tasks-done/bin/lib/export-phase-issues.cjs +1862 -0
  125. package/get-tasks-done/bin/lib/fallow-runner.cjs +109 -0
  126. package/get-tasks-done/bin/lib/frontmatter.cjs +389 -0
  127. package/get-tasks-done/bin/lib/gap-checker.cjs +197 -0
  128. package/get-tasks-done/bin/lib/github-api-client.cjs +97 -0
  129. package/get-tasks-done/bin/lib/github-repo.cjs +154 -0
  130. package/get-tasks-done/bin/lib/graphify.cjs +592 -0
  131. package/get-tasks-done/bin/lib/gtd2-import.cjs +514 -0
  132. package/get-tasks-done/bin/lib/init-command-router.cjs +65 -0
  133. package/get-tasks-done/bin/lib/init.cjs +1898 -0
  134. package/get-tasks-done/bin/lib/install-profiles.cjs +589 -0
  135. package/get-tasks-done/bin/lib/installer-migration-authoring.cjs +117 -0
  136. package/get-tasks-done/bin/lib/installer-migration-report.cjs +354 -0
  137. package/get-tasks-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  138. package/get-tasks-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  139. package/get-tasks-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  140. package/get-tasks-done/bin/lib/installer-migrations/003-legacy-acronym-install-cleanup.cjs +135 -0
  141. package/get-tasks-done/bin/lib/installer-migrations.cjs +703 -0
  142. package/get-tasks-done/bin/lib/intel.cjs +643 -0
  143. package/get-tasks-done/bin/lib/learnings.cjs +379 -0
  144. package/get-tasks-done/bin/lib/milestone.cjs +314 -0
  145. package/get-tasks-done/bin/lib/model-catalog.cjs +143 -0
  146. package/get-tasks-done/bin/lib/model-profiles.cjs +27 -0
  147. package/get-tasks-done/bin/lib/orchestrate-tasks.cjs +2166 -0
  148. package/get-tasks-done/bin/lib/phase-command-router.cjs +96 -0
  149. package/get-tasks-done/bin/lib/phase.cjs +1422 -0
  150. package/get-tasks-done/bin/lib/phases-command-router.cjs +39 -0
  151. package/get-tasks-done/bin/lib/plan-scan.cjs +138 -0
  152. package/get-tasks-done/bin/lib/planning-workspace.cjs +361 -0
  153. package/get-tasks-done/bin/lib/profile-output.cjs +1132 -0
  154. package/get-tasks-done/bin/lib/profile-pipeline.cjs +539 -0
  155. package/get-tasks-done/bin/lib/project-root.generated.cjs +117 -0
  156. package/get-tasks-done/bin/lib/review-reviewer-selection.cjs +125 -0
  157. package/get-tasks-done/bin/lib/roadmap-command-router.cjs +23 -0
  158. package/get-tasks-done/bin/lib/roadmap.cjs +621 -0
  159. package/get-tasks-done/bin/lib/runtime-homes.cjs +178 -0
  160. package/get-tasks-done/bin/lib/runtime-slash.cjs +109 -0
  161. package/get-tasks-done/bin/lib/schema-detect.cjs +238 -0
  162. package/get-tasks-done/bin/lib/secrets.cjs +33 -0
  163. package/get-tasks-done/bin/lib/security.cjs +504 -0
  164. package/get-tasks-done/bin/lib/shell-command-projection.cjs +548 -0
  165. package/get-tasks-done/bin/lib/state-command-router.cjs +318 -0
  166. package/get-tasks-done/bin/lib/state-document.cjs +12 -0
  167. package/get-tasks-done/bin/lib/state-document.generated.cjs +127 -0
  168. package/get-tasks-done/bin/lib/state.cjs +1917 -0
  169. package/get-tasks-done/bin/lib/surface.cjs +398 -0
  170. package/get-tasks-done/bin/lib/task-issue-shared.cjs +64 -0
  171. package/get-tasks-done/bin/lib/template.cjs +228 -0
  172. package/get-tasks-done/bin/lib/uat.cjs +289 -0
  173. package/get-tasks-done/bin/lib/validate-command-router.cjs +57 -0
  174. package/get-tasks-done/bin/lib/verify-command-router.cjs +34 -0
  175. package/get-tasks-done/bin/lib/verify.cjs +1557 -0
  176. package/get-tasks-done/bin/lib/work-task-issue.cjs +3429 -0
  177. package/get-tasks-done/bin/lib/workstream-inventory-builder.generated.cjs +79 -0
  178. package/get-tasks-done/bin/lib/workstream-inventory.cjs +132 -0
  179. package/get-tasks-done/bin/lib/workstream-name-policy.cjs +33 -0
  180. package/get-tasks-done/bin/lib/workstream.cjs +374 -0
  181. package/get-tasks-done/bin/lib/worktree-safety.cjs +563 -0
  182. package/get-tasks-done/bin/verify-reapply-patches.cjs +247 -0
  183. package/get-tasks-done/contexts/dev.md +21 -0
  184. package/get-tasks-done/contexts/research.md +22 -0
  185. package/get-tasks-done/contexts/review.md +23 -0
  186. package/get-tasks-done/references/agent-contracts.md +79 -0
  187. package/get-tasks-done/references/ai-evals.md +156 -0
  188. package/get-tasks-done/references/ai-frameworks.md +186 -0
  189. package/get-tasks-done/references/artifact-types.md +131 -0
  190. package/get-tasks-done/references/autonomous-smart-discuss.md +277 -0
  191. package/get-tasks-done/references/checkpoints.md +814 -0
  192. package/get-tasks-done/references/common-bug-patterns.md +114 -0
  193. package/get-tasks-done/references/context-budget.md +85 -0
  194. package/get-tasks-done/references/continuation-format.md +253 -0
  195. package/get-tasks-done/references/debugger-philosophy.md +76 -0
  196. package/get-tasks-done/references/decimal-phase-calculation.md +64 -0
  197. package/get-tasks-done/references/doc-conflict-engine.md +91 -0
  198. package/get-tasks-done/references/domain-probes.md +125 -0
  199. package/get-tasks-done/references/execute-mvp-tdd.md +81 -0
  200. package/get-tasks-done/references/executor-examples.md +110 -0
  201. package/get-tasks-done/references/few-shot-examples/plan-checker.md +73 -0
  202. package/get-tasks-done/references/few-shot-examples/verifier.md +109 -0
  203. package/get-tasks-done/references/gate-prompts.md +100 -0
  204. package/get-tasks-done/references/gates.md +70 -0
  205. package/get-tasks-done/references/git-integration.md +298 -0
  206. package/get-tasks-done/references/git-planning-commit.md +40 -0
  207. package/get-tasks-done/references/ios-scaffold.md +123 -0
  208. package/get-tasks-done/references/mandatory-initial-read.md +2 -0
  209. package/get-tasks-done/references/model-profile-resolution.md +38 -0
  210. package/get-tasks-done/references/model-profiles.md +245 -0
  211. package/get-tasks-done/references/mvp-concepts.md +49 -0
  212. package/get-tasks-done/references/phase-argument-parsing.md +61 -0
  213. package/get-tasks-done/references/plan-checker-task-atomicity.md +73 -0
  214. package/get-tasks-done/references/planner-antipatterns.md +89 -0
  215. package/get-tasks-done/references/planner-chunked.md +49 -0
  216. package/get-tasks-done/references/planner-execution-flow.md +85 -0
  217. package/get-tasks-done/references/planner-gap-closure.md +71 -0
  218. package/get-tasks-done/references/planner-graphify-auto-update.md +67 -0
  219. package/get-tasks-done/references/planner-human-verify-mode.md +57 -0
  220. package/get-tasks-done/references/planner-mvp-mode.md +53 -0
  221. package/get-tasks-done/references/planner-reviews.md +39 -0
  222. package/get-tasks-done/references/planner-revision.md +87 -0
  223. package/get-tasks-done/references/planner-source-audit.md +73 -0
  224. package/get-tasks-done/references/planning-config.md +463 -0
  225. package/get-tasks-done/references/project-skills-discovery.md +19 -0
  226. package/get-tasks-done/references/questioning.md +162 -0
  227. package/get-tasks-done/references/revision-loop.md +97 -0
  228. package/get-tasks-done/references/scout-codebase.md +51 -0
  229. package/get-tasks-done/references/skeleton-template.md +48 -0
  230. package/get-tasks-done/references/sketch-interactivity.md +41 -0
  231. package/get-tasks-done/references/sketch-theme-system.md +94 -0
  232. package/get-tasks-done/references/sketch-tooling.md +45 -0
  233. package/get-tasks-done/references/sketch-variant-patterns.md +81 -0
  234. package/get-tasks-done/references/spidr-splitting.md +69 -0
  235. package/get-tasks-done/references/tdd.md +330 -0
  236. package/get-tasks-done/references/thinking-models-debug.md +44 -0
  237. package/get-tasks-done/references/thinking-models-execution.md +50 -0
  238. package/get-tasks-done/references/thinking-models-planning.md +62 -0
  239. package/get-tasks-done/references/thinking-models-research.md +50 -0
  240. package/get-tasks-done/references/thinking-models-verification.md +55 -0
  241. package/get-tasks-done/references/thinking-partner.md +96 -0
  242. package/get-tasks-done/references/ui-brand.md +160 -0
  243. package/get-tasks-done/references/universal-anti-patterns.md +63 -0
  244. package/get-tasks-done/references/user-profiling.md +681 -0
  245. package/get-tasks-done/references/user-story-template.md +58 -0
  246. package/get-tasks-done/references/verification-overrides.md +227 -0
  247. package/get-tasks-done/references/verification-patterns.md +612 -0
  248. package/get-tasks-done/references/verify-mvp-mode.md +85 -0
  249. package/get-tasks-done/references/workstream-flag.md +111 -0
  250. package/get-tasks-done/references/worktree-path-safety.md +89 -0
  251. package/get-tasks-done/templates/AI-SPEC.md +246 -0
  252. package/get-tasks-done/templates/DEBUG.md +169 -0
  253. package/get-tasks-done/templates/README.md +77 -0
  254. package/get-tasks-done/templates/SECURITY.md +61 -0
  255. package/get-tasks-done/templates/UAT.md +265 -0
  256. package/get-tasks-done/templates/UI-SPEC.md +100 -0
  257. package/get-tasks-done/templates/VALIDATION.md +76 -0
  258. package/get-tasks-done/templates/claude-md.md +147 -0
  259. package/get-tasks-done/templates/codebase/architecture.md +255 -0
  260. package/get-tasks-done/templates/codebase/concerns.md +310 -0
  261. package/get-tasks-done/templates/codebase/conventions.md +307 -0
  262. package/get-tasks-done/templates/codebase/integrations.md +280 -0
  263. package/get-tasks-done/templates/codebase/stack.md +186 -0
  264. package/get-tasks-done/templates/codebase/structure.md +285 -0
  265. package/get-tasks-done/templates/codebase/testing.md +480 -0
  266. package/get-tasks-done/templates/config.json +55 -0
  267. package/get-tasks-done/templates/context.md +352 -0
  268. package/get-tasks-done/templates/continue-here.md +78 -0
  269. package/get-tasks-done/templates/copilot-instructions.md +8 -0
  270. package/get-tasks-done/templates/debug-subagent-prompt.md +91 -0
  271. package/get-tasks-done/templates/dev-preferences.md +21 -0
  272. package/get-tasks-done/templates/discovery.md +146 -0
  273. package/get-tasks-done/templates/discussion-log.md +63 -0
  274. package/get-tasks-done/templates/milestone-archive.md +123 -0
  275. package/get-tasks-done/templates/milestone.md +115 -0
  276. package/get-tasks-done/templates/phase-prompt.md +616 -0
  277. package/get-tasks-done/templates/planner-subagent-prompt.md +118 -0
  278. package/get-tasks-done/templates/project.md +186 -0
  279. package/get-tasks-done/templates/requirements.md +231 -0
  280. package/get-tasks-done/templates/research-project/ARCHITECTURE.md +204 -0
  281. package/get-tasks-done/templates/research-project/FEATURES.md +147 -0
  282. package/get-tasks-done/templates/research-project/PITFALLS.md +200 -0
  283. package/get-tasks-done/templates/research-project/STACK.md +120 -0
  284. package/get-tasks-done/templates/research-project/SUMMARY.md +170 -0
  285. package/get-tasks-done/templates/research.md +592 -0
  286. package/get-tasks-done/templates/retrospective.md +54 -0
  287. package/get-tasks-done/templates/roadmap.md +202 -0
  288. package/get-tasks-done/templates/spec.md +307 -0
  289. package/get-tasks-done/templates/state.md +184 -0
  290. package/get-tasks-done/templates/summary-complex.md +59 -0
  291. package/get-tasks-done/templates/summary-minimal.md +41 -0
  292. package/get-tasks-done/templates/summary-standard.md +48 -0
  293. package/get-tasks-done/templates/summary.md +248 -0
  294. package/get-tasks-done/templates/user-profile.md +146 -0
  295. package/get-tasks-done/templates/user-setup.md +311 -0
  296. package/get-tasks-done/templates/verification-report.md +322 -0
  297. package/get-tasks-done/workflows/add-backlog.md +90 -0
  298. package/get-tasks-done/workflows/add-phase.md +112 -0
  299. package/get-tasks-done/workflows/add-tests.md +354 -0
  300. package/get-tasks-done/workflows/add-todo.md +160 -0
  301. package/get-tasks-done/workflows/ai-integration-phase.md +294 -0
  302. package/get-tasks-done/workflows/analyze-dependencies.md +96 -0
  303. package/get-tasks-done/workflows/audit-fix.md +177 -0
  304. package/get-tasks-done/workflows/audit-milestone.md +357 -0
  305. package/get-tasks-done/workflows/audit-uat.md +109 -0
  306. package/get-tasks-done/workflows/autonomous.md +790 -0
  307. package/get-tasks-done/workflows/check-todos.md +179 -0
  308. package/get-tasks-done/workflows/cleanup.md +154 -0
  309. package/get-tasks-done/workflows/code-review-fix.md +501 -0
  310. package/get-tasks-done/workflows/code-review.md +613 -0
  311. package/get-tasks-done/workflows/complete-milestone.md +854 -0
  312. package/get-tasks-done/workflows/debug.md +231 -0
  313. package/get-tasks-done/workflows/diagnose-issues.md +240 -0
  314. package/get-tasks-done/workflows/discovery-phase.md +291 -0
  315. package/get-tasks-done/workflows/discuss-phase/modes/advisor.md +175 -0
  316. package/get-tasks-done/workflows/discuss-phase/modes/all.md +28 -0
  317. package/get-tasks-done/workflows/discuss-phase/modes/analyze.md +44 -0
  318. package/get-tasks-done/workflows/discuss-phase/modes/auto.md +56 -0
  319. package/get-tasks-done/workflows/discuss-phase/modes/batch.md +52 -0
  320. package/get-tasks-done/workflows/discuss-phase/modes/chain.md +97 -0
  321. package/get-tasks-done/workflows/discuss-phase/modes/default.md +141 -0
  322. package/get-tasks-done/workflows/discuss-phase/modes/power.md +44 -0
  323. package/get-tasks-done/workflows/discuss-phase/modes/text.md +55 -0
  324. package/get-tasks-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
  325. package/get-tasks-done/workflows/discuss-phase/templates/context.md +136 -0
  326. package/get-tasks-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
  327. package/get-tasks-done/workflows/discuss-phase-assumptions.md +674 -0
  328. package/get-tasks-done/workflows/discuss-phase-power.md +291 -0
  329. package/get-tasks-done/workflows/discuss-phase.md +499 -0
  330. package/get-tasks-done/workflows/do.md +110 -0
  331. package/get-tasks-done/workflows/docs-update.md +1161 -0
  332. package/get-tasks-done/workflows/edit-phase.md +294 -0
  333. package/get-tasks-done/workflows/eval-review.md +155 -0
  334. package/get-tasks-done/workflows/explore.md +143 -0
  335. package/get-tasks-done/workflows/export-phase-issues.md +74 -0
  336. package/get-tasks-done/workflows/extract-learnings.md +242 -0
  337. package/get-tasks-done/workflows/fast.md +105 -0
  338. package/get-tasks-done/workflows/forensics.md +278 -0
  339. package/get-tasks-done/workflows/graduation.md +195 -0
  340. package/get-tasks-done/workflows/health.md +223 -0
  341. package/get-tasks-done/workflows/help/modes/brief.md +24 -0
  342. package/get-tasks-done/workflows/help/modes/default.md +52 -0
  343. package/get-tasks-done/workflows/help/modes/full.md +813 -0
  344. package/get-tasks-done/workflows/help/modes/topic.md +74 -0
  345. package/get-tasks-done/workflows/help.md +24 -0
  346. package/get-tasks-done/workflows/import.md +253 -0
  347. package/get-tasks-done/workflows/inbox.md +87 -0
  348. package/get-tasks-done/workflows/ingest-docs.md +339 -0
  349. package/get-tasks-done/workflows/insert-phase.md +151 -0
  350. package/get-tasks-done/workflows/list-phase-assumptions.md +178 -0
  351. package/get-tasks-done/workflows/list-workspaces.md +56 -0
  352. package/get-tasks-done/workflows/manager.md +393 -0
  353. package/get-tasks-done/workflows/map-codebase.md +443 -0
  354. package/get-tasks-done/workflows/milestone-summary.md +223 -0
  355. package/get-tasks-done/workflows/mvp-phase.md +221 -0
  356. package/get-tasks-done/workflows/new-milestone.md +634 -0
  357. package/get-tasks-done/workflows/new-project.md +1443 -0
  358. package/get-tasks-done/workflows/new-workspace.md +239 -0
  359. package/get-tasks-done/workflows/next.md +220 -0
  360. package/get-tasks-done/workflows/node-repair.md +92 -0
  361. package/get-tasks-done/workflows/note.md +158 -0
  362. package/get-tasks-done/workflows/orchestrate-tasks.md +209 -0
  363. package/get-tasks-done/workflows/pause-work.md +243 -0
  364. package/get-tasks-done/workflows/plan-milestone-gaps.md +280 -0
  365. package/get-tasks-done/workflows/plan-phase.md +1756 -0
  366. package/get-tasks-done/workflows/plan-review-convergence.md +329 -0
  367. package/get-tasks-done/workflows/plant-seed.md +229 -0
  368. package/get-tasks-done/workflows/pr-branch.md +156 -0
  369. package/get-tasks-done/workflows/profile-user.md +452 -0
  370. package/get-tasks-done/workflows/progress.md +668 -0
  371. package/get-tasks-done/workflows/quick.md +1169 -0
  372. package/get-tasks-done/workflows/reapply-patches.md +390 -0
  373. package/get-tasks-done/workflows/remove-phase.md +155 -0
  374. package/get-tasks-done/workflows/remove-workspace.md +107 -0
  375. package/get-tasks-done/workflows/resume-project.md +329 -0
  376. package/get-tasks-done/workflows/review.md +459 -0
  377. package/get-tasks-done/workflows/scan.md +104 -0
  378. package/get-tasks-done/workflows/secure-phase.md +179 -0
  379. package/get-tasks-done/workflows/session-report.md +146 -0
  380. package/get-tasks-done/workflows/settings-advanced.md +532 -0
  381. package/get-tasks-done/workflows/settings-integrations.md +281 -0
  382. package/get-tasks-done/workflows/settings.md +502 -0
  383. package/get-tasks-done/workflows/sketch-wrap-up.md +285 -0
  384. package/get-tasks-done/workflows/sketch.md +360 -0
  385. package/get-tasks-done/workflows/spec-phase.md +262 -0
  386. package/get-tasks-done/workflows/spike-wrap-up.md +306 -0
  387. package/get-tasks-done/workflows/spike.md +452 -0
  388. package/get-tasks-done/workflows/stats.md +79 -0
  389. package/get-tasks-done/workflows/sync-skills.md +182 -0
  390. package/get-tasks-done/workflows/thread.md +221 -0
  391. package/get-tasks-done/workflows/transition.md +693 -0
  392. package/get-tasks-done/workflows/ui-phase.md +327 -0
  393. package/get-tasks-done/workflows/ui-review.md +192 -0
  394. package/get-tasks-done/workflows/ultraplan-phase.md +198 -0
  395. package/get-tasks-done/workflows/undo.md +314 -0
  396. package/get-tasks-done/workflows/update.md +644 -0
  397. package/get-tasks-done/workflows/validate-phase.md +178 -0
  398. package/get-tasks-done/workflows/verify-phase.md +543 -0
  399. package/get-tasks-done/workflows/verify-work.md +797 -0
  400. package/get-tasks-done/workflows/work-task-issue.md +249 -0
  401. package/hooks/dist/gtd-check-update-worker.js +117 -0
  402. package/hooks/dist/gtd-check-update.js +64 -0
  403. package/hooks/dist/gtd-context-monitor.js +192 -0
  404. package/hooks/dist/gtd-phase-boundary.sh +47 -0
  405. package/hooks/dist/gtd-prompt-guard.js +97 -0
  406. package/hooks/dist/gtd-read-guard.js +101 -0
  407. package/hooks/dist/gtd-read-injection-scanner.js +152 -0
  408. package/hooks/dist/gtd-session-state.sh +59 -0
  409. package/hooks/dist/gtd-statusline.js +537 -0
  410. package/hooks/dist/gtd-update-banner.js +134 -0
  411. package/hooks/dist/gtd-validate-commit.sh +57 -0
  412. package/hooks/dist/gtd-workflow-guard.js +94 -0
  413. package/hooks/gtd-check-update-worker.js +117 -0
  414. package/hooks/gtd-check-update.js +64 -0
  415. package/hooks/gtd-context-monitor.js +192 -0
  416. package/hooks/gtd-graphify-update.sh +152 -0
  417. package/hooks/gtd-phase-boundary.sh +47 -0
  418. package/hooks/gtd-prompt-guard.js +97 -0
  419. package/hooks/gtd-read-guard.js +101 -0
  420. package/hooks/gtd-read-injection-scanner.js +152 -0
  421. package/hooks/gtd-session-state.sh +59 -0
  422. package/hooks/gtd-statusline.js +537 -0
  423. package/hooks/gtd-update-banner.js +134 -0
  424. package/hooks/gtd-validate-commit.sh +57 -0
  425. package/hooks/gtd-workflow-guard.js +94 -0
  426. package/hooks/lib/git-cmd.js +150 -0
  427. package/hooks/lib/gtd-graphify-rebuild.sh +65 -0
  428. package/package.json +85 -0
  429. package/scripts/audit-workflow-script-paths.cjs +73 -0
  430. package/scripts/base64-scan.sh +262 -0
  431. package/scripts/build-hooks.js +187 -0
  432. package/scripts/command-contract-helpers.cjs +61 -0
  433. package/scripts/fix-slash-commands.cjs +106 -0
  434. package/scripts/lint-command-contract.cjs +108 -0
  435. package/scripts/lint-descriptions.cjs +83 -0
  436. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  437. package/scripts/lint-no-source-grep.cjs +174 -0
  438. package/scripts/lint-pr-check-project-dir.cjs +94 -0
  439. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  440. package/scripts/lint-skill-deps.cjs +180 -0
  441. package/scripts/prompt-injection-scan.sh +201 -0
  442. package/scripts/run-tests.cjs +33 -0
  443. package/scripts/secret-scan.sh +227 -0
  444. package/scripts/strip-prose-atrefs.cjs +106 -0
  445. package/scripts/verify-tarball-sdk-dist.sh +69 -0
  446. package/sdk/dist/cli-transport.d.ts +19 -0
  447. package/sdk/dist/cli-transport.d.ts.map +1 -0
  448. package/sdk/dist/cli-transport.js +104 -0
  449. package/sdk/dist/cli-transport.js.map +1 -0
  450. package/sdk/dist/cli.d.ts +46 -0
  451. package/sdk/dist/cli.d.ts.map +1 -0
  452. package/sdk/dist/cli.js +511 -0
  453. package/sdk/dist/cli.js.map +1 -0
  454. package/sdk/dist/config.d.ts +107 -0
  455. package/sdk/dist/config.d.ts.map +1 -0
  456. package/sdk/dist/config.js +115 -0
  457. package/sdk/dist/config.js.map +1 -0
  458. package/sdk/dist/configuration/index.d.ts +85 -0
  459. package/sdk/dist/configuration/index.d.ts.map +1 -0
  460. package/sdk/dist/configuration/index.js +257 -0
  461. package/sdk/dist/configuration/index.js.map +1 -0
  462. package/sdk/dist/context-engine.d.ts +49 -0
  463. package/sdk/dist/context-engine.d.ts.map +1 -0
  464. package/sdk/dist/context-engine.js +142 -0
  465. package/sdk/dist/context-engine.js.map +1 -0
  466. package/sdk/dist/context-truncation.d.ts +33 -0
  467. package/sdk/dist/context-truncation.d.ts.map +1 -0
  468. package/sdk/dist/context-truncation.js +197 -0
  469. package/sdk/dist/context-truncation.js.map +1 -0
  470. package/sdk/dist/errors.d.ts +46 -0
  471. package/sdk/dist/errors.d.ts.map +1 -0
  472. package/sdk/dist/errors.js +64 -0
  473. package/sdk/dist/errors.js.map +1 -0
  474. package/sdk/dist/event-stream.d.ts +53 -0
  475. package/sdk/dist/event-stream.d.ts.map +1 -0
  476. package/sdk/dist/event-stream.js +321 -0
  477. package/sdk/dist/event-stream.js.map +1 -0
  478. package/sdk/dist/golden/capture.d.ts +15 -0
  479. package/sdk/dist/golden/capture.d.ts.map +1 -0
  480. package/sdk/dist/golden/capture.js +67 -0
  481. package/sdk/dist/golden/capture.js.map +1 -0
  482. package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
  483. package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
  484. package/sdk/dist/golden/golden-integration-covered.js +30 -0
  485. package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
  486. package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
  487. package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
  488. package/sdk/dist/golden/golden-mutation-covered.js +17 -0
  489. package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
  490. package/sdk/dist/golden/golden-policy.d.ts +10 -0
  491. package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
  492. package/sdk/dist/golden/golden-policy.js +97 -0
  493. package/sdk/dist/golden/golden-policy.js.map +1 -0
  494. package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
  495. package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
  496. package/sdk/dist/golden/init-golden-normalize.js +14 -0
  497. package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
  498. package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
  499. package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
  500. package/sdk/dist/golden/read-only-golden-rows.js +67 -0
  501. package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
  502. package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
  503. package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
  504. package/sdk/dist/golden/registry-canonical-commands.js +30 -0
  505. package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
  506. package/sdk/dist/gtd-tools-error.d.ts +23 -0
  507. package/sdk/dist/gtd-tools-error.d.ts.map +1 -0
  508. package/sdk/dist/gtd-tools-error.js +29 -0
  509. package/sdk/dist/gtd-tools-error.js.map +1 -0
  510. package/sdk/dist/gtd-tools.d.ts +102 -0
  511. package/sdk/dist/gtd-tools.d.ts.map +1 -0
  512. package/sdk/dist/gtd-tools.js +222 -0
  513. package/sdk/dist/gtd-tools.js.map +1 -0
  514. package/sdk/dist/gtd-transport-policy.d.ts +10 -0
  515. package/sdk/dist/gtd-transport-policy.d.ts.map +1 -0
  516. package/sdk/dist/gtd-transport-policy.js +32 -0
  517. package/sdk/dist/gtd-transport-policy.js.map +1 -0
  518. package/sdk/dist/gtd-transport.d.ts +39 -0
  519. package/sdk/dist/gtd-transport.d.ts.map +1 -0
  520. package/sdk/dist/gtd-transport.js +78 -0
  521. package/sdk/dist/gtd-transport.js.map +1 -0
  522. package/sdk/dist/index.d.ts +127 -0
  523. package/sdk/dist/index.d.ts.map +1 -0
  524. package/sdk/dist/index.js +298 -0
  525. package/sdk/dist/index.js.map +1 -0
  526. package/sdk/dist/init-runner.d.ts +90 -0
  527. package/sdk/dist/init-runner.d.ts.map +1 -0
  528. package/sdk/dist/init-runner.js +613 -0
  529. package/sdk/dist/init-runner.js.map +1 -0
  530. package/sdk/dist/logger.d.ts +50 -0
  531. package/sdk/dist/logger.d.ts.map +1 -0
  532. package/sdk/dist/logger.js +70 -0
  533. package/sdk/dist/logger.js.map +1 -0
  534. package/sdk/dist/model-catalog.d.ts +33 -0
  535. package/sdk/dist/model-catalog.d.ts.map +1 -0
  536. package/sdk/dist/model-catalog.js +34 -0
  537. package/sdk/dist/model-catalog.js.map +1 -0
  538. package/sdk/dist/phase-prompt.d.ts +71 -0
  539. package/sdk/dist/phase-prompt.d.ts.map +1 -0
  540. package/sdk/dist/phase-prompt.js +208 -0
  541. package/sdk/dist/phase-prompt.js.map +1 -0
  542. package/sdk/dist/phase-runner.d.ts +145 -0
  543. package/sdk/dist/phase-runner.d.ts.map +1 -0
  544. package/sdk/dist/phase-runner.js +1206 -0
  545. package/sdk/dist/phase-runner.js.map +1 -0
  546. package/sdk/dist/plan-atomicity.d.ts +26 -0
  547. package/sdk/dist/plan-atomicity.d.ts.map +1 -0
  548. package/sdk/dist/plan-atomicity.js +116 -0
  549. package/sdk/dist/plan-atomicity.js.map +1 -0
  550. package/sdk/dist/plan-parser.d.ts +55 -0
  551. package/sdk/dist/plan-parser.d.ts.map +1 -0
  552. package/sdk/dist/plan-parser.js +391 -0
  553. package/sdk/dist/plan-parser.js.map +1 -0
  554. package/sdk/dist/planning-journal.d.ts +64 -0
  555. package/sdk/dist/planning-journal.d.ts.map +1 -0
  556. package/sdk/dist/planning-journal.js +88 -0
  557. package/sdk/dist/planning-journal.js.map +1 -0
  558. package/sdk/dist/planning-runtime.d.ts +67 -0
  559. package/sdk/dist/planning-runtime.d.ts.map +1 -0
  560. package/sdk/dist/planning-runtime.js +58 -0
  561. package/sdk/dist/planning-runtime.js.map +1 -0
  562. package/sdk/dist/project-root/index.d.ts +46 -0
  563. package/sdk/dist/project-root/index.d.ts.map +1 -0
  564. package/sdk/dist/project-root/index.js +138 -0
  565. package/sdk/dist/project-root/index.js.map +1 -0
  566. package/sdk/dist/prompt-builder.d.ts +44 -0
  567. package/sdk/dist/prompt-builder.d.ts.map +1 -0
  568. package/sdk/dist/prompt-builder.js +180 -0
  569. package/sdk/dist/prompt-builder.js.map +1 -0
  570. package/sdk/dist/prompt-sanitizer.d.ts +35 -0
  571. package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
  572. package/sdk/dist/prompt-sanitizer.js +101 -0
  573. package/sdk/dist/prompt-sanitizer.js.map +1 -0
  574. package/sdk/dist/query/active-workstream-store.d.ts +7 -0
  575. package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
  576. package/sdk/dist/query/active-workstream-store.js +56 -0
  577. package/sdk/dist/query/active-workstream-store.js.map +1 -0
  578. package/sdk/dist/query/agent-failure-classifier.d.ts +37 -0
  579. package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
  580. package/sdk/dist/query/agent-failure-classifier.js +82 -0
  581. package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
  582. package/sdk/dist/query/audit-open.d.ts +46 -0
  583. package/sdk/dist/query/audit-open.d.ts.map +1 -0
  584. package/sdk/dist/query/audit-open.js +662 -0
  585. package/sdk/dist/query/audit-open.js.map +1 -0
  586. package/sdk/dist/query/check-auto-mode.d.ts +13 -0
  587. package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
  588. package/sdk/dist/query/check-auto-mode.js +40 -0
  589. package/sdk/dist/query/check-auto-mode.js.map +1 -0
  590. package/sdk/dist/query/check-completion.d.ts +10 -0
  591. package/sdk/dist/query/check-completion.d.ts.map +1 -0
  592. package/sdk/dist/query/check-completion.js +157 -0
  593. package/sdk/dist/query/check-completion.js.map +1 -0
  594. package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
  595. package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
  596. package/sdk/dist/query/check-decision-coverage.js +472 -0
  597. package/sdk/dist/query/check-decision-coverage.js.map +1 -0
  598. package/sdk/dist/query/check-gates.d.ts +10 -0
  599. package/sdk/dist/query/check-gates.d.ts.map +1 -0
  600. package/sdk/dist/query/check-gates.js +89 -0
  601. package/sdk/dist/query/check-gates.js.map +1 -0
  602. package/sdk/dist/query/check-verification-status.d.ts +10 -0
  603. package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
  604. package/sdk/dist/query/check-verification-status.js +142 -0
  605. package/sdk/dist/query/check-verification-status.js.map +1 -0
  606. package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
  607. package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
  608. package/sdk/dist/query/command-aliases.generated.js +134 -0
  609. package/sdk/dist/query/command-aliases.generated.js.map +1 -0
  610. package/sdk/dist/query/command-catalog.d.ts +9 -0
  611. package/sdk/dist/query/command-catalog.d.ts.map +1 -0
  612. package/sdk/dist/query/command-catalog.js +17 -0
  613. package/sdk/dist/query/command-catalog.js.map +1 -0
  614. package/sdk/dist/query/command-definition.d.ts +19 -0
  615. package/sdk/dist/query/command-definition.d.ts.map +1 -0
  616. package/sdk/dist/query/command-definition.js +44 -0
  617. package/sdk/dist/query/command-definition.js.map +1 -0
  618. package/sdk/dist/query/command-family-handlers.d.ts +3 -0
  619. package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
  620. package/sdk/dist/query/command-family-handlers.js +93 -0
  621. package/sdk/dist/query/command-family-handlers.js.map +1 -0
  622. package/sdk/dist/query/command-manifest.d.ts +2 -0
  623. package/sdk/dist/query/command-manifest.d.ts.map +1 -0
  624. package/sdk/dist/query/command-manifest.init.d.ts +6 -0
  625. package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
  626. package/sdk/dist/query/command-manifest.init.js +22 -0
  627. package/sdk/dist/query/command-manifest.init.js.map +1 -0
  628. package/sdk/dist/query/command-manifest.js +17 -0
  629. package/sdk/dist/query/command-manifest.js.map +1 -0
  630. package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
  631. package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
  632. package/sdk/dist/query/command-manifest.non-family.js +62 -0
  633. package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
  634. package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
  635. package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
  636. package/sdk/dist/query/command-manifest.phase.js +15 -0
  637. package/sdk/dist/query/command-manifest.phase.js.map +1 -0
  638. package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
  639. package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
  640. package/sdk/dist/query/command-manifest.phases.js +10 -0
  641. package/sdk/dist/query/command-manifest.phases.js.map +1 -0
  642. package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
  643. package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
  644. package/sdk/dist/query/command-manifest.roadmap.js +10 -0
  645. package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
  646. package/sdk/dist/query/command-manifest.state.d.ts +9 -0
  647. package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
  648. package/sdk/dist/query/command-manifest.state.js +30 -0
  649. package/sdk/dist/query/command-manifest.state.js.map +1 -0
  650. package/sdk/dist/query/command-manifest.types.d.ts +12 -0
  651. package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
  652. package/sdk/dist/query/command-manifest.types.js +2 -0
  653. package/sdk/dist/query/command-manifest.types.js.map +1 -0
  654. package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
  655. package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
  656. package/sdk/dist/query/command-manifest.validate.js +10 -0
  657. package/sdk/dist/query/command-manifest.validate.js.map +1 -0
  658. package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
  659. package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
  660. package/sdk/dist/query/command-manifest.verify.js +14 -0
  661. package/sdk/dist/query/command-manifest.verify.js.map +1 -0
  662. package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
  663. package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
  664. package/sdk/dist/query/command-static-catalog-domain.js +120 -0
  665. package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
  666. package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
  667. package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
  668. package/sdk/dist/query/command-static-catalog-foundation.js +95 -0
  669. package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
  670. package/sdk/dist/query/command-topology.d.ts +32 -0
  671. package/sdk/dist/query/command-topology.d.ts.map +1 -0
  672. package/sdk/dist/query/command-topology.js +66 -0
  673. package/sdk/dist/query/command-topology.js.map +1 -0
  674. package/sdk/dist/query/commands-list.d.ts +14 -0
  675. package/sdk/dist/query/commands-list.d.ts.map +1 -0
  676. package/sdk/dist/query/commands-list.js +18 -0
  677. package/sdk/dist/query/commands-list.js.map +1 -0
  678. package/sdk/dist/query/commit.d.ts +79 -0
  679. package/sdk/dist/query/commit.d.ts.map +1 -0
  680. package/sdk/dist/query/commit.js +340 -0
  681. package/sdk/dist/query/commit.js.map +1 -0
  682. package/sdk/dist/query/config-gates.d.ts +12 -0
  683. package/sdk/dist/query/config-gates.d.ts.map +1 -0
  684. package/sdk/dist/query/config-gates.js +66 -0
  685. package/sdk/dist/query/config-gates.js.map +1 -0
  686. package/sdk/dist/query/config-mutation.d.ts +86 -0
  687. package/sdk/dist/query/config-mutation.d.ts.map +1 -0
  688. package/sdk/dist/query/config-mutation.js +445 -0
  689. package/sdk/dist/query/config-mutation.js.map +1 -0
  690. package/sdk/dist/query/config-query.d.ts +57 -0
  691. package/sdk/dist/query/config-query.d.ts.map +1 -0
  692. package/sdk/dist/query/config-query.js +208 -0
  693. package/sdk/dist/query/config-query.js.map +1 -0
  694. package/sdk/dist/query/config-schema.d.ts +19 -0
  695. package/sdk/dist/query/config-schema.d.ts.map +1 -0
  696. package/sdk/dist/query/config-schema.js +26 -0
  697. package/sdk/dist/query/config-schema.js.map +1 -0
  698. package/sdk/dist/query/decisions.d.ts +58 -0
  699. package/sdk/dist/query/decisions.d.ts.map +1 -0
  700. package/sdk/dist/query/decisions.js +161 -0
  701. package/sdk/dist/query/decisions.js.map +1 -0
  702. package/sdk/dist/query/detect-custom-files.d.ts +11 -0
  703. package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
  704. package/sdk/dist/query/detect-custom-files.js +89 -0
  705. package/sdk/dist/query/detect-custom-files.js.map +1 -0
  706. package/sdk/dist/query/detect-phase-type.d.ts +9 -0
  707. package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
  708. package/sdk/dist/query/detect-phase-type.js +124 -0
  709. package/sdk/dist/query/detect-phase-type.js.map +1 -0
  710. package/sdk/dist/query/docs-init.d.ts +26 -0
  711. package/sdk/dist/query/docs-init.d.ts.map +1 -0
  712. package/sdk/dist/query/docs-init.js +231 -0
  713. package/sdk/dist/query/docs-init.js.map +1 -0
  714. package/sdk/dist/query/fallow-audit.d.ts +44 -0
  715. package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
  716. package/sdk/dist/query/fallow-audit.js +44 -0
  717. package/sdk/dist/query/fallow-audit.js.map +1 -0
  718. package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
  719. package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
  720. package/sdk/dist/query/frontmatter-mutation.js +317 -0
  721. package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
  722. package/sdk/dist/query/frontmatter.d.ts +93 -0
  723. package/sdk/dist/query/frontmatter.d.ts.map +1 -0
  724. package/sdk/dist/query/frontmatter.js +365 -0
  725. package/sdk/dist/query/frontmatter.js.map +1 -0
  726. package/sdk/dist/query/helpers.d.ts +167 -0
  727. package/sdk/dist/query/helpers.d.ts.map +1 -0
  728. package/sdk/dist/query/helpers.js +495 -0
  729. package/sdk/dist/query/helpers.js.map +1 -0
  730. package/sdk/dist/query/index.d.ts +8 -0
  731. package/sdk/dist/query/index.d.ts.map +1 -0
  732. package/sdk/dist/query/index.js +6 -0
  733. package/sdk/dist/query/index.js.map +1 -0
  734. package/sdk/dist/query/init-complex.d.ts +47 -0
  735. package/sdk/dist/query/init-complex.d.ts.map +1 -0
  736. package/sdk/dist/query/init-complex.js +723 -0
  737. package/sdk/dist/query/init-complex.js.map +1 -0
  738. package/sdk/dist/query/init.d.ts +98 -0
  739. package/sdk/dist/query/init.d.ts.map +1 -0
  740. package/sdk/dist/query/init.js +1074 -0
  741. package/sdk/dist/query/init.js.map +1 -0
  742. package/sdk/dist/query/intel.d.ts +43 -0
  743. package/sdk/dist/query/intel.d.ts.map +1 -0
  744. package/sdk/dist/query/intel.js +416 -0
  745. package/sdk/dist/query/intel.js.map +1 -0
  746. package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
  747. package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
  748. package/sdk/dist/query/mutation-event-decorator.js +28 -0
  749. package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
  750. package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
  751. package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
  752. package/sdk/dist/query/mutation-event-mapper.js +70 -0
  753. package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
  754. package/sdk/dist/query/mvp.d.ts +113 -0
  755. package/sdk/dist/query/mvp.d.ts.map +1 -0
  756. package/sdk/dist/query/mvp.js +225 -0
  757. package/sdk/dist/query/mvp.js.map +1 -0
  758. package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
  759. package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
  760. package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
  761. package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
  762. package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
  763. package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
  764. package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
  765. package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
  766. package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
  767. package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
  768. package/sdk/dist/query/phase-lifecycle.js +1486 -0
  769. package/sdk/dist/query/phase-lifecycle.js.map +1 -0
  770. package/sdk/dist/query/phase-list-queries.d.ts +18 -0
  771. package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
  772. package/sdk/dist/query/phase-list-queries.js +129 -0
  773. package/sdk/dist/query/phase-list-queries.js.map +1 -0
  774. package/sdk/dist/query/phase-ready.d.ts +9 -0
  775. package/sdk/dist/query/phase-ready.d.ts.map +1 -0
  776. package/sdk/dist/query/phase-ready.js +132 -0
  777. package/sdk/dist/query/phase-ready.js.map +1 -0
  778. package/sdk/dist/query/phase-roadmap-mutation.d.ts +13 -0
  779. package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
  780. package/sdk/dist/query/phase-roadmap-mutation.js +65 -0
  781. package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
  782. package/sdk/dist/query/phase.d.ts +48 -0
  783. package/sdk/dist/query/phase.d.ts.map +1 -0
  784. package/sdk/dist/query/phase.js +451 -0
  785. package/sdk/dist/query/phase.js.map +1 -0
  786. package/sdk/dist/query/pipeline.d.ts +53 -0
  787. package/sdk/dist/query/pipeline.d.ts.map +1 -0
  788. package/sdk/dist/query/pipeline.js +198 -0
  789. package/sdk/dist/query/pipeline.js.map +1 -0
  790. package/sdk/dist/query/plan-scan.d.ts +14 -0
  791. package/sdk/dist/query/plan-scan.d.ts.map +1 -0
  792. package/sdk/dist/query/plan-scan.js +70 -0
  793. package/sdk/dist/query/plan-scan.js.map +1 -0
  794. package/sdk/dist/query/plan-task-structure.d.ts +9 -0
  795. package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
  796. package/sdk/dist/query/plan-task-structure.js +59 -0
  797. package/sdk/dist/query/plan-task-structure.js.map +1 -0
  798. package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
  799. package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
  800. package/sdk/dist/query/profile-extract-messages.js +195 -0
  801. package/sdk/dist/query/profile-extract-messages.js.map +1 -0
  802. package/sdk/dist/query/profile-output.d.ts +11 -0
  803. package/sdk/dist/query/profile-output.d.ts.map +1 -0
  804. package/sdk/dist/query/profile-output.js +873 -0
  805. package/sdk/dist/query/profile-output.js.map +1 -0
  806. package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
  807. package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
  808. package/sdk/dist/query/profile-questionnaire-data.js +171 -0
  809. package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
  810. package/sdk/dist/query/profile-sample.d.ts +22 -0
  811. package/sdk/dist/query/profile-sample.d.ts.map +1 -0
  812. package/sdk/dist/query/profile-sample.js +136 -0
  813. package/sdk/dist/query/profile-sample.js.map +1 -0
  814. package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
  815. package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
  816. package/sdk/dist/query/profile-scan-sessions.js +137 -0
  817. package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
  818. package/sdk/dist/query/profile.d.ts +61 -0
  819. package/sdk/dist/query/profile.d.ts.map +1 -0
  820. package/sdk/dist/query/profile.js +307 -0
  821. package/sdk/dist/query/profile.js.map +1 -0
  822. package/sdk/dist/query/progress.d.ts +77 -0
  823. package/sdk/dist/query/progress.d.ts.map +1 -0
  824. package/sdk/dist/query/progress.js +481 -0
  825. package/sdk/dist/query/progress.js.map +1 -0
  826. package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
  827. package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
  828. package/sdk/dist/query/query-cli-adapter.js +32 -0
  829. package/sdk/dist/query/query-cli-adapter.js.map +1 -0
  830. package/sdk/dist/query/query-cli-output.d.ts +9 -0
  831. package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
  832. package/sdk/dist/query/query-cli-output.js +54 -0
  833. package/sdk/dist/query/query-cli-output.js.map +1 -0
  834. package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
  835. package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
  836. package/sdk/dist/query/query-command-diagnosis.js +6 -0
  837. package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
  838. package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
  839. package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
  840. package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
  841. package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
  842. package/sdk/dist/query/query-command-semantics.d.ts +7 -0
  843. package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
  844. package/sdk/dist/query/query-command-semantics.js +7 -0
  845. package/sdk/dist/query/query-command-semantics.js.map +1 -0
  846. package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
  847. package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
  848. package/sdk/dist/query/query-dispatch-contract.js +2 -0
  849. package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
  850. package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
  851. package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
  852. package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
  853. package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
  854. package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
  855. package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
  856. package/sdk/dist/query/query-dispatch-formatting.js +6 -0
  857. package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
  858. package/sdk/dist/query/query-dispatch-input-validation.d.ts +6 -0
  859. package/sdk/dist/query/query-dispatch-input-validation.d.ts.map +1 -0
  860. package/sdk/dist/query/query-dispatch-input-validation.js +6 -0
  861. package/sdk/dist/query/query-dispatch-input-validation.js.map +1 -0
  862. package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
  863. package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
  864. package/sdk/dist/query/query-dispatch-observability.js +7 -0
  865. package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
  866. package/sdk/dist/query/query-dispatch-plan.d.ts +6 -0
  867. package/sdk/dist/query/query-dispatch-plan.d.ts.map +1 -0
  868. package/sdk/dist/query/query-dispatch-plan.js +6 -0
  869. package/sdk/dist/query/query-dispatch-plan.js.map +1 -0
  870. package/sdk/dist/query/query-dispatch-result-builder.d.ts +6 -0
  871. package/sdk/dist/query/query-dispatch-result-builder.d.ts.map +1 -0
  872. package/sdk/dist/query/query-dispatch-result-builder.js +6 -0
  873. package/sdk/dist/query/query-dispatch-result-builder.js.map +1 -0
  874. package/sdk/dist/query/query-dispatch.d.ts +48 -0
  875. package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
  876. package/sdk/dist/query/query-dispatch.js +205 -0
  877. package/sdk/dist/query/query-dispatch.js.map +1 -0
  878. package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
  879. package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
  880. package/sdk/dist/query/query-error-details-schema.js +10 -0
  881. package/sdk/dist/query/query-error-details-schema.js.map +1 -0
  882. package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
  883. package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
  884. package/sdk/dist/query/query-error-taxonomy.js +74 -0
  885. package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
  886. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
  887. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
  888. package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
  889. package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
  890. package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
  891. package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
  892. package/sdk/dist/query/query-fallback-executor.js +31 -0
  893. package/sdk/dist/query/query-fallback-executor.js.map +1 -0
  894. package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
  895. package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
  896. package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
  897. package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
  898. package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
  899. package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
  900. package/sdk/dist/query/query-fallback-policy.js +7 -0
  901. package/sdk/dist/query/query-fallback-policy.js.map +1 -0
  902. package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
  903. package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
  904. package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
  905. package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
  906. package/sdk/dist/query/query-policy-capability.d.ts +10 -0
  907. package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
  908. package/sdk/dist/query/query-policy-capability.js +17 -0
  909. package/sdk/dist/query/query-policy-capability.js.map +1 -0
  910. package/sdk/dist/query/query-runtime-context.d.ts +19 -0
  911. package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
  912. package/sdk/dist/query/query-runtime-context.js +31 -0
  913. package/sdk/dist/query/query-runtime-context.js.map +1 -0
  914. package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
  915. package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
  916. package/sdk/dist/query/query-unknown-command-hints.js +6 -0
  917. package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
  918. package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
  919. package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
  920. package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
  921. package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
  922. package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
  923. package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
  924. package/sdk/dist/query/registry-assembly-invariants.js +77 -0
  925. package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
  926. package/sdk/dist/query/registry-assembly.d.ts +10 -0
  927. package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
  928. package/sdk/dist/query/registry-assembly.js +53 -0
  929. package/sdk/dist/query/registry-assembly.js.map +1 -0
  930. package/sdk/dist/query/registry.d.ts +90 -0
  931. package/sdk/dist/query/registry.d.ts.map +1 -0
  932. package/sdk/dist/query/registry.js +129 -0
  933. package/sdk/dist/query/registry.js.map +1 -0
  934. package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
  935. package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
  936. package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
  937. package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
  938. package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
  939. package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
  940. package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
  941. package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
  942. package/sdk/dist/query/roadmap.d.ts +137 -0
  943. package/sdk/dist/query/roadmap.d.ts.map +1 -0
  944. package/sdk/dist/query/roadmap.js +753 -0
  945. package/sdk/dist/query/roadmap.js.map +1 -0
  946. package/sdk/dist/query/route-next-action.d.ts +9 -0
  947. package/sdk/dist/query/route-next-action.d.ts.map +1 -0
  948. package/sdk/dist/query/route-next-action.js +342 -0
  949. package/sdk/dist/query/route-next-action.js.map +1 -0
  950. package/sdk/dist/query/schema-detect.d.ts +21 -0
  951. package/sdk/dist/query/schema-detect.d.ts.map +1 -0
  952. package/sdk/dist/query/schema-detect.js +146 -0
  953. package/sdk/dist/query/schema-detect.js.map +1 -0
  954. package/sdk/dist/query/secrets.d.ts +27 -0
  955. package/sdk/dist/query/secrets.d.ts.map +1 -0
  956. package/sdk/dist/query/secrets.js +42 -0
  957. package/sdk/dist/query/secrets.js.map +1 -0
  958. package/sdk/dist/query/skill-manifest.d.ts +50 -0
  959. package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
  960. package/sdk/dist/query/skill-manifest.js +171 -0
  961. package/sdk/dist/query/skill-manifest.js.map +1 -0
  962. package/sdk/dist/query/skills.d.ts +27 -0
  963. package/sdk/dist/query/skills.d.ts.map +1 -0
  964. package/sdk/dist/query/skills.js +137 -0
  965. package/sdk/dist/query/skills.js.map +1 -0
  966. package/sdk/dist/query/state-document.d.ts +14 -0
  967. package/sdk/dist/query/state-document.d.ts.map +1 -0
  968. package/sdk/dist/query/state-document.js +110 -0
  969. package/sdk/dist/query/state-document.js.map +1 -0
  970. package/sdk/dist/query/state-mutation.d.ts +224 -0
  971. package/sdk/dist/query/state-mutation.d.ts.map +1 -0
  972. package/sdk/dist/query/state-mutation.js +1539 -0
  973. package/sdk/dist/query/state-mutation.js.map +1 -0
  974. package/sdk/dist/query/state-project-load.d.ts +23 -0
  975. package/sdk/dist/query/state-project-load.d.ts.map +1 -0
  976. package/sdk/dist/query/state-project-load.js +75 -0
  977. package/sdk/dist/query/state-project-load.js.map +1 -0
  978. package/sdk/dist/query/state.d.ts +78 -0
  979. package/sdk/dist/query/state.d.ts.map +1 -0
  980. package/sdk/dist/query/state.js +430 -0
  981. package/sdk/dist/query/state.js.map +1 -0
  982. package/sdk/dist/query/summary.d.ts +18 -0
  983. package/sdk/dist/query/summary.d.ts.map +1 -0
  984. package/sdk/dist/query/summary.js +249 -0
  985. package/sdk/dist/query/summary.js.map +1 -0
  986. package/sdk/dist/query/task-issues.d.ts +5 -0
  987. package/sdk/dist/query/task-issues.d.ts.map +1 -0
  988. package/sdk/dist/query/task-issues.js +72 -0
  989. package/sdk/dist/query/task-issues.js.map +1 -0
  990. package/sdk/dist/query/template.d.ts +46 -0
  991. package/sdk/dist/query/template.d.ts.map +1 -0
  992. package/sdk/dist/query/template.js +210 -0
  993. package/sdk/dist/query/template.js.map +1 -0
  994. package/sdk/dist/query/uat.d.ts +34 -0
  995. package/sdk/dist/query/uat.d.ts.map +1 -0
  996. package/sdk/dist/query/uat.js +339 -0
  997. package/sdk/dist/query/uat.js.map +1 -0
  998. package/sdk/dist/query/utils.d.ts +59 -0
  999. package/sdk/dist/query/utils.d.ts.map +1 -0
  1000. package/sdk/dist/query/utils.js +74 -0
  1001. package/sdk/dist/query/utils.js.map +1 -0
  1002. package/sdk/dist/query/validate.d.ts +67 -0
  1003. package/sdk/dist/query/validate.d.ts.map +1 -0
  1004. package/sdk/dist/query/validate.js +908 -0
  1005. package/sdk/dist/query/validate.js.map +1 -0
  1006. package/sdk/dist/query/verify.d.ts +110 -0
  1007. package/sdk/dist/query/verify.d.ts.map +1 -0
  1008. package/sdk/dist/query/verify.js +647 -0
  1009. package/sdk/dist/query/verify.js.map +1 -0
  1010. package/sdk/dist/query/websearch.d.ts +24 -0
  1011. package/sdk/dist/query/websearch.d.ts.map +1 -0
  1012. package/sdk/dist/query/websearch.js +68 -0
  1013. package/sdk/dist/query/websearch.js.map +1 -0
  1014. package/sdk/dist/query/workspace.d.ts +62 -0
  1015. package/sdk/dist/query/workspace.d.ts.map +1 -0
  1016. package/sdk/dist/query/workspace.js +104 -0
  1017. package/sdk/dist/query/workspace.js.map +1 -0
  1018. package/sdk/dist/query/workstream-inventory.d.ts +24 -0
  1019. package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
  1020. package/sdk/dist/query/workstream-inventory.js +120 -0
  1021. package/sdk/dist/query/workstream-inventory.js.map +1 -0
  1022. package/sdk/dist/query/workstream.d.ts +35 -0
  1023. package/sdk/dist/query/workstream.d.ts.map +1 -0
  1024. package/sdk/dist/query/workstream.js +298 -0
  1025. package/sdk/dist/query/workstream.js.map +1 -0
  1026. package/sdk/dist/query/worktree.d.ts +3 -0
  1027. package/sdk/dist/query/worktree.d.ts.map +1 -0
  1028. package/sdk/dist/query/worktree.js +36 -0
  1029. package/sdk/dist/query/worktree.js.map +1 -0
  1030. package/sdk/dist/query-command-executor.d.ts +22 -0
  1031. package/sdk/dist/query-command-executor.d.ts.map +1 -0
  1032. package/sdk/dist/query-command-executor.js +22 -0
  1033. package/sdk/dist/query-command-executor.js.map +1 -0
  1034. package/sdk/dist/query-execution-policy.d.ts +24 -0
  1035. package/sdk/dist/query-execution-policy.d.ts.map +1 -0
  1036. package/sdk/dist/query-execution-policy.js +27 -0
  1037. package/sdk/dist/query-execution-policy.js.map +1 -0
  1038. package/sdk/dist/query-failure-classification.d.ts +9 -0
  1039. package/sdk/dist/query-failure-classification.d.ts.map +1 -0
  1040. package/sdk/dist/query-failure-classification.js +32 -0
  1041. package/sdk/dist/query-failure-classification.js.map +1 -0
  1042. package/sdk/dist/query-gtd-tools-path.d.ts +2 -0
  1043. package/sdk/dist/query-gtd-tools-path.d.ts.map +1 -0
  1044. package/sdk/dist/query-gtd-tools-path.js +2 -0
  1045. package/sdk/dist/query-gtd-tools-path.js.map +1 -0
  1046. package/sdk/dist/query-gtd-tools-runtime.d.ts +20 -0
  1047. package/sdk/dist/query-gtd-tools-runtime.d.ts.map +1 -0
  1048. package/sdk/dist/query-gtd-tools-runtime.js +47 -0
  1049. package/sdk/dist/query-gtd-tools-runtime.js.map +1 -0
  1050. package/sdk/dist/query-hotpath-methods.d.ts +19 -0
  1051. package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
  1052. package/sdk/dist/query-hotpath-methods.js +34 -0
  1053. package/sdk/dist/query-hotpath-methods.js.map +1 -0
  1054. package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
  1055. package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
  1056. package/sdk/dist/query-native-direct-adapter.js +52 -0
  1057. package/sdk/dist/query-native-direct-adapter.js.map +1 -0
  1058. package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
  1059. package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
  1060. package/sdk/dist/query-native-hotpath-adapter.js +32 -0
  1061. package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
  1062. package/sdk/dist/query-raw-output-projection.d.ts +6 -0
  1063. package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
  1064. package/sdk/dist/query-raw-output-projection.js +67 -0
  1065. package/sdk/dist/query-raw-output-projection.js.map +1 -0
  1066. package/sdk/dist/query-runtime-bridge.d.ts +61 -0
  1067. package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
  1068. package/sdk/dist/query-runtime-bridge.js +144 -0
  1069. package/sdk/dist/query-runtime-bridge.js.map +1 -0
  1070. package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
  1071. package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
  1072. package/sdk/dist/query-subprocess-adapter.js +92 -0
  1073. package/sdk/dist/query-subprocess-adapter.js.map +1 -0
  1074. package/sdk/dist/query-tools-error-factory.d.ts +16 -0
  1075. package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
  1076. package/sdk/dist/query-tools-error-factory.js +33 -0
  1077. package/sdk/dist/query-tools-error-factory.js.map +1 -0
  1078. package/sdk/dist/research-gate.d.ts +24 -0
  1079. package/sdk/dist/research-gate.d.ts.map +1 -0
  1080. package/sdk/dist/research-gate.js +70 -0
  1081. package/sdk/dist/research-gate.js.map +1 -0
  1082. package/sdk/dist/runtime-bridge-sync/index.d.ts +96 -0
  1083. package/sdk/dist/runtime-bridge-sync/index.d.ts.map +1 -0
  1084. package/sdk/dist/runtime-bridge-sync/index.js +109 -0
  1085. package/sdk/dist/runtime-bridge-sync/index.js.map +1 -0
  1086. package/sdk/dist/runtime-bridge-sync/worker.d.ts +2 -0
  1087. package/sdk/dist/runtime-bridge-sync/worker.d.ts.map +1 -0
  1088. package/sdk/dist/runtime-bridge-sync/worker.js +138 -0
  1089. package/sdk/dist/runtime-bridge-sync/worker.js.map +1 -0
  1090. package/sdk/dist/runtime-gate.d.ts +14 -0
  1091. package/sdk/dist/runtime-gate.d.ts.map +1 -0
  1092. package/sdk/dist/runtime-gate.js +48 -0
  1093. package/sdk/dist/runtime-gate.js.map +1 -0
  1094. package/sdk/dist/sdk-package-compatibility.d.ts +40 -0
  1095. package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
  1096. package/sdk/dist/sdk-package-compatibility.js +94 -0
  1097. package/sdk/dist/sdk-package-compatibility.js.map +1 -0
  1098. package/sdk/dist/session-runner.d.ts +40 -0
  1099. package/sdk/dist/session-runner.d.ts.map +1 -0
  1100. package/sdk/dist/session-runner.js +274 -0
  1101. package/sdk/dist/session-runner.js.map +1 -0
  1102. package/sdk/dist/task-issues/adapters.d.ts +94 -0
  1103. package/sdk/dist/task-issues/adapters.d.ts.map +1 -0
  1104. package/sdk/dist/task-issues/adapters.js +2 -0
  1105. package/sdk/dist/task-issues/adapters.js.map +1 -0
  1106. package/sdk/dist/task-issues/core.d.ts +16 -0
  1107. package/sdk/dist/task-issues/core.d.ts.map +1 -0
  1108. package/sdk/dist/task-issues/core.js +283 -0
  1109. package/sdk/dist/task-issues/core.js.map +1 -0
  1110. package/sdk/dist/task-issues/export-phase-issues.d.ts +326 -0
  1111. package/sdk/dist/task-issues/export-phase-issues.d.ts.map +1 -0
  1112. package/sdk/dist/task-issues/export-phase-issues.js +1675 -0
  1113. package/sdk/dist/task-issues/export-phase-issues.js.map +1 -0
  1114. package/sdk/dist/task-issues/github-api-client.d.ts +23 -0
  1115. package/sdk/dist/task-issues/github-api-client.d.ts.map +1 -0
  1116. package/sdk/dist/task-issues/github-api-client.js +66 -0
  1117. package/sdk/dist/task-issues/github-api-client.js.map +1 -0
  1118. package/sdk/dist/task-issues/github-repo.d.ts +4 -0
  1119. package/sdk/dist/task-issues/github-repo.d.ts.map +1 -0
  1120. package/sdk/dist/task-issues/github-repo.js +108 -0
  1121. package/sdk/dist/task-issues/github-repo.js.map +1 -0
  1122. package/sdk/dist/task-issues/orchestrate-tasks.d.ts +319 -0
  1123. package/sdk/dist/task-issues/orchestrate-tasks.d.ts.map +1 -0
  1124. package/sdk/dist/task-issues/orchestrate-tasks.js +2040 -0
  1125. package/sdk/dist/task-issues/orchestrate-tasks.js.map +1 -0
  1126. package/sdk/dist/task-issues/plan-scan.d.ts +13 -0
  1127. package/sdk/dist/task-issues/plan-scan.d.ts.map +1 -0
  1128. package/sdk/dist/task-issues/plan-scan.js +70 -0
  1129. package/sdk/dist/task-issues/plan-scan.js.map +1 -0
  1130. package/sdk/dist/task-issues/runtime-slash.d.ts +4 -0
  1131. package/sdk/dist/task-issues/runtime-slash.d.ts.map +1 -0
  1132. package/sdk/dist/task-issues/runtime-slash.js +40 -0
  1133. package/sdk/dist/task-issues/runtime-slash.js.map +1 -0
  1134. package/sdk/dist/task-issues/task-issue-shared.d.ts +18 -0
  1135. package/sdk/dist/task-issues/task-issue-shared.d.ts.map +1 -0
  1136. package/sdk/dist/task-issues/task-issue-shared.js +44 -0
  1137. package/sdk/dist/task-issues/task-issue-shared.js.map +1 -0
  1138. package/sdk/dist/task-issues/types.d.ts +30 -0
  1139. package/sdk/dist/task-issues/types.d.ts.map +1 -0
  1140. package/sdk/dist/task-issues/types.js +2 -0
  1141. package/sdk/dist/task-issues/types.js.map +1 -0
  1142. package/sdk/dist/task-issues/work-task-issue.d.ts +1199 -0
  1143. package/sdk/dist/task-issues/work-task-issue.d.ts.map +1 -0
  1144. package/sdk/dist/task-issues/work-task-issue.js +3255 -0
  1145. package/sdk/dist/task-issues/work-task-issue.js.map +1 -0
  1146. package/sdk/dist/task-issues/worktree-safety.d.ts +5 -0
  1147. package/sdk/dist/task-issues/worktree-safety.d.ts.map +1 -0
  1148. package/sdk/dist/task-issues/worktree-safety.js +18 -0
  1149. package/sdk/dist/task-issues/worktree-safety.js.map +1 -0
  1150. package/sdk/dist/tool-scoping.d.ts +31 -0
  1151. package/sdk/dist/tool-scoping.d.ts.map +1 -0
  1152. package/sdk/dist/tool-scoping.js +54 -0
  1153. package/sdk/dist/tool-scoping.js.map +1 -0
  1154. package/sdk/dist/types.d.ts +795 -0
  1155. package/sdk/dist/types.d.ts.map +1 -0
  1156. package/sdk/dist/types.js +77 -0
  1157. package/sdk/dist/types.js.map +1 -0
  1158. package/sdk/dist/workstream-inventory/builder.d.ts +88 -0
  1159. package/sdk/dist/workstream-inventory/builder.d.ts.map +1 -0
  1160. package/sdk/dist/workstream-inventory/builder.js +84 -0
  1161. package/sdk/dist/workstream-inventory/builder.js.map +1 -0
  1162. package/sdk/dist/workstream-name-policy.d.ts +13 -0
  1163. package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
  1164. package/sdk/dist/workstream-name-policy.js +24 -0
  1165. package/sdk/dist/workstream-name-policy.js.map +1 -0
  1166. package/sdk/dist/workstream-utils.d.ts +23 -0
  1167. package/sdk/dist/workstream-utils.d.ts.map +1 -0
  1168. package/sdk/dist/workstream-utils.js +34 -0
  1169. package/sdk/dist/workstream-utils.js.map +1 -0
  1170. package/sdk/dist/ws-transport.d.ts +32 -0
  1171. package/sdk/dist/ws-transport.d.ts.map +1 -0
  1172. package/sdk/dist/ws-transport.js +84 -0
  1173. package/sdk/dist/ws-transport.js.map +1 -0
  1174. package/sdk/package-lock.json +2530 -0
  1175. package/sdk/package.json +67 -0
  1176. package/sdk/prompts/templates/project.md +186 -0
  1177. package/sdk/prompts/templates/requirements.md +231 -0
  1178. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  1179. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  1180. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  1181. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  1182. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  1183. package/sdk/prompts/templates/roadmap.md +202 -0
  1184. package/sdk/prompts/templates/state.md +175 -0
  1185. package/sdk/shared/config-defaults.manifest.json +71 -0
  1186. package/sdk/shared/config-schema.manifest.json +139 -0
  1187. package/sdk/shared/model-catalog.json +122 -0
  1188. package/sdk/src/assembled-prompts.test.ts +349 -0
  1189. package/sdk/src/bug-3589-planning-paths-validation.test.ts +89 -0
  1190. package/sdk/src/bug-3591-gtdtools-runtime-workstream.test.ts +179 -0
  1191. package/sdk/src/cli-transport.test.ts +388 -0
  1192. package/sdk/src/cli-transport.ts +130 -0
  1193. package/sdk/src/cli.test.ts +426 -0
  1194. package/sdk/src/cli.ts +589 -0
  1195. package/sdk/src/config.test.ts +277 -0
  1196. package/sdk/src/config.ts +201 -0
  1197. package/sdk/src/configuration/index.test.ts +318 -0
  1198. package/sdk/src/configuration/index.ts +325 -0
  1199. package/sdk/src/context-engine.test.ts +295 -0
  1200. package/sdk/src/context-engine.ts +170 -0
  1201. package/sdk/src/context-truncation.test.ts +163 -0
  1202. package/sdk/src/context-truncation.ts +233 -0
  1203. package/sdk/src/e2e.integration.test.ts +181 -0
  1204. package/sdk/src/errors.ts +72 -0
  1205. package/sdk/src/event-stream.test.ts +661 -0
  1206. package/sdk/src/event-stream.ts +441 -0
  1207. package/sdk/src/golden/capture.ts +95 -0
  1208. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  1209. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  1210. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  1211. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  1212. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  1213. package/sdk/src/golden/golden-mutation-covered.ts +17 -0
  1214. package/sdk/src/golden/golden-policy.test.ts +8 -0
  1215. package/sdk/src/golden/golden-policy.ts +118 -0
  1216. package/sdk/src/golden/golden.integration.test.ts +897 -0
  1217. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  1218. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  1219. package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
  1220. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  1221. package/sdk/src/gtd-tools-error.test.ts +21 -0
  1222. package/sdk/src/gtd-tools-error.ts +65 -0
  1223. package/sdk/src/gtd-tools.test.ts +472 -0
  1224. package/sdk/src/gtd-tools.ts +285 -0
  1225. package/sdk/src/gtd-transport-policy.test.ts +34 -0
  1226. package/sdk/src/gtd-transport-policy.ts +48 -0
  1227. package/sdk/src/gtd-transport.test.ts +292 -0
  1228. package/sdk/src/gtd-transport.ts +117 -0
  1229. package/sdk/src/index.ts +371 -0
  1230. package/sdk/src/init-e2e.integration.test.ts +138 -0
  1231. package/sdk/src/init-runner.test.ts +740 -0
  1232. package/sdk/src/init-runner.ts +734 -0
  1233. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  1234. package/sdk/src/logger.test.ts +149 -0
  1235. package/sdk/src/logger.ts +113 -0
  1236. package/sdk/src/milestone-runner.test.ts +421 -0
  1237. package/sdk/src/model-catalog.ts +77 -0
  1238. package/sdk/src/phase-prompt.test.ts +536 -0
  1239. package/sdk/src/phase-prompt.ts +257 -0
  1240. package/sdk/src/phase-runner-types.test.ts +421 -0
  1241. package/sdk/src/phase-runner.integration.test.ts +377 -0
  1242. package/sdk/src/phase-runner.test.ts +2720 -0
  1243. package/sdk/src/phase-runner.ts +1442 -0
  1244. package/sdk/src/plan-atomicity.test.ts +220 -0
  1245. package/sdk/src/plan-atomicity.ts +162 -0
  1246. package/sdk/src/plan-parser.test.ts +579 -0
  1247. package/sdk/src/plan-parser.ts +433 -0
  1248. package/sdk/src/planning-journal.test.ts +70 -0
  1249. package/sdk/src/planning-journal.ts +153 -0
  1250. package/sdk/src/planning-runtime.test.ts +29 -0
  1251. package/sdk/src/planning-runtime.ts +100 -0
  1252. package/sdk/src/project-root/index.test.ts +186 -0
  1253. package/sdk/src/project-root/index.ts +144 -0
  1254. package/sdk/src/prompt-builder.test.ts +318 -0
  1255. package/sdk/src/prompt-builder.ts +218 -0
  1256. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  1257. package/sdk/src/prompt-sanitizer.ts +116 -0
  1258. package/sdk/src/query/QUERY-HANDLERS.md +346 -0
  1259. package/sdk/src/query/active-workstream-store.ts +50 -0
  1260. package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
  1261. package/sdk/src/query/agent-failure-classifier.ts +104 -0
  1262. package/sdk/src/query/audit-open.ts +722 -0
  1263. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  1264. package/sdk/src/query/check-auto-mode.ts +49 -0
  1265. package/sdk/src/query/check-completion.test.ts +113 -0
  1266. package/sdk/src/query/check-completion.ts +182 -0
  1267. package/sdk/src/query/check-decision-coverage.test.ts +519 -0
  1268. package/sdk/src/query/check-decision-coverage.ts +554 -0
  1269. package/sdk/src/query/check-gates.test.ts +103 -0
  1270. package/sdk/src/query/check-gates.ts +112 -0
  1271. package/sdk/src/query/check-verification-status.test.ts +143 -0
  1272. package/sdk/src/query/check-verification-status.ts +160 -0
  1273. package/sdk/src/query/command-aliases.generated.ts +155 -0
  1274. package/sdk/src/query/command-catalog.ts +31 -0
  1275. package/sdk/src/query/command-definition.test.ts +47 -0
  1276. package/sdk/src/query/command-definition.ts +70 -0
  1277. package/sdk/src/query/command-family-handlers.ts +116 -0
  1278. package/sdk/src/query/command-manifest.init.ts +23 -0
  1279. package/sdk/src/query/command-manifest.non-family.ts +89 -0
  1280. package/sdk/src/query/command-manifest.phase.ts +16 -0
  1281. package/sdk/src/query/command-manifest.phases.ts +11 -0
  1282. package/sdk/src/query/command-manifest.roadmap.ts +11 -0
  1283. package/sdk/src/query/command-manifest.state.ts +31 -0
  1284. package/sdk/src/query/command-manifest.ts +17 -0
  1285. package/sdk/src/query/command-manifest.types.ts +13 -0
  1286. package/sdk/src/query/command-manifest.validate.ts +11 -0
  1287. package/sdk/src/query/command-manifest.verify.ts +15 -0
  1288. package/sdk/src/query/command-resolution.test.ts +70 -0
  1289. package/sdk/src/query/command-seam-coverage.test.ts +118 -0
  1290. package/sdk/src/query/command-static-catalog-domain.ts +121 -0
  1291. package/sdk/src/query/command-static-catalog-foundation.ts +100 -0
  1292. package/sdk/src/query/command-topology.test.ts +28 -0
  1293. package/sdk/src/query/command-topology.ts +114 -0
  1294. package/sdk/src/query/commands-list.test.ts +36 -0
  1295. package/sdk/src/query/commands-list.ts +19 -0
  1296. package/sdk/src/query/commit.test.ts +485 -0
  1297. package/sdk/src/query/commit.ts +383 -0
  1298. package/sdk/src/query/config-gates.test.ts +89 -0
  1299. package/sdk/src/query/config-gates.ts +69 -0
  1300. package/sdk/src/query/config-mutation.test.ts +572 -0
  1301. package/sdk/src/query/config-mutation.ts +484 -0
  1302. package/sdk/src/query/config-query.test.ts +367 -0
  1303. package/sdk/src/query/config-query.ts +244 -0
  1304. package/sdk/src/query/config-schema.ts +35 -0
  1305. package/sdk/src/query/decisions.test.ts +215 -0
  1306. package/sdk/src/query/decisions.ts +192 -0
  1307. package/sdk/src/query/decomposed-handlers.test.ts +431 -0
  1308. package/sdk/src/query/detect-custom-files.test.ts +115 -0
  1309. package/sdk/src/query/detect-custom-files.ts +96 -0
  1310. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  1311. package/sdk/src/query/detect-phase-type.ts +141 -0
  1312. package/sdk/src/query/docs-init.ts +258 -0
  1313. package/sdk/src/query/fallow-audit.ts +88 -0
  1314. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  1315. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  1316. package/sdk/src/query/frontmatter-mutation.ts +343 -0
  1317. package/sdk/src/query/frontmatter.test.ts +326 -0
  1318. package/sdk/src/query/frontmatter.ts +395 -0
  1319. package/sdk/src/query/helpers.test.ts +615 -0
  1320. package/sdk/src/query/helpers.ts +523 -0
  1321. package/sdk/src/query/index-thin-seam.test.ts +16 -0
  1322. package/sdk/src/query/index.ts +9 -0
  1323. package/sdk/src/query/init-complex.test.ts +616 -0
  1324. package/sdk/src/query/init-complex.ts +805 -0
  1325. package/sdk/src/query/init-progress-precedence.test.ts +177 -0
  1326. package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
  1327. package/sdk/src/query/init.test.ts +645 -0
  1328. package/sdk/src/query/init.ts +1167 -0
  1329. package/sdk/src/query/intel.test.ts +90 -0
  1330. package/sdk/src/query/intel.ts +404 -0
  1331. package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
  1332. package/sdk/src/query/mutation-event-decorator.ts +37 -0
  1333. package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
  1334. package/sdk/src/query/mutation-event-mapper.ts +102 -0
  1335. package/sdk/src/query/mvp.test.ts +335 -0
  1336. package/sdk/src/query/mvp.ts +292 -0
  1337. package/sdk/src/query/normalize-query-command.test.ts +102 -0
  1338. package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
  1339. package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
  1340. package/sdk/src/query/phase-lifecycle.test.ts +1750 -0
  1341. package/sdk/src/query/phase-lifecycle.ts +1833 -0
  1342. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  1343. package/sdk/src/query/phase-list-queries.ts +152 -0
  1344. package/sdk/src/query/phase-ready.test.ts +65 -0
  1345. package/sdk/src/query/phase-ready.ts +159 -0
  1346. package/sdk/src/query/phase-roadmap-mutation.ts +77 -0
  1347. package/sdk/src/query/phase.test.ts +651 -0
  1348. package/sdk/src/query/phase.ts +550 -0
  1349. package/sdk/src/query/pipeline.test.ts +169 -0
  1350. package/sdk/src/query/pipeline.ts +243 -0
  1351. package/sdk/src/query/plan-scan.test.ts +35 -0
  1352. package/sdk/src/query/plan-scan.ts +82 -0
  1353. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  1354. package/sdk/src/query/plan-task-structure.ts +63 -0
  1355. package/sdk/src/query/policy-convergence.test.ts +28 -0
  1356. package/sdk/src/query/profile-extract-messages.ts +247 -0
  1357. package/sdk/src/query/profile-output.ts +929 -0
  1358. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  1359. package/sdk/src/query/profile-sample.ts +184 -0
  1360. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  1361. package/sdk/src/query/profile.test.ts +136 -0
  1362. package/sdk/src/query/profile.ts +337 -0
  1363. package/sdk/src/query/progress.test.ts +156 -0
  1364. package/sdk/src/query/progress.ts +566 -0
  1365. package/sdk/src/query/query-cli-adapter.test.ts +79 -0
  1366. package/sdk/src/query/query-cli-adapter.ts +39 -0
  1367. package/sdk/src/query/query-cli-output.test.ts +33 -0
  1368. package/sdk/src/query/query-cli-output.ts +63 -0
  1369. package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
  1370. package/sdk/src/query/query-command-diagnosis.ts +5 -0
  1371. package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
  1372. package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
  1373. package/sdk/src/query/query-command-semantics.test.ts +22 -0
  1374. package/sdk/src/query/query-command-semantics.ts +22 -0
  1375. package/sdk/src/query/query-dispatch-contract.ts +30 -0
  1376. package/sdk/src/query/query-dispatch-error-mapper.test.ts +62 -0
  1377. package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
  1378. package/sdk/src/query/query-dispatch-formatting.test.ts +28 -0
  1379. package/sdk/src/query/query-dispatch-formatting.ts +5 -0
  1380. package/sdk/src/query/query-dispatch-input-validation.test.ts +23 -0
  1381. package/sdk/src/query/query-dispatch-input-validation.ts +5 -0
  1382. package/sdk/src/query/query-dispatch-observability.test.ts +10 -0
  1383. package/sdk/src/query/query-dispatch-observability.ts +6 -0
  1384. package/sdk/src/query/query-dispatch-plan.test.ts +25 -0
  1385. package/sdk/src/query/query-dispatch-plan.ts +5 -0
  1386. package/sdk/src/query/query-dispatch-result-builder.test.ts +16 -0
  1387. package/sdk/src/query/query-dispatch-result-builder.ts +5 -0
  1388. package/sdk/src/query/query-dispatch.test.ts +399 -0
  1389. package/sdk/src/query/query-dispatch.ts +275 -0
  1390. package/sdk/src/query/query-error-details-schema.ts +29 -0
  1391. package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
  1392. package/sdk/src/query/query-error-taxonomy.ts +117 -0
  1393. package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
  1394. package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
  1395. package/sdk/src/query/query-fallback-executor.test.ts +82 -0
  1396. package/sdk/src/query/query-fallback-executor.ts +44 -0
  1397. package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
  1398. package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
  1399. package/sdk/src/query/query-fallback-policy.test.ts +13 -0
  1400. package/sdk/src/query/query-fallback-policy.ts +11 -0
  1401. package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
  1402. package/sdk/src/query/query-policy-capability.test.ts +10 -0
  1403. package/sdk/src/query/query-policy-capability.ts +26 -0
  1404. package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
  1405. package/sdk/src/query/query-registry-capability.test.ts +14 -0
  1406. package/sdk/src/query/query-runtime-context.ts +44 -0
  1407. package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
  1408. package/sdk/src/query/query-unknown-command-hints.ts +5 -0
  1409. package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
  1410. package/sdk/src/query/registry-assembly-invariants.ts +127 -0
  1411. package/sdk/src/query/registry-assembly.test.ts +138 -0
  1412. package/sdk/src/query/registry-assembly.ts +78 -0
  1413. package/sdk/src/query/registry.test.ts +208 -0
  1414. package/sdk/src/query/registry.ts +142 -0
  1415. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  1416. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  1417. package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
  1418. package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
  1419. package/sdk/src/query/roadmap.test.ts +1181 -0
  1420. package/sdk/src/query/roadmap.ts +894 -0
  1421. package/sdk/src/query/route-next-action.test.ts +142 -0
  1422. package/sdk/src/query/route-next-action.ts +370 -0
  1423. package/sdk/src/query/schema-detect.ts +189 -0
  1424. package/sdk/src/query/secrets.test.ts +66 -0
  1425. package/sdk/src/query/secrets.ts +43 -0
  1426. package/sdk/src/query/skill-manifest.test.ts +62 -0
  1427. package/sdk/src/query/skill-manifest.ts +216 -0
  1428. package/sdk/src/query/skills.test.ts +234 -0
  1429. package/sdk/src/query/skills.ts +143 -0
  1430. package/sdk/src/query/state-document.test.ts +197 -0
  1431. package/sdk/src/query/state-document.ts +129 -0
  1432. package/sdk/src/query/state-mutation.test.ts +1198 -0
  1433. package/sdk/src/query/state-mutation.ts +1718 -0
  1434. package/sdk/src/query/state-project-load.ts +80 -0
  1435. package/sdk/src/query/state.test.ts +616 -0
  1436. package/sdk/src/query/state.ts +463 -0
  1437. package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
  1438. package/sdk/src/query/summary.test.ts +95 -0
  1439. package/sdk/src/query/summary.ts +296 -0
  1440. package/sdk/src/query/task-issues.ts +86 -0
  1441. package/sdk/src/query/template.test.ts +180 -0
  1442. package/sdk/src/query/template.ts +242 -0
  1443. package/sdk/src/query/uat.test.ts +77 -0
  1444. package/sdk/src/query/uat.ts +365 -0
  1445. package/sdk/src/query/utils.test.ts +82 -0
  1446. package/sdk/src/query/utils.ts +106 -0
  1447. package/sdk/src/query/validate.test.ts +831 -0
  1448. package/sdk/src/query/validate.ts +952 -0
  1449. package/sdk/src/query/verify.test.ts +416 -0
  1450. package/sdk/src/query/verify.ts +711 -0
  1451. package/sdk/src/query/websearch.test.ts +31 -0
  1452. package/sdk/src/query/websearch.ts +82 -0
  1453. package/sdk/src/query/workspace.test.ts +120 -0
  1454. package/sdk/src/query/workspace.ts +145 -0
  1455. package/sdk/src/query/workstream-inventory.ts +143 -0
  1456. package/sdk/src/query/workstream.test.ts +153 -0
  1457. package/sdk/src/query/workstream.ts +324 -0
  1458. package/sdk/src/query/worktree.ts +39 -0
  1459. package/sdk/src/query-command-executor.ts +31 -0
  1460. package/sdk/src/query-execution-policy.test.ts +52 -0
  1461. package/sdk/src/query-execution-policy.ts +46 -0
  1462. package/sdk/src/query-failure-classification.test.ts +23 -0
  1463. package/sdk/src/query-failure-classification.ts +42 -0
  1464. package/sdk/src/query-gtd-tools-path.ts +1 -0
  1465. package/sdk/src/query-gtd-tools-runtime.ts +89 -0
  1466. package/sdk/src/query-hotpath-methods.ts +48 -0
  1467. package/sdk/src/query-native-direct-adapter.test.ts +35 -0
  1468. package/sdk/src/query-native-direct-adapter.ts +70 -0
  1469. package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
  1470. package/sdk/src/query-native-hotpath-adapter.ts +45 -0
  1471. package/sdk/src/query-raw-output-projection.test.ts +39 -0
  1472. package/sdk/src/query-raw-output-projection.ts +74 -0
  1473. package/sdk/src/query-runtime-bridge.test.ts +150 -0
  1474. package/sdk/src/query-runtime-bridge.ts +215 -0
  1475. package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
  1476. package/sdk/src/query-subprocess-adapter.test.ts +84 -0
  1477. package/sdk/src/query-subprocess-adapter.ts +146 -0
  1478. package/sdk/src/query-tools-error-factory.test.ts +35 -0
  1479. package/sdk/src/query-tools-error-factory.ts +76 -0
  1480. package/sdk/src/research-gate.test.ts +190 -0
  1481. package/sdk/src/research-gate.ts +94 -0
  1482. package/sdk/src/runtime-bridge-options.test.ts +33 -0
  1483. package/sdk/src/runtime-bridge-sync/index.test.ts +164 -0
  1484. package/sdk/src/runtime-bridge-sync/index.ts +154 -0
  1485. package/sdk/src/runtime-bridge-sync/projectdir-regression.test.ts +151 -0
  1486. package/sdk/src/runtime-bridge-sync/worker.ts +181 -0
  1487. package/sdk/src/runtime-gate.test.ts +84 -0
  1488. package/sdk/src/runtime-gate.ts +52 -0
  1489. package/sdk/src/sdk-package-compatibility.test.ts +100 -0
  1490. package/sdk/src/sdk-package-compatibility.ts +149 -0
  1491. package/sdk/src/session-runner.test.ts +164 -0
  1492. package/sdk/src/session-runner.ts +327 -0
  1493. package/sdk/src/task-issues/adapters.ts +86 -0
  1494. package/sdk/src/task-issues/core.ts +287 -0
  1495. package/sdk/src/task-issues/export-phase-issues.ts +1862 -0
  1496. package/sdk/src/task-issues/github-api-client.ts +107 -0
  1497. package/sdk/src/task-issues/github-repo.ts +111 -0
  1498. package/sdk/src/task-issues/orchestrate-tasks.ts +2167 -0
  1499. package/sdk/src/task-issues/plan-scan.ts +78 -0
  1500. package/sdk/src/task-issues/runtime-slash.ts +37 -0
  1501. package/sdk/src/task-issues/task-issue-shared.ts +48 -0
  1502. package/sdk/src/task-issues/types.ts +34 -0
  1503. package/sdk/src/task-issues/work-task-issue.ts +3429 -0
  1504. package/sdk/src/task-issues/worktree-safety.ts +15 -0
  1505. package/sdk/src/task-issues-sdk.test.ts +182 -0
  1506. package/sdk/src/tool-scoping.test.ts +160 -0
  1507. package/sdk/src/tool-scoping.ts +61 -0
  1508. package/sdk/src/types.ts +928 -0
  1509. package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
  1510. package/sdk/src/workstream-inventory/builder.test.ts +241 -0
  1511. package/sdk/src/workstream-inventory/builder.ts +170 -0
  1512. package/sdk/src/workstream-name-policy.ts +24 -0
  1513. package/sdk/src/workstream-utils.ts +36 -0
  1514. package/sdk/src/ws-flag.test.ts +285 -0
  1515. package/sdk/src/ws-transport.test.ts +161 -0
  1516. package/sdk/src/ws-transport.ts +93 -0
  1517. package/sdk/tsconfig.json +20 -0
@@ -0,0 +1,1750 @@
1
+ /**
2
+ * Unit tests for phase lifecycle handlers.
3
+ *
4
+ * Tests phaseAdd, phaseAddBatch, phaseInsert, phaseScaffold, replaceInCurrentMilestone,
5
+ * and readModifyWriteRoadmapMd.
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { mkdtemp, writeFile, readFile, rm, mkdir, readdir } from 'node:fs/promises';
10
+ import { join } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { existsSync } from 'node:fs';
13
+
14
+ // ─── Fixtures ─────────────────────────────────────────────────────────────
15
+
16
+ const MINIMAL_ROADMAP = `# Roadmap
17
+
18
+ ## Current Milestone: v3.0 SDK-First Migration
19
+
20
+ ### Phase 9: Foundation
21
+
22
+ **Goal:** Build foundation
23
+ **Requirements**: TBD
24
+ **Depends on:** Phase 8
25
+ **Plans:** 3 plans
26
+
27
+ Plans:
28
+ - [x] 09-01 (Foundation setup)
29
+
30
+ ### Phase 10: Read-Only Queries
31
+
32
+ **Goal:** Port queries.
33
+ **Requirements**: TBD
34
+ **Depends on:** Phase 9
35
+ **Plans:** 3 plans
36
+
37
+ Plans:
38
+ - [x] 10-01 (Query setup)
39
+
40
+ ---
41
+ *Last updated: 2026-04-08*
42
+ `;
43
+
44
+ const ROADMAP_WITH_DETAILS = `# Roadmap
45
+
46
+ <details>
47
+ <summary>v1.0 (shipped)</summary>
48
+
49
+ ### Phase 1: Old Phase
50
+
51
+ **Goal:** Shipped already
52
+ **Plans:** 2 plans
53
+
54
+ </details>
55
+
56
+ ## Current Milestone: v3.0 SDK-First Migration
57
+
58
+ ### Phase 9: Foundation
59
+
60
+ **Goal:** Build foundation
61
+ **Requirements**: TBD
62
+ **Plans:** 3 plans
63
+
64
+ ### Phase 10: Read-Only Queries
65
+
66
+ **Goal:** Port queries.
67
+ **Requirements**: TBD
68
+ **Plans:** 3 plans
69
+
70
+ ---
71
+ *Last updated: 2026-04-08*
72
+ `;
73
+
74
+ const MINIMAL_STATE = `---
75
+ gtd_state_version: 1.0
76
+ milestone: v3.0
77
+ milestone_name: SDK-First Migration
78
+ status: executing
79
+ ---
80
+
81
+ # Project State
82
+
83
+ ## Current Position
84
+
85
+ Phase: 10 (Read-Only Queries) — EXECUTING
86
+ Plan: 2 of 3
87
+ Status: Executing Phase 10
88
+
89
+ ## Session Continuity
90
+
91
+ Last session: 2026-04-07T10:00:00.000Z
92
+ Stopped at: Completed 10-02-PLAN.md
93
+ `;
94
+
95
+ /** Create a test project with .planning structure. */
96
+ async function setupTestProject(
97
+ tmpDir: string,
98
+ opts?: { roadmap?: string; state?: string; config?: Record<string, unknown>; phases?: string[] }
99
+ ): Promise<string> {
100
+ const planningDir = join(tmpDir, '.planning');
101
+ await mkdir(planningDir, { recursive: true });
102
+ const phasesDir = join(planningDir, 'phases');
103
+ await mkdir(phasesDir, { recursive: true });
104
+ await writeFile(join(planningDir, 'ROADMAP.md'), opts?.roadmap || MINIMAL_ROADMAP, 'utf-8');
105
+ await writeFile(join(planningDir, 'STATE.md'), opts?.state || MINIMAL_STATE, 'utf-8');
106
+ await writeFile(
107
+ join(planningDir, 'config.json'),
108
+ JSON.stringify(opts?.config || { model_profile: 'balanced', phase_naming: 'sequential' }),
109
+ 'utf-8'
110
+ );
111
+ // Create phase directories if requested
112
+ if (opts?.phases) {
113
+ for (const phase of opts.phases) {
114
+ await mkdir(join(phasesDir, phase), { recursive: true });
115
+ await writeFile(join(phasesDir, phase, '.gitkeep'), '', 'utf-8');
116
+ }
117
+ }
118
+ return tmpDir;
119
+ }
120
+
121
+ // ─── Tests ────────────────────────────────────────────────────────────────
122
+
123
+ let tmpDir: string;
124
+
125
+ beforeEach(async () => {
126
+ tmpDir = await mkdtemp(join(tmpdir(), 'gtd-lifecycle-'));
127
+ });
128
+
129
+ afterEach(async () => {
130
+ await rm(tmpDir, { recursive: true, force: true });
131
+ });
132
+
133
+ // ─── replaceInCurrentMilestone ──────────────────────────────────────────
134
+
135
+ describe('replaceInCurrentMilestone', () => {
136
+ it('replaces in full content when no details blocks', async () => {
137
+ const { replaceInCurrentMilestone } = await import('./phase-lifecycle.js');
138
+ const content = '### Phase 9: Foundation\n**Plans:** 3 plans\n';
139
+ const result = replaceInCurrentMilestone(content, /3 plans/, '4 plans');
140
+ expect(result).toContain('4 plans');
141
+ });
142
+
143
+ it('only replaces after last </details> block', async () => {
144
+ const { replaceInCurrentMilestone } = await import('./phase-lifecycle.js');
145
+ const content = '<details>\n### Phase 1: Old\n**Plans:** 3 plans\n</details>\n\n### Phase 9: Current\n**Plans:** 3 plans\n';
146
+ const result = replaceInCurrentMilestone(content, /3 plans/, '4 plans');
147
+ // Should only replace in the current milestone section (after </details>)
148
+ const before = result.slice(0, result.indexOf('</details>') + '</details>'.length);
149
+ const after = result.slice(result.indexOf('</details>') + '</details>'.length);
150
+ expect(before).toContain('3 plans'); // old milestone untouched
151
+ expect(after).toContain('4 plans'); // current milestone updated
152
+ });
153
+
154
+ it('replaces only in current milestone when older milestones are wrapped in <details>', async () => {
155
+ const { replaceInCurrentMilestone } = await import('./phase-lifecycle.js');
156
+ const content = [
157
+ '# Roadmap',
158
+ '',
159
+ '<details>',
160
+ '<summary>✅ v1.18 (shipped)</summary>',
161
+ '',
162
+ '### Phase 1: Old Phase',
163
+ '',
164
+ '- [ ] Phase 1: Old Phase',
165
+ '',
166
+ '</details>',
167
+ '',
168
+ '<details>',
169
+ '<summary>✅ v1.19 (shipped)</summary>',
170
+ '',
171
+ '### Phase 2: Another Old Phase',
172
+ '',
173
+ '</details>',
174
+ '',
175
+ '## Current Milestone: v1.20',
176
+ '',
177
+ '- [ ] Phase 3: Current work',
178
+ '',
179
+ '### Phase 3: Current work',
180
+ '',
181
+ '**Plans:** 0/2 plans',
182
+ '',
183
+ ].join('\n');
184
+
185
+ const pattern = /\*\*Plans:\*\* [^\n]+/;
186
+ const result = replaceInCurrentMilestone(content, pattern, '**Plans:** 2/2 plans complete');
187
+
188
+ // Should update Phase 3's Plans line (current milestone)
189
+ expect(result).toContain('**Plans:** 2/2 plans complete');
190
+ // Should NOT touch v1.18 or v1.19 sections
191
+ expect(result).toContain('✅ v1.18');
192
+ expect(result).toContain('✅ v1.19');
193
+ });
194
+
195
+ it('replaces inside active milestone when it is wrapped in a <details> block', async () => {
196
+ const { replaceInCurrentMilestone } = await import('./phase-lifecycle.js');
197
+ // Scenario: active milestone is collapsed in <details> (e.g. user collapsed it)
198
+ const content = [
199
+ '# Roadmap',
200
+ '',
201
+ '<details>',
202
+ '<summary>✅ v1.18 (shipped)</summary>',
203
+ '',
204
+ '### Phase 1: Old Phase',
205
+ '',
206
+ '**Plans:** 1/1 plans',
207
+ '',
208
+ '</details>',
209
+ '',
210
+ '<details>',
211
+ '<summary>🚧 v1.19 in-progress</summary>',
212
+ '',
213
+ '### Phase 2: Current Work',
214
+ '',
215
+ '**Plans:** 1/2 plans',
216
+ '',
217
+ '</details>',
218
+ '',
219
+ ].join('\n');
220
+
221
+ const pattern = /\*\*Plans:\*\* [^\n]+/g;
222
+ const result = replaceInCurrentMilestone(content, pattern, '**Plans:** 2/2 plans complete');
223
+
224
+ // The replacement should happen somewhere in the content (not silently dropped)
225
+ expect(result).toContain('**Plans:** 2/2 plans complete');
226
+ // v1.18 old plans line should remain untouched
227
+ expect(result).toContain('**Plans:** 1/1 plans');
228
+ });
229
+
230
+ it('replaces inside active <details> even when footer text exists after </details>', async () => {
231
+ const { replaceInCurrentMilestone } = await import('./phase-lifecycle.js');
232
+ // Scenario: active milestone is the last <details> block, but a footer
233
+ // (e.g. "---\n*Last updated*") follows it. The fast-path sees after.trim()
234
+ // non-empty and replaces in the footer instead of inside the active block.
235
+ const content = [
236
+ '# Roadmap',
237
+ '',
238
+ '<details>',
239
+ '<summary>v1.0 (Archived)</summary>',
240
+ '',
241
+ '**Plans:** 1/1 plans',
242
+ '',
243
+ '</details>',
244
+ '',
245
+ '<details>',
246
+ '<summary>v2.0 (Active)</summary>',
247
+ '',
248
+ '**Plans:** 1/2 plans',
249
+ '',
250
+ '</details>',
251
+ '',
252
+ '---',
253
+ '*Last updated: 2026-01-01*',
254
+ ].join('\n');
255
+
256
+ const pattern = /\*\*Plans:\*\* [^\n]+/g;
257
+ const result = replaceInCurrentMilestone(content, pattern, '**Plans:** 2/2 plans complete');
258
+
259
+ // Active milestone inside last <details> should be updated
260
+ expect(result).toContain('**Plans:** 2/2 plans complete');
261
+ // Archived milestone should remain untouched
262
+ expect(result).toContain('**Plans:** 1/1 plans');
263
+ // Footer should be preserved verbatim
264
+ expect(result).toContain('---');
265
+ expect(result).toContain('*Last updated: 2026-01-01*');
266
+ });
267
+ });
268
+
269
+ // ─── readModifyWriteRoadmapMd ───────────────────────────────────────────
270
+
271
+ describe('readModifyWriteRoadmapMd', () => {
272
+ it('reads, modifies, and writes ROADMAP.md atomically', async () => {
273
+ const { readModifyWriteRoadmapMd } = await import('./phase-lifecycle.js');
274
+ await setupTestProject(tmpDir);
275
+ const result = await readModifyWriteRoadmapMd(tmpDir, (content) => {
276
+ return content.replace('Port queries.', 'Port all queries.');
277
+ });
278
+ expect(result).toContain('Port all queries.');
279
+ const ondisk = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
280
+ expect(ondisk).toContain('Port all queries.');
281
+ });
282
+
283
+ it('creates and releases lockfile', async () => {
284
+ const { readModifyWriteRoadmapMd } = await import('./phase-lifecycle.js');
285
+ await setupTestProject(tmpDir);
286
+ await readModifyWriteRoadmapMd(tmpDir, (c) => c);
287
+ // Lock should be released after operation
288
+ const lockPath = join(tmpDir, '.planning', 'ROADMAP.md.lock');
289
+ expect(existsSync(lockPath)).toBe(false);
290
+ });
291
+ });
292
+
293
+ // ─── phaseAdd ──────────────────────────────────────────────────────────
294
+
295
+ describe('phaseAdd', () => {
296
+ it('creates directory and updates ROADMAP.md for sequential phase', async () => {
297
+ const { phaseAdd } = await import('./phase-lifecycle.js');
298
+ await setupTestProject(tmpDir, {
299
+ phases: ['09-foundation', '10-read-only-queries'],
300
+ });
301
+
302
+ const result = await phaseAdd(['New Feature'], tmpDir);
303
+ const data = result.data as Record<string, unknown>;
304
+
305
+ expect(data.phase_number).toBe(11);
306
+ expect(data.padded).toBe('11');
307
+ expect(data.name).toBe('New Feature');
308
+ expect(data.slug).toBe('new-feature');
309
+ expect(data.naming_mode).toBe('sequential');
310
+
311
+ // Verify directory was created
312
+ const dir = data.directory as string;
313
+ expect(dir).toContain('11-new-feature');
314
+ const phasesDir = join(tmpDir, '.planning', 'phases');
315
+ const entries = await readdir(phasesDir, { withFileTypes: true });
316
+ const newDir = entries.find(e => e.isDirectory() && e.name.includes('11-new-feature'));
317
+ expect(newDir).toBeTruthy();
318
+
319
+ // Verify .gitkeep
320
+ expect(existsSync(join(phasesDir, newDir!.name, '.gitkeep'))).toBe(true);
321
+
322
+ // Verify ROADMAP.md updated
323
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
324
+ expect(roadmap).toContain('### Phase 11: New Feature');
325
+ expect(roadmap).toContain('**Goal:** [To be planned]');
326
+ });
327
+
328
+ it('skips phases >= 999 when calculating next number (backlog exclusion)', async () => {
329
+ const { phaseAdd } = await import('./phase-lifecycle.js');
330
+ const roadmapWith999 = MINIMAL_ROADMAP.replace(
331
+ '---\n*Last updated',
332
+ '### Phase 999: Backlog\n\n**Goal:** Backlog items\n**Plans:** 0 plans\n\n---\n*Last updated'
333
+ );
334
+ await setupTestProject(tmpDir, { roadmap: roadmapWith999 });
335
+
336
+ const result = await phaseAdd(['After Ten'], tmpDir);
337
+ const data = result.data as Record<string, unknown>;
338
+ // Should be 11, not 1000
339
+ expect(data.phase_number).toBe(11);
340
+ });
341
+
342
+ it('throws GTDError with Validation for empty description', async () => {
343
+ const { phaseAdd } = await import('./phase-lifecycle.js');
344
+ await setupTestProject(tmpDir);
345
+
346
+ await expect(phaseAdd([], tmpDir)).rejects.toThrow('description required');
347
+ });
348
+
349
+ it('inserts phase entry before last --- separator', async () => {
350
+ const { phaseAdd } = await import('./phase-lifecycle.js');
351
+ await setupTestProject(tmpDir);
352
+
353
+ await phaseAdd(['Inserted Phase'], tmpDir);
354
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
355
+
356
+ // The new phase should appear before the trailing ---
357
+ const phaseIdx = roadmap.indexOf('### Phase 11: Inserted Phase');
358
+ const sepIdx = roadmap.lastIndexOf('\n---');
359
+ expect(phaseIdx).toBeLessThan(sepIdx);
360
+ expect(phaseIdx).toBeGreaterThan(0);
361
+ });
362
+
363
+ it('detects max phase from bullet checklist format (regression #2726)', async () => {
364
+ const { phaseAdd } = await import('./phase-lifecycle.js');
365
+
366
+ const roadmap = [
367
+ '# Roadmap',
368
+ '',
369
+ '## Current Milestone: v5.0',
370
+ '',
371
+ '- [x] Phase 76: Data Import',
372
+ '- [x] Phase 77: Data Transform',
373
+ '- [ ] Phase 88: Final Cleanup',
374
+ '',
375
+ ].join('\n');
376
+
377
+ await setupTestProject(tmpDir, {
378
+ roadmap,
379
+ state: MINIMAL_STATE,
380
+ phases: [],
381
+ });
382
+
383
+ const result = await phaseAdd(['new-feature'], tmpDir);
384
+ const data = result.data as Record<string, unknown>;
385
+
386
+ expect(data.phase_number).toBe(89);
387
+ expect(data.padded).toBe('89');
388
+ });
389
+
390
+ it('detects max phase from bold inline format (regression #2726)', async () => {
391
+ const { phaseAdd } = await import('./phase-lifecycle.js');
392
+
393
+ const roadmap = [
394
+ '# Roadmap',
395
+ '',
396
+ '## Current Milestone: v5.0',
397
+ '',
398
+ '**Phase 50: Core Infrastructure**',
399
+ '**Phase 51: API Layer**',
400
+ '',
401
+ ].join('\n');
402
+
403
+ await setupTestProject(tmpDir, {
404
+ roadmap,
405
+ state: MINIMAL_STATE,
406
+ phases: [],
407
+ });
408
+
409
+ const result = await phaseAdd(['new-feature'], tmpDir);
410
+ const data = result.data as Record<string, unknown>;
411
+
412
+ expect(data.phase_number).toBe(52);
413
+ });
414
+
415
+ it('falls back to filesystem scan when no phase matches in ROADMAP (regression #2726)', async () => {
416
+ const { phaseAdd } = await import('./phase-lifecycle.js');
417
+
418
+ // ROADMAP with no recognizable phase entries
419
+ const roadmap = '# Roadmap\n\n## Current Milestone: v5.0\n\nSome content without phases\n';
420
+
421
+ await setupTestProject(tmpDir, {
422
+ roadmap,
423
+ state: MINIMAL_STATE,
424
+ phases: ['45-legacy-phase', '46-another-phase'],
425
+ });
426
+
427
+ const result = await phaseAdd(['new-feature'], tmpDir);
428
+ const data = result.data as Record<string, unknown>;
429
+
430
+ // Should detect phases 45 and 46 on disk, so new phase = 47
431
+ expect(data.phase_number).toBe(47);
432
+ });
433
+
434
+ it('filesystem fallback handles project-code-prefixed phase directories (regression coderabbit)', async () => {
435
+ const { phaseAdd } = await import('./phase-lifecycle.js');
436
+
437
+ const roadmap = '# Roadmap\n\n## Current Milestone: v5.0\n\nSome content\n';
438
+
439
+ await setupTestProject(tmpDir, {
440
+ roadmap,
441
+ state: MINIMAL_STATE,
442
+ phases: [],
443
+ });
444
+
445
+ // Create prefixed directories manually (project_code = "CK" scenario)
446
+ const phasesDir = join(tmpDir, '.planning', 'phases');
447
+ await mkdir(join(phasesDir, 'CK-45-legacy-phase'), { recursive: true });
448
+ await mkdir(join(phasesDir, 'CK-46-another-phase'), { recursive: true });
449
+
450
+ const result = await phaseAdd(['new-feature'], tmpDir);
451
+ const data = result.data as Record<string, unknown>;
452
+
453
+ // Should detect CK-45 and CK-46, so new phase = 47
454
+ expect(data.phase_number).toBe(47);
455
+ });
456
+
457
+ // ── Symptom A: --dry-run flag (#3226) ─────────────────────────────────
458
+
459
+ it('--dry-run returns JSON result without creating any files or modifying ROADMAP', async () => {
460
+ const { phaseAdd } = await import('./phase-lifecycle.js');
461
+ await setupTestProject(tmpDir, {
462
+ phases: ['09-foundation', '10-read-only-queries'],
463
+ });
464
+
465
+ const roadmapBefore = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
466
+ const result = await phaseAdd(['Dry Run Phase', '--dry-run'], tmpDir);
467
+ const data = result.data as Record<string, unknown>;
468
+
469
+ // Result must include the computed fields
470
+ expect(data.phase_number).toBe(11);
471
+ expect(data.padded).toBe('11');
472
+ expect(data.name).toBe('Dry Run Phase');
473
+ expect(data.slug).toBe('dry-run-phase');
474
+ expect(data.dry_run).toBe(true);
475
+ expect(typeof data.roadmap_entry).toBe('string');
476
+ expect((data.roadmap_entry as string)).toContain('### Phase 11: Dry Run Phase');
477
+
478
+ // ROADMAP.md must be unchanged
479
+ const roadmapAfter = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
480
+ expect(roadmapAfter).toBe(roadmapBefore);
481
+
482
+ // No new phase directory must have been created
483
+ const phasesDir = join(tmpDir, '.planning', 'phases');
484
+ const entries = await readdir(phasesDir, { withFileTypes: true });
485
+ const newDir = entries.find(e => e.isDirectory() && e.name.includes('11-dry-run-phase'));
486
+ expect(newDir).toBeUndefined();
487
+ });
488
+
489
+ it('--dry-run works when flag appears after customId position', async () => {
490
+ const { phaseAdd } = await import('./phase-lifecycle.js');
491
+ await setupTestProject(tmpDir, {
492
+ phases: ['09-foundation', '10-read-only-queries'],
493
+ });
494
+
495
+ const roadmapBefore = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
496
+ // description + --dry-run — no customId; flag must not be mistaken for customId
497
+ const result = await phaseAdd(['My Feature', '--dry-run'], tmpDir);
498
+ const data = result.data as Record<string, unknown>;
499
+
500
+ expect(data.dry_run).toBe(true);
501
+ expect(data.phase_number).toBe(11);
502
+
503
+ // ROADMAP must still be untouched
504
+ const roadmapAfter = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
505
+ expect(roadmapAfter).toBe(roadmapBefore);
506
+ });
507
+
508
+ // ── Symptom C: unknown flag rejection (#3226) ──────────────────────────
509
+
510
+ it('rejects unknown --flags with a validation error naming the flag', async () => {
511
+ const { phaseAdd } = await import('./phase-lifecycle.js');
512
+ await setupTestProject(tmpDir);
513
+
514
+ await expect(phaseAdd(['My Feature', '--bogus-flag'], tmpDir)).rejects.toThrow('--bogus-flag');
515
+ });
516
+
517
+ it('rejects any unknown --flag even when mixed with dry-run', async () => {
518
+ const { phaseAdd } = await import('./phase-lifecycle.js');
519
+ await setupTestProject(tmpDir);
520
+
521
+ await expect(phaseAdd(['Desc', '--dry-run', '--unknown'], tmpDir)).rejects.toThrow('--unknown');
522
+ });
523
+
524
+ // ── Symptom B: ROADMAP heading scan counts ### Phase N: (#3226 verify) ─
525
+
526
+ it('scans ### Phase N: headings in ROADMAP when no on-disk dirs exist (B already fixed)', async () => {
527
+ const { phaseAdd } = await import('./phase-lifecycle.js');
528
+
529
+ const roadmap = [
530
+ '# Roadmap',
531
+ '',
532
+ '## Current Milestone: v5.0',
533
+ '',
534
+ '### Phase 5: Foundation',
535
+ '',
536
+ '**Goal:** Build foundation',
537
+ '**Plans:** 0 plans',
538
+ '',
539
+ ].join('\n');
540
+
541
+ await setupTestProject(tmpDir, {
542
+ roadmap,
543
+ state: MINIMAL_STATE,
544
+ phases: [], // no on-disk dirs — must rely on ROADMAP scan
545
+ });
546
+
547
+ const result = await phaseAdd(['Next Phase'], tmpDir);
548
+ const data = result.data as Record<string, unknown>;
549
+
550
+ // Must detect Phase 5 from ### heading → next = 6, not 1
551
+ expect(data.phase_number).toBe(6);
552
+ });
553
+
554
+ // ── Concurrent phase.add: no duplicate IDs (CR finding) ────────────────
555
+ it('concurrent phase.add calls produce distinct sequential phase numbers', async () => {
556
+ const { phaseAdd } = await import('./phase-lifecycle.js');
557
+ await setupTestProject(tmpDir, {
558
+ phases: ['09-foundation', '10-read-only-queries'],
559
+ });
560
+
561
+ // Fire two phase.add calls simultaneously. If computation happens outside
562
+ // the lock both will observe maxPhase=10 and claim newPhaseId=11 — collision.
563
+ const [r1, r2] = await Promise.all([
564
+ phaseAdd(['Concurrent Alpha'], tmpDir),
565
+ phaseAdd(['Concurrent Beta'], tmpDir),
566
+ ]);
567
+
568
+ const n1 = (r1.data as Record<string, unknown>).phase_number as number;
569
+ const n2 = (r2.data as Record<string, unknown>).phase_number as number;
570
+
571
+ // Both must succeed and produce DIFFERENT numbers
572
+ expect(n1).not.toBe(n2);
573
+
574
+ // The pair must be {11, 12} — no gaps, no duplicates
575
+ const sorted = [n1, n2].sort((a, b) => a - b);
576
+ expect(sorted).toEqual([11, 12]);
577
+
578
+ // ROADMAP.md must contain exactly one entry for each phase
579
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
580
+ const phase11Count = (roadmap.match(/### Phase 11:/g) || []).length;
581
+ const phase12Count = (roadmap.match(/### Phase 12:/g) || []).length;
582
+ expect(phase11Count).toBe(1);
583
+ expect(phase12Count).toBe(1);
584
+
585
+ // Both phase directories must exist on disk
586
+ const phasesDir = join(tmpDir, '.planning', 'phases');
587
+ const entries = await readdir(phasesDir, { withFileTypes: true });
588
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
589
+ const has11 = dirs.some(d => d.startsWith('11-'));
590
+ const has12 = dirs.some(d => d.startsWith('12-'));
591
+ expect(has11).toBe(true);
592
+ expect(has12).toBe(true);
593
+ });
594
+ });
595
+
596
+ // ─── phaseAddBatch ─────────────────────────────────────────────────────
597
+
598
+ describe('phaseAddBatch', () => {
599
+ it('adds multiple sequential phases in one pass', async () => {
600
+ const { phaseAddBatch } = await import('./phase-lifecycle.js');
601
+ await setupTestProject(tmpDir, {
602
+ phases: ['09-foundation', '10-read-only-queries'],
603
+ });
604
+
605
+ const result = await phaseAddBatch(['Alpha', 'Beta'], tmpDir);
606
+ const data = result.data as { phases: Array<Record<string, unknown>>; count: number };
607
+
608
+ expect(data.count).toBe(2);
609
+ expect(data.phases[0].phase_number).toBe(11);
610
+ expect(data.phases[0].name).toBe('Alpha');
611
+ expect(data.phases[1].phase_number).toBe(12);
612
+ expect(data.phases[1].name).toBe('Beta');
613
+
614
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
615
+ expect(roadmap).toContain('### Phase 11: Alpha');
616
+ expect(roadmap).toContain('### Phase 12: Beta');
617
+
618
+ const phasesDir = join(tmpDir, '.planning', 'phases');
619
+ expect(existsSync(join(phasesDir, '11-alpha', '.gitkeep'))).toBe(true);
620
+ expect(existsSync(join(phasesDir, '12-beta', '.gitkeep'))).toBe(true);
621
+ });
622
+
623
+ it('accepts --descriptions JSON array', async () => {
624
+ const { phaseAddBatch } = await import('./phase-lifecycle.js');
625
+ await setupTestProject(tmpDir, { phases: ['09-foundation', '10-read-only-queries'] });
626
+
627
+ const result = await phaseAddBatch(
628
+ ['--descriptions', JSON.stringify(['One', 'Two'])],
629
+ tmpDir,
630
+ );
631
+ const data = result.data as { count: number };
632
+ expect(data.count).toBe(2);
633
+ });
634
+
635
+ it('throws when no descriptions', async () => {
636
+ const { phaseAddBatch } = await import('./phase-lifecycle.js');
637
+ await setupTestProject(tmpDir);
638
+
639
+ await expect(phaseAddBatch([], tmpDir)).rejects.toThrow('descriptions array required');
640
+ });
641
+ });
642
+
643
+ // ─── phaseInsert ────────────────────────────────────────────────────────
644
+
645
+ describe('phaseInsert', () => {
646
+ it('creates decimal phase directory after target phase', async () => {
647
+ const { phaseInsert } = await import('./phase-lifecycle.js');
648
+ await setupTestProject(tmpDir, {
649
+ phases: ['09-foundation', '10-read-only-queries'],
650
+ });
651
+
652
+ const result = await phaseInsert(['10', 'Urgent Fix'], tmpDir);
653
+ const data = result.data as Record<string, unknown>;
654
+
655
+ expect(data.phase_number).toBe('10.1');
656
+ expect(data.after_phase).toBe('10');
657
+ expect(data.name).toBe('Urgent Fix');
658
+ expect(data.slug).toBe('urgent-fix');
659
+
660
+ // Verify directory created
661
+ const dir = data.directory as string;
662
+ expect(dir).toContain('10.1-urgent-fix');
663
+ const phasesDir = join(tmpDir, '.planning', 'phases');
664
+ const entries = await readdir(phasesDir, { withFileTypes: true });
665
+ const newDir = entries.find(e => e.isDirectory() && e.name.includes('10.1-urgent-fix'));
666
+ expect(newDir).toBeTruthy();
667
+ });
668
+
669
+ it('scans both directories and ROADMAP.md for existing decimals to avoid collisions', async () => {
670
+ const { phaseInsert } = await import('./phase-lifecycle.js');
671
+ await setupTestProject(tmpDir, {
672
+ phases: ['09-foundation', '10-read-only-queries', '10.1-hotfix'],
673
+ });
674
+
675
+ const result = await phaseInsert(['10', 'Another Fix'], tmpDir);
676
+ const data = result.data as Record<string, unknown>;
677
+ // Should be 10.2 since 10.1 already exists on disk
678
+ expect(data.phase_number).toBe('10.2');
679
+ });
680
+
681
+ it('inserts section in ROADMAP.md after target phase', async () => {
682
+ const { phaseInsert } = await import('./phase-lifecycle.js');
683
+ await setupTestProject(tmpDir);
684
+
685
+ await phaseInsert(['10', 'Urgent Fix'], tmpDir);
686
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
687
+
688
+ expect(roadmap).toContain('### Phase 10.1: Urgent Fix (INSERTED)');
689
+ // Should appear after Phase 10 section
690
+ const phase10Idx = roadmap.indexOf('### Phase 10:');
691
+ const insertedIdx = roadmap.indexOf('### Phase 10.1:');
692
+ expect(insertedIdx).toBeGreaterThan(phase10Idx);
693
+ });
694
+
695
+ it('throws GTDError for missing target phase', async () => {
696
+ const { phaseInsert } = await import('./phase-lifecycle.js');
697
+ await setupTestProject(tmpDir);
698
+
699
+ await expect(phaseInsert(['99', 'Missing'], tmpDir)).rejects.toThrow('Phase 99 not found');
700
+ });
701
+
702
+ it('throws GTDError with Validation for missing args', async () => {
703
+ const { phaseInsert } = await import('./phase-lifecycle.js');
704
+ await setupTestProject(tmpDir);
705
+
706
+ await expect(phaseInsert([], tmpDir)).rejects.toThrow('after-phase and description required');
707
+ });
708
+ });
709
+
710
+ // ─── phaseScaffold ──────────────────────────────────────────────────────
711
+
712
+ describe('phaseScaffold', () => {
713
+ it('creates context template for a phase', async () => {
714
+ const { phaseScaffold } = await import('./phase-lifecycle.js');
715
+ await setupTestProject(tmpDir, {
716
+ phases: ['09-foundation'],
717
+ });
718
+
719
+ const result = await phaseScaffold(['context', '9'], tmpDir);
720
+ const data = result.data as Record<string, unknown>;
721
+
722
+ expect(data.created).toBe(true);
723
+ const filePath = data.path as string;
724
+ expect(filePath).toContain('09-CONTEXT.md');
725
+
726
+ // Check content
727
+ const fullPath = join(tmpDir, '.planning', 'phases', '09-foundation', '09-CONTEXT.md');
728
+ expect(existsSync(fullPath)).toBe(true);
729
+ const content = await readFile(fullPath, 'utf-8');
730
+ expect(content).toContain('phase: "09"');
731
+ expect(content).toContain('Context');
732
+ });
733
+
734
+ it('creates uat template', async () => {
735
+ const { phaseScaffold } = await import('./phase-lifecycle.js');
736
+ await setupTestProject(tmpDir, {
737
+ phases: ['09-foundation'],
738
+ });
739
+
740
+ const result = await phaseScaffold(['uat', '9'], tmpDir);
741
+ const data = result.data as Record<string, unknown>;
742
+
743
+ expect(data.created).toBe(true);
744
+ const fullPath = join(tmpDir, '.planning', 'phases', '09-foundation', '09-UAT.md');
745
+ expect(existsSync(fullPath)).toBe(true);
746
+ const content = await readFile(fullPath, 'utf-8');
747
+ expect(content).toContain('User Acceptance Testing');
748
+ });
749
+
750
+ it('creates verification template', async () => {
751
+ const { phaseScaffold } = await import('./phase-lifecycle.js');
752
+ await setupTestProject(tmpDir, {
753
+ phases: ['09-foundation'],
754
+ });
755
+
756
+ const result = await phaseScaffold(['verification', '9'], tmpDir);
757
+ const data = result.data as Record<string, unknown>;
758
+
759
+ expect(data.created).toBe(true);
760
+ const fullPath = join(tmpDir, '.planning', 'phases', '09-foundation', '09-VERIFICATION.md');
761
+ expect(existsSync(fullPath)).toBe(true);
762
+ const content = await readFile(fullPath, 'utf-8');
763
+ expect(content).toContain('Verification');
764
+ });
765
+
766
+ it('creates phase-dir under phases/', async () => {
767
+ const { phaseScaffold } = await import('./phase-lifecycle.js');
768
+ await setupTestProject(tmpDir);
769
+
770
+ const result = await phaseScaffold(['phase-dir', '15', 'New Module'], tmpDir);
771
+ const data = result.data as Record<string, unknown>;
772
+
773
+ expect(data.created).toBe(true);
774
+ const dir = data.directory as string;
775
+ expect(dir).toContain('15-new-module');
776
+ });
777
+
778
+ it('returns already_exists for existing file', async () => {
779
+ const { phaseScaffold } = await import('./phase-lifecycle.js');
780
+ await setupTestProject(tmpDir, {
781
+ phases: ['09-foundation'],
782
+ });
783
+
784
+ // Create first
785
+ await phaseScaffold(['context', '9'], tmpDir);
786
+ // Second call should return already_exists
787
+ const result = await phaseScaffold(['context', '9'], tmpDir);
788
+ const data = result.data as Record<string, unknown>;
789
+ expect(data.created).toBe(false);
790
+ expect(data.reason).toBe('already_exists');
791
+ });
792
+
793
+ it('throws GTDError for unknown type', async () => {
794
+ const { phaseScaffold } = await import('./phase-lifecycle.js');
795
+ await setupTestProject(tmpDir, {
796
+ phases: ['09-foundation'],
797
+ });
798
+
799
+ await expect(phaseScaffold(['badtype', '9'], tmpDir)).rejects.toThrow('Unknown scaffold type');
800
+ });
801
+ });
802
+
803
+ // ─── phaseRemove ─────────────────────────────────────────────────────────
804
+
805
+ const ROADMAP_FOR_REMOVE = `# Roadmap
806
+
807
+ ## Current Milestone: v3.0 SDK-First Migration
808
+
809
+ ### Phase 5: Auth
810
+
811
+ **Goal:** Build authentication
812
+ **Requirements**: TBD
813
+ **Depends on:** Phase 4
814
+ **Plans:** 2 plans
815
+
816
+ Plans:
817
+ - [x] 05-01 (Auth setup)
818
+ - [x] 05-02 (Auth complete)
819
+
820
+ ### Phase 6: Dashboard
821
+
822
+ **Goal:** Build dashboard
823
+ **Requirements**: TBD
824
+ **Depends on:** Phase 5
825
+ **Plans:** 3 plans
826
+
827
+ Plans:
828
+ - [ ] 06-01 (Dashboard setup)
829
+
830
+ ### Phase 7: API
831
+
832
+ **Goal:** Build API layer
833
+ **Requirements**: TBD
834
+ **Depends on:** Phase 6
835
+ **Plans:** 2 plans
836
+
837
+ Plans:
838
+ - [ ] 07-01 (API setup)
839
+
840
+ ---
841
+ *Last updated: 2026-04-08*
842
+ `;
843
+
844
+ const STATE_FOR_REMOVE = `---
845
+ gtd_state_version: 1.0
846
+ milestone: v3.0
847
+ milestone_name: SDK-First Migration
848
+ status: executing
849
+ progress:
850
+ total_phases: 7
851
+ completed_phases: 4
852
+ total_plans: 15
853
+ completed_plans: 12
854
+ percent: 80
855
+ ---
856
+
857
+ # Project State
858
+
859
+ ## Current Position
860
+
861
+ Phase: 6 (Dashboard) — EXECUTING
862
+ Plan: 1 of 3
863
+ Status: Executing Phase 6
864
+
865
+ ## Session Continuity
866
+
867
+ Last session: 2026-04-08T10:00:00.000Z
868
+ Stopped at: Started
869
+ `;
870
+
871
+ describe('phaseRemove', () => {
872
+ it('removes integer phase directory and renumbers subsequent phases', async () => {
873
+ const { phaseRemove } = await import('./phase-lifecycle.js');
874
+ const phasesDir = join(tmpDir, '.planning', 'phases');
875
+ await setupTestProject(tmpDir, {
876
+ roadmap: ROADMAP_FOR_REMOVE,
877
+ state: STATE_FOR_REMOVE,
878
+ phases: ['05-auth', '06-dashboard', '07-api'],
879
+ });
880
+ // Create files inside directories to verify file renaming
881
+ await writeFile(join(phasesDir, '06-dashboard', '06-01-PLAN.md'), 'plan', 'utf-8');
882
+ await writeFile(join(phasesDir, '07-api', '07-01-PLAN.md'), 'plan', 'utf-8');
883
+
884
+ const result = await phaseRemove(['6'], tmpDir);
885
+ const data = result.data as Record<string, unknown>;
886
+
887
+ expect(data.removed).toBe('6');
888
+ expect(data.directory_deleted).toBeTruthy();
889
+ expect(data.roadmap_updated).toBe(true);
890
+ expect(data.state_updated).toBe(true);
891
+
892
+ // Phase 6 dir should be gone
893
+ const entries = await readdir(phasesDir, { withFileTypes: true });
894
+ const dirNames = entries.filter(e => e.isDirectory()).map(e => e.name);
895
+ expect(dirNames.find(d => d.includes('06-dashboard'))).toBeUndefined();
896
+
897
+ // Phase 7 should have been renamed to 06
898
+ const renamedDir = dirNames.find(d => d.includes('06-api'));
899
+ expect(renamedDir).toBeTruthy();
900
+
901
+ // Files inside renamed dir should also be renamed
902
+ const files = await readdir(join(phasesDir, renamedDir!));
903
+ expect(files.some(f => f.includes('06-01'))).toBe(true);
904
+ expect(files.some(f => f.includes('07-01'))).toBe(false);
905
+ });
906
+
907
+ it('removes decimal phase and renumbers sibling decimals', async () => {
908
+ const { phaseRemove } = await import('./phase-lifecycle.js');
909
+ const decimalRoadmap = ROADMAP_FOR_REMOVE.replace(
910
+ '### Phase 7: API',
911
+ '### Phase 6.1: Hotfix A\n\n**Goal:** Fix A\n**Plans:** 1 plans\n\n### Phase 6.2: Hotfix B\n\n**Goal:** Fix B\n**Plans:** 1 plans\n\n### Phase 6.3: Hotfix C\n\n**Goal:** Fix C\n**Plans:** 1 plans\n\n### Phase 7: API'
912
+ );
913
+ const phasesDir = join(tmpDir, '.planning', 'phases');
914
+ await setupTestProject(tmpDir, {
915
+ roadmap: decimalRoadmap,
916
+ state: STATE_FOR_REMOVE,
917
+ phases: ['05-auth', '06-dashboard', '06.1-hotfix-a', '06.2-hotfix-b', '06.3-hotfix-c', '07-api'],
918
+ });
919
+ // Create files with phase ID in name
920
+ await writeFile(join(phasesDir, '06.2-hotfix-b', '06.2-01-PLAN.md'), 'plan', 'utf-8');
921
+ await writeFile(join(phasesDir, '06.3-hotfix-c', '06.3-01-PLAN.md'), 'plan', 'utf-8');
922
+
923
+ const result = await phaseRemove(['6.1'], tmpDir);
924
+ const data = result.data as Record<string, unknown>;
925
+
926
+ expect(data.removed).toBe('6.1');
927
+
928
+ // 06.1 should be gone
929
+ const entries = await readdir(phasesDir, { withFileTypes: true });
930
+ const dirNames = entries.filter(e => e.isDirectory()).map(e => e.name);
931
+ expect(dirNames.find(d => d.includes('06.1-hotfix-a'))).toBeUndefined();
932
+
933
+ // 06.2 should become 06.1, 06.3 should become 06.2
934
+ expect(dirNames.find(d => d.includes('06.1-hotfix-b'))).toBeTruthy();
935
+ expect(dirNames.find(d => d.includes('06.2-hotfix-c'))).toBeTruthy();
936
+ expect(dirNames.find(d => d.includes('06.3'))).toBeUndefined();
937
+
938
+ // Files inside renamed dirs should be renamed
939
+ const dir1Files = await readdir(join(phasesDir, '06.1-hotfix-b'));
940
+ expect(dir1Files.some(f => f.includes('06.1-01'))).toBe(true);
941
+ const dir2Files = await readdir(join(phasesDir, '06.2-hotfix-c'));
942
+ expect(dir2Files.some(f => f.includes('06.2-01'))).toBe(true);
943
+ });
944
+
945
+ it('requires --force to remove phase with SUMMARY files', async () => {
946
+ const { phaseRemove } = await import('./phase-lifecycle.js');
947
+ const phasesDir = join(tmpDir, '.planning', 'phases');
948
+ await setupTestProject(tmpDir, {
949
+ roadmap: ROADMAP_FOR_REMOVE,
950
+ state: STATE_FOR_REMOVE,
951
+ phases: ['05-auth', '06-dashboard', '07-api'],
952
+ });
953
+ // Create a SUMMARY file to simulate executed work
954
+ await writeFile(join(phasesDir, '06-dashboard', '06-01-SUMMARY.md'), 'summary', 'utf-8');
955
+
956
+ await expect(phaseRemove(['6'], tmpDir)).rejects.toThrow('--force');
957
+ });
958
+
959
+ it('allows removal with --force even when SUMMARY files exist', async () => {
960
+ const { phaseRemove } = await import('./phase-lifecycle.js');
961
+ const phasesDir = join(tmpDir, '.planning', 'phases');
962
+ await setupTestProject(tmpDir, {
963
+ roadmap: ROADMAP_FOR_REMOVE,
964
+ state: STATE_FOR_REMOVE,
965
+ phases: ['05-auth', '06-dashboard', '07-api'],
966
+ });
967
+ await writeFile(join(phasesDir, '06-dashboard', '06-01-SUMMARY.md'), 'summary', 'utf-8');
968
+
969
+ const result = await phaseRemove(['6', '--force'], tmpDir);
970
+ const data = result.data as Record<string, unknown>;
971
+ expect(data.removed).toBe('6');
972
+ expect(data.directory_deleted).toBeTruthy();
973
+ });
974
+
975
+ it('bug-3409: accepts --force before phase id', async () => {
976
+ const { phaseRemove } = await import('./phase-lifecycle.js');
977
+ const phasesDir = join(tmpDir, '.planning', 'phases');
978
+ await setupTestProject(tmpDir, {
979
+ roadmap: ROADMAP_FOR_REMOVE,
980
+ state: STATE_FOR_REMOVE,
981
+ phases: ['05-auth', '06-dashboard', '07-api'],
982
+ });
983
+ await writeFile(join(phasesDir, '06-dashboard', '06-01-SUMMARY.md'), 'summary', 'utf-8');
984
+
985
+ const result = await phaseRemove(['--force', '6'], tmpDir);
986
+ const data = result.data as Record<string, unknown>;
987
+ expect(data.removed).toBe('6');
988
+ expect(data.directory_deleted).toBeTruthy();
989
+ });
990
+
991
+ it('throws GTDError when ROADMAP.md is missing', async () => {
992
+ const { phaseRemove } = await import('./phase-lifecycle.js');
993
+ // Set up without ROADMAP.md
994
+ const planningDir = join(tmpDir, '.planning');
995
+ await mkdir(planningDir, { recursive: true });
996
+ const phasesDir = join(planningDir, 'phases');
997
+ await mkdir(phasesDir, { recursive: true });
998
+ await writeFile(join(planningDir, 'STATE.md'), STATE_FOR_REMOVE, 'utf-8');
999
+
1000
+ await expect(phaseRemove(['6'], tmpDir)).rejects.toThrow('ROADMAP.md not found');
1001
+ });
1002
+
1003
+ it('throws GTDError when phase number is missing', async () => {
1004
+ const { phaseRemove } = await import('./phase-lifecycle.js');
1005
+ await setupTestProject(tmpDir, {
1006
+ roadmap: ROADMAP_FOR_REMOVE,
1007
+ state: STATE_FOR_REMOVE,
1008
+ });
1009
+
1010
+ await expect(phaseRemove([], tmpDir)).rejects.toThrow('phase number required');
1011
+ });
1012
+
1013
+ it('throws GTDError when target phase does not exist and does not mutate STATE.md', async () => {
1014
+ const { phaseRemove } = await import('./phase-lifecycle.js');
1015
+ await setupTestProject(tmpDir, {
1016
+ roadmap: ROADMAP_FOR_REMOVE,
1017
+ state: STATE_FOR_REMOVE,
1018
+ phases: ['05-auth', '06-dashboard', '07-api'],
1019
+ });
1020
+
1021
+ await expect(phaseRemove(['99'], tmpDir)).rejects.toThrow('Phase 99 not found');
1022
+ const stateContent = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
1023
+ expect(stateContent).toMatch(/total_phases:\s*7/);
1024
+ });
1025
+
1026
+ it('updates ROADMAP.md by removing phase section and renumbering', async () => {
1027
+ const { phaseRemove } = await import('./phase-lifecycle.js');
1028
+ await setupTestProject(tmpDir, {
1029
+ roadmap: ROADMAP_FOR_REMOVE,
1030
+ state: STATE_FOR_REMOVE,
1031
+ phases: ['05-auth', '06-dashboard', '07-api'],
1032
+ });
1033
+
1034
+ await phaseRemove(['6'], tmpDir);
1035
+
1036
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
1037
+ // Phase 6 section should be removed
1038
+ expect(roadmap).not.toContain('### Phase 6: Dashboard');
1039
+ // Phase 7 should be renumbered to 6
1040
+ expect(roadmap).toContain('### Phase 6: API');
1041
+ // Plan references should be renumbered
1042
+ expect(roadmap).toContain('06-01');
1043
+ expect(roadmap).not.toContain('07-01');
1044
+ });
1045
+
1046
+ it('decrements total_phases in STATE.md frontmatter', async () => {
1047
+ const { phaseRemove } = await import('./phase-lifecycle.js');
1048
+ await setupTestProject(tmpDir, {
1049
+ roadmap: ROADMAP_FOR_REMOVE,
1050
+ state: STATE_FOR_REMOVE,
1051
+ phases: ['05-auth', '06-dashboard', '07-api'],
1052
+ });
1053
+
1054
+ await phaseRemove(['6'], tmpDir);
1055
+
1056
+ const stateContent = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
1057
+ // total_phases should be decremented from 7 to 6
1058
+ expect(stateContent).toMatch(/total_phases:\s*6/);
1059
+ });
1060
+ });
1061
+
1062
+ // ─── phaseComplete ─────────────────────────────────────────────────────────
1063
+
1064
+ const ROADMAP_FOR_COMPLETE = `# Roadmap
1065
+
1066
+ <details>
1067
+ <summary>v1.0 (shipped)</summary>
1068
+
1069
+ ### Phase 1: Old Phase
1070
+
1071
+ **Goal:** Shipped already
1072
+ **Plans:** 2 plans
1073
+
1074
+ </details>
1075
+
1076
+ ## Current Milestone: v3.0 SDK-First Migration
1077
+
1078
+ | Phase | Plans | Status | Completed |
1079
+ |-------|-------|--------|-----------|
1080
+ | 9. | 3/3 | Complete | 2026-04-01 |
1081
+ | 10. | 0/3 | In Progress | |
1082
+ | 11. | 0/2 | Not Started | |
1083
+
1084
+ - [x] Phase 9: Foundation (completed 2026-04-01)
1085
+ - [ ] Phase 10: Read-Only Queries
1086
+ - [ ] Phase 11: Final Phase
1087
+
1088
+ ### Phase 9: Foundation
1089
+
1090
+ **Goal:** Build foundation
1091
+ **Requirements**: FOUND-01, FOUND-02
1092
+ **Depends on:** Phase 8
1093
+ **Plans:** 3/3 plans complete
1094
+
1095
+ Plans:
1096
+ - [x] 09-01 (Foundation setup)
1097
+ - [x] 09-02 (Foundation core)
1098
+ - [x] 09-03 (Foundation tests)
1099
+
1100
+ ### Phase 10: Read-Only Queries
1101
+
1102
+ **Goal:** Port queries
1103
+ **Requirements**: QUERY-01
1104
+ **Depends on:** Phase 9
1105
+ **Plans:** 3 plans
1106
+
1107
+ Plans:
1108
+ - [x] 10-01 (Query setup)
1109
+ - [x] 10-02 (Query core)
1110
+ - [ ] 10-03 (Query tests)
1111
+
1112
+ ### Phase 11: Final Phase
1113
+
1114
+ **Goal:** Final work
1115
+ **Requirements**: FINAL-01
1116
+ **Depends on:** Phase 10
1117
+ **Plans:** 2 plans
1118
+
1119
+ Plans:
1120
+ - [ ] 11-01 (Final setup)
1121
+ - [ ] 11-02 (Final complete)
1122
+
1123
+ ---
1124
+ *Last updated: 2026-04-08*
1125
+ `;
1126
+
1127
+ const STATE_FOR_COMPLETE = `---
1128
+ gtd_state_version: 1.0
1129
+ milestone: v3.0
1130
+ milestone_name: SDK-First Migration
1131
+ status: executing
1132
+ progress:
1133
+ total_phases: 3
1134
+ completed_phases: 1
1135
+ total_plans: 8
1136
+ completed_plans: 5
1137
+ percent: 33
1138
+ ---
1139
+
1140
+ # Project State
1141
+
1142
+ ## Current Position
1143
+
1144
+ Phase: 10 of 3 (Read-Only Queries) — EXECUTING
1145
+ Plan: 3 of 3
1146
+ Status: Executing Phase 10
1147
+ Last activity: 2026-04-08
1148
+
1149
+ ## Performance Metrics
1150
+
1151
+ **Velocity:**
1152
+
1153
+ - Total plans completed: 3
1154
+ - Average duration: --
1155
+ - Total execution time: 0 hours
1156
+
1157
+ **By Phase:**
1158
+
1159
+ | Phase | Plans | Total | Avg/Plan |
1160
+ |-------|-------|-------|----------|
1161
+ | 9 | 3 | - | - |
1162
+
1163
+ ## Session Continuity
1164
+
1165
+ Last session: 2026-04-08T10:00:00.000Z
1166
+ Stopped at: Completed 10-03-PLAN.md
1167
+ `;
1168
+
1169
+ const REQUIREMENTS_FOR_COMPLETE = `# Requirements
1170
+
1171
+ ## Checklist
1172
+
1173
+ - [x] **FOUND-01** Foundation setup
1174
+ - [x] **FOUND-02** Foundation core
1175
+ - [ ] **QUERY-01** Query implementation
1176
+ - [ ] **FINAL-01** Final work
1177
+
1178
+ ## Traceability
1179
+
1180
+ | Requirement | Phase | Status |
1181
+ |-------------|-------|--------|
1182
+ | FOUND-01 | Phase 9 | Complete |
1183
+ | FOUND-02 | Phase 9 | Complete |
1184
+ | QUERY-01 | Phase 10 | In Progress |
1185
+ | FINAL-01 | Phase 11 | Pending |
1186
+ `;
1187
+
1188
+ describe('phaseComplete', () => {
1189
+ it('marks phase checkbox, updates progress table, and plan count in ROADMAP.md', async () => {
1190
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1191
+ await setupTestProject(tmpDir, {
1192
+ roadmap: ROADMAP_FOR_COMPLETE,
1193
+ state: STATE_FOR_COMPLETE,
1194
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1195
+ });
1196
+ // Create PLAN and SUMMARY files for phase 10
1197
+ const p10Dir = join(tmpDir, '.planning', 'phases', '10-read-only-queries');
1198
+ await writeFile(join(p10Dir, '10-01-PLAN.md'), 'plan1', 'utf-8');
1199
+ await writeFile(join(p10Dir, '10-02-PLAN.md'), 'plan2', 'utf-8');
1200
+ await writeFile(join(p10Dir, '10-03-PLAN.md'), 'plan3', 'utf-8');
1201
+ await writeFile(join(p10Dir, '10-01-SUMMARY.md'), 'summary1', 'utf-8');
1202
+ await writeFile(join(p10Dir, '10-02-SUMMARY.md'), 'summary2', 'utf-8');
1203
+ await writeFile(join(p10Dir, '10-03-SUMMARY.md'), 'summary3', 'utf-8');
1204
+ // Create REQUIREMENTS.md
1205
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1206
+
1207
+ const result = await phaseComplete(['10'], tmpDir);
1208
+ const data = result.data as Record<string, unknown>;
1209
+
1210
+ expect(data.completed_phase).toBe('10');
1211
+ expect(data.plans_executed).toBe('3/3');
1212
+ expect(data.is_last_phase).toBe(false);
1213
+ expect(data.next_phase).toBeTruthy();
1214
+ expect(data.roadmap_updated).toBe(true);
1215
+
1216
+ // Check ROADMAP.md updates
1217
+ const roadmap = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
1218
+ // Checkbox should be marked
1219
+ expect(roadmap).toMatch(/\[x\].*Phase 10/);
1220
+ // Progress table should show Complete
1221
+ expect(roadmap).toMatch(/10\.?\s*\|.*3\/3.*\|.*Complete/i);
1222
+ // Plan count in section should be updated
1223
+ expect(roadmap).toContain('3/3 plans complete');
1224
+ // Plan checkboxes should be [x]
1225
+ expect(roadmap).toMatch(/\[x\] 10-01/);
1226
+ expect(roadmap).toMatch(/\[x\] 10-02/);
1227
+ expect(roadmap).toMatch(/\[x\] 10-03/);
1228
+ });
1229
+
1230
+ it('updates REQUIREMENTS.md checkboxes and traceability table', async () => {
1231
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1232
+ await setupTestProject(tmpDir, {
1233
+ roadmap: ROADMAP_FOR_COMPLETE,
1234
+ state: STATE_FOR_COMPLETE,
1235
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1236
+ });
1237
+ const p10Dir = join(tmpDir, '.planning', 'phases', '10-read-only-queries');
1238
+ await writeFile(join(p10Dir, '10-01-PLAN.md'), 'plan1', 'utf-8');
1239
+ await writeFile(join(p10Dir, '10-02-PLAN.md'), 'plan2', 'utf-8');
1240
+ await writeFile(join(p10Dir, '10-03-PLAN.md'), 'plan3', 'utf-8');
1241
+ await writeFile(join(p10Dir, '10-01-SUMMARY.md'), 'summary1', 'utf-8');
1242
+ await writeFile(join(p10Dir, '10-02-SUMMARY.md'), 'summary2', 'utf-8');
1243
+ await writeFile(join(p10Dir, '10-03-SUMMARY.md'), 'summary3', 'utf-8');
1244
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1245
+
1246
+ await phaseComplete(['10'], tmpDir);
1247
+
1248
+ const req = await readFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), 'utf-8');
1249
+ // QUERY-01 checkbox should be marked
1250
+ expect(req).toMatch(/\[x\].*\*\*QUERY-01\*\*/);
1251
+ // Traceability should show Complete for QUERY-01
1252
+ expect(req).toMatch(/QUERY-01\s*\|.*\|\s*Complete\s*\|/);
1253
+ // FINAL-01 should remain Pending
1254
+ expect(req).toMatch(/FINAL-01\s*\|.*\|\s*Pending\s*\|/);
1255
+ });
1256
+
1257
+ it('updates STATE.md fields: current phase, status, completed phases, percent', async () => {
1258
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1259
+ await setupTestProject(tmpDir, {
1260
+ roadmap: ROADMAP_FOR_COMPLETE,
1261
+ state: STATE_FOR_COMPLETE,
1262
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1263
+ });
1264
+ const p10Dir = join(tmpDir, '.planning', 'phases', '10-read-only-queries');
1265
+ await writeFile(join(p10Dir, '10-01-PLAN.md'), 'plan', 'utf-8');
1266
+ await writeFile(join(p10Dir, '10-02-PLAN.md'), 'plan', 'utf-8');
1267
+ await writeFile(join(p10Dir, '10-03-PLAN.md'), 'plan', 'utf-8');
1268
+ await writeFile(join(p10Dir, '10-01-SUMMARY.md'), 'summary', 'utf-8');
1269
+ await writeFile(join(p10Dir, '10-02-SUMMARY.md'), 'summary', 'utf-8');
1270
+ await writeFile(join(p10Dir, '10-03-SUMMARY.md'), 'summary', 'utf-8');
1271
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1272
+
1273
+ await phaseComplete(['10'], tmpDir);
1274
+
1275
+ const state = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
1276
+ // Phase should advance to 11
1277
+ expect(state).toMatch(/Phase:\s*11/);
1278
+ // Status should indicate ready to plan
1279
+ expect(state).toMatch(/Status:\s*Ready to plan/);
1280
+ // Completed phases should be incremented from 1 to 2
1281
+ expect(state).toMatch(/completed_phases:\s*2/);
1282
+ // Percent should be recalculated (2/3 = 67%)
1283
+ expect(state).toMatch(/percent:\s*67/);
1284
+ });
1285
+
1286
+ it('detects next phase from filesystem, falls back to ROADMAP.md', async () => {
1287
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1288
+ await setupTestProject(tmpDir, {
1289
+ roadmap: ROADMAP_FOR_COMPLETE,
1290
+ state: STATE_FOR_COMPLETE,
1291
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1292
+ });
1293
+ const p10Dir = join(tmpDir, '.planning', 'phases', '10-read-only-queries');
1294
+ await writeFile(join(p10Dir, '10-01-PLAN.md'), 'plan', 'utf-8');
1295
+ await writeFile(join(p10Dir, '10-01-SUMMARY.md'), 'summary', 'utf-8');
1296
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1297
+
1298
+ const result = await phaseComplete(['10'], tmpDir);
1299
+ const data = result.data as Record<string, unknown>;
1300
+
1301
+ // Next phase should be 11 (from filesystem)
1302
+ expect(data.next_phase).toBe('11');
1303
+ expect(data.is_last_phase).toBe(false);
1304
+ });
1305
+
1306
+ it('sets is_last_phase when completing the final phase', async () => {
1307
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1308
+ await setupTestProject(tmpDir, {
1309
+ roadmap: ROADMAP_FOR_COMPLETE,
1310
+ state: STATE_FOR_COMPLETE,
1311
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1312
+ });
1313
+ const p11Dir = join(tmpDir, '.planning', 'phases', '11-final-phase');
1314
+ await writeFile(join(p11Dir, '11-01-PLAN.md'), 'plan', 'utf-8');
1315
+ await writeFile(join(p11Dir, '11-01-SUMMARY.md'), 'summary', 'utf-8');
1316
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1317
+
1318
+ const result = await phaseComplete(['11'], tmpDir);
1319
+ const data = result.data as Record<string, unknown>;
1320
+
1321
+ expect(data.is_last_phase).toBe(true);
1322
+ expect(data.next_phase).toBeNull();
1323
+
1324
+ // State should show milestone complete
1325
+ const state = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
1326
+ expect(state).toMatch(/Status:\s*Milestone complete/);
1327
+ });
1328
+
1329
+ it('collects UAT/VERIFICATION warnings without blocking', async () => {
1330
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1331
+ await setupTestProject(tmpDir, {
1332
+ roadmap: ROADMAP_FOR_COMPLETE,
1333
+ state: STATE_FOR_COMPLETE,
1334
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1335
+ });
1336
+ const p10Dir = join(tmpDir, '.planning', 'phases', '10-read-only-queries');
1337
+ await writeFile(join(p10Dir, '10-01-PLAN.md'), 'plan', 'utf-8');
1338
+ await writeFile(join(p10Dir, '10-01-SUMMARY.md'), 'summary', 'utf-8');
1339
+ // Create UAT file with pending status
1340
+ await writeFile(join(p10Dir, '10-UAT.md'), '---\nresult: pending\n---\nPending tests', 'utf-8');
1341
+ // Create VERIFICATION file with gaps
1342
+ await writeFile(join(p10Dir, '10-VERIFICATION.md'), '---\nstatus: gaps_found\n---\nGaps', 'utf-8');
1343
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1344
+
1345
+ const result = await phaseComplete(['10'], tmpDir);
1346
+ const data = result.data as Record<string, unknown>;
1347
+
1348
+ // Should complete despite warnings
1349
+ expect(data.completed_phase).toBe('10');
1350
+ expect(data.has_warnings).toBe(true);
1351
+ const warnings = data.warnings as string[];
1352
+ expect(warnings.length).toBeGreaterThan(0);
1353
+ expect(warnings.some(w => w.includes('pending'))).toBe(true);
1354
+ expect(warnings.some(w => w.includes('gaps'))).toBe(true);
1355
+ });
1356
+
1357
+ it('throws GTDError for missing phase', async () => {
1358
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1359
+ await setupTestProject(tmpDir, {
1360
+ roadmap: ROADMAP_FOR_COMPLETE,
1361
+ state: STATE_FOR_COMPLETE,
1362
+ phases: ['09-foundation'],
1363
+ });
1364
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1365
+
1366
+ await expect(phaseComplete(['99'], tmpDir)).rejects.toThrow('Phase 99 not found');
1367
+ });
1368
+
1369
+ it('updates performance metrics table in STATE.md', async () => {
1370
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1371
+ await setupTestProject(tmpDir, {
1372
+ roadmap: ROADMAP_FOR_COMPLETE,
1373
+ state: STATE_FOR_COMPLETE,
1374
+ phases: ['09-foundation', '10-read-only-queries', '11-final-phase'],
1375
+ });
1376
+ const p10Dir = join(tmpDir, '.planning', 'phases', '10-read-only-queries');
1377
+ await writeFile(join(p10Dir, '10-01-PLAN.md'), 'plan', 'utf-8');
1378
+ await writeFile(join(p10Dir, '10-02-PLAN.md'), 'plan', 'utf-8');
1379
+ await writeFile(join(p10Dir, '10-03-PLAN.md'), 'plan', 'utf-8');
1380
+ await writeFile(join(p10Dir, '10-01-SUMMARY.md'), 'summary', 'utf-8');
1381
+ await writeFile(join(p10Dir, '10-02-SUMMARY.md'), 'summary', 'utf-8');
1382
+ await writeFile(join(p10Dir, '10-03-SUMMARY.md'), 'summary', 'utf-8');
1383
+ await writeFile(join(tmpDir, '.planning', 'REQUIREMENTS.md'), REQUIREMENTS_FOR_COMPLETE, 'utf-8');
1384
+
1385
+ await phaseComplete(['10'], tmpDir);
1386
+
1387
+ const state = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
1388
+ // Total plans completed should be incremented: 3 + 3 = 6
1389
+ expect(state).toContain('Total plans completed: 6');
1390
+ // By Phase table should have a row for phase 10
1391
+ expect(state).toMatch(/\|\s*10\s*\|\s*3\s*\|/);
1392
+ });
1393
+
1394
+ it('does not overwrite plan checkbox when **Plans:** is on its own line (regression #2728)', async () => {
1395
+ const { phaseComplete } = await import('./phase-lifecycle.js');
1396
+
1397
+ const roadmap = [
1398
+ '# Roadmap',
1399
+ '',
1400
+ '## Current Milestone: v3.0',
1401
+ '',
1402
+ '- [ ] Phase 7: marketing-landing-v2',
1403
+ '',
1404
+ '### Phase 7: marketing-landing-v2',
1405
+ '',
1406
+ '**Goal:** Landing page',
1407
+ '**Plans:**',
1408
+ '- [x] 07-01-cherry-pick-foundation-PLAN.md — Wave 1',
1409
+ '- [x] 07-02-routing-auth-seo-PLAN.md — Wave 2',
1410
+ '',
1411
+ '### Phase 8: p3-nice-to-haves',
1412
+ '',
1413
+ '**Goal:** Nice to haves',
1414
+ '**Plans:** 3 plans',
1415
+ '',
1416
+ ].join('\n');
1417
+
1418
+ const state = [
1419
+ '---',
1420
+ 'gtd_state_version: 1.0',
1421
+ 'milestone: v3.0',
1422
+ 'status: executing',
1423
+ 'progress:',
1424
+ ' total_phases: 2',
1425
+ ' completed_phases: 0',
1426
+ ' total_plans: 4',
1427
+ ' completed_plans: 2',
1428
+ ' percent: 50',
1429
+ '---',
1430
+ '',
1431
+ '# Project State',
1432
+ '',
1433
+ 'Phase: 7 of 2 — EXECUTING',
1434
+ 'Status: Executing Phase 7',
1435
+ ].join('\n');
1436
+
1437
+ await setupTestProject(tmpDir, {
1438
+ roadmap,
1439
+ state,
1440
+ phases: ['07-marketing-landing-v2', '08-p3-nice-to-haves'],
1441
+ });
1442
+
1443
+ const p7Dir = join(tmpDir, '.planning', 'phases', '07-marketing-landing-v2');
1444
+ await writeFile(join(p7Dir, '07-01-PLAN.md'), 'plan1', 'utf-8');
1445
+ await writeFile(join(p7Dir, '07-02-PLAN.md'), 'plan2', 'utf-8');
1446
+ await writeFile(join(p7Dir, '07-01-SUMMARY.md'), 'summary1', 'utf-8');
1447
+ await writeFile(join(p7Dir, '07-02-SUMMARY.md'), 'summary2', 'utf-8');
1448
+
1449
+ await phaseComplete(['7'], tmpDir);
1450
+
1451
+ const updated = await readFile(join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
1452
+
1453
+ // The plan lines must NOT be replaced with "N/N plans complete"
1454
+ expect(updated).toContain('07-01-cherry-pick-foundation-PLAN.md');
1455
+ expect(updated).toContain('07-02-routing-auth-seo-PLAN.md');
1456
+ expect(updated).not.toMatch(/^2\/2 plans complete/m);
1457
+
1458
+ // Phase 8's **Plans:** line must NOT be touched
1459
+ expect(updated).toContain('**Plans:** 3 plans');
1460
+ });
1461
+ });
1462
+
1463
+ // ─── phasesClear ────────────────────────────────────────────────────────────
1464
+
1465
+ describe('phasesClear', () => {
1466
+ it('throws GTDError without --confirm flag, showing count', async () => {
1467
+ const { phasesClear } = await import('./phase-lifecycle.js');
1468
+ await setupTestProject(tmpDir, {
1469
+ phases: ['09-foundation', '10-read-only-queries', '999.1-backlog'],
1470
+ });
1471
+
1472
+ // Should throw with count of dirs to delete (2, not 3 since 999.1 is excluded)
1473
+ await expect(phasesClear([], tmpDir)).rejects.toThrow(/2 phase director/);
1474
+ });
1475
+
1476
+ it('deletes all dirs except 999.x with --confirm', async () => {
1477
+ const { phasesClear } = await import('./phase-lifecycle.js');
1478
+ await setupTestProject(tmpDir, {
1479
+ phases: ['09-foundation', '10-read-only-queries', '999.1-backlog'],
1480
+ });
1481
+
1482
+ const result = await phasesClear(['--confirm'], tmpDir);
1483
+ const data = result.data as Record<string, unknown>;
1484
+
1485
+ expect(data.cleared).toBe(2);
1486
+
1487
+ // Verify filesystem
1488
+ const phasesDir = join(tmpDir, '.planning', 'phases');
1489
+ const entries = await readdir(phasesDir, { withFileTypes: true });
1490
+ const dirNames = entries.filter(e => e.isDirectory()).map(e => e.name);
1491
+ expect(dirNames.length).toBe(1);
1492
+ expect(dirNames[0]).toContain('999');
1493
+ });
1494
+
1495
+ it('returns 0 cleared when phases dir is empty', async () => {
1496
+ const { phasesClear } = await import('./phase-lifecycle.js');
1497
+ await setupTestProject(tmpDir, { phases: [] });
1498
+
1499
+ const result = await phasesClear(['--confirm'], tmpDir);
1500
+ const data = result.data as Record<string, unknown>;
1501
+ expect(data.cleared).toBe(0);
1502
+ });
1503
+ });
1504
+
1505
+ // ─── phasesArchive ──────────────────────────────────────────────────────────
1506
+
1507
+ describe('phasesArchive', () => {
1508
+ it('moves milestone phase dirs to milestones/{version}-phases/', async () => {
1509
+ const { phasesArchive } = await import('./phase-lifecycle.js');
1510
+ await setupTestProject(tmpDir, {
1511
+ phases: ['09-foundation', '10-read-only-queries'],
1512
+ });
1513
+
1514
+ const result = await phasesArchive(['v3.0'], tmpDir);
1515
+ const data = result.data as Record<string, unknown>;
1516
+
1517
+ expect(data.version).toBe('v3.0');
1518
+ expect((data.archived as number)).toBeGreaterThan(0);
1519
+
1520
+ // Verify archive directory exists
1521
+ const archiveDir = join(tmpDir, '.planning', 'milestones', 'v3.0-phases');
1522
+ expect(existsSync(archiveDir)).toBe(true);
1523
+
1524
+ // Verify dirs were moved
1525
+ const archivedEntries = await readdir(archiveDir, { withFileTypes: true });
1526
+ const archivedDirs = archivedEntries.filter(e => e.isDirectory()).map(e => e.name);
1527
+ expect(archivedDirs.length).toBeGreaterThan(0);
1528
+
1529
+ // Original dirs should be gone
1530
+ const phasesDir = join(tmpDir, '.planning', 'phases');
1531
+ const remaining = await readdir(phasesDir, { withFileTypes: true });
1532
+ const remainingDirs = remaining.filter(e => e.isDirectory()).map(e => e.name);
1533
+ expect(remainingDirs.length).toBe(0);
1534
+ });
1535
+ });
1536
+
1537
+ // ─── milestoneComplete help-flag defense (#3259) ────────────────────────────
1538
+
1539
+ describe('milestoneComplete help-flag defense', () => {
1540
+ it('rejects --help as a version value with GTDError before any disk write', async () => {
1541
+ const { milestoneComplete } = await import('./phase-lifecycle.js');
1542
+ const { GTDError, ErrorClassification } = await import('../errors.js');
1543
+ await setupTestProject(tmpDir);
1544
+
1545
+ // Capture pre-invocation filesystem state
1546
+ const planningDir = join(tmpDir, '.planning');
1547
+ const milestonesPath = join(planningDir, 'MILESTONES.md');
1548
+ const statePath = join(planningDir, 'STATE.md');
1549
+ const preStateStat = await import('node:fs').then((m) => m.statSync(statePath));
1550
+ const milestonesExistedBefore = existsSync(milestonesPath);
1551
+
1552
+ let thrown: unknown;
1553
+ try {
1554
+ await milestoneComplete(['--help'], tmpDir);
1555
+ } catch (e) {
1556
+ thrown = e;
1557
+ }
1558
+
1559
+ expect(thrown).toBeInstanceOf(GTDError);
1560
+ const err = thrown as InstanceType<typeof GTDError>;
1561
+ expect(err.classification).toBe(ErrorClassification.Validation);
1562
+ expect(err.message).toContain('--help');
1563
+
1564
+ // Assert no files were written
1565
+ const postStateStat = await import('node:fs').then((m) => m.statSync(statePath));
1566
+ expect(postStateStat.mtimeMs).toBe(preStateStat.mtimeMs);
1567
+ expect(existsSync(milestonesPath)).toBe(milestonesExistedBefore);
1568
+ });
1569
+
1570
+ it('rejects -h as a version value with GTDError before any disk write', async () => {
1571
+ const { milestoneComplete } = await import('./phase-lifecycle.js');
1572
+ const { GTDError, ErrorClassification } = await import('../errors.js');
1573
+ await setupTestProject(tmpDir);
1574
+
1575
+ const statePath = join(tmpDir, '.planning', 'STATE.md');
1576
+ const preStateStat = await import('node:fs').then((m) => m.statSync(statePath));
1577
+ const milestonesPath = join(tmpDir, '.planning', 'MILESTONES.md');
1578
+ const milestonesExistedBefore = existsSync(milestonesPath);
1579
+
1580
+ let thrown: unknown;
1581
+ try {
1582
+ await milestoneComplete(['-h'], tmpDir);
1583
+ } catch (e) {
1584
+ thrown = e;
1585
+ }
1586
+
1587
+ expect(thrown).toBeInstanceOf(GTDError);
1588
+ const err = thrown as InstanceType<typeof GTDError>;
1589
+ expect(err.classification).toBe(ErrorClassification.Validation);
1590
+ expect(err.message).toContain('-h');
1591
+
1592
+ // Assert no files were written
1593
+ const postStateStat = await import('node:fs').then((m) => m.statSync(statePath));
1594
+ expect(postStateStat.mtimeMs).toBe(preStateStat.mtimeMs);
1595
+ expect(existsSync(milestonesPath)).toBe(milestonesExistedBefore);
1596
+ });
1597
+ });
1598
+
1599
+ // ─── Registry integration ──────────────────────────────────────────────────
1600
+
1601
+ describe('lifecycle handlers in registry', () => {
1602
+ it('registers all 7 lifecycle handlers with dot notation', async () => {
1603
+ const { createRegistry } = await import('./index.js');
1604
+ const registry = createRegistry();
1605
+
1606
+ const commands = [
1607
+ 'phase.add', 'phase.insert', 'phase.remove', 'phase.complete',
1608
+ 'phase.scaffold', 'phases.clear', 'phases.archive',
1609
+ ];
1610
+
1611
+ for (const cmd of commands) {
1612
+ const handler = registry.getHandler(cmd);
1613
+ expect(handler, `${cmd} should be registered`).toBeDefined();
1614
+ }
1615
+ });
1616
+
1617
+ it('registers space-delimited aliases', async () => {
1618
+ const { createRegistry } = await import('./index.js');
1619
+ const registry = createRegistry();
1620
+
1621
+ const commands = [
1622
+ 'phase add', 'phase insert', 'phase remove', 'phase complete',
1623
+ 'phase scaffold', 'phases clear', 'phases archive',
1624
+ ];
1625
+
1626
+ for (const cmd of commands) {
1627
+ const handler = registry.getHandler(cmd);
1628
+ expect(handler, `${cmd} should be registered`).toBeDefined();
1629
+ }
1630
+ });
1631
+ });
1632
+
1633
+ // ─── CR-3267 regression: error-propagation in listDirectories ─────────────
1634
+
1635
+ describe('listDirectories — CR-3267 finding 1: non-ENOENT errors propagate', () => {
1636
+ it('propagates EACCES from readdir instead of returning []', async () => {
1637
+ const { listDirectories } = await import('./phase-filesystem-adapter.js');
1638
+ // Create a real directory then remove read permission
1639
+ const dir = await mkdtemp(join(tmpdir(), 'gtd-fs-acl-'));
1640
+ const inner = join(dir, 'phases');
1641
+ await mkdir(inner);
1642
+ try {
1643
+ await import('node:fs/promises').then(m => m.chmod(inner, 0o000));
1644
+ await expect(listDirectories(inner)).rejects.toThrow();
1645
+ } finally {
1646
+ // Restore so cleanup can delete
1647
+ await import('node:fs/promises').then(m => m.chmod(inner, 0o755));
1648
+ await rm(dir, { recursive: true, force: true });
1649
+ }
1650
+ });
1651
+
1652
+ it('returns [] for ENOENT (directory gone between existsSync and readdir)', async () => {
1653
+ // existsSync passes, but the directory has been removed before readdir —
1654
+ // the ENOENT branch must still return [].
1655
+ const { listDirectories } = await import('./phase-filesystem-adapter.js');
1656
+ // We can't easily race the real FS, but we can verify the function tolerates
1657
+ // a path that truly does not exist (existsSync returns false → early []).
1658
+ const nonExistent = join(tmpdir(), 'gtd-does-not-exist-' + Date.now());
1659
+ const result = await listDirectories(nonExistent);
1660
+ expect(result).toEqual([]);
1661
+ });
1662
+ });
1663
+
1664
+ // ─── CR-3267 regression: error-propagation in readModifyWriteRoadmapMd ─────
1665
+
1666
+ describe('readModifyWriteRoadmapMd — CR-3267 finding 4: non-ENOENT errors propagate', () => {
1667
+ it('propagates EACCES on ROADMAP.md readFile instead of treating as empty', async () => {
1668
+ const { readModifyWriteRoadmapMd } = await import('./phase-lifecycle.js');
1669
+ const dir = await mkdtemp(join(tmpdir(), 'gtd-roadmap-acl-'));
1670
+ const planningDir = join(dir, '.planning');
1671
+ await mkdir(planningDir, { recursive: true });
1672
+ const roadmapPath = join(planningDir, 'ROADMAP.md');
1673
+ await writeFile(roadmapPath, '# Roadmap\n', 'utf-8');
1674
+ try {
1675
+ await import('node:fs/promises').then(m => m.chmod(roadmapPath, 0o000));
1676
+ await expect(
1677
+ readModifyWriteRoadmapMd(dir, (c) => c)
1678
+ ).rejects.toThrow();
1679
+ } finally {
1680
+ await import('node:fs/promises').then(m => m.chmod(roadmapPath, 0o644));
1681
+ await rm(dir, { recursive: true, force: true });
1682
+ }
1683
+ });
1684
+
1685
+ it('starts with empty content when ROADMAP.md is absent (ENOENT)', async () => {
1686
+ const { readModifyWriteRoadmapMd } = await import('./phase-lifecycle.js');
1687
+ const dir = await mkdtemp(join(tmpdir(), 'gtd-roadmap-noent-'));
1688
+ const planningDir = join(dir, '.planning');
1689
+ await mkdir(planningDir, { recursive: true });
1690
+ // No ROADMAP.md written — must default to '' and create it
1691
+ try {
1692
+ const result = await readModifyWriteRoadmapMd(dir, (c) => c + 'NEW');
1693
+ expect(result).toBe('NEW');
1694
+ } finally {
1695
+ await rm(dir, { recursive: true, force: true });
1696
+ }
1697
+ });
1698
+ });
1699
+
1700
+ // ─── CR-3267 regression: buildPhaseRoadmapEntry — no "Phase 0" dependency ──
1701
+
1702
+ describe('buildPhaseRoadmapEntry — CR-3267 finding 2: first sequential phase has no predecessor', () => {
1703
+ it('omits Depends on line when phaseId is 1', async () => {
1704
+ const { buildPhaseRoadmapEntry } = await import('./phase-lifecycle-policy.js');
1705
+ const entry = buildPhaseRoadmapEntry(1, 'Bootstrap', 'sequential');
1706
+ expect(entry).not.toContain('Depends on');
1707
+ expect(entry).not.toContain('Phase 0');
1708
+ });
1709
+
1710
+ it('includes Depends on line when phaseId is 2', async () => {
1711
+ const { buildPhaseRoadmapEntry } = await import('./phase-lifecycle-policy.js');
1712
+ const entry = buildPhaseRoadmapEntry(2, 'Second Phase', 'sequential');
1713
+ expect(entry).toContain('**Depends on:** Phase 1');
1714
+ });
1715
+
1716
+ it('omits Depends on line for custom naming mode regardless of id', async () => {
1717
+ const { buildPhaseRoadmapEntry } = await import('./phase-lifecycle-policy.js');
1718
+ const entry = buildPhaseRoadmapEntry('ALPHA', 'Custom', 'custom');
1719
+ expect(entry).not.toContain('Depends on');
1720
+ });
1721
+ });
1722
+
1723
+ // ─── CR-3267 regression: collectDecimalSuffixesFromDirNames prefix grammar ─
1724
+
1725
+ describe('collectDecimalSuffixesFromDirNames — CR-3267 finding 3: alphanumeric prefixes accepted', () => {
1726
+ it('matches directories with long alphanumeric project-code prefix', async () => {
1727
+ const { collectDecimalSuffixesFromDirNames } = await import('./phase-lifecycle-policy.js');
1728
+ // Prefix "MYAPP01" is longer than 6 chars and contains digits — was rejected before fix
1729
+ const dirs = ['MYAPP01-3.1-some-work', 'MYAPP01-3.2-other-work', 'unrelated-dir'];
1730
+ const result = collectDecimalSuffixesFromDirNames('3', dirs);
1731
+ expect(result.has(1)).toBe(true);
1732
+ expect(result.has(2)).toBe(true);
1733
+ });
1734
+
1735
+ it('still matches directories with short uppercase-only prefix', async () => {
1736
+ const { collectDecimalSuffixesFromDirNames } = await import('./phase-lifecycle-policy.js');
1737
+ const dirs = ['AB-5.1-task', 'AB-5.3-other'];
1738
+ const result = collectDecimalSuffixesFromDirNames('5', dirs);
1739
+ expect(result.has(1)).toBe(true);
1740
+ expect(result.has(3)).toBe(true);
1741
+ });
1742
+
1743
+ it('matches directories with no prefix', async () => {
1744
+ const { collectDecimalSuffixesFromDirNames } = await import('./phase-lifecycle-policy.js');
1745
+ const dirs = ['3.1-plain', '3.2-also-plain'];
1746
+ const result = collectDecimalSuffixesFromDirNames('3', dirs);
1747
+ expect(result.has(1)).toBe(true);
1748
+ expect(result.has(2)).toBe(true);
1749
+ });
1750
+ });