@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,1557 @@
1
+ /**
2
+ * Verify — Verification suite, consistency, and health validation
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+ const { loadConfig, normalizePhaseName, escapeRegex, findPhaseInternal, getMilestoneInfo, stripShippedMilestones, extractCurrentMilestone, output, error, checkAgentsInstalled, CONFIG_DEFAULTS, inspectWorktreeHealth } = require('./core.cjs');
9
+ const { execGit, platformReadSync: safeReadFile, platformWriteSync } = require('./shell-command-projection.cjs');
10
+ const { planningDir } = require('./planning-workspace.cjs');
11
+ const { extractFrontmatter, parseMustHavesBlock } = require('./frontmatter.cjs');
12
+ const { writeStateMd } = require('./state.cjs');
13
+ const { formatGtdSlash, resolveRuntime } = require('./runtime-slash.cjs');
14
+
15
+ const EXECUTABLE_TASK_TYPES = new Set(['auto', 'tdd']);
16
+
17
+ function extractTaskElement(taskContent, tagName) {
18
+ const regex = new RegExp(`<${tagName}>([\\s\\S]*?)<\\/${tagName}>`, 'i');
19
+ const match = taskContent.match(regex);
20
+ return match ? match[1].trim() : '';
21
+ }
22
+
23
+ function extractTaskType(attrs) {
24
+ const match = attrs.match(/type\s*=\s*["']([^"']+)["']/i);
25
+ return match ? match[1].trim() : 'auto';
26
+ }
27
+
28
+ function parseTaskFileList(filesText) {
29
+ if (!filesText) return [];
30
+ return filesText
31
+ .split(/[,\n]/)
32
+ .map((file) => file.trim().replace(/^[-*]\s*/, ''))
33
+ .filter(Boolean);
34
+ }
35
+
36
+ function isExecutableTaskType(type) {
37
+ return EXECUTABLE_TASK_TYPES.has(String(type || 'auto').toLowerCase());
38
+ }
39
+
40
+ function isCheckpointTaskType(type) {
41
+ return String(type || '').toLowerCase().startsWith('checkpoint:');
42
+ }
43
+
44
+ function isVagueDoneCriteria(done) {
45
+ const normalized = String(done || '').trim().toLowerCase();
46
+ if (!normalized) return false;
47
+ if (normalized.length < 12) return true;
48
+ if (/^(done|complete|completed|working|works|implemented|ready|thing is done)$/.test(normalized)) return true;
49
+ if (/\b(working|works|complete|completed|implemented|ready|done)\b/.test(normalized) && normalized.split(/\s+/).length <= 5) return true;
50
+ return false;
51
+ }
52
+
53
+ function hasMultiConcernAction(action) {
54
+ return /\b(and also|also\s+(?:implement|create|update|add|set up)|and\s+(?:implement|create|update|add|set up))\b/i.test(String(action || ''));
55
+ }
56
+
57
+ function hasPlaceholderBoundaries(boundaries) {
58
+ const normalized = String(boundaries || '').trim().toLowerCase().replace(/[.\s]+$/g, '');
59
+ return /^(no boundaries|none|n\/a|na|not applicable)(?:\b|$)/.test(normalized);
60
+ }
61
+
62
+ function hasStructuredBoundaryClause(boundaries) {
63
+ return /\b(?:allowed|forbidden|forbidden paths|out of scope):/i.test(String(boundaries || '')) ||
64
+ /\bdo not modify:/i.test(String(boundaries || ''));
65
+ }
66
+
67
+ function makeAtomicityIssue(task, code, message) {
68
+ return {
69
+ task: task.name,
70
+ index: task.index,
71
+ type: task.type,
72
+ code,
73
+ message,
74
+ };
75
+ }
76
+
77
+ function evaluateTaskAtomicity(taskRecords) {
78
+ const blockers = [];
79
+ const warnings = [];
80
+ const taskResults = [];
81
+
82
+ for (let i = 0; i < taskRecords.length; i++) {
83
+ const task = taskRecords[i];
84
+ const executable = isExecutableTaskType(task.type);
85
+ const taskBlockers = [];
86
+ const taskWarnings = [];
87
+
88
+ if (executable) {
89
+ if (!task.boundaries || !task.boundaries.trim()) {
90
+ taskBlockers.push(makeAtomicityIssue(task, 'missing_boundaries', `Task '${task.name}' missing non-empty <boundaries>`));
91
+ } else if (hasPlaceholderBoundaries(task.boundaries)) {
92
+ taskBlockers.push(makeAtomicityIssue(task, 'placeholder_boundaries', `Task '${task.name}' has placeholder <boundaries>`));
93
+ } else if (!hasStructuredBoundaryClause(task.boundaries)) {
94
+ taskWarnings.push(makeAtomicityIssue(task, 'unstructured_boundaries', `Task '${task.name}' <boundaries> should include Allowed, Forbidden, DO NOT modify, or Out of scope clauses`));
95
+ }
96
+
97
+ if (task.files.length === 0) {
98
+ taskBlockers.push(makeAtomicityIssue(task, 'empty_files', `Task '${task.name}' has empty <files>`));
99
+ } else if (task.files.length >= 6) {
100
+ taskBlockers.push(makeAtomicityIssue(task, 'too_many_files', `Task '${task.name}' modifies ${task.files.length} files; maximum is 5`));
101
+ } else if (task.files.length >= 4) {
102
+ taskWarnings.push(makeAtomicityIssue(task, 'borderline_file_count', `Task '${task.name}' modifies ${task.files.length} files; target is 1-3`));
103
+ }
104
+
105
+ if (!task.done || !task.done.trim()) {
106
+ taskBlockers.push(makeAtomicityIssue(task, 'missing_done', `Task '${task.name}' missing <done>`));
107
+ } else if (isVagueDoneCriteria(task.done)) {
108
+ taskWarnings.push(makeAtomicityIssue(task, 'vague_done', `Task '${task.name}' has vague <done> criteria`));
109
+ }
110
+
111
+ if (hasMultiConcernAction(task.action)) {
112
+ taskWarnings.push(makeAtomicityIssue(task, 'possible_multi_concern_action', `Task '${task.name}' action may combine multiple concerns`));
113
+ }
114
+
115
+ for (let j = i + 1; j < taskRecords.length; j++) {
116
+ const laterTask = taskRecords[j];
117
+ if (!isExecutableTaskType(laterTask.type)) continue;
118
+ const referencedFile = laterTask.files.find((file) => file && task.verify.includes(file));
119
+ if (referencedFile) {
120
+ taskBlockers.push(makeAtomicityIssue(
121
+ task,
122
+ 'verify_references_later_task_file',
123
+ `Task '${task.name}' <verify> references '${referencedFile}' from later task '${laterTask.name}'`
124
+ ));
125
+ }
126
+ }
127
+ }
128
+
129
+ blockers.push(...taskBlockers);
130
+ warnings.push(...taskWarnings);
131
+ taskResults.push({
132
+ name: task.name,
133
+ index: task.index,
134
+ type: task.type,
135
+ executable,
136
+ checkpoint: isCheckpointTaskType(task.type),
137
+ file_count: task.files.length,
138
+ blockers: taskBlockers,
139
+ warnings: taskWarnings,
140
+ });
141
+ }
142
+
143
+ return {
144
+ ok: blockers.length === 0,
145
+ blockers,
146
+ warnings,
147
+ tasks: taskResults,
148
+ };
149
+ }
150
+
151
+ function cmdVerifySummary(cwd, summaryPath, checkFileCount, raw) {
152
+ if (!summaryPath) {
153
+ error('summary-path required');
154
+ }
155
+
156
+ const fullPath = path.join(cwd, summaryPath);
157
+ const checkCount = checkFileCount || 2;
158
+
159
+ // Check 1: Summary exists
160
+ if (!fs.existsSync(fullPath)) {
161
+ const result = {
162
+ passed: false,
163
+ checks: {
164
+ summary_exists: false,
165
+ files_created: { checked: 0, found: 0, missing: [] },
166
+ commits_exist: false,
167
+ self_check: 'not_found',
168
+ },
169
+ errors: ['SUMMARY.md not found'],
170
+ };
171
+ output(result, raw, 'failed');
172
+ return;
173
+ }
174
+
175
+ const content = fs.readFileSync(fullPath, 'utf-8');
176
+ const errors = [];
177
+
178
+ // Check 2: Spot-check files mentioned in summary
179
+ const mentionedFiles = new Set();
180
+ const patterns = [
181
+ /`([^`]+\.[a-zA-Z]+)`/g,
182
+ /(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi,
183
+ ];
184
+
185
+ for (const pattern of patterns) {
186
+ let m;
187
+ while ((m = pattern.exec(content)) !== null) {
188
+ const filePath = m[1];
189
+ if (filePath && !filePath.startsWith('http') && filePath.includes('/')) {
190
+ mentionedFiles.add(filePath);
191
+ }
192
+ }
193
+ }
194
+
195
+ const filesToCheck = Array.from(mentionedFiles).slice(0, checkCount);
196
+ const missing = [];
197
+ for (const file of filesToCheck) {
198
+ if (!fs.existsSync(path.join(cwd, file))) {
199
+ missing.push(file);
200
+ }
201
+ }
202
+
203
+ // Check 3: Commits exist
204
+ const commitHashPattern = /\b[0-9a-f]{7,40}\b/g;
205
+ const hashes = content.match(commitHashPattern) || [];
206
+ let commitsExist = false;
207
+ if (hashes.length > 0) {
208
+ for (const hash of hashes.slice(0, 3)) {
209
+ const result = execGit(['cat-file', '-t', hash], { cwd });
210
+ if (result.exitCode === 0 && result.stdout.trim() === 'commit') {
211
+ commitsExist = true;
212
+ break;
213
+ }
214
+ }
215
+ }
216
+
217
+ // Check 4: Self-check section
218
+ let selfCheck = 'not_found';
219
+ const selfCheckPattern = /##\s*(?:Self[- ]?Check|Verification|Quality Check)/i;
220
+ if (selfCheckPattern.test(content)) {
221
+ const passPattern = /(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i;
222
+ const failPattern = /(?:fail|✗|❌|incomplete|blocked)/i;
223
+ const checkSection = content.slice(content.search(selfCheckPattern));
224
+ if (failPattern.test(checkSection)) {
225
+ selfCheck = 'failed';
226
+ } else if (passPattern.test(checkSection)) {
227
+ selfCheck = 'passed';
228
+ }
229
+ }
230
+
231
+ if (missing.length > 0) errors.push('Missing files: ' + missing.join(', '));
232
+ if (!commitsExist && hashes.length > 0) errors.push('Referenced commit hashes not found in git history');
233
+ if (selfCheck === 'failed') errors.push('Self-check section indicates failure');
234
+
235
+ const checks = {
236
+ summary_exists: true,
237
+ files_created: { checked: filesToCheck.length, found: filesToCheck.length - missing.length, missing },
238
+ commits_exist: commitsExist,
239
+ self_check: selfCheck,
240
+ };
241
+
242
+ const passed = missing.length === 0 && selfCheck !== 'failed';
243
+ const result = { passed, checks, errors };
244
+ output(result, raw, passed ? 'passed' : 'failed');
245
+ }
246
+
247
+ function cmdVerifyPlanStructure(cwd, filePath, raw) {
248
+ if (!filePath) { error('file path required'); }
249
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(cwd, filePath);
250
+ const content = safeReadFile(fullPath);
251
+ if (!content) { output({ error: 'File not found', path: filePath }, raw); return; }
252
+
253
+ const fm = extractFrontmatter(content);
254
+ const errors = [];
255
+ const warnings = [];
256
+
257
+ // Check required frontmatter fields
258
+ const required = ['phase', 'plan', 'type', 'wave', 'depends_on', 'files_modified', 'autonomous', 'must_haves'];
259
+ for (const field of required) {
260
+ if (fm[field] === undefined) errors.push(`Missing required frontmatter field: ${field}`);
261
+ }
262
+
263
+ // Parse and check task elements
264
+ const taskPattern = /<task\b([^>]*)>([\s\S]*?)<\/task>/g;
265
+ const tasks = [];
266
+ const atomicityTaskRecords = [];
267
+ let taskMatch;
268
+ while ((taskMatch = taskPattern.exec(content)) !== null) {
269
+ const taskAttrs = taskMatch[1] || '';
270
+ const taskContent = taskMatch[2];
271
+ const taskType = extractTaskType(taskAttrs);
272
+ const taskName = extractTaskElement(taskContent, 'name') || 'unnamed';
273
+ const hasName = /<name>/.test(taskContent);
274
+ const hasFiles = /<files>/.test(taskContent);
275
+ const hasAction = /<action>/.test(taskContent);
276
+ const hasVerify = /<verify>/.test(taskContent);
277
+ const hasDone = /<done>/.test(taskContent);
278
+ const hasBoundaries = /<boundaries>/.test(taskContent);
279
+ const executable = isExecutableTaskType(taskType);
280
+
281
+ if (!hasName) errors.push('Task missing <name> element');
282
+ if (executable && !hasAction) errors.push(`Task '${taskName}' missing <action>`);
283
+ if (executable && !hasVerify) warnings.push(`Task '${taskName}' missing <verify>`);
284
+ if (executable && !hasDone) warnings.push(`Task '${taskName}' missing <done>`);
285
+ if (executable && !hasFiles) warnings.push(`Task '${taskName}' missing <files>`);
286
+
287
+ tasks.push({ name: taskName, hasFiles, hasAction, hasVerify, hasDone, hasBoundaries });
288
+ atomicityTaskRecords.push({
289
+ index: atomicityTaskRecords.length + 1,
290
+ name: taskName,
291
+ type: taskType,
292
+ files: parseTaskFileList(extractTaskElement(taskContent, 'files')),
293
+ boundaries: extractTaskElement(taskContent, 'boundaries'),
294
+ action: extractTaskElement(taskContent, 'action'),
295
+ verify: extractTaskElement(taskContent, 'verify'),
296
+ done: extractTaskElement(taskContent, 'done'),
297
+ });
298
+ }
299
+
300
+ if (tasks.length === 0) warnings.push('No <task> elements found');
301
+ const atomicity = evaluateTaskAtomicity(atomicityTaskRecords);
302
+
303
+ // Wave/depends_on consistency
304
+ if (fm.wave && parseInt(fm.wave) > 1 && (!fm.depends_on || (Array.isArray(fm.depends_on) && fm.depends_on.length === 0))) {
305
+ warnings.push('Wave > 1 but depends_on is empty');
306
+ }
307
+
308
+ // Autonomous/checkpoint consistency
309
+ const hasCheckpoints = /<task\s+type=["']?checkpoint/.test(content);
310
+ if (hasCheckpoints && fm.autonomous !== 'false' && fm.autonomous !== false) {
311
+ errors.push('Has checkpoint tasks but autonomous is not false');
312
+ }
313
+
314
+ output({
315
+ valid: errors.length === 0,
316
+ errors,
317
+ warnings,
318
+ task_count: tasks.length,
319
+ tasks,
320
+ atomicity,
321
+ frontmatter_fields: Object.keys(fm),
322
+ }, raw, errors.length === 0 ? 'valid' : 'invalid');
323
+ }
324
+
325
+ function cmdVerifyPhaseCompleteness(cwd, phase, raw) {
326
+ if (!phase) { error('phase required'); }
327
+ const phaseInfo = findPhaseInternal(cwd, phase);
328
+ if (!phaseInfo || !phaseInfo.found) {
329
+ output({ error: 'Phase not found', phase }, raw);
330
+ return;
331
+ }
332
+
333
+ const errors = [];
334
+ const warnings = [];
335
+ const phaseDir = path.join(cwd, phaseInfo.directory);
336
+
337
+ // List plans and summaries
338
+ let files;
339
+ try { files = fs.readdirSync(phaseDir); } catch { output({ error: 'Cannot read phase directory' }, raw); return; }
340
+
341
+ const plans = files.filter(f => f.match(/-PLAN\.md$/i));
342
+ const summaries = files.filter(f => f.match(/-SUMMARY\.md$/i));
343
+
344
+ // Extract plan IDs (everything before -PLAN.md)
345
+ const planIds = new Set(plans.map(p => p.replace(/-PLAN\.md$/i, '')));
346
+ const summaryIds = new Set(summaries.map(s => s.replace(/-SUMMARY\.md$/i, '')));
347
+
348
+ // Plans without summaries
349
+ const incompletePlans = [...planIds].filter(id => !summaryIds.has(id));
350
+ if (incompletePlans.length > 0) {
351
+ errors.push(`Plans without summaries: ${incompletePlans.join(', ')}`);
352
+ }
353
+
354
+ // Summaries without plans (orphans)
355
+ const orphanSummaries = [...summaryIds].filter(id => !planIds.has(id));
356
+ if (orphanSummaries.length > 0) {
357
+ warnings.push(`Summaries without plans: ${orphanSummaries.join(', ')}`);
358
+ }
359
+
360
+ output({
361
+ complete: errors.length === 0,
362
+ phase: phaseInfo.phase_number,
363
+ plan_count: plans.length,
364
+ summary_count: summaries.length,
365
+ incomplete_plans: incompletePlans,
366
+ orphan_summaries: orphanSummaries,
367
+ errors,
368
+ warnings,
369
+ }, raw, errors.length === 0 ? 'complete' : 'incomplete');
370
+ }
371
+
372
+ function cmdVerifyReferences(cwd, filePath, raw) {
373
+ if (!filePath) { error('file path required'); }
374
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(cwd, filePath);
375
+ const content = safeReadFile(fullPath);
376
+ if (!content) { output({ error: 'File not found', path: filePath }, raw); return; }
377
+
378
+ const found = [];
379
+ const missing = [];
380
+
381
+ // Find @-references: @path/to/file (must contain / to be a file path)
382
+ const atRefs = content.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g) || [];
383
+ for (const ref of atRefs) {
384
+ const cleanRef = ref.slice(1); // remove @
385
+ const resolved = cleanRef.startsWith('~/')
386
+ ? path.join(process.env.HOME || '', cleanRef.slice(2))
387
+ : path.join(cwd, cleanRef);
388
+ if (fs.existsSync(resolved)) {
389
+ found.push(cleanRef);
390
+ } else {
391
+ missing.push(cleanRef);
392
+ }
393
+ }
394
+
395
+ // Find backtick file paths that look like real paths (contain / and have extension)
396
+ const backtickRefs = content.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g) || [];
397
+ for (const ref of backtickRefs) {
398
+ const cleanRef = ref.slice(1, -1); // remove backticks
399
+ if (cleanRef.startsWith('http') || cleanRef.includes('${') || cleanRef.includes('{{')) continue;
400
+ if (found.includes(cleanRef) || missing.includes(cleanRef)) continue; // dedup
401
+ const resolved = path.join(cwd, cleanRef);
402
+ if (fs.existsSync(resolved)) {
403
+ found.push(cleanRef);
404
+ } else {
405
+ missing.push(cleanRef);
406
+ }
407
+ }
408
+
409
+ output({
410
+ valid: missing.length === 0,
411
+ found: found.length,
412
+ missing,
413
+ total: found.length + missing.length,
414
+ }, raw, missing.length === 0 ? 'valid' : 'invalid');
415
+ }
416
+
417
+ function cmdVerifyCommits(cwd, hashes, raw) {
418
+ if (!hashes || hashes.length === 0) { error('At least one commit hash required'); }
419
+
420
+ const valid = [];
421
+ const invalid = [];
422
+ for (const hash of hashes) {
423
+ const result = execGit(['cat-file', '-t', hash], { cwd });
424
+ if (result.exitCode === 0 && result.stdout.trim() === 'commit') {
425
+ valid.push(hash);
426
+ } else {
427
+ invalid.push(hash);
428
+ }
429
+ }
430
+
431
+ output({
432
+ all_valid: invalid.length === 0,
433
+ valid,
434
+ invalid,
435
+ total: hashes.length,
436
+ }, raw, invalid.length === 0 ? 'valid' : 'invalid');
437
+ }
438
+
439
+ function cmdVerifyArtifacts(cwd, planFilePath, raw) {
440
+ if (!planFilePath) { error('plan file path required'); }
441
+ const fullPath = path.isAbsolute(planFilePath) ? planFilePath : path.join(cwd, planFilePath);
442
+ const content = safeReadFile(fullPath);
443
+ if (!content) { output({ error: 'File not found', path: planFilePath }, raw); return; }
444
+
445
+ const artifacts = parseMustHavesBlock(content, 'artifacts');
446
+ if (artifacts.length === 0) {
447
+ output({ error: 'No must_haves.artifacts found in frontmatter', path: planFilePath }, raw);
448
+ return;
449
+ }
450
+
451
+ const results = [];
452
+ for (const artifact of artifacts) {
453
+ if (typeof artifact === 'string') continue; // skip simple string items
454
+ const artPath = artifact.path;
455
+ if (!artPath) continue;
456
+
457
+ const artFullPath = path.join(cwd, artPath);
458
+ const exists = fs.existsSync(artFullPath);
459
+ const check = { path: artPath, exists, issues: [], passed: false };
460
+
461
+ if (exists) {
462
+ const fileContent = safeReadFile(artFullPath) || '';
463
+ const lineCount = fileContent.split('\n').length;
464
+
465
+ if (artifact.min_lines && lineCount < artifact.min_lines) {
466
+ check.issues.push(`Only ${lineCount} lines, need ${artifact.min_lines}`);
467
+ }
468
+ if (artifact.contains && !fileContent.includes(artifact.contains)) {
469
+ check.issues.push(`Missing pattern: ${artifact.contains}`);
470
+ }
471
+ if (artifact.exports) {
472
+ const exports = Array.isArray(artifact.exports) ? artifact.exports : [artifact.exports];
473
+ for (const exp of exports) {
474
+ if (!fileContent.includes(exp)) check.issues.push(`Missing export: ${exp}`);
475
+ }
476
+ }
477
+ check.passed = check.issues.length === 0;
478
+ } else {
479
+ check.issues.push('File not found');
480
+ }
481
+
482
+ results.push(check);
483
+ }
484
+
485
+ const passed = results.filter(r => r.passed).length;
486
+ output({
487
+ all_passed: passed === results.length,
488
+ passed,
489
+ total: results.length,
490
+ artifacts: results,
491
+ }, raw, passed === results.length ? 'valid' : 'invalid');
492
+ }
493
+
494
+ function cmdVerifyKeyLinks(cwd, planFilePath, raw) {
495
+ if (!planFilePath) { error('plan file path required'); }
496
+ const fullPath = path.isAbsolute(planFilePath) ? planFilePath : path.join(cwd, planFilePath);
497
+ const content = safeReadFile(fullPath);
498
+ if (!content) { output({ error: 'File not found', path: planFilePath }, raw); return; }
499
+
500
+ const keyLinks = parseMustHavesBlock(content, 'key_links');
501
+ if (keyLinks.length === 0) {
502
+ output({ error: 'No must_haves.key_links found in frontmatter', path: planFilePath }, raw);
503
+ return;
504
+ }
505
+
506
+ const results = [];
507
+ for (const link of keyLinks) {
508
+ if (typeof link === 'string') continue;
509
+ const check = { from: link.from, to: link.to, via: link.via || '', verified: false, detail: '' };
510
+
511
+ const sourceContent = safeReadFile(path.join(cwd, link.from || ''));
512
+ if (!sourceContent) {
513
+ check.detail = 'Source file not found';
514
+ } else if (link.pattern) {
515
+ try {
516
+ const regex = new RegExp(link.pattern);
517
+ if (regex.test(sourceContent)) {
518
+ check.verified = true;
519
+ check.detail = 'Pattern found in source';
520
+ } else {
521
+ const targetContent = safeReadFile(path.join(cwd, link.to || ''));
522
+ if (targetContent && regex.test(targetContent)) {
523
+ check.verified = true;
524
+ check.detail = 'Pattern found in target';
525
+ } else {
526
+ check.detail = `Pattern "${link.pattern}" not found in source or target`;
527
+ }
528
+ }
529
+ } catch {
530
+ check.detail = `Invalid regex pattern: ${link.pattern}`;
531
+ }
532
+ } else {
533
+ // No pattern: just check source references target
534
+ if (sourceContent.includes(link.to || '')) {
535
+ check.verified = true;
536
+ check.detail = 'Target referenced in source';
537
+ } else {
538
+ check.detail = 'Target not referenced in source';
539
+ }
540
+ }
541
+
542
+ results.push(check);
543
+ }
544
+
545
+ const verified = results.filter(r => r.verified).length;
546
+ output({
547
+ all_verified: verified === results.length,
548
+ verified,
549
+ total: results.length,
550
+ links: results,
551
+ }, raw, verified === results.length ? 'valid' : 'invalid');
552
+ }
553
+
554
+ const PHASE_TOKEN_FROM_DIR_RE = /^(?:[A-Z]{1,6}-)?(\d+[A-Z]?(?:\.\d+)*)(?:-|$)/i;
555
+ const MILESTONE_ARCHIVE_DIR_RE = /^v\d+.*-phases$/i;
556
+
557
+ function listMilestoneArchiveDirs(planBase) {
558
+ const milestonesDir = path.join(planBase, 'milestones');
559
+ try {
560
+ return fs.readdirSync(milestonesDir, { withFileTypes: true })
561
+ .filter((e) => e.isDirectory() && MILESTONE_ARCHIVE_DIR_RE.test(e.name))
562
+ .map((e) => path.join(milestonesDir, e.name))
563
+ .sort((a, b) => path.basename(a).localeCompare(path.basename(b), undefined, { numeric: true }));
564
+ } catch {
565
+ return [];
566
+ }
567
+ }
568
+
569
+ function getActiveMilestoneArchiveDir(planBase) {
570
+ const archiveDirs = listMilestoneArchiveDirs(planBase);
571
+ if (archiveDirs.length === 0) return null;
572
+
573
+ // Prefer STATE.md milestone when it maps to an on-disk archive dir.
574
+ try {
575
+ const statePath = path.join(planBase, 'STATE.md');
576
+ if (fs.existsSync(statePath)) {
577
+ const state = fs.readFileSync(statePath, 'utf-8');
578
+ const m = state.match(/^\s*(?:\*\*)?milestone(?:\*\*)?:\s*([^\s\r\n#]+).*$/mi);
579
+ if (m && m[1]) {
580
+ const milestone = m[1].trim();
581
+ const candidate = path.join(planBase, 'milestones', `${milestone}-phases`);
582
+ if (archiveDirs.includes(candidate)) return candidate;
583
+ }
584
+ }
585
+ } catch { /* intentionally empty */ }
586
+
587
+ // Fallback when STATE.md is absent/stale: highest (most recent) archive by version-ish name.
588
+ return archiveDirs[archiveDirs.length - 1];
589
+ }
590
+
591
+ function collectPhaseRoots(planBase) {
592
+ const roots = [];
593
+ const flatPhasesDir = path.join(planBase, 'phases');
594
+ if (fs.existsSync(flatPhasesDir)) roots.push(flatPhasesDir);
595
+ const activeArchive = getActiveMilestoneArchiveDir(planBase);
596
+ if (activeArchive) roots.push(activeArchive);
597
+ return roots;
598
+ }
599
+
600
+ // Returns a Set of phase numbers found on disk across active phase roots.
601
+ function collectDiskPhases(planBase) {
602
+ const diskPhases = new Set();
603
+ const phaseRoots = collectPhaseRoots(planBase);
604
+ const scanDir = (dir) => {
605
+ try {
606
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
607
+ for (const e of entries) {
608
+ if (e.isDirectory()) {
609
+ const m = e.name.match(PHASE_TOKEN_FROM_DIR_RE);
610
+ if (m) diskPhases.add(m[1]);
611
+ }
612
+ }
613
+ } catch { /* dir absent */ }
614
+ };
615
+
616
+ for (const root of phaseRoots) scanDir(root);
617
+
618
+ return diskPhases;
619
+ }
620
+
621
+ function cmdValidateConsistency(cwd, raw) {
622
+ const planBase = planningDir(cwd);
623
+ const roadmapPath = path.join(planBase, 'ROADMAP.md');
624
+ const errors = [];
625
+ const warnings = [];
626
+
627
+ // Check for ROADMAP
628
+ if (!fs.existsSync(roadmapPath)) {
629
+ errors.push('ROADMAP.md not found');
630
+ output({ passed: false, errors, warnings }, raw, 'failed');
631
+ return;
632
+ }
633
+
634
+ const roadmapContentRaw = fs.readFileSync(roadmapPath, 'utf-8');
635
+ const roadmapContent = extractCurrentMilestone(roadmapContentRaw, cwd);
636
+
637
+ // Extract phases from ROADMAP (archived milestones already stripped)
638
+ const roadmapPhases = new Set();
639
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi;
640
+ let m;
641
+ while ((m = phasePattern.exec(roadmapContent)) !== null) {
642
+ roadmapPhases.add(m[1]);
643
+ }
644
+
645
+ // Get phases on disk (flat layout + milestone-archive layout)
646
+ const diskPhases = collectDiskPhases(planBase);
647
+
648
+ // Check: phases in ROADMAP but not on disk
649
+ for (const p of roadmapPhases) {
650
+ if (!diskPhases.has(p) && !diskPhases.has(normalizePhaseName(p))) {
651
+ warnings.push(`Phase ${p} in ROADMAP.md but no directory on disk`);
652
+ }
653
+ }
654
+
655
+ // Check: phases on disk but not in ROADMAP
656
+ for (const p of diskPhases) {
657
+ const unpadded = String(parseInt(p, 10));
658
+ if (!roadmapPhases.has(p) && !roadmapPhases.has(unpadded)) {
659
+ warnings.push(`Phase ${p} exists on disk but not in ROADMAP.md`);
660
+ }
661
+ }
662
+
663
+ // Check: sequential phase numbers (integers only, skip in custom naming mode)
664
+ const config = loadConfig(cwd);
665
+ if (config.phase_naming !== 'custom') {
666
+ const integerPhases = [...diskPhases]
667
+ .filter(p => !p.includes('.'))
668
+ .map(p => parseInt(p, 10))
669
+ .sort((a, b) => a - b);
670
+
671
+ for (let i = 1; i < integerPhases.length; i++) {
672
+ if (integerPhases[i] !== integerPhases[i - 1] + 1) {
673
+ warnings.push(`Gap in phase numbering: ${integerPhases[i - 1]} → ${integerPhases[i]}`);
674
+ }
675
+ }
676
+ }
677
+
678
+ const phaseRoots = collectPhaseRoots(planBase);
679
+ for (const phaseRoot of phaseRoots) {
680
+ try {
681
+ const entries = fs.readdirSync(phaseRoot, { withFileTypes: true });
682
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort();
683
+
684
+ for (const dir of dirs) {
685
+ const phasePath = path.join(phaseRoot, dir);
686
+ const phaseLabel = path.relative(planBase, phasePath).replace(/\\/g, '/');
687
+ const phaseFiles = fs.readdirSync(phasePath);
688
+ const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md')).sort();
689
+
690
+ // Extract plan numbers
691
+ const planNums = plans.map(p => {
692
+ const pm = p.match(/-(\d{2})-PLAN\.md$/);
693
+ return pm ? parseInt(pm[1], 10) : null;
694
+ }).filter(n => n !== null);
695
+
696
+ for (let i = 1; i < planNums.length; i++) {
697
+ if (planNums[i] !== planNums[i - 1] + 1) {
698
+ warnings.push(`Gap in plan numbering in ${phaseLabel}: plan ${planNums[i - 1]} → ${planNums[i]}`);
699
+ }
700
+ }
701
+
702
+ // Check: plans without summaries (completed plans)
703
+ const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md'));
704
+ const planIds = new Set(plans.map(p => p.replace('-PLAN.md', '')));
705
+ const summaryIds = new Set(summaries.map(s => s.replace('-SUMMARY.md', '')));
706
+
707
+ // Summary without matching plan is suspicious
708
+ for (const sid of summaryIds) {
709
+ if (!planIds.has(sid)) {
710
+ warnings.push(`Summary ${sid}-SUMMARY.md in ${phaseLabel} has no matching PLAN.md`);
711
+ }
712
+ }
713
+
714
+ // Check: frontmatter in plans has required fields
715
+ for (const plan of plans) {
716
+ const content = fs.readFileSync(path.join(phasePath, plan), 'utf-8');
717
+ const fm = extractFrontmatter(content);
718
+ if (!fm.wave) {
719
+ warnings.push(`${phaseLabel}/${plan}: missing 'wave' in frontmatter`);
720
+ }
721
+ }
722
+ }
723
+ } catch { /* intentionally empty */ }
724
+ }
725
+
726
+ const passed = errors.length === 0;
727
+ output({ passed, errors, warnings, warning_count: warnings.length }, raw, passed ? 'passed' : 'failed');
728
+ }
729
+
730
+ function cmdValidateHealth(cwd, options, raw) {
731
+ // Guard: detect if CWD is the home directory (likely accidental)
732
+ const resolved = path.resolve(cwd);
733
+ if (resolved === os.homedir()) {
734
+ output({
735
+ status: 'error',
736
+ errors: [{ code: 'E010', message: `CWD is home directory (${resolved}) — health check would read the wrong .planning/ directory. Run from your project root instead.`, fix: 'cd into your project directory and retry' }],
737
+ warnings: [],
738
+ info: [{ code: 'I010', message: `Resolved CWD: ${resolved}` }],
739
+ repairable_count: 0,
740
+ }, raw);
741
+ return;
742
+ }
743
+
744
+ const planBase = planningDir(cwd);
745
+ const projectPath = path.join(planBase, 'PROJECT.md');
746
+ const roadmapPath = path.join(planBase, 'ROADMAP.md');
747
+ const statePath = path.join(planBase, 'STATE.md');
748
+ const configPath = path.join(planBase, 'config.json');
749
+ const phasesDir = path.join(planBase, 'phases');
750
+ // Resolve runtime once so every emitted fix hint uses the routable slash
751
+ // form for this install (#3584).
752
+ const _slashRuntime = resolveRuntime(cwd);
753
+ const slash = (name) => formatGtdSlash(name, _slashRuntime);
754
+
755
+ const errors = [];
756
+ const warnings = [];
757
+ const info = [];
758
+ const repairs = [];
759
+
760
+ // Helper to add issue
761
+ const addIssue = (severity, code, message, fix, repairable = false) => {
762
+ const issue = { code, message, fix, repairable };
763
+ if (severity === 'error') errors.push(issue);
764
+ else if (severity === 'warning') warnings.push(issue);
765
+ else info.push(issue);
766
+ };
767
+
768
+ // ─── Check 1: .planning/ exists ───────────────────────────────────────────
769
+ if (!fs.existsSync(planBase)) {
770
+ addIssue('error', 'E001', '.planning/ directory not found', `Run ${slash('new-project')} to initialize`);
771
+ output({
772
+ status: 'broken',
773
+ errors,
774
+ warnings,
775
+ info,
776
+ repairable_count: 0,
777
+ }, raw);
778
+ return;
779
+ }
780
+
781
+ // ─── Check 2: PROJECT.md exists and has required sections ─────────────────
782
+ if (!fs.existsSync(projectPath)) {
783
+ addIssue('error', 'E002', 'PROJECT.md not found', `Run ${slash('new-project')} to create`);
784
+ } else {
785
+ const content = fs.readFileSync(projectPath, 'utf-8');
786
+ const requiredSections = ['## What This Is', '## Core Value', '## Requirements'];
787
+ for (const section of requiredSections) {
788
+ if (!content.includes(section)) {
789
+ addIssue('warning', 'W001', `PROJECT.md missing section: ${section}`, 'Add section manually');
790
+ }
791
+ }
792
+ }
793
+
794
+ // ─── Check 3: ROADMAP.md exists ───────────────────────────────────────────
795
+ if (!fs.existsSync(roadmapPath)) {
796
+ addIssue('error', 'E003', 'ROADMAP.md not found', `Run ${slash('new-milestone')} to create roadmap`);
797
+ }
798
+
799
+ // ─── Check 4: STATE.md exists and references valid phases ─────────────────
800
+ if (!fs.existsSync(statePath)) {
801
+ addIssue('error', 'E004', 'STATE.md not found', `Run ${slash('health')} --repair to regenerate`, true);
802
+ repairs.push('regenerateState');
803
+ } else {
804
+ const stateContent = fs.readFileSync(statePath, 'utf-8');
805
+ // Extract phase references from STATE.md
806
+ const phaseRefs = [...stateContent.matchAll(/[Pp]hase\s+(\d+[A-Z]?(?:\.\d+)*)/g)].map(m => m[1]);
807
+ // Bug #2633 — ROADMAP.md is the authority for which phases are valid.
808
+ // STATE.md may legitimately reference current-milestone future phases
809
+ // (not yet materialized on disk) and shipped-milestone history phases
810
+ // (archived / cleared off disk). Matching only against on-disk dirs
811
+ // produces false W002 warnings in both cases.
812
+ const validPhases = collectDiskPhases(planBase);
813
+ // Union in every phase declared anywhere in ROADMAP.md (current + shipped + backlog).
814
+ try {
815
+ if (fs.existsSync(roadmapPath)) {
816
+ const roadmapRaw = fs.readFileSync(roadmapPath, 'utf-8');
817
+ const all = [...roadmapRaw.matchAll(/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi)];
818
+ for (const m of all) validPhases.add(m[1]);
819
+ }
820
+ } catch { /* intentionally empty */ }
821
+ // Compare canonical full phase tokens. Also accept a leading-zero variant
822
+ // on the integer prefix only (e.g. "03" matching "3", "03.1" matching
823
+ // "3.1") so historic STATE.md formatting still validates. Suffix tokens
824
+ // like "3A" must match exactly — never collapsed to "3".
825
+ const normalizedValid = new Set();
826
+ for (const p of validPhases) {
827
+ normalizedValid.add(p);
828
+ const dotIdx = p.indexOf('.');
829
+ const head = dotIdx === -1 ? p : p.slice(0, dotIdx);
830
+ const tail = dotIdx === -1 ? '' : p.slice(dotIdx);
831
+ if (/^\d+$/.test(head)) {
832
+ normalizedValid.add(head.padStart(2, '0') + tail);
833
+ }
834
+ }
835
+ // Check for invalid references
836
+ for (const ref of phaseRefs) {
837
+ const dotIdx = ref.indexOf('.');
838
+ const head = dotIdx === -1 ? ref : ref.slice(0, dotIdx);
839
+ const tail = dotIdx === -1 ? '' : ref.slice(dotIdx);
840
+ const padded = /^\d+$/.test(head) ? head.padStart(2, '0') + tail : ref;
841
+ if (!normalizedValid.has(ref) && !normalizedValid.has(padded)) {
842
+ // Only warn if we know any valid phases (not just an empty project)
843
+ if (normalizedValid.size > 0) {
844
+ addIssue(
845
+ 'warning',
846
+ 'W002',
847
+ `STATE.md references phase ${ref}, but only phases ${[...validPhases].sort().join(', ')} are declared`,
848
+ `Review STATE.md manually before changing it; ${slash('health')} --repair will not overwrite an existing STATE.md for phase mismatches`
849
+ );
850
+ }
851
+ }
852
+ }
853
+ }
854
+
855
+ // ─── Check 5: config.json valid JSON + valid schema ───────────────────────
856
+ if (!fs.existsSync(configPath)) {
857
+ addIssue('warning', 'W003', 'config.json not found', `Run ${slash('health')} --repair to create with defaults`, true);
858
+ repairs.push('createConfig');
859
+ } else {
860
+ try {
861
+ const raw = fs.readFileSync(configPath, 'utf-8');
862
+ const parsed = JSON.parse(raw);
863
+ // Validate known fields
864
+ const validProfiles = ['quality', 'balanced', 'budget', 'inherit'];
865
+ if (parsed.model_profile && !validProfiles.includes(parsed.model_profile)) {
866
+ addIssue('warning', 'W004', `config.json: invalid model_profile "${parsed.model_profile}"`, `Valid values: ${validProfiles.join(', ')}`);
867
+ }
868
+ } catch (err) {
869
+ addIssue('error', 'E005', `config.json: JSON parse error - ${err.message}`, `Run ${slash('health')} --repair to reset to defaults`, true);
870
+ repairs.push('resetConfig');
871
+ }
872
+ }
873
+
874
+ // ─── Check 5b: Nyquist validation key presence ──────────────────────────
875
+ if (fs.existsSync(configPath)) {
876
+ try {
877
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
878
+ const configParsed = JSON.parse(configRaw);
879
+ if (configParsed.workflow && configParsed.workflow.nyquist_validation === undefined) {
880
+ addIssue('warning', 'W008', 'config.json: workflow.nyquist_validation absent (defaults to enabled but agents may skip)', `Run ${slash('health')} --repair to add key`, true);
881
+ if (!repairs.includes('addNyquistKey')) repairs.push('addNyquistKey');
882
+ }
883
+ if (configParsed.workflow && configParsed.workflow.ai_integration_phase === undefined) {
884
+ addIssue('warning', 'W016', `config.json: workflow.ai_integration_phase absent (defaults to enabled — run ${slash('ai-integration-phase')} before planning AI system phases)`, `Run ${slash('health')} --repair to add key`, true);
885
+ if (!repairs.includes('addAiIntegrationPhaseKey')) repairs.push('addAiIntegrationPhaseKey');
886
+ }
887
+ } catch { /* intentionally empty */ }
888
+ }
889
+
890
+ // ─── Read phase directories once for checks 6, 7, 7b, and 8 (#1973) ──────
891
+ let phaseDirEntries = [];
892
+ const phaseDirFiles = new Map(); // phase dir name → file list
893
+ try {
894
+ phaseDirEntries = fs.readdirSync(phasesDir, { withFileTypes: true }).filter(e => e.isDirectory());
895
+ for (const e of phaseDirEntries) {
896
+ try {
897
+ phaseDirFiles.set(e.name, fs.readdirSync(path.join(phasesDir, e.name)));
898
+ } catch { phaseDirFiles.set(e.name, []); }
899
+ }
900
+ } catch { /* intentionally empty */ }
901
+
902
+ // ─── Check 6: Phase directory naming (NN-name format) ─────────────────────
903
+ for (const e of phaseDirEntries) {
904
+ if (!e.name.match(/^\d{2}(?:\.\d+)*-[\w-]+$/)) {
905
+ addIssue('warning', 'W005', `Phase directory "${e.name}" doesn't follow NN-name format`, 'Rename to match pattern (e.g., 01-setup)');
906
+ }
907
+ }
908
+
909
+ // ─── Check 7: Orphaned plans (PLAN without SUMMARY) ───────────────────────
910
+ for (const e of phaseDirEntries) {
911
+ const phaseFiles = phaseDirFiles.get(e.name) || [];
912
+ const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
913
+ const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
914
+ const summaryBases = new Set(summaries.map(s => s.replace('-SUMMARY.md', '').replace('SUMMARY.md', '')));
915
+
916
+ for (const plan of plans) {
917
+ const planBase = plan.replace('-PLAN.md', '').replace('PLAN.md', '');
918
+ if (!summaryBases.has(planBase)) {
919
+ addIssue('info', 'I001', `${e.name}/${plan} has no SUMMARY.md`, 'May be in progress');
920
+ }
921
+ }
922
+ }
923
+
924
+ // ─── Check 7b: Nyquist VALIDATION.md consistency ────────────────────────
925
+ for (const e of phaseDirEntries) {
926
+ const phaseFiles = phaseDirFiles.get(e.name) || [];
927
+ const hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md'));
928
+ const hasValidation = phaseFiles.some(f => f.endsWith('-VALIDATION.md'));
929
+ if (hasResearch && !hasValidation) {
930
+ const researchFile = phaseFiles.find(f => f.endsWith('-RESEARCH.md'));
931
+ try {
932
+ const researchContent = fs.readFileSync(path.join(phasesDir, e.name, researchFile), 'utf-8');
933
+ if (researchContent.includes('## Validation Architecture')) {
934
+ addIssue('warning', 'W009', `Phase ${e.name}: has Validation Architecture in RESEARCH.md but no VALIDATION.md`, `Re-run ${slash('plan-phase')} with --research to regenerate`);
935
+ }
936
+ } catch { /* intentionally empty */ }
937
+ }
938
+ }
939
+
940
+ // ─── Check 7c: Agent installation (#1371) ──────────────────────────────────
941
+ // Verify GTD agents are installed. Missing agents cause Task(subagent_type=...)
942
+ // to silently fall back to general-purpose, losing specialized instructions.
943
+ try {
944
+ const agentStatus = checkAgentsInstalled();
945
+ if (!agentStatus.agents_installed) {
946
+ if (agentStatus.installed_agents.length === 0) {
947
+ addIssue('warning', 'W010',
948
+ `No GTD agents found in ${agentStatus.agents_dir} — Task(subagent_type="gtd-*") will fall back to general-purpose`,
949
+ 'Run the GTD installer: npx @ai-is-gonna/get-tasks-done@latest');
950
+ } else {
951
+ addIssue('warning', 'W010',
952
+ `Missing ${agentStatus.missing_agents.length} GTD agents: ${agentStatus.missing_agents.join(', ')} — affected workflows will fall back to general-purpose`,
953
+ 'Run the GTD installer: npx @ai-is-gonna/get-tasks-done@latest');
954
+ }
955
+ }
956
+ } catch { /* intentionally empty — agent check is non-blocking */ }
957
+
958
+ // ─── Check 8: Run existing consistency checks ─────────────────────────────
959
+ // Inline subset of cmdValidateConsistency
960
+ if (fs.existsSync(roadmapPath)) {
961
+ const roadmapContentRaw = fs.readFileSync(roadmapPath, 'utf-8');
962
+ const roadmapContent = extractCurrentMilestone(roadmapContentRaw, cwd);
963
+ const roadmapPhases = new Set();
964
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi;
965
+ let m;
966
+ while ((m = phasePattern.exec(roadmapContent)) !== null) {
967
+ roadmapPhases.add(m[1]);
968
+ }
969
+
970
+ const diskPhases = collectDiskPhases(planBase);
971
+
972
+ // Build a set of phases explicitly marked not-yet-started in the ROADMAP
973
+ // summary list (- [ ] **Phase N:**). These phases are intentionally absent
974
+ // from disk -- W006 must not fire for them (#2009).
975
+ const notStartedPhases = new Set();
976
+ const uncheckedPattern = /-\s*\[\s\]\s*\*{0,2}Phase\s+(\d+[A-Z]?(?:\.\d+)*)[:\s*]/gi;
977
+ let um;
978
+ while ((um = uncheckedPattern.exec(roadmapContent)) !== null) {
979
+ notStartedPhases.add(um[1]);
980
+ // Also add zero-padded variant so 1 and 01 both match
981
+ notStartedPhases.add(String(parseInt(um[1], 10)).padStart(2, '0'));
982
+ }
983
+
984
+ // Phases in ROADMAP but not on disk
985
+ for (const p of roadmapPhases) {
986
+ const padded = String(parseInt(p, 10)).padStart(2, '0');
987
+ if (!diskPhases.has(p) && !diskPhases.has(padded)) {
988
+ // Skip phases explicitly flagged as not-yet-started in the summary list
989
+ if (notStartedPhases.has(p) || notStartedPhases.has(padded)) continue;
990
+ addIssue('warning', 'W006', `Phase ${p} in ROADMAP.md but no directory on disk`, 'Create phase directory or remove from roadmap');
991
+ }
992
+ }
993
+
994
+ // Phases on disk but not in ROADMAP
995
+ for (const p of diskPhases) {
996
+ const unpadded = String(parseInt(p, 10));
997
+ if (!roadmapPhases.has(p) && !roadmapPhases.has(unpadded)) {
998
+ addIssue('warning', 'W007', `Phase ${p} exists on disk but not in ROADMAP.md`, 'Add to roadmap or remove directory');
999
+ }
1000
+ }
1001
+ }
1002
+
1003
+ // ─── Check 9: STATE.md / ROADMAP.md cross-validation ─────────────────────
1004
+ if (fs.existsSync(statePath) && fs.existsSync(roadmapPath)) {
1005
+ try {
1006
+ const stateContent = fs.readFileSync(statePath, 'utf-8');
1007
+ const roadmapContentFull = fs.readFileSync(roadmapPath, 'utf-8');
1008
+
1009
+ // Extract current phase from STATE.md
1010
+ const currentPhaseMatch = stateContent.match(/\*\*Current Phase:\*\*\s*(\S+)/i) ||
1011
+ stateContent.match(/Current Phase:\s*(\S+)/i);
1012
+ if (currentPhaseMatch) {
1013
+ const statePhase = currentPhaseMatch[1].replace(/^0+/, '');
1014
+ // Check if ROADMAP shows this phase as already complete
1015
+ const phaseCheckboxRe = new RegExp(`-\\s*\\[x\\].*Phase\\s+0*${escapeRegex(statePhase)}[:\\s]`, 'i');
1016
+ if (phaseCheckboxRe.test(roadmapContentFull)) {
1017
+ // STATE says "current" but ROADMAP says "complete" — divergence
1018
+ const stateStatus = stateContent.match(/\*\*Status:\*\*\s*(.+)/i);
1019
+ const statusVal = stateStatus ? stateStatus[1].trim().toLowerCase() : '';
1020
+ if (statusVal !== 'complete' && statusVal !== 'done') {
1021
+ addIssue('warning', 'W011',
1022
+ `STATE.md says current phase is ${statePhase} (status: ${statusVal || 'unknown'}) but ROADMAP.md shows it as [x] complete — state files may be out of sync`,
1023
+ `Run ${slash('progress')} to re-derive current position, or manually update STATE.md`);
1024
+ }
1025
+ }
1026
+ }
1027
+ } catch { /* intentionally empty — cross-validation is advisory */ }
1028
+ }
1029
+
1030
+ // ─── Check 10: Config field validation ────────────────────────────────────
1031
+ if (fs.existsSync(configPath)) {
1032
+ try {
1033
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
1034
+ const configParsed = JSON.parse(configRaw);
1035
+
1036
+ // Validate branching_strategy
1037
+ const validStrategies = ['none', 'phase', 'milestone'];
1038
+ if (configParsed.branching_strategy && !validStrategies.includes(configParsed.branching_strategy)) {
1039
+ addIssue('warning', 'W012',
1040
+ `config.json: invalid branching_strategy "${configParsed.branching_strategy}"`,
1041
+ `Valid values: ${validStrategies.join(', ')}`);
1042
+ }
1043
+
1044
+ // Validate context_window is a positive integer
1045
+ if (configParsed.context_window !== undefined) {
1046
+ const cw = configParsed.context_window;
1047
+ if (typeof cw !== 'number' || cw <= 0 || !Number.isInteger(cw)) {
1048
+ addIssue('warning', 'W013',
1049
+ `config.json: context_window should be a positive integer, got "${cw}"`,
1050
+ 'Set to 200000 (default) or 1000000 (for 1M models)');
1051
+ }
1052
+ }
1053
+
1054
+ // Validate branch templates have required placeholders
1055
+ if (configParsed.phase_branch_template && !configParsed.phase_branch_template.includes('{phase}')) {
1056
+ addIssue('warning', 'W014',
1057
+ 'config.json: phase_branch_template missing {phase} placeholder',
1058
+ 'Template must include {phase} for phase number substitution');
1059
+ }
1060
+ if (configParsed.milestone_branch_template && !configParsed.milestone_branch_template.includes('{milestone}')) {
1061
+ addIssue('warning', 'W015',
1062
+ 'config.json: milestone_branch_template missing {milestone} placeholder',
1063
+ 'Template must include {milestone} for version substitution');
1064
+ }
1065
+ } catch { /* parse error already caught in Check 5 */ }
1066
+ }
1067
+
1068
+ // ─── Check 11: Stale / orphan git worktrees (#2167) ────────────────────────
1069
+ try {
1070
+ const worktreeHealth = inspectWorktreeHealth(
1071
+ cwd,
1072
+ { staleAfterMs: 60 * 60 * 1000 },
1073
+ { execGit, existsSync: fs.existsSync, statSync: fs.statSync }
1074
+ );
1075
+ if (!worktreeHealth.ok) {
1076
+ // AC2 / AC3: surface degraded-git state as a structured warning instead
1077
+ // of silently suppressing it (PRED.k302 — error-swallowing-empty-sentinel).
1078
+ if (worktreeHealth.reason === 'git_timed_out') {
1079
+ addIssue('warning', 'W020',
1080
+ 'Worktree health check degraded: git worktree list timed out after 10s — orphan/stale worktrees could not be inspected',
1081
+ 'Run: git worktree list --porcelain to diagnose; check for .git/index.lock or a hung git process');
1082
+ }
1083
+ if (worktreeHealth.reason === 'git_list_failed') {
1084
+ addIssue('warning', 'W020',
1085
+ 'Worktree health check degraded: git worktree list failed — orphan/stale worktrees could not be inspected',
1086
+ 'Run: git worktree list --porcelain to diagnose; check git repository state and permissions');
1087
+ }
1088
+ // Other non-ok reasons (not_a_git_repo) are silent — not meaningful for
1089
+ // users who have no git repo.
1090
+ } else {
1091
+ for (const finding of worktreeHealth.findings) {
1092
+ if (finding.kind === 'orphan') {
1093
+ addIssue('warning', 'W017',
1094
+ `Orphan git worktree: ${finding.path} (path no longer exists on disk)`,
1095
+ 'Run: git worktree prune');
1096
+ continue;
1097
+ }
1098
+
1099
+ if (finding.kind === 'stale') {
1100
+ addIssue('warning', 'W017',
1101
+ `Stale git worktree: ${finding.path} (last modified ${finding.ageMinutes} minutes ago)`,
1102
+ `Run: git worktree remove ${finding.path} --force`);
1103
+ }
1104
+ }
1105
+ }
1106
+ } catch { /* git worktree not available or not a git repo — skip silently */ }
1107
+
1108
+ // ─── Check 12: MILESTONES.md / archive snapshot drift (#2446) ─────────────
1109
+ const milestonesPath = path.join(planBase, 'MILESTONES.md');
1110
+ const milestonesArchiveDir = path.join(planBase, 'milestones');
1111
+ const missingFromRegistry = [];
1112
+ try {
1113
+ if (fs.existsSync(milestonesArchiveDir)) {
1114
+ const archiveFiles = fs.readdirSync(milestonesArchiveDir);
1115
+ const archivedVersions = archiveFiles
1116
+ .map(f => f.match(/^(v\d+\.\d+(?:\.\d+)?)-ROADMAP\.md$/))
1117
+ .filter(Boolean)
1118
+ .map(m => m[1]);
1119
+
1120
+ if (archivedVersions.length > 0) {
1121
+ const registryContent = fs.existsSync(milestonesPath)
1122
+ ? fs.readFileSync(milestonesPath, 'utf-8')
1123
+ : '';
1124
+ for (const ver of archivedVersions) {
1125
+ if (!registryContent.includes(`## ${ver}`)) {
1126
+ missingFromRegistry.push(ver);
1127
+ }
1128
+ }
1129
+ if (missingFromRegistry.length > 0) {
1130
+ addIssue('warning', 'W018',
1131
+ `MILESTONES.md missing ${missingFromRegistry.length} archived milestone(s): ${missingFromRegistry.join(', ')}`,
1132
+ `Run ${slash('health')} --backfill to synthesize missing entries from archive snapshots`,
1133
+ true);
1134
+ repairs.push('backfillMilestones');
1135
+ }
1136
+ }
1137
+ }
1138
+ } catch { /* intentionally empty — milestone sync check is advisory */ }
1139
+
1140
+ // ─── Check 13: Unrecognized .planning/ root files (W019) ──────────────────
1141
+ try {
1142
+ const { isCanonicalPlanningFile } = require('./artifacts.cjs');
1143
+ const entries = fs.readdirSync(planBase, { withFileTypes: true });
1144
+ for (const entry of entries) {
1145
+ if (!entry.isFile()) continue;
1146
+ if (!entry.name.endsWith('.md')) continue;
1147
+ if (!isCanonicalPlanningFile(entry.name)) {
1148
+ addIssue('warning', 'W019',
1149
+ `Unrecognized .planning/ file: ${entry.name} — not a canonical GTD artifact`,
1150
+ 'Move to .planning/milestones/ archive subdir or delete if stale. See templates/README.md for the canonical artifact list.',
1151
+ false);
1152
+ }
1153
+ }
1154
+ } catch { /* artifact check is advisory — skip on error */ }
1155
+
1156
+ // ─── Perform repairs if requested ─────────────────────────────────────────
1157
+ const repairActions = [];
1158
+ if (options.repair && repairs.length > 0) {
1159
+ for (const repair of repairs) {
1160
+ try {
1161
+ switch (repair) {
1162
+ case 'createConfig':
1163
+ case 'resetConfig': {
1164
+ const defaults = {
1165
+ model_profile: CONFIG_DEFAULTS.model_profile,
1166
+ commit_docs: CONFIG_DEFAULTS.commit_docs,
1167
+ search_gitignored: CONFIG_DEFAULTS.search_gitignored,
1168
+ branching_strategy: CONFIG_DEFAULTS.branching_strategy,
1169
+ phase_branch_template: CONFIG_DEFAULTS.phase_branch_template,
1170
+ milestone_branch_template: CONFIG_DEFAULTS.milestone_branch_template,
1171
+ quick_branch_template: CONFIG_DEFAULTS.quick_branch_template,
1172
+ workflow: {
1173
+ research: CONFIG_DEFAULTS.research,
1174
+ plan_check: CONFIG_DEFAULTS.plan_checker,
1175
+ verifier: CONFIG_DEFAULTS.verifier,
1176
+ nyquist_validation: CONFIG_DEFAULTS.nyquist_validation,
1177
+ },
1178
+ parallelization: CONFIG_DEFAULTS.parallelization,
1179
+ brave_search: CONFIG_DEFAULTS.brave_search,
1180
+ };
1181
+ platformWriteSync(configPath, JSON.stringify(defaults, null, 2));
1182
+ repairActions.push({ action: repair, success: true, path: 'config.json' });
1183
+ break;
1184
+ }
1185
+ case 'regenerateState': {
1186
+ // Create timestamped backup before overwriting
1187
+ if (fs.existsSync(statePath)) {
1188
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
1189
+ const backupPath = `${statePath}.bak-${timestamp}`;
1190
+ fs.copyFileSync(statePath, backupPath);
1191
+ repairActions.push({ action: 'backupState', success: true, path: backupPath });
1192
+ }
1193
+ // Generate minimal STATE.md from ROADMAP.md structure
1194
+ const milestone = getMilestoneInfo(cwd);
1195
+ const projectRef = path
1196
+ .relative(cwd, path.join(planningDir(cwd), 'PROJECT.md'))
1197
+ .split(path.sep).join('/');
1198
+ let stateContent = `# Session State\n\n`;
1199
+ stateContent += `## Project Reference\n\n`;
1200
+ stateContent += `See: ${projectRef}\n\n`;
1201
+ stateContent += `## Position\n\n`;
1202
+ stateContent += `**Milestone:** ${milestone.version} ${milestone.name}\n`;
1203
+ stateContent += `**Current phase:** (determining...)\n`;
1204
+ stateContent += `**Status:** Resuming\n\n`;
1205
+ stateContent += `## Session Log\n\n`;
1206
+ stateContent += `- ${new Date().toISOString().split('T')[0]}: STATE.md regenerated by ${slash('health')} --repair\n`;
1207
+ writeStateMd(statePath, stateContent, cwd);
1208
+ repairActions.push({ action: repair, success: true, path: 'STATE.md' });
1209
+ break;
1210
+ }
1211
+ case 'addNyquistKey': {
1212
+ if (fs.existsSync(configPath)) {
1213
+ try {
1214
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
1215
+ const configParsed = JSON.parse(configRaw);
1216
+ if (!configParsed.workflow) configParsed.workflow = {};
1217
+ if (configParsed.workflow.nyquist_validation === undefined) {
1218
+ configParsed.workflow.nyquist_validation = true;
1219
+ platformWriteSync(configPath, JSON.stringify(configParsed, null, 2));
1220
+ }
1221
+ repairActions.push({ action: repair, success: true, path: 'config.json' });
1222
+ } catch (err) {
1223
+ repairActions.push({ action: repair, success: false, error: err.message });
1224
+ }
1225
+ }
1226
+ break;
1227
+ }
1228
+ case 'addAiIntegrationPhaseKey': {
1229
+ if (fs.existsSync(configPath)) {
1230
+ try {
1231
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
1232
+ const configParsed = JSON.parse(configRaw);
1233
+ if (!configParsed.workflow) configParsed.workflow = {};
1234
+ if (configParsed.workflow.ai_integration_phase === undefined) {
1235
+ configParsed.workflow.ai_integration_phase = true;
1236
+ platformWriteSync(configPath, JSON.stringify(configParsed, null, 2));
1237
+ }
1238
+ repairActions.push({ action: repair, success: true, path: 'config.json' });
1239
+ } catch (err) {
1240
+ repairActions.push({ action: repair, success: false, error: err.message });
1241
+ }
1242
+ }
1243
+ break;
1244
+ }
1245
+ case 'backfillMilestones': {
1246
+ if (!options.backfill && !options.repair) break;
1247
+ const today = new Date().toISOString().split('T')[0];
1248
+ let backfilled = 0;
1249
+ for (const ver of missingFromRegistry) {
1250
+ try {
1251
+ const snapshotPath = path.join(milestonesArchiveDir, `${ver}-ROADMAP.md`);
1252
+ const snapshot = safeReadFile(snapshotPath);
1253
+ // Build minimal entry from snapshot title or version
1254
+ const titleMatch = snapshot && snapshot.match(/^#\s+(.+)$/m);
1255
+ const milestoneName = titleMatch ? titleMatch[1].replace(/^Milestone\s+/i, '').replace(/^v[\d.]+\s*/, '').trim() : ver;
1256
+ const entry = `## ${ver}${milestoneName && milestoneName !== ver ? ` ${milestoneName}` : ''} (Backfilled: ${today})\n\n**Note:** Synthesized from archive snapshot by \`${slash('health')} --backfill\`. Original completion date unknown.\n\n---\n\n`;
1257
+ const milestonesContent = fs.existsSync(milestonesPath)
1258
+ ? fs.readFileSync(milestonesPath, 'utf-8')
1259
+ : '';
1260
+ if (!milestonesContent.trim()) {
1261
+ platformWriteSync(milestonesPath, `# Milestones\n\n${entry}`);
1262
+ } else {
1263
+ const headerMatch = milestonesContent.match(/^(#{1,3}\s+[^\n]*\n\n?)/);
1264
+ if (headerMatch) {
1265
+ const header = headerMatch[1];
1266
+ const rest = milestonesContent.slice(header.length);
1267
+ platformWriteSync(milestonesPath, header + entry + rest);
1268
+ } else {
1269
+ platformWriteSync(milestonesPath, entry + milestonesContent);
1270
+ }
1271
+ }
1272
+ backfilled++;
1273
+ } catch { /* intentionally empty — partial backfill is acceptable */ }
1274
+ }
1275
+ repairActions.push({ action: repair, success: true, detail: `Backfilled ${backfilled} milestone(s) into MILESTONES.md` });
1276
+ break;
1277
+ }
1278
+ }
1279
+ } catch (err) {
1280
+ repairActions.push({ action: repair, success: false, error: err.message });
1281
+ }
1282
+ }
1283
+ }
1284
+
1285
+ // ─── Determine overall status ─────────────────────────────────────────────
1286
+ let status;
1287
+ if (errors.length > 0) {
1288
+ status = 'broken';
1289
+ } else if (warnings.length > 0) {
1290
+ status = 'degraded';
1291
+ } else {
1292
+ status = 'healthy';
1293
+ }
1294
+
1295
+ const repairableCount = errors.filter(e => e.repairable).length +
1296
+ warnings.filter(w => w.repairable).length;
1297
+
1298
+ const result = {
1299
+ status,
1300
+ errors,
1301
+ warnings,
1302
+ info,
1303
+ repairable_count: repairableCount,
1304
+ repairs_performed: repairActions.length > 0 ? repairActions : undefined,
1305
+ };
1306
+ output(result, raw);
1307
+ return result;
1308
+ }
1309
+
1310
+ /**
1311
+ * Validate agent installation status (#1371).
1312
+ * Returns detailed information about which agents are installed and which are missing.
1313
+ */
1314
+ function cmdValidateAgents(cwd, raw) {
1315
+ const { MODEL_PROFILES } = require('./model-profiles.cjs');
1316
+ const agentStatus = checkAgentsInstalled();
1317
+ const expected = Object.keys(MODEL_PROFILES);
1318
+
1319
+ output({
1320
+ agents_dir: agentStatus.agents_dir,
1321
+ agents_found: agentStatus.agents_installed,
1322
+ installed: agentStatus.installed_agents,
1323
+ missing: agentStatus.missing_agents,
1324
+ expected,
1325
+ }, raw);
1326
+ }
1327
+
1328
+ // ─── Schema Drift Detection ──────────────────────────────────────────────────
1329
+
1330
+ function cmdVerifySchemaDrift(cwd, phaseArg, skipFlag, raw) {
1331
+ const { detectSchemaFiles, checkSchemaDrift } = require('./schema-detect.cjs');
1332
+
1333
+ if (!phaseArg) {
1334
+ error('Usage: verify schema-drift <phase> [--skip]');
1335
+ return;
1336
+ }
1337
+
1338
+ // Find phase directory
1339
+ const pDir = planningDir(cwd);
1340
+ const phasesDir = path.join(pDir, 'phases');
1341
+ if (!fs.existsSync(phasesDir)) {
1342
+ output({ drift_detected: false, blocking: false, message: 'No phases directory' }, raw);
1343
+ return;
1344
+ }
1345
+
1346
+ // Find matching phase directory
1347
+ let phaseDir = null;
1348
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
1349
+ for (const entry of entries) {
1350
+ if (entry.isDirectory() && entry.name.includes(phaseArg)) {
1351
+ phaseDir = path.join(phasesDir, entry.name);
1352
+ break;
1353
+ }
1354
+ }
1355
+
1356
+ // Also try exact match
1357
+ if (!phaseDir) {
1358
+ const exact = path.join(phasesDir, phaseArg);
1359
+ if (fs.existsSync(exact)) phaseDir = exact;
1360
+ }
1361
+
1362
+ if (!phaseDir) {
1363
+ output({ drift_detected: false, blocking: false, message: `Phase directory not found: ${phaseArg}` }, raw);
1364
+ return;
1365
+ }
1366
+
1367
+ // Collect files_modified from all PLAN.md files in the phase
1368
+ const allFiles = [];
1369
+ const planFiles = fs.readdirSync(phaseDir).filter(f => f.endsWith('-PLAN.md'));
1370
+ for (const pf of planFiles) {
1371
+ const content = fs.readFileSync(path.join(phaseDir, pf), 'utf-8');
1372
+ // Extract files_modified from frontmatter
1373
+ const fmMatch = content.match(/files_modified:\s*\[([^\]]*)\]/);
1374
+ if (fmMatch) {
1375
+ const files = fmMatch[1].split(',').map(f => f.trim()).filter(Boolean);
1376
+ allFiles.push(...files);
1377
+ }
1378
+ }
1379
+
1380
+ // Collect execution log from SUMMARY.md files
1381
+ let executionLog = '';
1382
+ const summaryFiles = fs.readdirSync(phaseDir).filter(f => f.endsWith('-SUMMARY.md'));
1383
+ for (const sf of summaryFiles) {
1384
+ executionLog += fs.readFileSync(path.join(phaseDir, sf), 'utf-8') + '\n';
1385
+ }
1386
+
1387
+ // Also check git commit messages for push evidence
1388
+ const gitLog = execGit(['log', '--oneline', '--all', '-50'], { cwd });
1389
+ if (gitLog.exitCode === 0) {
1390
+ executionLog += '\n' + gitLog.stdout;
1391
+ }
1392
+
1393
+ const result = checkSchemaDrift(allFiles, executionLog, { skipCheck: !!skipFlag });
1394
+
1395
+ output({
1396
+ drift_detected: result.driftDetected,
1397
+ blocking: result.blocking,
1398
+ schema_files: result.schemaFiles,
1399
+ orms: result.orms,
1400
+ unpushed_orms: result.unpushedOrms,
1401
+ message: result.message,
1402
+ skipped: result.skipped || false,
1403
+ }, raw);
1404
+ }
1405
+
1406
+ // ─── Codebase Drift Detection (#2003) ────────────────────────────────────────
1407
+
1408
+ /**
1409
+ * Detect structural drift between the committed tree and
1410
+ * `.planning/codebase/STRUCTURE.md`. Non-blocking: any failure returns a
1411
+ * `{ skipped: true }` JSON result with a reason; the command never exits
1412
+ * non-zero so `task orchestration flow`'s drift gate cannot fail the phase.
1413
+ */
1414
+ function cmdVerifyCodebaseDrift(cwd, raw) {
1415
+ const drift = require('./drift.cjs');
1416
+
1417
+ const emit = (payload) => output(payload, raw);
1418
+
1419
+ try {
1420
+ const codebaseDir = path.join(planningDir(cwd), 'codebase');
1421
+ const structurePath = path.join(codebaseDir, 'STRUCTURE.md');
1422
+ if (!fs.existsSync(structurePath)) {
1423
+ emit({
1424
+ skipped: true,
1425
+ reason: 'no-structure-md',
1426
+ action_required: false,
1427
+ directive: 'none',
1428
+ elements: [],
1429
+ });
1430
+ return;
1431
+ }
1432
+
1433
+ let structureMd;
1434
+ try {
1435
+ structureMd = fs.readFileSync(structurePath, 'utf-8');
1436
+ } catch (err) {
1437
+ emit({
1438
+ skipped: true,
1439
+ reason: 'cannot-read-structure-md: ' + err.message,
1440
+ action_required: false,
1441
+ directive: 'none',
1442
+ elements: [],
1443
+ });
1444
+ return;
1445
+ }
1446
+
1447
+ const lastMapped = drift.readMappedCommit(structurePath);
1448
+
1449
+ // Verify we're inside a git repo and resolve the diff range.
1450
+ const revProbe = execGit(['rev-parse', 'HEAD'], { cwd });
1451
+ if (revProbe.exitCode !== 0) {
1452
+ emit({
1453
+ skipped: true,
1454
+ reason: 'not-a-git-repo',
1455
+ action_required: false,
1456
+ directive: 'none',
1457
+ elements: [],
1458
+ });
1459
+ return;
1460
+ }
1461
+
1462
+ // Empty-tree SHA is a stable fallback when no mapping commit is recorded.
1463
+ const EMPTY_TREE = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
1464
+ let base = lastMapped;
1465
+ if (!base) {
1466
+ base = EMPTY_TREE;
1467
+ } else {
1468
+ // Verify the commit is reachable; if not, fall back to EMPTY_TREE.
1469
+ const verify = execGit(['cat-file', '-t', base], { cwd });
1470
+ if (verify.exitCode !== 0) base = EMPTY_TREE;
1471
+ }
1472
+
1473
+ const diff = execGit(['diff', '--name-status', base, 'HEAD'], { cwd });
1474
+ if (diff.exitCode !== 0) {
1475
+ emit({
1476
+ skipped: true,
1477
+ reason: 'git-diff-failed',
1478
+ action_required: false,
1479
+ directive: 'none',
1480
+ elements: [],
1481
+ });
1482
+ return;
1483
+ }
1484
+
1485
+ const added = [];
1486
+ const modified = [];
1487
+ const deleted = [];
1488
+ for (const line of diff.stdout.split(/\r?\n/)) {
1489
+ if (!line.trim()) continue;
1490
+ const m = line.match(/^([A-Z])\d*\t(.+?)(?:\t(.+))?$/);
1491
+ if (!m) continue;
1492
+ const status = m[1];
1493
+ // For renames (R), use the new path (m[3] if present, else m[2]).
1494
+ const file = m[3] || m[2];
1495
+ if (status === 'A' || status === 'R' || status === 'C') added.push(file);
1496
+ else if (status === 'M') modified.push(file);
1497
+ else if (status === 'D') deleted.push(file);
1498
+ }
1499
+
1500
+ // Threshold and action read from config, with defaults.
1501
+ const config = loadConfig(cwd);
1502
+ const threshold = Number.isInteger(config?.workflow?.drift_threshold) && config.workflow.drift_threshold >= 1
1503
+ ? config.workflow.drift_threshold
1504
+ : 3;
1505
+ const action = config?.workflow?.drift_action === 'auto-remap' ? 'auto-remap' : 'warn';
1506
+
1507
+ const result = drift.detectDrift({
1508
+ addedFiles: added,
1509
+ modifiedFiles: modified,
1510
+ deletedFiles: deleted,
1511
+ structureMd,
1512
+ threshold,
1513
+ action,
1514
+ // #3584: keep drift.cjs a pure library — resolve the runtime here and
1515
+ // pass the literal name in so drift never touches env/config itself.
1516
+ runtime: resolveRuntime(cwd),
1517
+ });
1518
+
1519
+ emit({
1520
+ skipped: !!result.skipped,
1521
+ reason: result.reason || null,
1522
+ action_required: !!result.actionRequired,
1523
+ directive: result.directive,
1524
+ spawn_mapper: !!result.spawnMapper,
1525
+ affected_paths: result.affectedPaths || [],
1526
+ elements: result.elements || [],
1527
+ threshold,
1528
+ action,
1529
+ last_mapped_commit: lastMapped,
1530
+ message: result.message || '',
1531
+ });
1532
+ } catch (err) {
1533
+ // Non-blocking: never bubble up an exception.
1534
+ emit({
1535
+ skipped: true,
1536
+ reason: 'exception: ' + (err && err.message ? err.message : String(err)),
1537
+ action_required: false,
1538
+ directive: 'none',
1539
+ elements: [],
1540
+ });
1541
+ }
1542
+ }
1543
+
1544
+ module.exports = {
1545
+ cmdVerifySummary,
1546
+ cmdVerifyPlanStructure,
1547
+ cmdVerifyPhaseCompleteness,
1548
+ cmdVerifyReferences,
1549
+ cmdVerifyCommits,
1550
+ cmdVerifyArtifacts,
1551
+ cmdVerifyKeyLinks,
1552
+ cmdValidateConsistency,
1553
+ cmdValidateHealth,
1554
+ cmdValidateAgents,
1555
+ cmdVerifySchemaDrift,
1556
+ cmdVerifyCodebaseDrift,
1557
+ };