@jokerized/getresearchdone 0.4.1

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 (711) hide show
  1. package/.claude-plugin/plugin.json +103 -0
  2. package/README.md +211 -0
  3. package/agents/grd-baseline-assessor.md +684 -0
  4. package/agents/grd-code-reviewer.md +300 -0
  5. package/agents/grd-codebase-mapper.md +355 -0
  6. package/agents/grd-critique-agent.md +119 -0
  7. package/agents/grd-debugger.md +519 -0
  8. package/agents/grd-deep-diver.md +737 -0
  9. package/agents/grd-eval-planner.md +913 -0
  10. package/agents/grd-eval-reporter.md +717 -0
  11. package/agents/grd-executor.md +683 -0
  12. package/agents/grd-feasibility-analyst.md +624 -0
  13. package/agents/grd-integration-checker.md +367 -0
  14. package/agents/grd-knowledge-miner.md +81 -0
  15. package/agents/grd-migrator.md +88 -0
  16. package/agents/grd-phase-researcher.md +697 -0
  17. package/agents/grd-plan-checker.md +443 -0
  18. package/agents/grd-planner.md +1532 -0
  19. package/agents/grd-product-owner.md +562 -0
  20. package/agents/grd-project-researcher.md +513 -0
  21. package/agents/grd-research-synthesizer.md +273 -0
  22. package/agents/grd-roadmapper.md +798 -0
  23. package/agents/grd-surveyor.md +566 -0
  24. package/agents/grd-verifier.md +893 -0
  25. package/bin/gd.js +4 -0
  26. package/bin/gd.ts +227 -0
  27. package/bin/grd-manifest.js +4 -0
  28. package/bin/grd-manifest.ts +286 -0
  29. package/bin/grd-mcp-server.js +4 -0
  30. package/bin/grd-mcp-server.ts +124 -0
  31. package/bin/grd-tools.js +4 -0
  32. package/bin/grd-tools.ts +2471 -0
  33. package/bin/postinstall.js +4 -0
  34. package/bin/postinstall.ts +80 -0
  35. package/commands/add-phase.md +123 -0
  36. package/commands/add-todo.md +87 -0
  37. package/commands/assess-baseline.md +289 -0
  38. package/commands/autopilot.md +100 -0
  39. package/commands/autoplan.md +55 -0
  40. package/commands/check-todos.md +87 -0
  41. package/commands/compare-methods.md +262 -0
  42. package/commands/complete-milestone.md +225 -0
  43. package/commands/debug.md +372 -0
  44. package/commands/deep-dive.md +288 -0
  45. package/commands/discover.md +281 -0
  46. package/commands/discuss-phase.md +188 -0
  47. package/commands/discuss.md +55 -0
  48. package/commands/eval-report.md +310 -0
  49. package/commands/evolve.md +79 -0
  50. package/commands/execute-phase.md +1017 -0
  51. package/commands/feasibility.md +292 -0
  52. package/commands/help.md +407 -0
  53. package/commands/init.md +1508 -0
  54. package/commands/insert-phase.md +113 -0
  55. package/commands/iterate.md +327 -0
  56. package/commands/list-phase-assumptions.md +217 -0
  57. package/commands/long-term-roadmap.md +202 -0
  58. package/commands/map-codebase.md +111 -0
  59. package/commands/migrate.md +159 -0
  60. package/commands/new-milestone.md +169 -0
  61. package/commands/pause-work.md +83 -0
  62. package/commands/plan-milestone-gaps.md +373 -0
  63. package/commands/plan-phase.md +655 -0
  64. package/commands/principles.md +328 -0
  65. package/commands/product-plan.md +319 -0
  66. package/commands/progress.md +481 -0
  67. package/commands/quick.md +167 -0
  68. package/commands/reapply-patches.md +154 -0
  69. package/commands/remove-phase.md +97 -0
  70. package/commands/requirement.md +96 -0
  71. package/commands/resume-project.md +113 -0
  72. package/commands/settings.md +1144 -0
  73. package/commands/survey.md +242 -0
  74. package/commands/sync.md +246 -0
  75. package/commands/tracker-setup.md +322 -0
  76. package/commands/update.md +202 -0
  77. package/commands/verify-phase.md +335 -0
  78. package/commands/verify-work.md +701 -0
  79. package/commands/wireup.md +29 -0
  80. package/dist/bin/gd.d.ts +3 -0
  81. package/dist/bin/gd.d.ts.map +1 -0
  82. package/dist/bin/gd.js +178 -0
  83. package/dist/bin/gd.js.map +1 -0
  84. package/dist/bin/grd-manifest.d.ts +3 -0
  85. package/dist/bin/grd-manifest.d.ts.map +1 -0
  86. package/dist/bin/grd-manifest.js +202 -0
  87. package/dist/bin/grd-manifest.js.map +1 -0
  88. package/dist/bin/grd-mcp-server.d.ts +3 -0
  89. package/dist/bin/grd-mcp-server.d.ts.map +1 -0
  90. package/dist/bin/grd-mcp-server.js +71 -0
  91. package/dist/bin/grd-mcp-server.js.map +1 -0
  92. package/dist/bin/grd-tools.d.ts +3 -0
  93. package/dist/bin/grd-tools.d.ts.map +1 -0
  94. package/dist/bin/grd-tools.js +1680 -0
  95. package/dist/bin/grd-tools.js.map +1 -0
  96. package/dist/bin/postinstall.d.ts +3 -0
  97. package/dist/bin/postinstall.d.ts.map +1 -0
  98. package/dist/bin/postinstall.js +61 -0
  99. package/dist/bin/postinstall.js.map +1 -0
  100. package/dist/lib/autopilot-milestone.d.ts +2 -0
  101. package/dist/lib/autopilot-milestone.d.ts.map +1 -0
  102. package/dist/lib/autopilot-milestone.js +94 -0
  103. package/dist/lib/autopilot-milestone.js.map +1 -0
  104. package/dist/lib/autopilot-pipeline.d.ts +2 -0
  105. package/dist/lib/autopilot-pipeline.d.ts.map +1 -0
  106. package/dist/lib/autopilot-pipeline.js +830 -0
  107. package/dist/lib/autopilot-pipeline.js.map +1 -0
  108. package/dist/lib/autopilot-waves.d.ts +2 -0
  109. package/dist/lib/autopilot-waves.d.ts.map +1 -0
  110. package/dist/lib/autopilot-waves.js +266 -0
  111. package/dist/lib/autopilot-waves.js.map +1 -0
  112. package/dist/lib/autopilot.d.ts +2 -0
  113. package/dist/lib/autopilot.d.ts.map +1 -0
  114. package/dist/lib/autopilot.js +1314 -0
  115. package/dist/lib/autopilot.js.map +1 -0
  116. package/dist/lib/autoplan.d.ts +2 -0
  117. package/dist/lib/autoplan.d.ts.map +1 -0
  118. package/dist/lib/autoplan.js +198 -0
  119. package/dist/lib/autoplan.js.map +1 -0
  120. package/dist/lib/autoresearch.d.ts +2 -0
  121. package/dist/lib/autoresearch.d.ts.map +1 -0
  122. package/dist/lib/autoresearch.js +626 -0
  123. package/dist/lib/autoresearch.js.map +1 -0
  124. package/dist/lib/backend.d.ts +2 -0
  125. package/dist/lib/backend.d.ts.map +1 -0
  126. package/dist/lib/backend.js +1036 -0
  127. package/dist/lib/backend.js.map +1 -0
  128. package/dist/lib/benchmark.d.ts +99 -0
  129. package/dist/lib/benchmark.d.ts.map +1 -0
  130. package/dist/lib/benchmark.js +278 -0
  131. package/dist/lib/benchmark.js.map +1 -0
  132. package/dist/lib/citations.d.ts +2 -0
  133. package/dist/lib/citations.d.ts.map +1 -0
  134. package/dist/lib/citations.js +642 -0
  135. package/dist/lib/citations.js.map +1 -0
  136. package/dist/lib/cleanup.d.ts +2 -0
  137. package/dist/lib/cleanup.d.ts.map +1 -0
  138. package/dist/lib/cleanup.js +1222 -0
  139. package/dist/lib/cleanup.js.map +1 -0
  140. package/dist/lib/cli/adapters.d.ts +10 -0
  141. package/dist/lib/cli/adapters.d.ts.map +1 -0
  142. package/dist/lib/cli/adapters.js +27 -0
  143. package/dist/lib/cli/adapters.js.map +1 -0
  144. package/dist/lib/cli/agent.d.ts +17 -0
  145. package/dist/lib/cli/agent.d.ts.map +1 -0
  146. package/dist/lib/cli/agent.js +53 -0
  147. package/dist/lib/cli/agent.js.map +1 -0
  148. package/dist/lib/cli/index.d.ts +21 -0
  149. package/dist/lib/cli/index.d.ts.map +1 -0
  150. package/dist/lib/cli/index.js +264 -0
  151. package/dist/lib/cli/index.js.map +1 -0
  152. package/dist/lib/cli/output.d.ts +20 -0
  153. package/dist/lib/cli/output.d.ts.map +1 -0
  154. package/dist/lib/cli/output.js +22 -0
  155. package/dist/lib/cli/output.js.map +1 -0
  156. package/dist/lib/cli/scan-dispatch.d.ts +9 -0
  157. package/dist/lib/cli/scan-dispatch.d.ts.map +1 -0
  158. package/dist/lib/cli/scan-dispatch.js +107 -0
  159. package/dist/lib/cli/scan-dispatch.js.map +1 -0
  160. package/dist/lib/cli/tools.d.ts +16 -0
  161. package/dist/lib/cli/tools.d.ts.map +1 -0
  162. package/dist/lib/cli/tools.js +168 -0
  163. package/dist/lib/cli/tools.js.map +1 -0
  164. package/dist/lib/commands/_dashboard-parsers.d.ts +2 -0
  165. package/dist/lib/commands/_dashboard-parsers.d.ts.map +1 -0
  166. package/dist/lib/commands/_dashboard-parsers.js +192 -0
  167. package/dist/lib/commands/_dashboard-parsers.js.map +1 -0
  168. package/dist/lib/commands/analysis.d.ts +2 -0
  169. package/dist/lib/commands/analysis.d.ts.map +1 -0
  170. package/dist/lib/commands/analysis.js +1418 -0
  171. package/dist/lib/commands/analysis.js.map +1 -0
  172. package/dist/lib/commands/assumptions.d.ts +2 -0
  173. package/dist/lib/commands/assumptions.d.ts.map +1 -0
  174. package/dist/lib/commands/assumptions.js +166 -0
  175. package/dist/lib/commands/assumptions.js.map +1 -0
  176. package/dist/lib/commands/blame.d.ts +2 -0
  177. package/dist/lib/commands/blame.d.ts.map +1 -0
  178. package/dist/lib/commands/blame.js +133 -0
  179. package/dist/lib/commands/blame.js.map +1 -0
  180. package/dist/lib/commands/budget.d.ts +2 -0
  181. package/dist/lib/commands/budget.d.ts.map +1 -0
  182. package/dist/lib/commands/budget.js +100 -0
  183. package/dist/lib/commands/budget.js.map +1 -0
  184. package/dist/lib/commands/check-plans.d.ts +2 -0
  185. package/dist/lib/commands/check-plans.d.ts.map +1 -0
  186. package/dist/lib/commands/check-plans.js +190 -0
  187. package/dist/lib/commands/check-plans.js.map +1 -0
  188. package/dist/lib/commands/config.d.ts +2 -0
  189. package/dist/lib/commands/config.d.ts.map +1 -0
  190. package/dist/lib/commands/config.js +188 -0
  191. package/dist/lib/commands/config.js.map +1 -0
  192. package/dist/lib/commands/dashboard.d.ts +2 -0
  193. package/dist/lib/commands/dashboard.d.ts.map +1 -0
  194. package/dist/lib/commands/dashboard.js +466 -0
  195. package/dist/lib/commands/dashboard.js.map +1 -0
  196. package/dist/lib/commands/estimate.d.ts +2 -0
  197. package/dist/lib/commands/estimate.d.ts.map +1 -0
  198. package/dist/lib/commands/estimate.js +148 -0
  199. package/dist/lib/commands/estimate.js.map +1 -0
  200. package/dist/lib/commands/eval-diff.d.ts +2 -0
  201. package/dist/lib/commands/eval-diff.d.ts.map +1 -0
  202. package/dist/lib/commands/eval-diff.js +213 -0
  203. package/dist/lib/commands/eval-diff.js.map +1 -0
  204. package/dist/lib/commands/freshness.d.ts +2 -0
  205. package/dist/lib/commands/freshness.d.ts.map +1 -0
  206. package/dist/lib/commands/freshness.js +163 -0
  207. package/dist/lib/commands/freshness.js.map +1 -0
  208. package/dist/lib/commands/health.d.ts +2 -0
  209. package/dist/lib/commands/health.d.ts.map +1 -0
  210. package/dist/lib/commands/health.js +435 -0
  211. package/dist/lib/commands/health.js.map +1 -0
  212. package/dist/lib/commands/index.d.ts +2 -0
  213. package/dist/lib/commands/index.d.ts.map +1 -0
  214. package/dist/lib/commands/index.js +128 -0
  215. package/dist/lib/commands/index.js.map +1 -0
  216. package/dist/lib/commands/install.d.ts +56 -0
  217. package/dist/lib/commands/install.d.ts.map +1 -0
  218. package/dist/lib/commands/install.js +214 -0
  219. package/dist/lib/commands/install.js.map +1 -0
  220. package/dist/lib/commands/knowhow-aggregator.d.ts +2 -0
  221. package/dist/lib/commands/knowhow-aggregator.d.ts.map +1 -0
  222. package/dist/lib/commands/knowhow-aggregator.js +279 -0
  223. package/dist/lib/commands/knowhow-aggregator.js.map +1 -0
  224. package/dist/lib/commands/knowledge-search.d.ts +2 -0
  225. package/dist/lib/commands/knowledge-search.d.ts.map +1 -0
  226. package/dist/lib/commands/knowledge-search.js +113 -0
  227. package/dist/lib/commands/knowledge-search.js.map +1 -0
  228. package/dist/lib/commands/long-term-roadmap.d.ts +2 -0
  229. package/dist/lib/commands/long-term-roadmap.d.ts.map +1 -0
  230. package/dist/lib/commands/long-term-roadmap.js +272 -0
  231. package/dist/lib/commands/long-term-roadmap.js.map +1 -0
  232. package/dist/lib/commands/patterns.d.ts +91 -0
  233. package/dist/lib/commands/patterns.d.ts.map +1 -0
  234. package/dist/lib/commands/patterns.js +391 -0
  235. package/dist/lib/commands/patterns.js.map +1 -0
  236. package/dist/lib/commands/phase-info.d.ts +2 -0
  237. package/dist/lib/commands/phase-info.d.ts.map +1 -0
  238. package/dist/lib/commands/phase-info.js +509 -0
  239. package/dist/lib/commands/phase-info.js.map +1 -0
  240. package/dist/lib/commands/plan-lint.d.ts +56 -0
  241. package/dist/lib/commands/plan-lint.d.ts.map +1 -0
  242. package/dist/lib/commands/plan-lint.js +481 -0
  243. package/dist/lib/commands/plan-lint.js.map +1 -0
  244. package/dist/lib/commands/plan-phase.d.ts +53 -0
  245. package/dist/lib/commands/plan-phase.d.ts.map +1 -0
  246. package/dist/lib/commands/plan-phase.js +288 -0
  247. package/dist/lib/commands/plan-phase.js.map +1 -0
  248. package/dist/lib/commands/progress.d.ts +2 -0
  249. package/dist/lib/commands/progress.d.ts.map +1 -0
  250. package/dist/lib/commands/progress.js +266 -0
  251. package/dist/lib/commands/progress.js.map +1 -0
  252. package/dist/lib/commands/quality.d.ts +2 -0
  253. package/dist/lib/commands/quality.d.ts.map +1 -0
  254. package/dist/lib/commands/quality.js +80 -0
  255. package/dist/lib/commands/quality.js.map +1 -0
  256. package/dist/lib/commands/rollback.d.ts +2 -0
  257. package/dist/lib/commands/rollback.d.ts.map +1 -0
  258. package/dist/lib/commands/rollback.js +145 -0
  259. package/dist/lib/commands/rollback.js.map +1 -0
  260. package/dist/lib/commands/scan.d.ts +25 -0
  261. package/dist/lib/commands/scan.d.ts.map +1 -0
  262. package/dist/lib/commands/scan.js +28 -0
  263. package/dist/lib/commands/scan.js.map +1 -0
  264. package/dist/lib/commands/search.d.ts +2 -0
  265. package/dist/lib/commands/search.d.ts.map +1 -0
  266. package/dist/lib/commands/search.js +212 -0
  267. package/dist/lib/commands/search.js.map +1 -0
  268. package/dist/lib/commands/select-candidate.d.ts +128 -0
  269. package/dist/lib/commands/select-candidate.d.ts.map +1 -0
  270. package/dist/lib/commands/select-candidate.js +518 -0
  271. package/dist/lib/commands/select-candidate.js.map +1 -0
  272. package/dist/lib/commands/singularity.d.ts +2 -0
  273. package/dist/lib/commands/singularity.d.ts.map +1 -0
  274. package/dist/lib/commands/singularity.js +185 -0
  275. package/dist/lib/commands/singularity.js.map +1 -0
  276. package/dist/lib/commands/slug-timestamp.d.ts +2 -0
  277. package/dist/lib/commands/slug-timestamp.d.ts.map +1 -0
  278. package/dist/lib/commands/slug-timestamp.js +54 -0
  279. package/dist/lib/commands/slug-timestamp.js.map +1 -0
  280. package/dist/lib/commands/tail.d.ts +2 -0
  281. package/dist/lib/commands/tail.d.ts.map +1 -0
  282. package/dist/lib/commands/tail.js +100 -0
  283. package/dist/lib/commands/tail.js.map +1 -0
  284. package/dist/lib/commands/todo.d.ts +2 -0
  285. package/dist/lib/commands/todo.d.ts.map +1 -0
  286. package/dist/lib/commands/todo.js +200 -0
  287. package/dist/lib/commands/todo.js.map +1 -0
  288. package/dist/lib/commands/watch.d.ts +2 -0
  289. package/dist/lib/commands/watch.d.ts.map +1 -0
  290. package/dist/lib/commands/watch.js +72 -0
  291. package/dist/lib/commands/watch.js.map +1 -0
  292. package/dist/lib/complexity.d.ts +55 -0
  293. package/dist/lib/complexity.d.ts.map +1 -0
  294. package/dist/lib/complexity.js +80 -0
  295. package/dist/lib/complexity.js.map +1 -0
  296. package/dist/lib/context/agents.d.ts +2 -0
  297. package/dist/lib/context/agents.d.ts.map +1 -0
  298. package/dist/lib/context/agents.js +344 -0
  299. package/dist/lib/context/agents.js.map +1 -0
  300. package/dist/lib/context/base.d.ts +2 -0
  301. package/dist/lib/context/base.d.ts.map +1 -0
  302. package/dist/lib/context/base.js +81 -0
  303. package/dist/lib/context/base.js.map +1 -0
  304. package/dist/lib/context/execute.d.ts +2 -0
  305. package/dist/lib/context/execute.d.ts.map +1 -0
  306. package/dist/lib/context/execute.js +753 -0
  307. package/dist/lib/context/execute.js.map +1 -0
  308. package/dist/lib/context/index.d.ts +2 -0
  309. package/dist/lib/context/index.d.ts.map +1 -0
  310. package/dist/lib/context/index.js +88 -0
  311. package/dist/lib/context/index.js.map +1 -0
  312. package/dist/lib/context/progress.d.ts +2 -0
  313. package/dist/lib/context/progress.d.ts.map +1 -0
  314. package/dist/lib/context/progress.js +178 -0
  315. package/dist/lib/context/progress.js.map +1 -0
  316. package/dist/lib/context/project.d.ts +2 -0
  317. package/dist/lib/context/project.d.ts.map +1 -0
  318. package/dist/lib/context/project.js +413 -0
  319. package/dist/lib/context/project.js.map +1 -0
  320. package/dist/lib/context/research.d.ts +2 -0
  321. package/dist/lib/context/research.d.ts.map +1 -0
  322. package/dist/lib/context/research.js +466 -0
  323. package/dist/lib/context/research.js.map +1 -0
  324. package/dist/lib/dead-ends.d.ts +28 -0
  325. package/dist/lib/dead-ends.d.ts.map +1 -0
  326. package/dist/lib/dead-ends.js +451 -0
  327. package/dist/lib/dead-ends.js.map +1 -0
  328. package/dist/lib/deps.d.ts +2 -0
  329. package/dist/lib/deps.d.ts.map +1 -0
  330. package/dist/lib/deps.js +630 -0
  331. package/dist/lib/deps.js.map +1 -0
  332. package/dist/lib/discussion.d.ts +2 -0
  333. package/dist/lib/discussion.d.ts.map +1 -0
  334. package/dist/lib/discussion.js +1041 -0
  335. package/dist/lib/discussion.js.map +1 -0
  336. package/dist/lib/drift.d.ts +36 -0
  337. package/dist/lib/drift.d.ts.map +1 -0
  338. package/dist/lib/drift.js +481 -0
  339. package/dist/lib/drift.js.map +1 -0
  340. package/dist/lib/evolve/_dimensions-features.d.ts +2 -0
  341. package/dist/lib/evolve/_dimensions-features.d.ts.map +1 -0
  342. package/dist/lib/evolve/_dimensions-features.js +369 -0
  343. package/dist/lib/evolve/_dimensions-features.js.map +1 -0
  344. package/dist/lib/evolve/_dimensions.d.ts +2 -0
  345. package/dist/lib/evolve/_dimensions.d.ts.map +1 -0
  346. package/dist/lib/evolve/_dimensions.js +358 -0
  347. package/dist/lib/evolve/_dimensions.js.map +1 -0
  348. package/dist/lib/evolve/_product-ideation.d.ts +2 -0
  349. package/dist/lib/evolve/_product-ideation.d.ts.map +1 -0
  350. package/dist/lib/evolve/_product-ideation.js +281 -0
  351. package/dist/lib/evolve/_product-ideation.js.map +1 -0
  352. package/dist/lib/evolve/_prompts.d.ts +2 -0
  353. package/dist/lib/evolve/_prompts.d.ts.map +1 -0
  354. package/dist/lib/evolve/_prompts.js +153 -0
  355. package/dist/lib/evolve/_prompts.js.map +1 -0
  356. package/dist/lib/evolve/cli.d.ts +2 -0
  357. package/dist/lib/evolve/cli.d.ts.map +1 -0
  358. package/dist/lib/evolve/cli.js +224 -0
  359. package/dist/lib/evolve/cli.js.map +1 -0
  360. package/dist/lib/evolve/discovery.d.ts +2 -0
  361. package/dist/lib/evolve/discovery.d.ts.map +1 -0
  362. package/dist/lib/evolve/discovery.js +391 -0
  363. package/dist/lib/evolve/discovery.js.map +1 -0
  364. package/dist/lib/evolve/index.d.ts +2 -0
  365. package/dist/lib/evolve/index.d.ts.map +1 -0
  366. package/dist/lib/evolve/index.js +88 -0
  367. package/dist/lib/evolve/index.js.map +1 -0
  368. package/dist/lib/evolve/orchestrator.d.ts +2 -0
  369. package/dist/lib/evolve/orchestrator.d.ts.map +1 -0
  370. package/dist/lib/evolve/orchestrator.js +851 -0
  371. package/dist/lib/evolve/orchestrator.js.map +1 -0
  372. package/dist/lib/evolve/scoring.d.ts +2 -0
  373. package/dist/lib/evolve/scoring.d.ts.map +1 -0
  374. package/dist/lib/evolve/scoring.js +118 -0
  375. package/dist/lib/evolve/scoring.js.map +1 -0
  376. package/dist/lib/evolve/state.d.ts +2 -0
  377. package/dist/lib/evolve/state.d.ts.map +1 -0
  378. package/dist/lib/evolve/state.js +264 -0
  379. package/dist/lib/evolve/state.js.map +1 -0
  380. package/dist/lib/evolve/types.d.ts +249 -0
  381. package/dist/lib/evolve/types.d.ts.map +1 -0
  382. package/dist/lib/evolve/types.js +3 -0
  383. package/dist/lib/evolve/types.js.map +1 -0
  384. package/dist/lib/frontmatter.d.ts +2 -0
  385. package/dist/lib/frontmatter.d.ts.map +1 -0
  386. package/dist/lib/frontmatter.js +513 -0
  387. package/dist/lib/frontmatter.js.map +1 -0
  388. package/dist/lib/gates.d.ts +2 -0
  389. package/dist/lib/gates.d.ts.map +1 -0
  390. package/dist/lib/gates.js +578 -0
  391. package/dist/lib/gates.js.map +1 -0
  392. package/dist/lib/genome.d.ts +10 -0
  393. package/dist/lib/genome.d.ts.map +1 -0
  394. package/dist/lib/genome.js +368 -0
  395. package/dist/lib/genome.js.map +1 -0
  396. package/dist/lib/got.d.ts +2 -0
  397. package/dist/lib/got.d.ts.map +1 -0
  398. package/dist/lib/got.js +280 -0
  399. package/dist/lib/got.js.map +1 -0
  400. package/dist/lib/invariants.d.ts +2 -0
  401. package/dist/lib/invariants.d.ts.map +1 -0
  402. package/dist/lib/invariants.js +298 -0
  403. package/dist/lib/invariants.js.map +1 -0
  404. package/dist/lib/knowledge.d.ts +2 -0
  405. package/dist/lib/knowledge.d.ts.map +1 -0
  406. package/dist/lib/knowledge.js +658 -0
  407. package/dist/lib/knowledge.js.map +1 -0
  408. package/dist/lib/long-term-roadmap.d.ts +2 -0
  409. package/dist/lib/long-term-roadmap.d.ts.map +1 -0
  410. package/dist/lib/long-term-roadmap.js +602 -0
  411. package/dist/lib/long-term-roadmap.js.map +1 -0
  412. package/dist/lib/markdown-split.d.ts +2 -0
  413. package/dist/lib/markdown-split.d.ts.map +1 -0
  414. package/dist/lib/markdown-split.js +199 -0
  415. package/dist/lib/markdown-split.js.map +1 -0
  416. package/dist/lib/mcp-server.d.ts +2 -0
  417. package/dist/lib/mcp-server.d.ts.map +1 -0
  418. package/dist/lib/mcp-server.js +2424 -0
  419. package/dist/lib/mcp-server.js.map +1 -0
  420. package/dist/lib/metrics.d.ts +16 -0
  421. package/dist/lib/metrics.d.ts.map +1 -0
  422. package/dist/lib/metrics.js +48 -0
  423. package/dist/lib/metrics.js.map +1 -0
  424. package/dist/lib/overstory.d.ts +2 -0
  425. package/dist/lib/overstory.d.ts.map +1 -0
  426. package/dist/lib/overstory.js +211 -0
  427. package/dist/lib/overstory.js.map +1 -0
  428. package/dist/lib/parallel.d.ts +2 -0
  429. package/dist/lib/parallel.d.ts.map +1 -0
  430. package/dist/lib/parallel.js +349 -0
  431. package/dist/lib/parallel.js.map +1 -0
  432. package/dist/lib/paths.d.ts +2 -0
  433. package/dist/lib/paths.d.ts.map +1 -0
  434. package/dist/lib/paths.js +254 -0
  435. package/dist/lib/paths.js.map +1 -0
  436. package/dist/lib/phase-complete-llm.d.ts +22 -0
  437. package/dist/lib/phase-complete-llm.d.ts.map +1 -0
  438. package/dist/lib/phase-complete-llm.js +331 -0
  439. package/dist/lib/phase-complete-llm.js.map +1 -0
  440. package/dist/lib/phase-complete.d.ts +46 -0
  441. package/dist/lib/phase-complete.d.ts.map +1 -0
  442. package/dist/lib/phase-complete.js +278 -0
  443. package/dist/lib/phase-complete.js.map +1 -0
  444. package/dist/lib/phase-io.d.ts +2 -0
  445. package/dist/lib/phase-io.d.ts.map +1 -0
  446. package/dist/lib/phase-io.js +126 -0
  447. package/dist/lib/phase-io.js.map +1 -0
  448. package/dist/lib/phase.d.ts +2 -0
  449. package/dist/lib/phase.d.ts.map +1 -0
  450. package/dist/lib/phase.js +1344 -0
  451. package/dist/lib/phase.js.map +1 -0
  452. package/dist/lib/plan-tournament.d.ts +63 -0
  453. package/dist/lib/plan-tournament.d.ts.map +1 -0
  454. package/dist/lib/plan-tournament.js +353 -0
  455. package/dist/lib/plan-tournament.js.map +1 -0
  456. package/dist/lib/refinement.d.ts +74 -0
  457. package/dist/lib/refinement.d.ts.map +1 -0
  458. package/dist/lib/refinement.js +283 -0
  459. package/dist/lib/refinement.js.map +1 -0
  460. package/dist/lib/requirements.d.ts +2 -0
  461. package/dist/lib/requirements.d.ts.map +1 -0
  462. package/dist/lib/requirements.js +355 -0
  463. package/dist/lib/requirements.js.map +1 -0
  464. package/dist/lib/research-bundle.d.ts +2 -0
  465. package/dist/lib/research-bundle.d.ts.map +1 -0
  466. package/dist/lib/research-bundle.js +246 -0
  467. package/dist/lib/research-bundle.js.map +1 -0
  468. package/dist/lib/roadmap.d.ts +2 -0
  469. package/dist/lib/roadmap.d.ts.map +1 -0
  470. package/dist/lib/roadmap.js +541 -0
  471. package/dist/lib/roadmap.js.map +1 -0
  472. package/dist/lib/sample.d.ts +16 -0
  473. package/dist/lib/sample.d.ts.map +1 -0
  474. package/dist/lib/sample.js +20 -0
  475. package/dist/lib/sample.js.map +1 -0
  476. package/dist/lib/scaffold.d.ts +2 -0
  477. package/dist/lib/scaffold.d.ts.map +1 -0
  478. package/dist/lib/scaffold.js +355 -0
  479. package/dist/lib/scaffold.js.map +1 -0
  480. package/dist/lib/scan/_utils.d.ts +11 -0
  481. package/dist/lib/scan/_utils.d.ts.map +1 -0
  482. package/dist/lib/scan/_utils.js +36 -0
  483. package/dist/lib/scan/_utils.js.map +1 -0
  484. package/dist/lib/scan/base64.d.ts +15 -0
  485. package/dist/lib/scan/base64.d.ts.map +1 -0
  486. package/dist/lib/scan/base64.js +66 -0
  487. package/dist/lib/scan/base64.js.map +1 -0
  488. package/dist/lib/scan/ignorefile.d.ts +30 -0
  489. package/dist/lib/scan/ignorefile.d.ts.map +1 -0
  490. package/dist/lib/scan/ignorefile.js +101 -0
  491. package/dist/lib/scan/ignorefile.js.map +1 -0
  492. package/dist/lib/scan/injection.d.ts +14 -0
  493. package/dist/lib/scan/injection.d.ts.map +1 -0
  494. package/dist/lib/scan/injection.js +39 -0
  495. package/dist/lib/scan/injection.js.map +1 -0
  496. package/dist/lib/scan/patterns.d.ts +17 -0
  497. package/dist/lib/scan/patterns.d.ts.map +1 -0
  498. package/dist/lib/scan/patterns.js +123 -0
  499. package/dist/lib/scan/patterns.js.map +1 -0
  500. package/dist/lib/scan/strip-markdown.d.ts +7 -0
  501. package/dist/lib/scan/strip-markdown.d.ts.map +1 -0
  502. package/dist/lib/scan/strip-markdown.js +38 -0
  503. package/dist/lib/scan/strip-markdown.js.map +1 -0
  504. package/dist/lib/scan/types.d.ts +23 -0
  505. package/dist/lib/scan/types.d.ts.map +1 -0
  506. package/dist/lib/scan/types.js +3 -0
  507. package/dist/lib/scan/types.js.map +1 -0
  508. package/dist/lib/scheduler-wait.d.ts +2 -0
  509. package/dist/lib/scheduler-wait.d.ts.map +1 -0
  510. package/dist/lib/scheduler-wait.js +59 -0
  511. package/dist/lib/scheduler-wait.js.map +1 -0
  512. package/dist/lib/scheduler.d.ts +254 -0
  513. package/dist/lib/scheduler.d.ts.map +1 -0
  514. package/dist/lib/scheduler.js +1147 -0
  515. package/dist/lib/scheduler.js.map +1 -0
  516. package/dist/lib/state.d.ts +2 -0
  517. package/dist/lib/state.d.ts.map +1 -0
  518. package/dist/lib/state.js +744 -0
  519. package/dist/lib/state.js.map +1 -0
  520. package/dist/lib/think.d.ts +18 -0
  521. package/dist/lib/think.d.ts.map +1 -0
  522. package/dist/lib/think.js +317 -0
  523. package/dist/lib/think.js.map +1 -0
  524. package/dist/lib/tracker.d.ts +2 -0
  525. package/dist/lib/tracker.d.ts.map +1 -0
  526. package/dist/lib/tracker.js +1121 -0
  527. package/dist/lib/tracker.js.map +1 -0
  528. package/dist/lib/types.d.ts +1514 -0
  529. package/dist/lib/types.d.ts.map +1 -0
  530. package/dist/lib/types.js +4 -0
  531. package/dist/lib/types.js.map +1 -0
  532. package/dist/lib/utils.d.ts +2 -0
  533. package/dist/lib/utils.d.ts.map +1 -0
  534. package/dist/lib/utils.js +1363 -0
  535. package/dist/lib/utils.js.map +1 -0
  536. package/dist/lib/verify.d.ts +2 -0
  537. package/dist/lib/verify.d.ts.map +1 -0
  538. package/dist/lib/verify.js +1153 -0
  539. package/dist/lib/verify.js.map +1 -0
  540. package/dist/lib/wireup/autofix.d.ts +2 -0
  541. package/dist/lib/wireup/autofix.d.ts.map +1 -0
  542. package/dist/lib/wireup/autofix.js +188 -0
  543. package/dist/lib/wireup/autofix.js.map +1 -0
  544. package/dist/lib/wireup/cli.d.ts +2 -0
  545. package/dist/lib/wireup/cli.d.ts.map +1 -0
  546. package/dist/lib/wireup/cli.js +194 -0
  547. package/dist/lib/wireup/cli.js.map +1 -0
  548. package/dist/lib/wireup/detection.d.ts +47 -0
  549. package/dist/lib/wireup/detection.d.ts.map +1 -0
  550. package/dist/lib/wireup/detection.js +410 -0
  551. package/dist/lib/wireup/detection.js.map +1 -0
  552. package/dist/lib/wireup/discovery.d.ts +2 -0
  553. package/dist/lib/wireup/discovery.d.ts.map +1 -0
  554. package/dist/lib/wireup/discovery.js +934 -0
  555. package/dist/lib/wireup/discovery.js.map +1 -0
  556. package/dist/lib/wireup/execution.d.ts +2 -0
  557. package/dist/lib/wireup/execution.d.ts.map +1 -0
  558. package/dist/lib/wireup/execution.js +573 -0
  559. package/dist/lib/wireup/execution.js.map +1 -0
  560. package/dist/lib/wireup/index.d.ts +2 -0
  561. package/dist/lib/wireup/index.d.ts.map +1 -0
  562. package/dist/lib/wireup/index.js +85 -0
  563. package/dist/lib/wireup/index.js.map +1 -0
  564. package/dist/lib/wireup/orchestrator.d.ts +2 -0
  565. package/dist/lib/wireup/orchestrator.d.ts.map +1 -0
  566. package/dist/lib/wireup/orchestrator.js +366 -0
  567. package/dist/lib/wireup/orchestrator.js.map +1 -0
  568. package/dist/lib/wireup/report.d.ts +47 -0
  569. package/dist/lib/wireup/report.d.ts.map +1 -0
  570. package/dist/lib/wireup/report.js +201 -0
  571. package/dist/lib/wireup/report.js.map +1 -0
  572. package/dist/lib/wireup/scenarios.d.ts +2 -0
  573. package/dist/lib/wireup/scenarios.d.ts.map +1 -0
  574. package/dist/lib/wireup/scenarios.js +516 -0
  575. package/dist/lib/wireup/scenarios.js.map +1 -0
  576. package/dist/lib/wireup/state.d.ts +2 -0
  577. package/dist/lib/wireup/state.d.ts.map +1 -0
  578. package/dist/lib/wireup/state.js +102 -0
  579. package/dist/lib/wireup/state.js.map +1 -0
  580. package/dist/lib/wireup/types.d.ts +376 -0
  581. package/dist/lib/wireup/types.d.ts.map +1 -0
  582. package/dist/lib/wireup/types.js +3 -0
  583. package/dist/lib/wireup/types.js.map +1 -0
  584. package/dist/lib/worktree.d.ts +2 -0
  585. package/dist/lib/worktree.d.ts.map +1 -0
  586. package/dist/lib/worktree.js +999 -0
  587. package/dist/lib/worktree.js.map +1 -0
  588. package/lib/autopilot-milestone.ts +136 -0
  589. package/lib/autopilot-pipeline.ts +1179 -0
  590. package/lib/autopilot-waves.ts +361 -0
  591. package/lib/autopilot.ts +1874 -0
  592. package/lib/autoplan.ts +280 -0
  593. package/lib/autoresearch.js +4 -0
  594. package/lib/autoresearch.ts +886 -0
  595. package/lib/backend.ts +1252 -0
  596. package/lib/benchmark.ts +341 -0
  597. package/lib/citations.ts +760 -0
  598. package/lib/cleanup.ts +1588 -0
  599. package/lib/cli/adapters.ts +41 -0
  600. package/lib/cli/agent.ts +83 -0
  601. package/lib/cli/index.ts +273 -0
  602. package/lib/cli/output.ts +33 -0
  603. package/lib/cli/scan-dispatch.ts +130 -0
  604. package/lib/cli/tools.ts +198 -0
  605. package/lib/commands/_dashboard-parsers.ts +275 -0
  606. package/lib/commands/analysis.ts +1851 -0
  607. package/lib/commands/assumptions.ts +232 -0
  608. package/lib/commands/blame.ts +174 -0
  609. package/lib/commands/budget.ts +148 -0
  610. package/lib/commands/check-plans.ts +233 -0
  611. package/lib/commands/config.ts +287 -0
  612. package/lib/commands/dashboard.ts +680 -0
  613. package/lib/commands/estimate.ts +204 -0
  614. package/lib/commands/eval-diff.ts +252 -0
  615. package/lib/commands/freshness.ts +213 -0
  616. package/lib/commands/health.ts +607 -0
  617. package/lib/commands/index.ts +266 -0
  618. package/lib/commands/install.ts +307 -0
  619. package/lib/commands/knowhow-aggregator.ts +345 -0
  620. package/lib/commands/knowledge-search.ts +153 -0
  621. package/lib/commands/long-term-roadmap.ts +390 -0
  622. package/lib/commands/patterns.ts +465 -0
  623. package/lib/commands/phase-info.ts +698 -0
  624. package/lib/commands/plan-lint.ts +546 -0
  625. package/lib/commands/plan-phase.ts +375 -0
  626. package/lib/commands/progress.ts +319 -0
  627. package/lib/commands/quality.ts +138 -0
  628. package/lib/commands/rollback.ts +195 -0
  629. package/lib/commands/scan.ts +72 -0
  630. package/lib/commands/search.ts +300 -0
  631. package/lib/commands/select-candidate.ts +687 -0
  632. package/lib/commands/singularity.ts +222 -0
  633. package/lib/commands/slug-timestamp.ts +74 -0
  634. package/lib/commands/tail.ts +129 -0
  635. package/lib/commands/todo.ts +273 -0
  636. package/lib/commands/watch.ts +80 -0
  637. package/lib/complexity.ts +117 -0
  638. package/lib/context/agents.ts +505 -0
  639. package/lib/context/base.ts +123 -0
  640. package/lib/context/execute.ts +977 -0
  641. package/lib/context/index.ts +110 -0
  642. package/lib/context/progress.ts +278 -0
  643. package/lib/context/project.ts +531 -0
  644. package/lib/context/research.ts +646 -0
  645. package/lib/dead-ends.ts +506 -0
  646. package/lib/deps.ts +773 -0
  647. package/lib/discussion.ts +1275 -0
  648. package/lib/drift.ts +519 -0
  649. package/lib/evolve/_dimensions-features.ts +525 -0
  650. package/lib/evolve/_dimensions.ts +511 -0
  651. package/lib/evolve/_product-ideation.ts +405 -0
  652. package/lib/evolve/_prompts.ts +178 -0
  653. package/lib/evolve/cli.ts +330 -0
  654. package/lib/evolve/discovery.ts +571 -0
  655. package/lib/evolve/index.ts +105 -0
  656. package/lib/evolve/orchestrator.ts +1139 -0
  657. package/lib/evolve/scoring.ts +167 -0
  658. package/lib/evolve/state.ts +330 -0
  659. package/lib/evolve/types.ts +290 -0
  660. package/lib/frontmatter.ts +615 -0
  661. package/lib/gates.ts +695 -0
  662. package/lib/genome.ts +402 -0
  663. package/lib/got.js +4 -0
  664. package/lib/got.ts +361 -0
  665. package/lib/invariants.ts +378 -0
  666. package/lib/knowledge.ts +768 -0
  667. package/lib/long-term-roadmap.ts +806 -0
  668. package/lib/markdown-split.ts +273 -0
  669. package/lib/mcp-server.ts +3292 -0
  670. package/lib/metrics.ts +49 -0
  671. package/lib/overstory.ts +270 -0
  672. package/lib/parallel.ts +570 -0
  673. package/lib/paths.ts +293 -0
  674. package/lib/phase-complete-llm.ts +376 -0
  675. package/lib/phase-complete.ts +366 -0
  676. package/lib/phase-io.ts +101 -0
  677. package/lib/phase.ts +1981 -0
  678. package/lib/plan-tournament.ts +426 -0
  679. package/lib/refinement.ts +349 -0
  680. package/lib/requirements.ts +469 -0
  681. package/lib/research-bundle.ts +300 -0
  682. package/lib/roadmap.ts +775 -0
  683. package/lib/scaffold.ts +480 -0
  684. package/lib/scan/_utils.ts +37 -0
  685. package/lib/scan/base64.ts +90 -0
  686. package/lib/scan/ignorefile.ts +109 -0
  687. package/lib/scan/injection.ts +67 -0
  688. package/lib/scan/patterns.ts +139 -0
  689. package/lib/scan/strip-markdown.ts +39 -0
  690. package/lib/scan/types.ts +28 -0
  691. package/lib/scheduler-wait.ts +58 -0
  692. package/lib/scheduler.ts +1370 -0
  693. package/lib/state.ts +1000 -0
  694. package/lib/think.ts +365 -0
  695. package/lib/tracker.ts +1591 -0
  696. package/lib/types.ts +1663 -0
  697. package/lib/utils.ts +1479 -0
  698. package/lib/verify.ts +1434 -0
  699. package/lib/wireup/autofix.ts +241 -0
  700. package/lib/wireup/cli.ts +278 -0
  701. package/lib/wireup/detection.ts +542 -0
  702. package/lib/wireup/discovery.ts +1063 -0
  703. package/lib/wireup/execution.ts +686 -0
  704. package/lib/wireup/index.ts +117 -0
  705. package/lib/wireup/orchestrator.ts +519 -0
  706. package/lib/wireup/report.ts +286 -0
  707. package/lib/wireup/scenarios.ts +616 -0
  708. package/lib/wireup/state.ts +139 -0
  709. package/lib/wireup/types.ts +436 -0
  710. package/lib/worktree.ts +1309 -0
  711. package/package.json +67 -0
@@ -0,0 +1,2471 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * GRD Tools -- Thin CLI router. All business logic lives in lib/ modules.
6
+ * Usage: node grd-tools.js <command> [args] [--raw]
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+
12
+ import type { Scheduler } from '../lib/scheduler';
13
+ import type { GrdConfig, TokenProfileName } from '../lib/types';
14
+
15
+ // ─── Typed Imports ──────────────────────────────────────────────────────────
16
+
17
+ const {
18
+ parseIncludeFlag,
19
+ output,
20
+ error,
21
+ loadConfig,
22
+ validatePhaseArg,
23
+ validateFileArg,
24
+ validateSubcommand,
25
+ validateGitRef,
26
+ findClosestCommand,
27
+ }: {
28
+ parseIncludeFlag: (args: string[]) => Set<string>;
29
+ output: (result: unknown, raw: boolean, rawValue?: unknown) => never;
30
+ error: (message: string) => never;
31
+ loadConfig: (cwd: string) => GrdConfig;
32
+ validatePhaseArg: (phase: string) => string;
33
+ validateFileArg: (filePath: string, cwd: string) => string;
34
+ validateSubcommand: (sub: string, validSubs: string[], parentCmd: string) => string;
35
+ validateGitRef: (ref: string) => string;
36
+ findClosestCommand: (input: string | null, commands: string[]) => string | null;
37
+ } = require('../lib/utils');
38
+
39
+ const {
40
+ cmdFrontmatterGet,
41
+ cmdFrontmatterSet,
42
+ cmdFrontmatterMerge,
43
+ cmdFrontmatterValidate,
44
+ }: {
45
+ cmdFrontmatterGet: (cwd: string, filePath: string, field: string | null, raw: boolean) => void;
46
+ cmdFrontmatterSet: (
47
+ cwd: string,
48
+ filePath: string,
49
+ field: string,
50
+ value: string,
51
+ raw: boolean
52
+ ) => void;
53
+ cmdFrontmatterMerge: (cwd: string, filePath: string, data: string, raw: boolean) => void;
54
+ cmdFrontmatterValidate: (cwd: string, filePath: string, schemaName: string, raw: boolean) => void;
55
+ } = require('../lib/frontmatter');
56
+
57
+ const {
58
+ cmdStateLoad,
59
+ cmdStateGet,
60
+ cmdStatePatch,
61
+ cmdStateUpdate,
62
+ cmdStateAdvancePlan,
63
+ cmdStateRecordMetric,
64
+ cmdStateUpdateProgress,
65
+ cmdStateAddDecision,
66
+ cmdStateAddBlocker,
67
+ cmdStateResolveBlocker,
68
+ cmdStateRecordSession,
69
+ cmdStateSnapshot,
70
+ }: {
71
+ cmdStateLoad: (cwd: string, raw: boolean) => void;
72
+ cmdStateGet: (cwd: string, section: string | null, raw: boolean) => void;
73
+ cmdStatePatch: (cwd: string, patches: Record<string, string>, raw: boolean) => void;
74
+ cmdStateUpdate: (cwd: string, field: string, value: string) => void;
75
+ cmdStateAdvancePlan: (cwd: string, raw: boolean) => void;
76
+ cmdStateRecordMetric: (cwd: string, options: Record<string, string | null>, raw: boolean) => void;
77
+ cmdStateUpdateProgress: (cwd: string, raw: boolean) => void;
78
+ cmdStateAddDecision: (cwd: string, options: Record<string, string | null>, raw: boolean) => void;
79
+ cmdStateAddBlocker: (cwd: string, text: string, raw: boolean) => void;
80
+ cmdStateResolveBlocker: (cwd: string, text: string, raw: boolean) => void;
81
+ cmdStateRecordSession: (
82
+ cwd: string,
83
+ options: Record<string, string | null>,
84
+ raw: boolean
85
+ ) => void;
86
+ cmdStateSnapshot: (cwd: string, raw: boolean, opts?: Record<string, string | undefined>) => void;
87
+ } = require('../lib/state');
88
+
89
+ const {
90
+ cmdRoadmapGetPhase,
91
+ cmdPhaseNextDecimal,
92
+ cmdRoadmapAnalyze,
93
+ }: {
94
+ cmdRoadmapGetPhase: (cwd: string, phaseNum: string, raw: boolean) => void;
95
+ cmdPhaseNextDecimal: (cwd: string, basePhase: string, raw: boolean) => void;
96
+ cmdRoadmapAnalyze: (cwd: string, raw: boolean) => void;
97
+ } = require('../lib/roadmap');
98
+
99
+ const {
100
+ cmdTemplateSelect,
101
+ cmdTemplateFill,
102
+ cmdScaffold,
103
+ }: {
104
+ cmdTemplateSelect: (cwd: string, planPath: string, raw: boolean) => void;
105
+ cmdTemplateFill: (
106
+ cwd: string,
107
+ templateType: string,
108
+ options: Record<string, unknown>,
109
+ raw: boolean
110
+ ) => void;
111
+ cmdScaffold: (
112
+ cwd: string,
113
+ type: string,
114
+ options: Record<string, string | null>,
115
+ raw: boolean
116
+ ) => void;
117
+ } = require('../lib/scaffold');
118
+
119
+ const {
120
+ cmdVerifySummary,
121
+ cmdVerifyPlanStructure,
122
+ cmdVerifyPhaseCompleteness,
123
+ cmdVerifyReferences,
124
+ cmdVerifyCommits,
125
+ cmdVerifyArtifacts,
126
+ cmdVerifyKeyLinks,
127
+ cmdVerifyMechanical,
128
+ }: {
129
+ cmdVerifySummary: (
130
+ cwd: string,
131
+ summaryPath: string,
132
+ checkFileCount: number,
133
+ raw: boolean
134
+ ) => void;
135
+ cmdVerifyPlanStructure: (cwd: string, filePath: string, raw: boolean) => void;
136
+ cmdVerifyPhaseCompleteness: (cwd: string, phase: string, raw: boolean) => void;
137
+ cmdVerifyReferences: (cwd: string, filePath: string, raw: boolean) => void;
138
+ cmdVerifyCommits: (cwd: string, hashes: string[], raw: boolean) => void;
139
+ cmdVerifyArtifacts: (cwd: string, planFilePath: string, raw: boolean) => void;
140
+ cmdVerifyKeyLinks: (cwd: string, planFilePath: string, raw: boolean) => void;
141
+ cmdVerifyMechanical: (cwd: string, phase: string, raw: boolean) => void;
142
+ } = require('../lib/verify');
143
+
144
+ const {
145
+ cmdPhasesList,
146
+ cmdPhaseAdd,
147
+ cmdPhaseInsert,
148
+ cmdPhaseRemove,
149
+ cmdPhaseComplete,
150
+ cmdMilestoneComplete,
151
+ cmdValidateConsistency,
152
+ cmdVersionBump,
153
+ }: {
154
+ cmdPhasesList: (cwd: string, options: Record<string, string | null>, raw: boolean) => void;
155
+ cmdPhaseAdd: (cwd: string, name: string, raw: boolean, context?: string) => void;
156
+ cmdPhaseInsert: (cwd: string, phase: string, name: string, raw: boolean) => void;
157
+ cmdPhaseRemove: (
158
+ cwd: string,
159
+ phase: string,
160
+ options: Record<string, boolean>,
161
+ raw: boolean
162
+ ) => void;
163
+ cmdPhaseComplete: (
164
+ cwd: string,
165
+ phase: string,
166
+ raw: boolean,
167
+ options?: Record<string, boolean>
168
+ ) => Promise<void>;
169
+ cmdMilestoneComplete: (
170
+ cwd: string,
171
+ version: string | null,
172
+ options: Record<string, string | boolean | null>,
173
+ raw: boolean
174
+ ) => void;
175
+ cmdValidateConsistency: (cwd: string, raw: boolean) => void;
176
+ cmdVersionBump: (cwd: string, version: string, raw: boolean) => void;
177
+ } = require('../lib/phase');
178
+
179
+ const {
180
+ cmdTracker,
181
+ }: {
182
+ cmdTracker: (cwd: string, sub: string, args: string[], raw: boolean) => Promise<void>;
183
+ } = require('../lib/tracker');
184
+
185
+ const {
186
+ cmdWorktreeCreate,
187
+ cmdWorktreeRemove,
188
+ cmdWorktreeList,
189
+ cmdWorktreeRemoveStale,
190
+ cmdWorktreePushAndPR,
191
+ cmdWorktreeEnsureMilestoneBranch,
192
+ cmdWorktreeMerge,
193
+ cmdWorktreeHookCreate,
194
+ cmdWorktreeHookRemove,
195
+ cmdTeammateIdleHook,
196
+ cmdTaskCompletedHook,
197
+ cmdInstructionsLoadedHook,
198
+ cmdStopFailureHook,
199
+ cmdPostCompactHook,
200
+ }: {
201
+ cmdWorktreeCreate: (cwd: string, options: Record<string, string | null>, raw: boolean) => void;
202
+ cmdWorktreeRemove: (cwd: string, options: Record<string, string | null>, raw: boolean) => void;
203
+ cmdWorktreeList: (cwd: string, raw: boolean) => void;
204
+ cmdWorktreeRemoveStale: (cwd: string, raw: boolean) => void;
205
+ cmdWorktreePushAndPR: (cwd: string, options: Record<string, string | null>, raw: boolean) => void;
206
+ cmdWorktreeEnsureMilestoneBranch: (
207
+ cwd: string,
208
+ options: Record<string, string | null>,
209
+ raw: boolean
210
+ ) => void;
211
+ cmdWorktreeMerge: (
212
+ cwd: string,
213
+ options: Record<string, string | boolean | null>,
214
+ raw: boolean
215
+ ) => void;
216
+ cmdWorktreeHookCreate: (cwd: string, wtPath: string, wtBranch: string, raw: boolean) => void;
217
+ cmdWorktreeHookRemove: (cwd: string, wtPath: string, wtBranch: string, raw: boolean) => void;
218
+ cmdTeammateIdleHook: (cwd: string, raw: boolean) => void;
219
+ cmdTaskCompletedHook: (cwd: string, raw: boolean) => void;
220
+ cmdInstructionsLoadedHook: (cwd: string, raw: boolean) => void;
221
+ cmdStopFailureHook: (cwd: string, raw: boolean) => void;
222
+ cmdPostCompactHook: (cwd: string, raw: boolean) => void;
223
+ } = require('../lib/worktree');
224
+
225
+ const {
226
+ cmdPhaseAnalyzeDeps,
227
+ }: {
228
+ cmdPhaseAnalyzeDeps: (cwd: string, raw: boolean) => void;
229
+ } = require('../lib/deps');
230
+
231
+ const {
232
+ detectOverstory,
233
+ installOverstory,
234
+ }: {
235
+ detectOverstory: (cwd: string) => Record<string, unknown> | null;
236
+ installOverstory: (cwd: string) => void;
237
+ } = require('../lib/overstory');
238
+
239
+ const {
240
+ cmdAutopilot,
241
+ cmdInitAutopilot,
242
+ cmdMultiMilestoneAutopilot,
243
+ cmdInitMultiMilestoneAutopilot,
244
+ }: {
245
+ cmdAutopilot: (cwd: string, args: string[], raw: boolean) => Promise<void>;
246
+ cmdInitAutopilot: (cwd: string, raw: boolean) => void;
247
+ cmdMultiMilestoneAutopilot: (cwd: string, args: string[], raw: boolean) => Promise<void>;
248
+ cmdInitMultiMilestoneAutopilot: (cwd: string, raw: boolean) => void;
249
+ } = require('../lib/autopilot');
250
+
251
+ const {
252
+ cmdAutoplan,
253
+ cmdInitAutoplan,
254
+ }: {
255
+ cmdAutoplan: (cwd: string, args: string[], raw: boolean) => Promise<void>;
256
+ cmdInitAutoplan: (cwd: string, raw: boolean) => void;
257
+ } = require('../lib/autoplan');
258
+
259
+ const {
260
+ createScheduler,
261
+ }: {
262
+ createScheduler: (
263
+ config: import('../lib/types').SchedulerConfig | undefined,
264
+ superpowersConfig?: import('../lib/types').SuperpowersConfig
265
+ ) => Scheduler | null;
266
+ } = require('../lib/scheduler');
267
+
268
+ const {
269
+ cmdAutoResearch,
270
+ cmdInitAutoResearch,
271
+ }: {
272
+ cmdAutoResearch: (
273
+ cwd: string,
274
+ args: string[],
275
+ raw: boolean,
276
+ scheduler?: Scheduler | null
277
+ ) => Promise<void>;
278
+ cmdInitAutoResearch: (cwd: string, raw: boolean) => void;
279
+ } = require('../lib/autoresearch');
280
+
281
+ const {
282
+ cmdEvolve,
283
+ cmdEvolveDiscover,
284
+ cmdEvolveState,
285
+ cmdEvolveAdvance,
286
+ cmdEvolveReset,
287
+ cmdInitEvolve,
288
+ }: {
289
+ cmdEvolve: (cwd: string, args: string[], raw: boolean) => Promise<void>;
290
+ cmdEvolveDiscover: (cwd: string, args: string[], raw: boolean) => Promise<void>;
291
+ cmdEvolveState: (cwd: string, args: string[], raw: boolean) => void;
292
+ cmdEvolveAdvance: (cwd: string, args: string[], raw: boolean) => void;
293
+ cmdEvolveReset: (cwd: string, args: string[], raw: boolean) => void;
294
+ cmdInitEvolve: (cwd: string, raw: boolean) => void;
295
+ } = require('../lib/evolve/index');
296
+
297
+ const {
298
+ cmdInitExecuteParallel,
299
+ cmdParallelProgress,
300
+ }: {
301
+ cmdInitExecuteParallel: (
302
+ cwd: string,
303
+ phases: string[],
304
+ includes: Set<string>,
305
+ raw: boolean
306
+ ) => void;
307
+ cmdParallelProgress: (args: string[], raw: boolean) => void;
308
+ } = require('../lib/parallel');
309
+
310
+ const {
311
+ cmdWireup,
312
+ cmdInitWireup,
313
+ }: {
314
+ cmdWireup: (cwd: string, args: string[], raw: boolean) => Promise<void>;
315
+ cmdInitWireup: (cwd: string, raw: boolean) => void;
316
+ } = require('../lib/wireup/index');
317
+
318
+ const {
319
+ splitMarkdown,
320
+ isIndexFile,
321
+ estimateTokens,
322
+ }: {
323
+ splitMarkdown: (
324
+ content: string,
325
+ options?: { threshold?: number; basename?: string }
326
+ ) => {
327
+ split_performed: boolean;
328
+ reason?: string;
329
+ index_content?: string;
330
+ parts?: Array<{ filename: string; content: string }>;
331
+ };
332
+ isIndexFile: (content: unknown) => boolean;
333
+ estimateTokens: (content: string) => number;
334
+ } = require('../lib/markdown-split');
335
+
336
+ const {
337
+ cmdInitExecutePhase,
338
+ cmdInitPlanPhase,
339
+ cmdInitNewProject,
340
+ cmdInitNewMilestone,
341
+ cmdInitQuick,
342
+ cmdInitResume,
343
+ cmdInitVerifyWork,
344
+ cmdInitPhaseOp,
345
+ cmdInitTodos,
346
+ cmdInitMilestoneOp,
347
+ cmdInitMapCodebase,
348
+ cmdInitProgress,
349
+ cmdInitResearchWorkflow,
350
+ cmdInitPlanMilestoneGaps,
351
+ cmdInitDebug,
352
+ cmdInitIntegrationCheck,
353
+ cmdInitMigrate,
354
+ cmdInitPlanCheck,
355
+ cmdInitPhaseResearch,
356
+ cmdInitCodeReview,
357
+ cmdInitAssessBaseline,
358
+ cmdInitDeepDive,
359
+ cmdInitEvalPlan,
360
+ cmdInitEvalReport,
361
+ cmdInitFeasibility,
362
+ cmdInitProductOwner,
363
+ cmdInitProjectResearcher,
364
+ cmdInitResearchSynthesizer,
365
+ cmdInitRoadmapper,
366
+ cmdInitSurveyor,
367
+ cmdInitVerifier,
368
+ }: {
369
+ cmdInitExecutePhase: (cwd: string, phase: string, includes: Set<string>, raw: boolean) => void;
370
+ cmdInitPlanPhase: (cwd: string, phase: string, includes: Set<string>, raw: boolean) => void;
371
+ cmdInitNewProject: (cwd: string, raw: boolean) => void;
372
+ cmdInitNewMilestone: (cwd: string, raw: boolean) => void;
373
+ cmdInitQuick: (cwd: string, description: string, raw: boolean) => void;
374
+ cmdInitResume: (cwd: string, raw: boolean) => void;
375
+ cmdInitVerifyWork: (cwd: string, phase: string, raw: boolean) => void;
376
+ cmdInitPhaseOp: (cwd: string, phase: string, raw: boolean) => void;
377
+ cmdInitTodos: (cwd: string, area: string | null, raw: boolean) => void;
378
+ cmdInitMilestoneOp: (cwd: string, raw: boolean) => void;
379
+ cmdInitMapCodebase: (cwd: string, raw: boolean) => void;
380
+ cmdInitProgress: (cwd: string, includes: Set<string>, raw: boolean, refresh?: boolean) => void;
381
+ cmdInitResearchWorkflow: (
382
+ cwd: string,
383
+ workflow: string,
384
+ topic: string,
385
+ includes: Set<string>,
386
+ raw: boolean
387
+ ) => void;
388
+ cmdInitPlanMilestoneGaps: (cwd: string, raw: boolean) => void;
389
+ cmdInitDebug: (cwd: string, phase: string | null, raw: boolean) => void;
390
+ cmdInitIntegrationCheck: (cwd: string, phase: string | null, raw: boolean) => void;
391
+ cmdInitMigrate: (cwd: string, raw: boolean) => void;
392
+ cmdInitPlanCheck: (cwd: string, phase: string, raw: boolean) => void;
393
+ cmdInitPhaseResearch: (cwd: string, phase: string, includes: Set<string>, raw: boolean) => void;
394
+ cmdInitCodeReview: (cwd: string, phase: string, raw: boolean) => void;
395
+ cmdInitAssessBaseline: (cwd: string, raw: boolean) => void;
396
+ cmdInitDeepDive: (cwd: string, topic: string, raw: boolean) => void;
397
+ cmdInitEvalPlan: (cwd: string, phase: string | null, raw: boolean) => void;
398
+ cmdInitEvalReport: (cwd: string, phase: string | null, raw: boolean) => void;
399
+ cmdInitFeasibility: (cwd: string, topic: string, raw: boolean) => void;
400
+ cmdInitProductOwner: (cwd: string, raw: boolean) => void;
401
+ cmdInitProjectResearcher: (cwd: string, topic: string, raw: boolean) => void;
402
+ cmdInitResearchSynthesizer: (cwd: string, raw: boolean) => void;
403
+ cmdInitRoadmapper: (cwd: string, raw: boolean) => void;
404
+ cmdInitSurveyor: (cwd: string, topic: string, raw: boolean) => void;
405
+ cmdInitVerifier: (cwd: string, phase: string | null, raw: boolean) => void;
406
+ } = require('../lib/context/index');
407
+
408
+ const {
409
+ cmdGenerateSlug,
410
+ cmdCurrentTimestamp,
411
+ cmdListTodos,
412
+ cmdTodoComplete,
413
+ cmdVerifyPathExists,
414
+ cmdConfigEnsureSection,
415
+ cmdConfigSet,
416
+ cmdHistoryDigest,
417
+ cmdResolveModel,
418
+ cmdFindPhase,
419
+ cmdCommit,
420
+ cmdPhasePlanIndex,
421
+ cmdSummaryExtract,
422
+ cmdProgressRender,
423
+ cmdDashboard,
424
+ cmdPhaseDetail,
425
+ cmdHealth,
426
+ cmdDetectBackend,
427
+ cmdLongTermRoadmap,
428
+ cmdQualityAnalysis,
429
+ cmdSetup,
430
+ cmdRequirementGet,
431
+ cmdRequirementList,
432
+ cmdRequirementTraceability,
433
+ cmdRequirementUpdateStatus,
434
+ cmdSearch,
435
+ cmdMigrateDirs,
436
+ cmdCoverageReport,
437
+ cmdHealthCheck,
438
+ cmdPhaseRiskAssessment,
439
+ cmdCitationBacklinks,
440
+ cmdEvalRegressionCheck,
441
+ cmdPhaseTimeBudget,
442
+ cmdConfigDiff,
443
+ cmdPhaseReadiness,
444
+ cmdMilestoneHealth,
445
+ cmdDecisionTimeline,
446
+ cmdImportKnowledge,
447
+ cmdTodoDuplicates,
448
+ cmdKnowhowList,
449
+ cmdCitationGraph,
450
+ cmdArtifactDAG,
451
+ cmdBenchmarkReport,
452
+ cmdKnowhowSearch,
453
+ cmdCheckPlans,
454
+ cmdEvalDiff,
455
+ cmdTail,
456
+ cmdEstimatePhase,
457
+ cmdImpact,
458
+ cmdCheckAssumptions,
459
+ }: {
460
+ cmdGenerateSlug: (text: string, raw: boolean) => void;
461
+ cmdCurrentTimestamp: (format: string, raw: boolean) => void;
462
+ cmdListTodos: (cwd: string, area: string | null, raw: boolean) => void;
463
+ cmdTodoComplete: (cwd: string, filename: string, raw: boolean, dryRun?: boolean) => void;
464
+ cmdVerifyPathExists: (cwd: string, targetPath: string, raw: boolean, dryRun?: boolean) => void;
465
+ cmdConfigEnsureSection: (cwd: string, raw: boolean, dryRun?: boolean) => void;
466
+ cmdConfigSet: (cwd: string, key: string, value: string, raw: boolean, dryRun?: boolean) => void;
467
+ cmdHistoryDigest: (cwd: string, raw: boolean) => void;
468
+ cmdResolveModel: (cwd: string, agentType: string, raw: boolean) => void;
469
+ cmdFindPhase: (cwd: string, phase: string, raw: boolean) => void;
470
+ cmdCommit: (cwd: string, message: string, files: string[], raw: boolean, amend?: boolean) => void;
471
+ cmdPhasePlanIndex: (cwd: string, phase: string, raw: boolean) => void;
472
+ cmdSummaryExtract: (
473
+ cwd: string,
474
+ summaryPath: string,
475
+ fields: string[] | null,
476
+ raw: boolean
477
+ ) => void;
478
+ cmdProgressRender: (cwd: string, format: string, raw: boolean) => void;
479
+ cmdDashboard: (cwd: string, raw: boolean, options?: Record<string, unknown>) => void;
480
+ cmdPhaseDetail: (cwd: string, phase: string, raw: boolean) => void;
481
+ cmdHealth: (cwd: string, raw: boolean) => void;
482
+ cmdDetectBackend: (cwd: string, raw: boolean) => void;
483
+ cmdLongTermRoadmap: (cwd: string, subcommand: string, args: string[], raw: boolean) => void;
484
+ cmdQualityAnalysis: (cwd: string, args: string[], raw: boolean) => void;
485
+ cmdSetup: (cwd: string, raw: boolean) => void;
486
+ cmdRequirementGet: (cwd: string, reqId: string, raw: boolean) => void;
487
+ cmdRequirementList: (
488
+ cwd: string,
489
+ options: Record<string, string | boolean | null>,
490
+ raw: boolean
491
+ ) => void;
492
+ cmdRequirementTraceability: (
493
+ cwd: string,
494
+ options: Record<string, string | null>,
495
+ raw: boolean
496
+ ) => void;
497
+ cmdRequirementUpdateStatus: (
498
+ cwd: string,
499
+ reqId: string,
500
+ status: string,
501
+ raw: boolean,
502
+ dryRun?: boolean
503
+ ) => void;
504
+ cmdSearch: (cwd: string, query: string, raw: boolean) => void;
505
+ cmdMigrateDirs: (cwd: string, raw: boolean, dryRun?: boolean) => void;
506
+ cmdCoverageReport: (cwd: string, options: Record<string, unknown>, raw: boolean) => void;
507
+ cmdHealthCheck: (cwd: string, options: Record<string, unknown>, raw: boolean) => void;
508
+ cmdPhaseRiskAssessment: (cwd: string, phase: string, raw: boolean) => void;
509
+ cmdCitationBacklinks: (cwd: string, raw: boolean) => void;
510
+ cmdEvalRegressionCheck: (cwd: string, phase: string, raw: boolean, thresholdPct?: number) => void;
511
+ cmdPhaseTimeBudget: (cwd: string, raw: boolean) => void;
512
+ cmdConfigDiff: (cwd: string, raw: boolean, reset?: boolean, dryRun?: boolean) => void;
513
+ cmdPhaseReadiness: (cwd: string, phase: string, raw: boolean) => void;
514
+ cmdMilestoneHealth: (cwd: string, raw: boolean) => void;
515
+ cmdDecisionTimeline: (cwd: string, raw: boolean) => void;
516
+ cmdImportKnowledge: (
517
+ cwd: string,
518
+ sourcePath: string,
519
+ types: string,
520
+ raw: boolean,
521
+ force?: boolean,
522
+ dryRun?: boolean
523
+ ) => void;
524
+ cmdTodoDuplicates: (cwd: string, raw: boolean, threshold?: number) => void;
525
+ cmdKnowhowList: (cwd: string, raw: boolean, moduleHint?: string, limit?: number) => void;
526
+ cmdCitationGraph: (cwd: string, raw: boolean, unresolvedOnly?: boolean) => void;
527
+ cmdArtifactDAG: (cwd: string, phase: string, raw: boolean) => void;
528
+ cmdBenchmarkReport: (cwd: string, raw: boolean) => void;
529
+ cmdKnowhowSearch: (cwd: string, query: string, topN: number, raw: boolean) => void;
530
+ cmdCheckPlans: (cwd: string, options: { phase?: string | null; milestone?: string | null }, raw: boolean) => void;
531
+ cmdEvalDiff: (cwd: string, phaseA: string, phaseB: string, raw: boolean) => void;
532
+ cmdTail: (cwd: string, phaseFilter: string | null, follow: boolean, raw: boolean) => void;
533
+ cmdEstimatePhase: (cwd: string, phase: string, raw: boolean) => void;
534
+ cmdImpact: (cwd: string, phase: string, raw: boolean) => void;
535
+ cmdCheckAssumptions: (cwd: string, phase: string, raw: boolean, skipCheck?: boolean) => void;
536
+ } = require('../lib/commands/index');
537
+
538
+ const {
539
+ cmdDeadEndAdd,
540
+ cmdDeadEndPromoteFromPhase,
541
+ }: {
542
+ cmdDeadEndAdd: (
543
+ cwd: string,
544
+ opts: {
545
+ approach: string;
546
+ phase: string;
547
+ verdict?: string;
548
+ evidence?: string[];
549
+ notes?: string;
550
+ },
551
+ raw: boolean
552
+ ) => void;
553
+ cmdDeadEndPromoteFromPhase: (cwd: string, phase: string, raw: boolean) => void;
554
+ } = require('../lib/dead-ends');
555
+
556
+ const {
557
+ cmdPlanTournament,
558
+ }: {
559
+ cmdPlanTournament: (
560
+ cwd: string,
561
+ opts: { phase: string; candidates: string[] },
562
+ raw: boolean
563
+ ) => void;
564
+ } = require('../lib/plan-tournament');
565
+
566
+ const {
567
+ cmdThink,
568
+ }: {
569
+ cmdThink: (cwd: string, opts: { limit?: number }, raw: boolean) => void;
570
+ } = require('../lib/think');
571
+
572
+ const {
573
+ cmdExportResearch,
574
+ cmdImportResearch,
575
+ }: {
576
+ cmdExportResearch: (cwd: string, outputPath: string | null, raw: boolean) => void;
577
+ cmdImportResearch: (cwd: string, bundlePath: string, raw: boolean) => void;
578
+ } = require('../lib/research-bundle');
579
+
580
+ const {
581
+ cmdDiagnosePhase,
582
+ }: {
583
+ cmdDiagnosePhase: (cwd: string, phase: string, raw: boolean) => void;
584
+ } = require('../lib/verify');
585
+
586
+ const {
587
+ cmdKnowhowAudit,
588
+ cmdKnowhowDedup,
589
+ cmdKnowhowRank,
590
+ }: {
591
+ cmdKnowhowAudit: (cwd: string, raw: boolean) => void;
592
+ cmdKnowhowDedup: (cwd: string, raw: boolean, threshold?: number) => void;
593
+ cmdKnowhowRank: (cwd: string, query: string, topN: number, raw: boolean) => void;
594
+ } = require('../lib/knowledge');
595
+
596
+ const {
597
+ cmdPhaseDepsVisualize,
598
+ cmdExecutePhaseDryRun,
599
+ }: {
600
+ cmdPhaseDepsVisualize: (
601
+ cwd: string,
602
+ opts: { milestone?: string | null; format?: string | null },
603
+ raw: boolean
604
+ ) => void;
605
+ cmdExecutePhaseDryRun: (cwd: string, phase: string, raw: boolean) => void;
606
+ } = require('../lib/deps');
607
+
608
+ const {
609
+ cmdTodosRank,
610
+ }: {
611
+ cmdTodosRank: (cwd: string, raw: boolean, topN?: number) => void;
612
+ } = require('../lib/commands/todo');
613
+
614
+ const {
615
+ cmdRollback,
616
+ }: {
617
+ cmdRollback: (cwd: string, phase: string, raw: boolean) => void;
618
+ } = require('../lib/commands/rollback');
619
+
620
+ const {
621
+ cmdEstimate,
622
+ }: {
623
+ cmdEstimate: (cwd: string, phase: string, raw: boolean) => void;
624
+ } = require('../lib/commands/estimate');
625
+
626
+ const {
627
+ cmdBudget,
628
+ }: {
629
+ cmdBudget: (cwd: string, phaseArg: string, raw: boolean) => void;
630
+ } = require('../lib/commands/budget');
631
+
632
+ const {
633
+ cmdBlame,
634
+ }: {
635
+ cmdBlame: (cwd: string, phaseArg: string, raw: boolean) => void;
636
+ } = require('../lib/commands/blame');
637
+
638
+ const {
639
+ cmdKnowhowAggregate,
640
+ cmdImportKnowhow,
641
+ }: {
642
+ cmdKnowhowAggregate: (cwd: string, raw: boolean, exportFlag?: boolean, dryRun?: boolean) => void;
643
+ cmdImportKnowhow: (cwd: string, sourcePath: string, raw: boolean, topN?: number, importAll?: boolean, dryRun?: boolean) => void;
644
+ } = require('../lib/commands/knowhow-aggregator');
645
+
646
+ const {
647
+ cmdFreshness,
648
+ }: {
649
+ cmdFreshness: (cwd: string, phaseArg: string | null, raw: boolean) => void;
650
+ } = require('../lib/commands/freshness');
651
+
652
+ const {
653
+ cmdGenomeInit,
654
+ cmdGenomeShow,
655
+ cmdGenomeSnapshot,
656
+ cmdGenomePromoteSuggestion,
657
+ }: {
658
+ cmdGenomeInit: (cwd: string, raw: boolean) => void;
659
+ cmdGenomeShow: (cwd: string, raw: boolean) => void;
660
+ cmdGenomeSnapshot: (cwd: string, raw: boolean) => void;
661
+ cmdGenomePromoteSuggestion: (cwd: string, slug: string, raw: boolean) => void;
662
+ } = require('../lib/genome');
663
+
664
+ const {
665
+ cmdResearchGaps,
666
+ }: {
667
+ cmdResearchGaps: (cwd: string, raw: boolean) => void;
668
+ } = require('../lib/commands/progress');
669
+
670
+ const {
671
+ cmdDepsRisk,
672
+ }: {
673
+ cmdDepsRisk: (cwd: string, startPhase: string | null, raw: boolean) => void;
674
+ } = require('../lib/commands/phase-info');
675
+
676
+ const {
677
+ cmdWatch,
678
+ }: {
679
+ cmdWatch: (cwd: string, raw: boolean) => void;
680
+ } = require('../lib/commands/watch');
681
+
682
+ const {
683
+ cmdSingularity,
684
+ }: {
685
+ cmdSingularity: (
686
+ cwd: string,
687
+ options: { since?: string | null; all?: boolean; byIteration?: boolean },
688
+ raw: boolean
689
+ ) => void;
690
+ } = require('../lib/commands/singularity');
691
+
692
+ const {
693
+ cmdPlanLint,
694
+ }: {
695
+ cmdPlanLint: (cwd: string, milestone: string, raw: boolean) => void;
696
+ } = require('../lib/commands/plan-lint');
697
+
698
+ const {
699
+ cmdPlanPhase,
700
+ }: {
701
+ cmdPlanPhase: (
702
+ cwd: string,
703
+ phaseNum: string,
704
+ opts: { candidates: number; inputFile?: string; allowPartial?: boolean },
705
+ raw: boolean
706
+ ) => void;
707
+ } = require('../lib/commands/plan-phase');
708
+
709
+ const {
710
+ cmdSelectCandidate,
711
+ }: {
712
+ cmdSelectCandidate: (
713
+ cwd: string,
714
+ phaseNum: string,
715
+ opts: { dryRun?: boolean; force?: boolean; runVerificationCommands?: boolean },
716
+ raw: boolean
717
+ ) => void;
718
+ } = require('../lib/commands/select-candidate');
719
+
720
+ const {
721
+ cmdPatterns,
722
+ }: {
723
+ cmdPatterns: (
724
+ cwd: string,
725
+ opts: {
726
+ minOccurrences?: number;
727
+ effectSize?: number;
728
+ fdrQ?: number;
729
+ apply?: boolean;
730
+ yes?: boolean;
731
+ },
732
+ raw: boolean
733
+ ) => void;
734
+ } = require('../lib/commands/patterns');
735
+
736
+ const {
737
+ cmdInstall,
738
+ }: {
739
+ cmdInstall: (
740
+ cwd: string,
741
+ opts: {
742
+ harnesses?: Array<'claude' | 'codex' | 'gemini' | 'opencode'>;
743
+ all?: boolean;
744
+ list?: boolean;
745
+ dryRun?: boolean;
746
+ },
747
+ raw: boolean
748
+ ) => void;
749
+ } = require('../lib/commands/install');
750
+
751
+ // ─── Helpers ────────────────────────────────────────────────────────────────
752
+
753
+ /** Extract --flag value from args, returns value or fallback */
754
+ function flag(args: string[], name: string, fallback?: string): string | undefined {
755
+ const i = args.indexOf(name);
756
+ return i !== -1 ? args[i + 1] : fallback;
757
+ }
758
+
759
+ /**
760
+ * Print a deprecation warning to stderr. See docs/DEPRECATIONS.md for the
761
+ * v0.4.x trim plan. Commands listed in DEPRECATED_COMMANDS will be removed
762
+ * in v0.4.0; this helper fires once per invocation.
763
+ */
764
+ const DEPRECATED_COMMANDS: Record<string, string> = {
765
+ dashboard: 'Use `gd health` + `gd think` instead',
766
+ 'health-check': 'Subset of `gd health`',
767
+ 'coverage-report': 'Use `npx jest --coverage` directly',
768
+ 'phase-time-budget': 'Subsumed by `gd estimate-phase`',
769
+ 'todo-duplicates': 'One-off helper; rarely used',
770
+ 'markdown-split': 'Internal infrastructure — surfaced by accident',
771
+ setup: '`gd init` does this',
772
+ };
773
+ function _warnDeprecated(cmd: string): void {
774
+ const replacement = DEPRECATED_COMMANDS[cmd];
775
+ if (!replacement) return;
776
+ process.stderr.write(
777
+ `Warning: \`gd ${cmd}\` is DEPRECATED and will be removed in v0.4.0.\n` +
778
+ ` ${replacement}.\n` +
779
+ ` See docs/DEPRECATIONS.md.\n`
780
+ );
781
+ }
782
+
783
+ // ─── Route Descriptor Interface ─────────────────────────────────────────────
784
+
785
+ interface RouteDescriptor {
786
+ command: string;
787
+ handler: (args: string[], cwd: string, raw: boolean) => void | unknown;
788
+ }
789
+
790
+ // ─── Descriptor-Based Dispatch Table ────────────────────────────────────────
791
+
792
+ /**
793
+ * Descriptor-based dispatch table for simple top-level commands.
794
+ * Each entry maps a command string to a handler function.
795
+ * routeCommand() checks this table first before falling through to the switch.
796
+ */
797
+ const ROUTE_DESCRIPTORS: RouteDescriptor[] = [
798
+ { command: 'generate-slug', handler: (args, _cwd, raw) => cmdGenerateSlug(args[1], raw) },
799
+ {
800
+ command: 'current-timestamp',
801
+ handler: (args, _cwd, raw) => cmdCurrentTimestamp(args[1] || 'full', raw),
802
+ },
803
+ { command: 'list-todos', handler: (args, cwd, raw) => cmdListTodos(cwd, args[1], raw) },
804
+ {
805
+ command: 'verify-path-exists',
806
+ handler: (args, cwd, raw) => cmdVerifyPathExists(cwd, args[1], raw, args.includes('--dry-run')),
807
+ },
808
+ {
809
+ command: 'config-ensure-section',
810
+ handler: (args, cwd, raw) => cmdConfigEnsureSection(cwd, raw, args.includes('--dry-run')),
811
+ },
812
+ {
813
+ command: 'config-set',
814
+ handler: (args, cwd, raw) =>
815
+ cmdConfigSet(cwd, args[1], args[2], raw, args.includes('--dry-run')),
816
+ },
817
+ { command: 'history-digest', handler: (_args, cwd, raw) => cmdHistoryDigest(cwd, raw) },
818
+ {
819
+ command: 'progress',
820
+ handler: (args, cwd, raw) => cmdProgressRender(cwd, args[1] || 'json', raw),
821
+ },
822
+ {
823
+ command: 'migrate-dirs',
824
+ handler: (args, cwd, raw) => cmdMigrateDirs(cwd, raw, args.includes('--dry-run')),
825
+ },
826
+ {
827
+ command: 'dashboard',
828
+ handler: (_args, cwd, raw) => {
829
+ _warnDeprecated('dashboard');
830
+ cmdDashboard(cwd, raw);
831
+ },
832
+ },
833
+ { command: 'health', handler: (_args, cwd, raw) => cmdHealth(cwd, raw) },
834
+ { command: 'detect-backend', handler: (_args, cwd, raw) => cmdDetectBackend(cwd, raw) },
835
+ {
836
+ command: 'quality-analysis',
837
+ handler: (args, cwd, raw) => cmdQualityAnalysis(cwd, args.slice(1), raw),
838
+ },
839
+ {
840
+ command: 'setup',
841
+ handler: (_args, cwd, raw) => {
842
+ _warnDeprecated('setup');
843
+ cmdSetup(cwd, raw);
844
+ },
845
+ },
846
+ {
847
+ command: 'parallel-progress',
848
+ handler: (args, _cwd, raw) => cmdParallelProgress(args.slice(1), raw),
849
+ },
850
+ { command: 'resolve-model', handler: (args, cwd, raw) => cmdResolveModel(cwd, args[1], raw) },
851
+ { command: 'find-phase', handler: (args, cwd, raw) => cmdFindPhase(cwd, args[1], raw) },
852
+ {
853
+ command: 'coverage-report',
854
+ handler: (args, cwd, raw) => {
855
+ _warnDeprecated('coverage-report');
856
+ return cmdCoverageReport(
857
+ cwd,
858
+ { threshold: parseInt(flag(args, '--threshold', '85') as string, 10) },
859
+ raw
860
+ );
861
+ },
862
+ },
863
+ {
864
+ command: 'health-check',
865
+ handler: (args, cwd, raw) => {
866
+ _warnDeprecated('health-check');
867
+ return cmdHealthCheck(cwd, { fix: args.includes('--fix') }, raw);
868
+ },
869
+ },
870
+ {
871
+ command: 'phase-detail',
872
+ handler: (args, cwd, raw) => {
873
+ validatePhaseArg(args[1]);
874
+ return cmdPhaseDetail(cwd, args[1], raw);
875
+ },
876
+ },
877
+ {
878
+ command: 'phase-plan-index',
879
+ handler: (args, cwd, raw) => {
880
+ validatePhaseArg(args[1]);
881
+ return cmdPhasePlanIndex(cwd, args[1], raw);
882
+ },
883
+ },
884
+ {
885
+ command: 'search',
886
+ handler: (args, cwd, raw) => {
887
+ if (!args[1]) error('Search query is required');
888
+ return cmdSearch(cwd, args[1], raw);
889
+ },
890
+ },
891
+ {
892
+ command: 'phase-risk',
893
+ handler: (args, cwd, raw) => {
894
+ validatePhaseArg(args[1]);
895
+ return cmdPhaseRiskAssessment(cwd, args[1], raw);
896
+ },
897
+ },
898
+ { command: 'citation-backlinks', handler: (_args, cwd, raw) => cmdCitationBacklinks(cwd, raw) },
899
+ {
900
+ command: 'eval-regression-check',
901
+ handler: (args, cwd, raw) => {
902
+ validatePhaseArg(args[1]);
903
+ const t = flag(args, '--threshold');
904
+ return cmdEvalRegressionCheck(cwd, args[1], raw, t ? parseFloat(t) : undefined);
905
+ },
906
+ },
907
+ {
908
+ command: 'phase-time-budget',
909
+ handler: (_args, cwd, raw) => {
910
+ _warnDeprecated('phase-time-budget');
911
+ cmdPhaseTimeBudget(cwd, raw);
912
+ },
913
+ },
914
+ {
915
+ command: 'config-diff',
916
+ handler: (args, cwd, raw) => cmdConfigDiff(cwd, raw, args.includes('--reset'), args.includes('--dry-run')),
917
+ },
918
+ {
919
+ command: 'phase-readiness',
920
+ handler: (args, cwd, raw) => {
921
+ validatePhaseArg(args[1]);
922
+ return cmdPhaseReadiness(cwd, args[1], raw);
923
+ },
924
+ },
925
+ { command: 'milestone-health', handler: (_args, cwd, raw) => cmdMilestoneHealth(cwd, raw) },
926
+ { command: 'decision-timeline', handler: (_args, cwd, raw) => cmdDecisionTimeline(cwd, raw) },
927
+ {
928
+ command: 'import-knowledge',
929
+ handler: (args, cwd, raw) => {
930
+ if (!args[1]) error('Source path required');
931
+ return cmdImportKnowledge(
932
+ cwd,
933
+ args[1],
934
+ flag(args, '--types') || 'all',
935
+ raw,
936
+ args.includes('--force'),
937
+ args.includes('--dry-run')
938
+ );
939
+ },
940
+ },
941
+ {
942
+ command: 'todo-duplicates',
943
+ handler: (args, cwd, raw) => {
944
+ _warnDeprecated('todo-duplicates');
945
+ const t = flag(args, '--threshold');
946
+ return cmdTodoDuplicates(cwd, raw, t ? parseFloat(t) : undefined);
947
+ },
948
+ },
949
+ { command: 'teammate-idle-hook', handler: (_args, cwd, raw) => cmdTeammateIdleHook(cwd, raw) },
950
+ { command: 'task-completed-hook', handler: (_args, cwd, raw) => cmdTaskCompletedHook(cwd, raw) },
951
+ {
952
+ command: 'instructions-loaded-hook',
953
+ handler: (_args, cwd, raw) => cmdInstructionsLoadedHook(cwd, raw),
954
+ },
955
+ { command: 'stop-failure-hook', handler: (_args, cwd, raw) => cmdStopFailureHook(cwd, raw) },
956
+ { command: 'post-compact-hook', handler: (_args, cwd, raw) => cmdPostCompactHook(cwd, raw) },
957
+ {
958
+ command: 'citation-graph',
959
+ handler: (args, cwd, raw) => cmdCitationGraph(cwd, raw, args.includes('--unresolved')),
960
+ },
961
+ {
962
+ command: 'artifact-dag',
963
+ handler: (args, cwd, raw) => {
964
+ validatePhaseArg(args[1]);
965
+ return cmdArtifactDAG(cwd, args[1], raw);
966
+ },
967
+ },
968
+ { command: 'benchmark-report', handler: (_args, cwd, raw) => cmdBenchmarkReport(cwd, raw) },
969
+ {
970
+ command: 'diagnose',
971
+ handler: (args, cwd, raw) => {
972
+ if (!args[1]) error('phase required. Usage: gd diagnose <phase>');
973
+ validatePhaseArg(args[1]);
974
+ return cmdDiagnosePhase(cwd, args[1], raw);
975
+ },
976
+ },
977
+ {
978
+ command: 'export-research',
979
+ handler: (args, cwd, raw) => cmdExportResearch(cwd, flag(args, '--output') ?? null, raw),
980
+ },
981
+ {
982
+ command: 'import-research',
983
+ handler: (args, cwd, raw) => {
984
+ if (!args[1]) error('bundle path required. Usage: gd import-research <bundle.tar.gz>');
985
+ return cmdImportResearch(cwd, args[1], raw);
986
+ },
987
+ },
988
+ {
989
+ command: 'deps',
990
+ handler: (args, cwd, raw) =>
991
+ cmdPhaseDepsVisualize(
992
+ cwd,
993
+ { milestone: flag(args, '--milestone') ?? null, format: flag(args, '--format') ?? null },
994
+ raw
995
+ ),
996
+ },
997
+ {
998
+ command: 'todos',
999
+ handler: (args, cwd, raw) => {
1000
+ const sub = args[1];
1001
+ if (sub === 'rank') {
1002
+ const topStr = flag(args, '--top');
1003
+ const topN = topStr ? parseInt(topStr, 10) : undefined;
1004
+ if (topN !== undefined && (isNaN(topN) || topN < 0)) {
1005
+ error('--top must be a non-negative integer');
1006
+ }
1007
+ return cmdTodosRank(cwd, raw, topN);
1008
+ }
1009
+ error(`Unknown todos subcommand: ${sub || '(none)'}. Valid: rank`);
1010
+ },
1011
+ },
1012
+ {
1013
+ command: 'knowhow',
1014
+ handler: (args, cwd, raw) => {
1015
+ const sub = args[1];
1016
+ if (sub === 'audit') return cmdKnowhowAudit(cwd, raw);
1017
+ if (sub === 'aggregate' || sub === 'agg') return cmdKnowhowAggregate(cwd, raw, args.includes('--export'), args.includes('--dry-run'));
1018
+ if (sub === 'dedup') {
1019
+ const t = flag(args, '--threshold');
1020
+ return cmdKnowhowDedup(cwd, raw, t ? parseFloat(t) : undefined);
1021
+ }
1022
+ if (sub === 'rank') {
1023
+ const query = args[2];
1024
+ if (!query) error('query required. Usage: gd knowhow rank "<query>"');
1025
+ const topStr = flag(args, '--top');
1026
+ const topN = topStr ? parseInt(topStr, 10) : 5;
1027
+ if (isNaN(topN) || topN <= 0) error('--top must be a positive integer');
1028
+ return cmdKnowhowRank(cwd, query, topN, raw);
1029
+ }
1030
+ return cmdKnowhowList(
1031
+ cwd,
1032
+ raw,
1033
+ flag(args, '--module'),
1034
+ flag(args, '--limit') ? parseInt(flag(args, '--limit')!, 10) : undefined
1035
+ );
1036
+ },
1037
+ },
1038
+ {
1039
+ command: 'budget',
1040
+ handler: (args, cwd, raw) => {
1041
+ if (!args[1]) error('phase required. Usage: gd budget <phase>');
1042
+ return cmdBudget(cwd, args[1], raw);
1043
+ },
1044
+ },
1045
+ {
1046
+ command: 'blame',
1047
+ handler: (args, cwd, raw) => {
1048
+ if (!args[1]) error('phase required. Usage: gd blame <phase>');
1049
+ return cmdBlame(cwd, args[1], raw);
1050
+ },
1051
+ },
1052
+ {
1053
+ command: 'freshness',
1054
+ handler: (args, cwd, raw) => cmdFreshness(cwd, args[1] ?? null, raw),
1055
+ },
1056
+ {
1057
+ command: 'rollback',
1058
+ handler: (args, cwd, raw) => {
1059
+ if (!args[1]) error('phase required. Usage: gd rollback <phase>');
1060
+ validatePhaseArg(args[1]);
1061
+ return cmdRollback(cwd, args[1], raw);
1062
+ },
1063
+ },
1064
+ {
1065
+ command: 'estimate',
1066
+ handler: (args, cwd, raw) => {
1067
+ if (!args[1]) error('phase required. Usage: gd estimate <phase>');
1068
+ validatePhaseArg(args[1]);
1069
+ return cmdEstimate(cwd, args[1], raw);
1070
+ },
1071
+ },
1072
+ {
1073
+ command: 'estimate-phase',
1074
+ handler: (args, cwd, raw) => {
1075
+ if (!args[1]) error('phase required. Usage: gd estimate-phase <phase>');
1076
+ validatePhaseArg(args[1]);
1077
+ return cmdEstimatePhase(cwd, args[1], raw);
1078
+ },
1079
+ },
1080
+ {
1081
+ command: 'impact',
1082
+ handler: (args, cwd, raw) => {
1083
+ if (!args[1]) error('phase required. Usage: gd impact <phase>');
1084
+ validatePhaseArg(args[1]);
1085
+ return cmdImpact(cwd, args[1], raw);
1086
+ },
1087
+ },
1088
+ {
1089
+ command: 'check-assumptions',
1090
+ handler: (args, cwd, raw) => {
1091
+ if (!args[1]) error('phase required. Usage: gd check-assumptions <phase>');
1092
+ validatePhaseArg(args[1]);
1093
+ return cmdCheckAssumptions(cwd, args[1], raw, args.includes('--skip-assumption-check'));
1094
+ },
1095
+ },
1096
+ {
1097
+ command: 'execute-phase',
1098
+ handler: (args, cwd, raw) => {
1099
+ if (args.includes('--dry-run')) {
1100
+ if (!args[1] || args[1].startsWith('--')) error('phase required. Usage: gd execute-phase <phase> --dry-run');
1101
+ validatePhaseArg(args[1]);
1102
+ return cmdExecutePhaseDryRun(cwd, args[1], raw);
1103
+ }
1104
+ // Non-dry-run execute-phase falls through to init workflow
1105
+ const includes: Set<string> = parseIncludeFlag(args);
1106
+ const phase = args[1];
1107
+ if (!phase || phase.startsWith('--')) error('phase required. Usage: gd execute-phase <phase>');
1108
+ validatePhaseArg(phase);
1109
+ const { cmdInitExecutePhase } = require('../lib/context/index') as {
1110
+ cmdInitExecutePhase: (cwd: string, phase: string, includes: Set<string>, raw: boolean) => void;
1111
+ };
1112
+ return cmdInitExecutePhase(cwd, phase, includes, raw);
1113
+ },
1114
+ },
1115
+ {
1116
+ command: 'knowledge',
1117
+ handler: (args, cwd, raw) => {
1118
+ const sub = args[1];
1119
+ if (sub === 'search') {
1120
+ // Codex r3 P2: skip both the flag and its value so e.g.
1121
+ // `gd knowledge search cache --top 5` searches for "cache",
1122
+ // not "cache 5". Walks the slice, skipping flags and the
1123
+ // token immediately following any value-bearing flag.
1124
+ const FLAGS_WITH_VALUE = new Set(['--top']);
1125
+ const queryParts: string[] = [];
1126
+ const rest = args.slice(2);
1127
+ for (let i = 0; i < rest.length; i++) {
1128
+ const a = rest[i];
1129
+ if (a.startsWith('--')) {
1130
+ if (FLAGS_WITH_VALUE.has(a)) i++;
1131
+ continue;
1132
+ }
1133
+ queryParts.push(a);
1134
+ }
1135
+ const query = queryParts.join(' ');
1136
+ if (!query) error('query required. Usage: gd knowledge search <query>');
1137
+ const topN = parseInt(flag(args, '--top') ?? '10', 10);
1138
+ return cmdKnowhowSearch(cwd, query, topN, raw);
1139
+ }
1140
+ error(`Unknown knowledge subcommand: ${sub || '(none)'}. Valid: search`);
1141
+ },
1142
+ },
1143
+ {
1144
+ command: 'check-plans',
1145
+ handler: (args, cwd, raw) => {
1146
+ const phase = flag(args, '--phase') ?? null;
1147
+ const milestone = flag(args, '--milestone') ?? null;
1148
+ return cmdCheckPlans(cwd, { phase, milestone }, raw);
1149
+ },
1150
+ },
1151
+ {
1152
+ command: 'eval',
1153
+ handler: (args, cwd, raw) => {
1154
+ const sub = args[1];
1155
+ if (sub === 'diff') {
1156
+ const phaseA = args[2];
1157
+ const phaseB = args[3] ?? 'latest';
1158
+ if (!phaseA) error('Usage: gd eval diff <phaseA> <phaseB> — or: gd eval diff latest');
1159
+ if (phaseA !== 'latest') validatePhaseArg(phaseA);
1160
+ if (phaseB !== 'latest') validatePhaseArg(phaseB);
1161
+ return cmdEvalDiff(cwd, phaseA, phaseB, raw);
1162
+ }
1163
+ error(`Unknown eval subcommand: ${sub || '(none)'}. Valid: diff`);
1164
+ },
1165
+ },
1166
+ {
1167
+ command: 'tail',
1168
+ handler: (args, cwd, raw) => {
1169
+ const phaseFilter = flag(args, '--phase') ?? null;
1170
+ const follow = args.includes('-f') || args.includes('--follow');
1171
+ return cmdTail(cwd, phaseFilter, follow, raw);
1172
+ },
1173
+ },
1174
+ {
1175
+ command: 'forecast-phase',
1176
+ handler: (args, cwd, raw) => {
1177
+ const phase = args[1];
1178
+ if (!phase) error('phase required. Usage: gd forecast-phase <phase>');
1179
+ validatePhaseArg(phase);
1180
+
1181
+ const { phasesDir: _phasesDir } = require('../lib/paths') as { phasesDir: (cwd: string) => string };
1182
+ const { safeReadFile: _safeRead, execGit: _execGit } = require('../lib/utils') as {
1183
+ safeReadFile: (p: string) => string | null;
1184
+ execGit: (cwd: string, args: string[]) => { exitCode: number; stdout: string; stderr: string };
1185
+ };
1186
+
1187
+ const phasesBase = _phasesDir(cwd);
1188
+ let phaseDir: string | null = null;
1189
+ try {
1190
+ // Codex r15 P2: match the canonical zero-padded form too so
1191
+ // `gd forecast-phase 1` resolves to `01-test/`.
1192
+ const padded = /^\d+$/.test(phase) ? phase.padStart(2, '0') : phase;
1193
+ const dirs: string[] = fs.readdirSync(phasesBase);
1194
+ const match = dirs.find(
1195
+ (d: string) =>
1196
+ d === phase || d === padded ||
1197
+ d.startsWith(`${phase}-`) || d.startsWith(`${padded}-`)
1198
+ );
1199
+ if (match) phaseDir = path.join(phasesBase, match);
1200
+ } catch { /* phases dir not found */ }
1201
+
1202
+ if (!phaseDir) {
1203
+ output({ phase, error: `Phase ${phase} not found`, files: [] }, raw, `Phase ${phase} not found`);
1204
+ return;
1205
+ }
1206
+
1207
+ // Extract file paths from all PLAN.md files via regex
1208
+ const fileRegex = /(?:^|[\s`"'(,])([a-zA-Z][a-zA-Z0-9_/-]*\.[a-zA-Z]{1,5})(?=$|[\s`"',):])/gm;
1209
+ const fileCounts = new Map<string, number>();
1210
+
1211
+ let planFiles: string[] = [];
1212
+ try {
1213
+ planFiles = (fs.readdirSync(phaseDir) as string[]).filter((f: string) => f.endsWith('-PLAN.md') || f === 'PLAN.md');
1214
+ } catch { /* ignore */ }
1215
+
1216
+ for (const pf of planFiles) {
1217
+ const content = _safeRead(path.join(phaseDir, pf));
1218
+ if (!content) continue;
1219
+ let m: RegExpExecArray | null;
1220
+ fileRegex.lastIndex = 0;
1221
+ while ((m = fileRegex.exec(content)) !== null) {
1222
+ const fp = m[1];
1223
+ if (fp && fp.length > 3 && fp.includes('.') && !fp.startsWith('.')) {
1224
+ fileCounts.set(fp, (fileCounts.get(fp) ?? 0) + 1);
1225
+ }
1226
+ }
1227
+ }
1228
+
1229
+ // Cross-reference with git history for co-modification frequency
1230
+ interface ForecastEntry { file: string; mentions: number; git_touches: number; confidence: number; last_modified: string }
1231
+ const fileScores: ForecastEntry[] = [];
1232
+ for (const [fp, mentions] of fileCounts) {
1233
+ const logResult = _execGit(cwd, ['log', '--oneline', '--', fp]);
1234
+ const gitTouches = logResult.exitCode === 0 ? logResult.stdout.trim().split('\n').filter(Boolean).length : 0;
1235
+ const lastResult = _execGit(cwd, ['log', '-1', '--format=%ci', '--', fp]);
1236
+ const lastModified = lastResult.exitCode === 0 ? lastResult.stdout.trim().slice(0, 10) : '';
1237
+ const confidence = Math.round(Math.min(1, mentions * 0.4 + Math.min(gitTouches, 10) * 0.06) * 100) / 100;
1238
+ fileScores.push({ file: fp, mentions, git_touches: gitTouches, confidence, last_modified: lastModified });
1239
+ }
1240
+
1241
+ fileScores.sort((a, b) => b.confidence - a.confidence || b.mentions - a.mentions);
1242
+ const top = fileScores.slice(0, 20);
1243
+
1244
+ // Write FORECAST.md to phase dir
1245
+ let forecastPath: string | null = null;
1246
+ try {
1247
+ const lines = [
1248
+ `# File Touch Forecast — Phase ${phase}`,
1249
+ '',
1250
+ `Generated: ${new Date().toISOString().slice(0, 10)}`,
1251
+ '',
1252
+ '| File | Mentions | Git Touches | Confidence | Last Modified |',
1253
+ '|------|----------|-------------|------------|---------------|',
1254
+ ...top.map((r) => `| \`${r.file}\` | ${r.mentions} | ${r.git_touches} | ${r.confidence} | ${r.last_modified || 'n/a'} |`),
1255
+ ];
1256
+ const fp = path.join(phaseDir, 'FORECAST.md');
1257
+ fs.writeFileSync(fp, lines.join('\n') + '\n', 'utf-8');
1258
+ forecastPath = path.relative(cwd, fp);
1259
+ } catch { /* non-fatal */ }
1260
+
1261
+ const summary = top.length > 0
1262
+ ? `Top predicted files:\n${top.slice(0, 5).map((r, i) => ` ${i + 1}. ${r.file} (confidence: ${r.confidence})`).join('\n')}`
1263
+ : 'No file paths found in plan descriptions';
1264
+
1265
+ output({ phase, files_found: fileScores.length, top_files: top, forecast_path: forecastPath }, raw, summary);
1266
+ },
1267
+ },
1268
+ {
1269
+ command: 'import-knowhow',
1270
+ handler: (args, cwd, raw) => {
1271
+ if (!args[1]) error('source project directory required. Usage: gd import-knowhow <source-dir>');
1272
+ const topStr = flag(args, '--top');
1273
+ const topN = topStr ? parseInt(topStr, 10) : undefined;
1274
+ return cmdImportKnowhow(cwd, args[1], raw, topN, args.includes('--all'), args.includes('--dry-run'));
1275
+ },
1276
+ },
1277
+ { command: 'research-gaps', handler: (_args, cwd, raw) => cmdResearchGaps(cwd, raw) },
1278
+ {
1279
+ command: 'deps-risk',
1280
+ handler: (args, cwd, raw) => cmdDepsRisk(cwd, args[1] ?? null, raw),
1281
+ },
1282
+ { command: 'watch', handler: (_args, cwd, raw) => cmdWatch(cwd, raw) },
1283
+ {
1284
+ command: 'singularity',
1285
+ handler: (args, cwd, raw) => {
1286
+ const since = flag(args, '--since') ?? null;
1287
+ const all = args.includes('--all');
1288
+ const byIteration = args.includes('--by-iteration');
1289
+ cmdSingularity(cwd, { since, all, byIteration }, raw);
1290
+ },
1291
+ },
1292
+ {
1293
+ command: 'plan-lint',
1294
+ handler: (args, cwd, raw) => {
1295
+ if (!args[1]) {
1296
+ error('milestone name required. Usage: gd plan-lint <milestone>');
1297
+ }
1298
+ cmdPlanLint(cwd, args[1], raw);
1299
+ },
1300
+ },
1301
+ {
1302
+ command: 'plan-candidates',
1303
+ handler: (args, cwd, raw) => {
1304
+ if (!args[1]) {
1305
+ error(
1306
+ 'phase number required. Usage: gd plan-candidates <N> --candidates K [--input FILE] [--allow-partial-candidates]'
1307
+ );
1308
+ }
1309
+ const phaseNum: string = args[1];
1310
+ const candidatesArg: string | undefined = flag(args, '--candidates');
1311
+ const inputFile: string | undefined = flag(args, '--input');
1312
+ const allowPartial: boolean = args.includes('--allow-partial-candidates');
1313
+ const candidates: number = candidatesArg ? parseInt(candidatesArg, 10) : 0;
1314
+ if (candidatesArg && (!Number.isInteger(candidates) || candidates < 1)) {
1315
+ error(`--candidates must be a positive integer, got "${candidatesArg}"`);
1316
+ }
1317
+ cmdPlanPhase(cwd, phaseNum, { candidates, inputFile, allowPartial }, raw);
1318
+ },
1319
+ },
1320
+ {
1321
+ command: 'select-candidate',
1322
+ handler: (args, cwd, raw) => {
1323
+ if (!args[1]) {
1324
+ error(
1325
+ 'phase number required. Usage: gd select-candidate <N> [--dry-run] [--force] [--run-verification-commands]'
1326
+ );
1327
+ }
1328
+ const phaseNum: string = args[1];
1329
+ const dryRun: boolean = args.includes('--dry-run');
1330
+ const force: boolean = args.includes('--force');
1331
+ const runVerificationCommands: boolean = args.includes('--run-verification-commands');
1332
+ cmdSelectCandidate(cwd, phaseNum, { dryRun, force, runVerificationCommands }, raw);
1333
+ },
1334
+ },
1335
+ {
1336
+ command: 'patterns',
1337
+ handler: (args, cwd, raw) => {
1338
+ // --dry-run is the default; --apply requires --yes (never-auto-write).
1339
+ const apply: boolean = args.includes('--apply');
1340
+ const yes: boolean = args.includes('--yes');
1341
+ const minOcc = flag(args, '--min-occurrences');
1342
+ const effSize = flag(args, '--effect-size');
1343
+ const fdr = flag(args, '--fdr-q');
1344
+ cmdPatterns(
1345
+ cwd,
1346
+ {
1347
+ apply,
1348
+ yes,
1349
+ minOccurrences: minOcc !== undefined ? parseInt(minOcc, 10) : undefined,
1350
+ effectSize: effSize !== undefined ? parseFloat(effSize) : undefined,
1351
+ fdrQ: fdr !== undefined ? parseFloat(fdr) : undefined,
1352
+ },
1353
+ raw
1354
+ );
1355
+ },
1356
+ },
1357
+ {
1358
+ command: 'install',
1359
+ handler: (args, cwd, raw) => {
1360
+ // Positional harness names (everything after `install` that isn't a flag).
1361
+ const harnesses = args
1362
+ .slice(1)
1363
+ .filter((a) => !a.startsWith('--')) as Array<'claude' | 'codex' | 'gemini' | 'opencode'>;
1364
+ cmdInstall(
1365
+ cwd,
1366
+ {
1367
+ harnesses,
1368
+ all: args.includes('--all'),
1369
+ list: args.includes('--list'),
1370
+ dryRun: args.includes('--dry-run'),
1371
+ },
1372
+ raw
1373
+ );
1374
+ },
1375
+ },
1376
+ ];
1377
+
1378
+ // ─── Subcommand Arrays ──────────────────────────────────────────────────────
1379
+
1380
+ const STATE_SUBS: readonly string[] = [
1381
+ 'load',
1382
+ 'get',
1383
+ 'patch',
1384
+ 'update',
1385
+ 'advance-plan',
1386
+ 'record-metric',
1387
+ 'update-progress',
1388
+ 'add-decision',
1389
+ 'add-blocker',
1390
+ 'resolve-blocker',
1391
+ 'record-session',
1392
+ ];
1393
+ const TEMPLATE_SUBS: readonly string[] = ['select', 'fill'];
1394
+ const FRONTMATTER_SUBS: readonly string[] = ['get', 'set', 'merge', 'validate'];
1395
+ const VERIFY_SUBS: readonly string[] = [
1396
+ 'plan-structure',
1397
+ 'phase-completeness',
1398
+ 'references',
1399
+ 'commits',
1400
+ 'artifacts',
1401
+ 'key-links',
1402
+ 'mechanical',
1403
+ ];
1404
+ const PHASES_SUBS: readonly string[] = ['list'];
1405
+ const ROADMAP_SUBS: readonly string[] = ['get-phase', 'analyze'];
1406
+ const PHASE_SUBS: readonly string[] = [
1407
+ 'next-decimal',
1408
+ 'add',
1409
+ 'insert',
1410
+ 'remove',
1411
+ 'complete',
1412
+ 'analyze-deps',
1413
+ ];
1414
+ const MILESTONE_SUBS: readonly string[] = ['complete'];
1415
+ const VALIDATE_SUBS: readonly string[] = ['consistency'];
1416
+ const TODO_SUBS: readonly string[] = ['complete'];
1417
+ const TRACKER_SUBS: readonly string[] = [
1418
+ 'get-config',
1419
+ 'sync-roadmap',
1420
+ 'sync-phase',
1421
+ 'update-status',
1422
+ 'add-comment',
1423
+ 'sync-status',
1424
+ 'schedule',
1425
+ 'prepare-reschedule',
1426
+ 'prepare-roadmap-sync',
1427
+ 'prepare-phase-sync',
1428
+ 'record-mapping',
1429
+ 'record-status',
1430
+ ];
1431
+ const REQUIREMENT_SUBS: readonly string[] = ['get', 'list', 'traceability', 'update-status'];
1432
+ const WORKTREE_SUBS: readonly string[] = [
1433
+ 'create',
1434
+ 'remove',
1435
+ 'list',
1436
+ 'push-pr',
1437
+ 'ensure-milestone-branch',
1438
+ 'merge',
1439
+ 'hook',
1440
+ ];
1441
+ const { INIT_WORKFLOWS } = require('../lib/cli/index') as { INIT_WORKFLOWS: readonly string[] };
1442
+
1443
+ // ─── Main ───────────────────────────────────────────────────────────────────
1444
+
1445
+ async function main(): Promise<void> {
1446
+ const args = process.argv.slice(2);
1447
+ const rawIndex = args.indexOf('--raw');
1448
+ const raw = rawIndex !== -1;
1449
+ if (rawIndex !== -1) args.splice(rawIndex, 1);
1450
+ const command = args[0];
1451
+ const cwd = process.cwd();
1452
+
1453
+ if (!command) {
1454
+ error(
1455
+ 'Usage: grd-tools <command> [args] [--raw]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, tracker, init, dashboard, phase-detail, health, detect-backend, long-term-roadmap, quality-analysis, setup, search, requirement, worktree, migrate-dirs, coverage-report, health-check, dead-end'
1456
+ );
1457
+ }
1458
+
1459
+ try {
1460
+ await routeCommand(command, args, cwd, raw);
1461
+ } catch (e: unknown) {
1462
+ error((e as Error).stack || String(e));
1463
+ }
1464
+ }
1465
+
1466
+ // ─── Route Command ──────────────────────────────────────────────────────────
1467
+
1468
+ /** Validate and route CLI commands */
1469
+ async function routeCommand(
1470
+ command: string,
1471
+ args: string[],
1472
+ cwd: string,
1473
+ raw: boolean
1474
+ ): Promise<void> {
1475
+ // Descriptor-based dispatch: check ROUTE_DESCRIPTORS before falling through to switch
1476
+ const descriptor = ROUTE_DESCRIPTORS.find((d) => d.command === command);
1477
+ if (descriptor) {
1478
+ return descriptor.handler(args, cwd, raw) as void;
1479
+ }
1480
+
1481
+ switch (command) {
1482
+ case 'state': {
1483
+ const sub: string = args[1];
1484
+ // No subcommand defaults to load -- only validate if provided
1485
+ if (sub) validateSubcommand(sub, STATE_SUBS as string[], 'state');
1486
+ if (sub === 'update') cmdStateUpdate(cwd, args[2], args[3]);
1487
+ else if (sub === 'get') cmdStateGet(cwd, args[2], raw);
1488
+ else if (sub === 'patch') {
1489
+ const patches: Record<string, string> = {};
1490
+ for (let i = 2; i < args.length; i += 2) {
1491
+ const k: string = args[i].replace(/^--/, '');
1492
+ if (k && args[i + 1] !== undefined) patches[k] = args[i + 1];
1493
+ }
1494
+ cmdStatePatch(cwd, patches, raw);
1495
+ } else if (sub === 'advance-plan') cmdStateAdvancePlan(cwd, raw);
1496
+ else if (sub === 'record-metric') {
1497
+ cmdStateRecordMetric(
1498
+ cwd,
1499
+ {
1500
+ phase: flag(args, '--phase') ?? null,
1501
+ plan: flag(args, '--plan') ?? null,
1502
+ duration: flag(args, '--duration') ?? null,
1503
+ tasks: flag(args, '--tasks') ?? null,
1504
+ files: flag(args, '--files') ?? null,
1505
+ },
1506
+ raw
1507
+ );
1508
+ } else if (sub === 'update-progress') cmdStateUpdateProgress(cwd, raw);
1509
+ else if (sub === 'add-decision') {
1510
+ cmdStateAddDecision(
1511
+ cwd,
1512
+ {
1513
+ phase: flag(args, '--phase') ?? null,
1514
+ summary: flag(args, '--summary') ?? null,
1515
+ rationale: flag(args, '--rationale') ?? '',
1516
+ },
1517
+ raw
1518
+ );
1519
+ } else if (sub === 'add-blocker') cmdStateAddBlocker(cwd, flag(args, '--text') ?? '', raw);
1520
+ else if (sub === 'resolve-blocker')
1521
+ cmdStateResolveBlocker(cwd, flag(args, '--text') ?? '', raw);
1522
+ else if (sub === 'record-session') {
1523
+ cmdStateRecordSession(
1524
+ cwd,
1525
+ {
1526
+ stopped_at: flag(args, '--stopped-at') ?? null,
1527
+ resume_file: flag(args, '--resume-file') ?? 'None',
1528
+ },
1529
+ raw
1530
+ );
1531
+ } else cmdStateLoad(cwd, raw);
1532
+ break;
1533
+ }
1534
+ case 'resolve-model':
1535
+ cmdResolveModel(cwd, args[1], raw);
1536
+ break;
1537
+ case 'find-phase':
1538
+ cmdFindPhase(cwd, args[1], raw);
1539
+ break;
1540
+ case 'commit': {
1541
+ const filesIndex: number = args.indexOf('--files');
1542
+ cmdCommit(
1543
+ cwd,
1544
+ args[1],
1545
+ filesIndex !== -1
1546
+ ? args.slice(filesIndex + 1).filter((a: string) => !a.startsWith('--'))
1547
+ : [],
1548
+ raw,
1549
+ args.includes('--amend')
1550
+ );
1551
+ break;
1552
+ }
1553
+ case 'verify-summary': {
1554
+ validateFileArg(args[1], cwd);
1555
+ const cc: number = args.indexOf('--check-count');
1556
+ cmdVerifySummary(cwd, args[1], cc !== -1 ? parseInt(args[cc + 1], 10) : 2, raw);
1557
+ break;
1558
+ }
1559
+ case 'template': {
1560
+ const sub: string = args[1];
1561
+ validateSubcommand(sub, TEMPLATE_SUBS as string[], 'template');
1562
+ if (sub === 'select') cmdTemplateSelect(cwd, args[2], raw);
1563
+ else if (sub === 'fill') {
1564
+ cmdTemplateFill(
1565
+ cwd,
1566
+ args[2],
1567
+ {
1568
+ phase: flag(args, '--phase') ?? null,
1569
+ plan: flag(args, '--plan') ?? null,
1570
+ name: flag(args, '--name') ?? null,
1571
+ type: flag(args, '--type') ?? 'execute',
1572
+ wave: flag(args, '--wave') ?? '1',
1573
+ fields: flag(args, '--fields') ? JSON.parse(flag(args, '--fields') as string) : {},
1574
+ },
1575
+ raw
1576
+ );
1577
+ }
1578
+ break;
1579
+ }
1580
+ case 'frontmatter': {
1581
+ const sub: string = args[1];
1582
+ validateSubcommand(sub, FRONTMATTER_SUBS as string[], 'frontmatter');
1583
+ const file: string = args[2];
1584
+ validateFileArg(file, cwd);
1585
+ if (sub === 'get') cmdFrontmatterGet(cwd, file, flag(args, '--field') ?? null, raw);
1586
+ else if (sub === 'set')
1587
+ cmdFrontmatterSet(cwd, file, flag(args, '--field') ?? '', flag(args, '--value') ?? '', raw);
1588
+ else if (sub === 'merge') cmdFrontmatterMerge(cwd, file, flag(args, '--data') ?? '', raw);
1589
+ else if (sub === 'validate')
1590
+ cmdFrontmatterValidate(cwd, file, flag(args, '--schema') ?? '', raw);
1591
+ break;
1592
+ }
1593
+ case 'verify': {
1594
+ const sub: string = args[1];
1595
+ validateSubcommand(sub, VERIFY_SUBS as string[], 'verify');
1596
+ if (sub === 'commits') {
1597
+ for (const ref of args.slice(2)) validateGitRef(ref);
1598
+ cmdVerifyCommits(cwd, args.slice(2), raw);
1599
+ } else if (sub === 'mechanical') {
1600
+ // Bundle: arg is a phase number/name, not a file path
1601
+ cmdVerifyMechanical(cwd, args[2], raw);
1602
+ } else {
1603
+ validateFileArg(args[2], cwd);
1604
+ if (sub === 'plan-structure') cmdVerifyPlanStructure(cwd, args[2], raw);
1605
+ else if (sub === 'phase-completeness') cmdVerifyPhaseCompleteness(cwd, args[2], raw);
1606
+ else if (sub === 'references') cmdVerifyReferences(cwd, args[2], raw);
1607
+ else if (sub === 'artifacts') cmdVerifyArtifacts(cwd, args[2], raw);
1608
+ else if (sub === 'key-links') cmdVerifyKeyLinks(cwd, args[2], raw);
1609
+ }
1610
+ break;
1611
+ }
1612
+ case 'generate-slug':
1613
+ cmdGenerateSlug(args[1], raw);
1614
+ break;
1615
+ case 'current-timestamp':
1616
+ cmdCurrentTimestamp(args[1] || 'full', raw);
1617
+ break;
1618
+ case 'list-todos':
1619
+ cmdListTodos(cwd, args[1], raw);
1620
+ break;
1621
+ case 'verify-path-exists':
1622
+ cmdVerifyPathExists(cwd, args[1], raw, args.includes('--dry-run'));
1623
+ break;
1624
+ case 'config-ensure-section':
1625
+ cmdConfigEnsureSection(cwd, raw, args.includes('--dry-run'));
1626
+ break;
1627
+ case 'config-set':
1628
+ cmdConfigSet(cwd, args[1], args[2], raw, args.includes('--dry-run'));
1629
+ break;
1630
+ case 'history-digest':
1631
+ cmdHistoryDigest(cwd, raw);
1632
+ break;
1633
+ case 'dead-end': {
1634
+ const sub: string = args[1];
1635
+ if (sub === 'add') {
1636
+ // Collect all --evidence flags (repeatable)
1637
+ const evidence: string[] = [];
1638
+ for (let i = 0; i < args.length; i++) {
1639
+ if (args[i] === '--evidence' && args[i + 1]) evidence.push(args[i + 1]);
1640
+ }
1641
+ cmdDeadEndAdd(
1642
+ cwd,
1643
+ {
1644
+ approach: flag(args, '--approach') ?? '',
1645
+ phase: flag(args, '--phase') ?? '',
1646
+ verdict: flag(args, '--verdict'),
1647
+ evidence,
1648
+ notes: flag(args, '--notes'),
1649
+ },
1650
+ raw
1651
+ );
1652
+ } else if (sub === 'promote-from-phase') {
1653
+ // Prefer the explicit --phase flag when present. Fall back to
1654
+ // positional args[2], but only if it is NOT itself a flag —
1655
+ // otherwise `promote-from-phase --phase 1` would pass the literal
1656
+ // string "--phase" to findPhaseInternal (codex r1 P2 on PR #37).
1657
+ const flagPhase = flag(args, '--phase');
1658
+ const positional = args[2] && !args[2].startsWith('--') ? args[2] : undefined;
1659
+ const phaseArg = flagPhase ?? positional ?? '';
1660
+ cmdDeadEndPromoteFromPhase(cwd, phaseArg, raw);
1661
+ } else {
1662
+ error(`Unknown dead-end subcommand: ${sub}. Valid: add, promote-from-phase`);
1663
+ }
1664
+ break;
1665
+ }
1666
+ case 'genome': {
1667
+ const sub: string = args[1];
1668
+ if (sub === 'init') {
1669
+ cmdGenomeInit(cwd, raw);
1670
+ } else if (sub === 'show') {
1671
+ cmdGenomeShow(cwd, raw);
1672
+ } else if (sub === 'snapshot') {
1673
+ cmdGenomeSnapshot(cwd, raw);
1674
+ } else if (sub === 'promote-suggestion') {
1675
+ const slug = args[2] && !args[2].startsWith('--') ? args[2] : '';
1676
+ cmdGenomePromoteSuggestion(cwd, slug, raw);
1677
+ } else {
1678
+ error(
1679
+ `Unknown genome subcommand: ${sub}. Valid: init, show, snapshot, promote-suggestion`
1680
+ );
1681
+ }
1682
+ break;
1683
+ }
1684
+ case 'think': {
1685
+ // Tier-3 #11 of the Ouroboros integration. One-shot project-state
1686
+ // aggregator. No daemon, no LLM, writes only to .planning/thoughts/.
1687
+ //
1688
+ // codex r1 P3 on PR #42: strictly validate --limit. Pre-fix:
1689
+ // `--limit 1.5` parseInt → 1 (silent truncation)
1690
+ // `--limit 3abc` parseInt → 3 (silent truncation)
1691
+ // `--limit` (no value) → silently defaulted
1692
+ // All three slipped past the positive-integer check downstream.
1693
+ let limit: number | undefined;
1694
+ if (args.indexOf('--limit') !== -1) {
1695
+ const limitRaw = flag(args, '--limit');
1696
+ if (limitRaw === undefined || !/^\d+$/.test(limitRaw)) {
1697
+ error(
1698
+ `--limit requires a positive integer value (got ${limitRaw === undefined ? '<missing>' : `"${limitRaw}"`})`
1699
+ );
1700
+ }
1701
+ limit = parseInt(limitRaw as string, 10);
1702
+ }
1703
+ cmdThink(cwd, { limit }, raw);
1704
+ break;
1705
+ }
1706
+ case 'plan-tournament': {
1707
+ // Tier-3 #9 of the Ouroboros integration. Scoring + selection over
1708
+ // N candidate PLAN.md files. Caller supplies paths; this command
1709
+ // does NOT auto-generate candidates (that's a deliberate follow-up
1710
+ // to avoid worktree orchestration + backend variance per the
1711
+ // proposal's caveat).
1712
+ const rawCandidates: string[] = [];
1713
+ for (let i = 0; i < args.length; i++) {
1714
+ if (args[i] === '--candidate' && args[i + 1]) rawCandidates.push(args[i + 1]);
1715
+ }
1716
+ // Also accept comma-separated list via --candidates "a.md,b.md"
1717
+ const csv = flag(args, '--candidates');
1718
+ if (csv) {
1719
+ for (const p of csv.split(',')) {
1720
+ const trimmed = p.trim();
1721
+ if (trimmed) rawCandidates.push(trimmed);
1722
+ }
1723
+ }
1724
+ // codex r4 P2 on PR #41: validate each candidate path against the
1725
+ // project boundary before passing it to the scorer. Without this
1726
+ // guard, absolute paths or `../` traversal could read files
1727
+ // outside the repo when gd is invoked via automation / MCP.
1728
+ //
1729
+ // codex r5 P2 on PR #41: validateFileArg's underlying check is
1730
+ // prefix-based, so a sibling like `${cwd}-secrets/PLAN.md` would
1731
+ // squeak through. Tighten with a path.relative containment check.
1732
+ const path_lib = require('path') as typeof import('path');
1733
+ const candidates: string[] = rawCandidates.map((p) => {
1734
+ const validated = validateFileArg(p, cwd);
1735
+ const rel = path_lib.relative(cwd, validated);
1736
+ if (rel === '' || rel.startsWith('..') || path_lib.isAbsolute(rel)) {
1737
+ error(`Candidate path "${p}" is outside the project directory`);
1738
+ }
1739
+ return validated;
1740
+ });
1741
+ // codex r5 P3: validate phase format before interpolating into
1742
+ // _extractRoadmapGoal's regex, where a malformed value would
1743
+ // crash with a regex syntax error.
1744
+ const phaseArg = flag(args, '--phase') ?? '';
1745
+ if (phaseArg) validatePhaseArg(phaseArg);
1746
+ cmdPlanTournament(cwd, { phase: phaseArg, candidates }, raw);
1747
+ break;
1748
+ }
1749
+ case 'phases': {
1750
+ const sub: string = args[1];
1751
+ validateSubcommand(sub, PHASES_SUBS as string[], 'phases');
1752
+ cmdPhasesList(
1753
+ cwd,
1754
+ { type: flag(args, '--type') ?? null, phase: flag(args, '--phase') ?? null },
1755
+ raw
1756
+ );
1757
+ break;
1758
+ }
1759
+ case 'roadmap': {
1760
+ const sub: string = args[1];
1761
+ validateSubcommand(sub, ROADMAP_SUBS as string[], 'roadmap');
1762
+ if (sub === 'get-phase') {
1763
+ validatePhaseArg(args[2]);
1764
+ cmdRoadmapGetPhase(cwd, args[2], raw);
1765
+ } else if (sub === 'analyze') cmdRoadmapAnalyze(cwd, raw);
1766
+ break;
1767
+ }
1768
+ case 'phase': {
1769
+ const sub: string = args[1];
1770
+ validateSubcommand(sub, PHASE_SUBS as string[], 'phase');
1771
+ if (sub === 'next-decimal') {
1772
+ validatePhaseArg(args[2]);
1773
+ cmdPhaseNextDecimal(cwd, args[2], raw);
1774
+ } else if (sub === 'add') {
1775
+ const ctxIdx: number = args.indexOf('--context');
1776
+ let context: string | undefined;
1777
+ if (ctxIdx !== -1) {
1778
+ context = args.slice(ctxIdx + 1).join(' ');
1779
+ args.splice(ctxIdx);
1780
+ }
1781
+ cmdPhaseAdd(cwd, args.slice(2).join(' '), raw, context);
1782
+ } else if (sub === 'insert') {
1783
+ validatePhaseArg(args[2]);
1784
+ cmdPhaseInsert(cwd, args[2], args.slice(3).join(' '), raw);
1785
+ } else if (sub === 'remove') {
1786
+ validatePhaseArg(args[2]);
1787
+ cmdPhaseRemove(
1788
+ cwd,
1789
+ args[2],
1790
+ { force: args.includes('--force'), dryRun: args.includes('--dry-run') },
1791
+ raw
1792
+ );
1793
+ } else if (sub === 'complete') {
1794
+ validatePhaseArg(args[2]);
1795
+ await cmdPhaseComplete(cwd, args[2], raw, { dryRun: args.includes('--dry-run') });
1796
+ } else if (sub === 'analyze-deps') {
1797
+ cmdPhaseAnalyzeDeps(cwd, raw);
1798
+ }
1799
+ break;
1800
+ }
1801
+ case 'milestone': {
1802
+ const sub: string = args[1];
1803
+ validateSubcommand(sub, MILESTONE_SUBS as string[], 'milestone');
1804
+ if (sub === 'complete') {
1805
+ const ni: number = args.indexOf('--name');
1806
+ const version: string | null =
1807
+ args.slice(2).find((a: string) => !a.startsWith('--')) || null;
1808
+ cmdMilestoneComplete(
1809
+ cwd,
1810
+ version,
1811
+ {
1812
+ name: ni !== -1 ? args[ni + 1] : null,
1813
+ dryRun: args.includes('--dry-run'),
1814
+ },
1815
+ raw
1816
+ );
1817
+ }
1818
+ break;
1819
+ }
1820
+ case 'version': {
1821
+ const VERSION_SUBS: readonly string[] = ['bump'];
1822
+ validateSubcommand(args[1], VERSION_SUBS as string[], 'version');
1823
+ if (args[1] === 'bump') {
1824
+ if (!args[2]) error('version string required (e.g., v1.0.0)');
1825
+ cmdVersionBump(cwd, args[2], raw);
1826
+ }
1827
+ break;
1828
+ }
1829
+ case 'validate': {
1830
+ validateSubcommand(args[1], VALIDATE_SUBS as string[], 'validate');
1831
+ cmdValidateConsistency(cwd, raw);
1832
+ break;
1833
+ }
1834
+ case 'progress':
1835
+ cmdProgressRender(cwd, args[1] || 'json', raw);
1836
+ break;
1837
+ case 'todo': {
1838
+ validateSubcommand(args[1], TODO_SUBS as string[], 'todo');
1839
+ cmdTodoComplete(cwd, args[2], raw, args.includes('--dry-run'));
1840
+ break;
1841
+ }
1842
+ case 'scaffold': {
1843
+ const pi: number = args.indexOf('--phase');
1844
+ const ni: number = args.indexOf('--name');
1845
+ cmdScaffold(
1846
+ cwd,
1847
+ args[1],
1848
+ {
1849
+ phase: pi !== -1 ? args[pi + 1] : null,
1850
+ name: ni !== -1 ? args.slice(ni + 1).join(' ') : null,
1851
+ },
1852
+ raw
1853
+ );
1854
+ break;
1855
+ }
1856
+ case 'migrate-dirs':
1857
+ cmdMigrateDirs(cwd, raw, args.includes('--dry-run'));
1858
+ break;
1859
+ case 'init': {
1860
+ const wf: string = args[1];
1861
+ const includes: Set<string> = parseIncludeFlag(args);
1862
+ validateSubcommand(wf, INIT_WORKFLOWS as string[], 'init');
1863
+ switch (wf) {
1864
+ case 'execute-phase':
1865
+ validatePhaseArg(args[2]);
1866
+ cmdInitExecutePhase(cwd, args[2], includes, raw);
1867
+ break;
1868
+ case 'execute-parallel': {
1869
+ const phases: string[] = args.slice(2).filter((a: string) => !a.startsWith('--'));
1870
+ if (phases.length === 0)
1871
+ error('At least one phase number required for init execute-parallel');
1872
+ for (const p of phases) validatePhaseArg(p);
1873
+ cmdInitExecuteParallel(cwd, phases, includes, raw);
1874
+ break;
1875
+ }
1876
+ case 'plan-phase':
1877
+ validatePhaseArg(args[2]);
1878
+ cmdInitPlanPhase(cwd, args[2], includes, raw);
1879
+ break;
1880
+ case 'new-project':
1881
+ cmdInitNewProject(cwd, raw);
1882
+ break;
1883
+ case 'new-milestone':
1884
+ cmdInitNewMilestone(cwd, raw);
1885
+ break;
1886
+ case 'quick':
1887
+ cmdInitQuick(cwd, args.slice(2).join(' '), raw);
1888
+ break;
1889
+ case 'resume':
1890
+ cmdInitResume(cwd, raw);
1891
+ break;
1892
+ case 'verify-work':
1893
+ validatePhaseArg(args[2]);
1894
+ cmdInitVerifyWork(cwd, args[2], raw);
1895
+ break;
1896
+ case 'phase-op':
1897
+ validatePhaseArg(args[2]);
1898
+ cmdInitPhaseOp(cwd, args[2], raw);
1899
+ break;
1900
+ case 'todos':
1901
+ cmdInitTodos(cwd, args[2], raw);
1902
+ break;
1903
+ case 'milestone-op':
1904
+ cmdInitMilestoneOp(cwd, raw);
1905
+ break;
1906
+ case 'plan-milestone-gaps':
1907
+ cmdInitPlanMilestoneGaps(cwd, raw);
1908
+ break;
1909
+ case 'map-codebase':
1910
+ cmdInitMapCodebase(cwd, raw);
1911
+ break;
1912
+ case 'progress':
1913
+ cmdInitProgress(cwd, includes, raw, args.includes('--refresh'));
1914
+ break;
1915
+ case 'survey':
1916
+ cmdInitSurveyor(cwd, args.slice(2).join(' ') || '', raw);
1917
+ break;
1918
+ case 'deep-dive':
1919
+ cmdInitDeepDive(cwd, args.slice(2).join(' ') || '', raw);
1920
+ break;
1921
+ case 'feasibility':
1922
+ cmdInitFeasibility(cwd, args.slice(2).join(' ') || '', raw);
1923
+ break;
1924
+ case 'eval-plan':
1925
+ cmdInitEvalPlan(cwd, args[2] || null, raw);
1926
+ break;
1927
+ case 'eval-report':
1928
+ cmdInitEvalReport(cwd, args[2] || null, raw);
1929
+ break;
1930
+ case 'assess-baseline':
1931
+ cmdInitAssessBaseline(cwd, raw);
1932
+ break;
1933
+ case 'product-plan':
1934
+ cmdInitProductOwner(cwd, raw);
1935
+ break;
1936
+ case 'iterate':
1937
+ cmdInitResearchWorkflow(cwd, 'iterate', args.slice(2).join(' '), includes, raw);
1938
+ break;
1939
+ case 'project-researcher':
1940
+ cmdInitProjectResearcher(cwd, args.slice(2).join(' ') || '', raw);
1941
+ break;
1942
+ case 'research-synthesizer':
1943
+ cmdInitResearchSynthesizer(cwd, raw);
1944
+ break;
1945
+ case 'roadmapper':
1946
+ cmdInitRoadmapper(cwd, raw);
1947
+ break;
1948
+ case 'verifier':
1949
+ cmdInitVerifier(cwd, args[2] || null, raw);
1950
+ break;
1951
+ case 'autopilot':
1952
+ cmdInitAutopilot(cwd, raw);
1953
+ break;
1954
+ case 'multi-milestone-autopilot':
1955
+ cmdInitMultiMilestoneAutopilot(cwd, raw);
1956
+ break;
1957
+ case 'autoplan':
1958
+ cmdInitAutoplan(cwd, raw);
1959
+ break;
1960
+ case 'autoresearch':
1961
+ cmdInitAutoResearch(cwd, raw);
1962
+ break;
1963
+ case 'evolve':
1964
+ cmdInitEvolve(cwd, raw);
1965
+ break;
1966
+ case 'wireup':
1967
+ cmdInitWireup(cwd, raw);
1968
+ break;
1969
+ case 'debug':
1970
+ cmdInitDebug(cwd, args[2] || null, raw);
1971
+ break;
1972
+ case 'integration-check':
1973
+ cmdInitIntegrationCheck(cwd, args[2] || null, raw);
1974
+ break;
1975
+ case 'migrate':
1976
+ cmdInitMigrate(cwd, raw);
1977
+ break;
1978
+ case 'plan-check':
1979
+ validatePhaseArg(args[2]);
1980
+ cmdInitPlanCheck(cwd, args[2], raw);
1981
+ break;
1982
+ case 'phase-research':
1983
+ validatePhaseArg(args[2]);
1984
+ cmdInitPhaseResearch(cwd, args[2], includes, raw);
1985
+ break;
1986
+ case 'code-review':
1987
+ validatePhaseArg(args[2]);
1988
+ cmdInitCodeReview(cwd, args[2], raw);
1989
+ break;
1990
+ }
1991
+ break;
1992
+ }
1993
+ case 'phase-plan-index':
1994
+ validatePhaseArg(args[1]);
1995
+ cmdPhasePlanIndex(cwd, args[1], raw);
1996
+ break;
1997
+ case 'state-snapshot': {
1998
+ const sinceIdx: number = args.indexOf('--since');
1999
+ const snapshotOptions: Record<string, string | undefined> =
2000
+ sinceIdx !== -1 ? { since: args[sinceIdx + 1] } : {};
2001
+ cmdStateSnapshot(cwd, raw, snapshotOptions);
2002
+ break;
2003
+ }
2004
+ case 'summary-extract': {
2005
+ validateFileArg(args[1], cwd);
2006
+ const fi: number = args.indexOf('--fields');
2007
+ cmdSummaryExtract(cwd, args[1], fi !== -1 ? args[fi + 1].split(',') : null, raw);
2008
+ break;
2009
+ }
2010
+ case 'tracker': {
2011
+ validateSubcommand(args[1], TRACKER_SUBS as string[], 'tracker');
2012
+ await cmdTracker(cwd, args[1], args.slice(2), raw);
2013
+ break;
2014
+ }
2015
+ case 'dashboard':
2016
+ cmdDashboard(cwd, raw);
2017
+ break;
2018
+ case 'phase-detail':
2019
+ validatePhaseArg(args[1]);
2020
+ cmdPhaseDetail(cwd, args[1], raw);
2021
+ break;
2022
+ case 'health':
2023
+ cmdHealth(cwd, raw);
2024
+ break;
2025
+ case 'detect-backend':
2026
+ cmdDetectBackend(cwd, raw);
2027
+ break;
2028
+ case 'long-term-roadmap': {
2029
+ const sub: string = args[1];
2030
+ if (!sub)
2031
+ error(
2032
+ 'subcommand required: list, add, remove, update, refine, link, unlink, display, init, history, parse, validate'
2033
+ );
2034
+ const subArgs: string[] = args.slice(2);
2035
+ cmdLongTermRoadmap(cwd, sub, subArgs, raw);
2036
+ break;
2037
+ }
2038
+ case 'quality-analysis':
2039
+ cmdQualityAnalysis(cwd, args.slice(1), raw);
2040
+ break;
2041
+ case 'setup':
2042
+ cmdSetup(cwd, raw);
2043
+ break;
2044
+ case 'search':
2045
+ if (!args[1]) error('Search query is required');
2046
+ cmdSearch(cwd, args[1], raw);
2047
+ break;
2048
+ case 'requirement': {
2049
+ const sub: string = args[1];
2050
+ validateSubcommand(sub, REQUIREMENT_SUBS as string[], 'requirement');
2051
+ if (sub === 'get') {
2052
+ if (!args[2]) error('REQ-ID required');
2053
+ cmdRequirementGet(cwd, args[2], raw);
2054
+ } else if (sub === 'list') {
2055
+ cmdRequirementList(
2056
+ cwd,
2057
+ {
2058
+ phase: flag(args, '--phase') ?? null,
2059
+ priority: flag(args, '--priority') ?? null,
2060
+ status: flag(args, '--status') ?? null,
2061
+ category: flag(args, '--category') ?? null,
2062
+ all: args.includes('--all'),
2063
+ },
2064
+ raw
2065
+ );
2066
+ } else if (sub === 'traceability') {
2067
+ cmdRequirementTraceability(
2068
+ cwd,
2069
+ {
2070
+ phase: flag(args, '--phase') ?? null,
2071
+ },
2072
+ raw
2073
+ );
2074
+ } else if (sub === 'update-status') {
2075
+ if (!args[2]) error('REQ-ID required');
2076
+ if (!args[3]) error('Status required (Pending, In Progress, Done, Deferred)');
2077
+ // Handle multi-word status "In Progress" -- args[3] might be "In" and args[4] "Progress"
2078
+ let status: string = args[3];
2079
+ if (args[3] === 'In' && args[4] === 'Progress') {
2080
+ status = 'In Progress';
2081
+ }
2082
+ cmdRequirementUpdateStatus(cwd, args[2], status, raw, args.includes('--dry-run'));
2083
+ }
2084
+ break;
2085
+ }
2086
+ case 'worktree': {
2087
+ const sub: string = args[1];
2088
+ validateSubcommand(sub, WORKTREE_SUBS as string[], 'worktree');
2089
+ if (sub === 'create') {
2090
+ cmdWorktreeCreate(
2091
+ cwd,
2092
+ {
2093
+ phase: flag(args, '--phase') ?? null,
2094
+ milestone: flag(args, '--milestone') ?? null,
2095
+ slug: flag(args, '--slug') ?? null,
2096
+ startPoint: flag(args, '--start-point') ?? null,
2097
+ },
2098
+ raw
2099
+ );
2100
+ } else if (sub === 'remove') {
2101
+ if (args.includes('--stale')) {
2102
+ cmdWorktreeRemoveStale(cwd, raw);
2103
+ } else {
2104
+ cmdWorktreeRemove(
2105
+ cwd,
2106
+ {
2107
+ phase: flag(args, '--phase') ?? null,
2108
+ path: flag(args, '--path') ?? null,
2109
+ milestone: flag(args, '--milestone') ?? null,
2110
+ },
2111
+ raw
2112
+ );
2113
+ }
2114
+ } else if (sub === 'list') {
2115
+ cmdWorktreeList(cwd, raw);
2116
+ } else if (sub === 'push-pr') {
2117
+ cmdWorktreePushAndPR(
2118
+ cwd,
2119
+ {
2120
+ phase: flag(args, '--phase') ?? null,
2121
+ milestone: flag(args, '--milestone') ?? null,
2122
+ title: flag(args, '--title') ?? null,
2123
+ body: flag(args, '--body') ?? null,
2124
+ base: flag(args, '--base') ?? null,
2125
+ },
2126
+ raw
2127
+ );
2128
+ } else if (sub === 'ensure-milestone-branch') {
2129
+ cmdWorktreeEnsureMilestoneBranch(
2130
+ cwd,
2131
+ {
2132
+ milestone: flag(args, '--milestone') ?? null,
2133
+ baseBranch: flag(args, '--base-branch') ?? null,
2134
+ },
2135
+ raw
2136
+ );
2137
+ } else if (sub === 'merge') {
2138
+ cmdWorktreeMerge(
2139
+ cwd,
2140
+ {
2141
+ phase: flag(args, '--phase') ?? null,
2142
+ milestone: flag(args, '--milestone') ?? null,
2143
+ slug: flag(args, '--slug') ?? null,
2144
+ base: flag(args, '--base') ?? null,
2145
+ branch: flag(args, '--branch') ?? null,
2146
+ deleteBranch: args.includes('--delete-branch'),
2147
+ },
2148
+ raw
2149
+ );
2150
+ } else if (sub === 'hook') {
2151
+ const hookSub: string = args[2];
2152
+ if (hookSub === 'create') {
2153
+ cmdWorktreeHookCreate(cwd, args[3], args[4], raw);
2154
+ } else if (hookSub === 'remove') {
2155
+ cmdWorktreeHookRemove(cwd, args[3], args[4], raw);
2156
+ } else {
2157
+ error(`Unknown worktree hook subcommand: ${hookSub}. Use 'create' or 'remove'.`);
2158
+ }
2159
+ }
2160
+ break;
2161
+ }
2162
+ case 'settings': {
2163
+ const sub: string = args[1];
2164
+ if (sub === 'token_profile') {
2165
+ const value: string = args[2];
2166
+ const validProfiles: TokenProfileName[] = ['frugal', 'balanced', 'quality'];
2167
+ if (!value || !validProfiles.includes(value as TokenProfileName)) {
2168
+ error(
2169
+ `Invalid token_profile value "${value || ''}". Valid values: ${validProfiles.join(', ')}`
2170
+ );
2171
+ }
2172
+ cmdConfigSet(cwd, 'token_profile', value, raw);
2173
+ } else if (sub === 'phase_complete_llm_fallback') {
2174
+ const value: string = args[2];
2175
+ if (value !== 'true' && value !== 'false') {
2176
+ error(
2177
+ `Invalid phase_complete_llm_fallback value "${value || ''}". Valid values: true, false`
2178
+ );
2179
+ }
2180
+ cmdConfigSet(cwd, 'phase_complete_llm_fallback', value, raw);
2181
+ } else if (sub === 'effort') {
2182
+ // v0.4 Phase 1: effort axis
2183
+ const value: string = args[2];
2184
+ const validEffortLevels: string[] = ['thrifty', 'balanced', 'deep'];
2185
+ if (!value || !validEffortLevels.includes(value)) {
2186
+ error(
2187
+ `Invalid effort value "${value || ''}". Valid values: ${validEffortLevels.join(', ')}`
2188
+ );
2189
+ }
2190
+ cmdConfigSet(cwd, 'effort', value, raw);
2191
+ } else {
2192
+ error(
2193
+ `Unknown settings subcommand "${sub || ''}". Tool-mode settings subcommands: token_profile, effort, phase_complete_llm_fallback`
2194
+ );
2195
+ }
2196
+ break;
2197
+ }
2198
+ case 'evolve': {
2199
+ const sub: string = args[1];
2200
+ validateSubcommand(sub, ['run', 'discover', 'state', 'advance', 'reset'], 'evolve');
2201
+ switch (sub) {
2202
+ case 'run':
2203
+ await cmdEvolve(cwd, args.slice(2), raw);
2204
+ return;
2205
+ case 'discover':
2206
+ await cmdEvolveDiscover(cwd, args.slice(2), raw);
2207
+ return;
2208
+ case 'state':
2209
+ cmdEvolveState(cwd, args.slice(2), raw);
2210
+ return;
2211
+ case 'advance':
2212
+ cmdEvolveAdvance(cwd, args.slice(2), raw);
2213
+ return;
2214
+ case 'reset':
2215
+ cmdEvolveReset(cwd, args.slice(2), raw);
2216
+ return;
2217
+ }
2218
+ break;
2219
+ }
2220
+ case 'wireup': {
2221
+ const sub: string = args[1];
2222
+ validateSubcommand(sub, ['run'], 'wireup');
2223
+ if (sub === 'run') {
2224
+ await cmdWireup(cwd, args.slice(2), raw);
2225
+ return;
2226
+ }
2227
+ break;
2228
+ }
2229
+ case 'autopilot':
2230
+ await cmdAutopilot(cwd, args.slice(1), raw);
2231
+ break;
2232
+ case 'multi-milestone-autopilot':
2233
+ await cmdMultiMilestoneAutopilot(cwd, args.slice(1), raw);
2234
+ break;
2235
+ case 'autoplan':
2236
+ await cmdAutoplan(cwd, args.slice(1), raw);
2237
+ break;
2238
+ case 'autoresearch': {
2239
+ const arConfig: GrdConfig = loadConfig(cwd);
2240
+ const arScheduler = createScheduler(arConfig.scheduler, arConfig.superpowers);
2241
+ if (arScheduler) {
2242
+ arScheduler.loadPersistedState(path.join(cwd, '.planning'));
2243
+ }
2244
+ await cmdAutoResearch(cwd, args.slice(1), raw, arScheduler);
2245
+ break;
2246
+ }
2247
+ case 'worktree-hook-create':
2248
+ cmdWorktreeHookCreate(cwd, args[1], args[2], raw);
2249
+ break;
2250
+ case 'worktree-hook-remove':
2251
+ cmdWorktreeHookRemove(cwd, args[1], args[2], raw);
2252
+ break;
2253
+ case 'coverage-report':
2254
+ cmdCoverageReport(
2255
+ cwd,
2256
+ { threshold: parseInt(flag(args, '--threshold', '85') as string, 10) },
2257
+ raw
2258
+ );
2259
+ break;
2260
+ case 'health-check':
2261
+ cmdHealthCheck(cwd, { fix: args.includes('--fix') }, raw);
2262
+ break;
2263
+ case 'markdown-split': {
2264
+ _warnDeprecated('markdown-split');
2265
+ const sub: string = args[1];
2266
+ validateSubcommand(sub, ['split', 'check'], 'markdown-split');
2267
+ switch (sub) {
2268
+ case 'split': {
2269
+ const filePath: string = args[2];
2270
+ if (!filePath) error('file path required for markdown-split split');
2271
+ const absPath: string = path.resolve(cwd, filePath);
2272
+ if (!fs.existsSync(absPath)) error(`File not found: ${absPath}`);
2273
+
2274
+ const thresholdIdx: number = args.indexOf('--threshold');
2275
+ const threshold: number | undefined =
2276
+ thresholdIdx !== -1 ? parseInt(args[thresholdIdx + 1], 10) : undefined;
2277
+
2278
+ const content: string = fs.readFileSync(absPath, 'utf-8');
2279
+ const basename: string = path.basename(absPath, '.md');
2280
+ const dir: string = path.dirname(absPath);
2281
+ const result = splitMarkdown(content, { threshold, basename });
2282
+
2283
+ if (!result.split_performed) {
2284
+ output({ split_performed: false, reason: result.reason, file: absPath }, raw);
2285
+ break;
2286
+ }
2287
+
2288
+ // Write index file (overwrite original)
2289
+ fs.writeFileSync(absPath, result.index_content, 'utf-8');
2290
+
2291
+ // Write partial files
2292
+ const partials: string[] = [];
2293
+ for (const part of result.parts || []) {
2294
+ const partPath: string = path.join(dir, part.filename);
2295
+ fs.writeFileSync(partPath, part.content, 'utf-8');
2296
+ partials.push(partPath);
2297
+ }
2298
+
2299
+ output(
2300
+ {
2301
+ split_performed: true,
2302
+ index_file: absPath,
2303
+ partials,
2304
+ part_count: (result.parts || []).length,
2305
+ },
2306
+ raw
2307
+ );
2308
+ break;
2309
+ }
2310
+ case 'check': {
2311
+ const filePath: string = args[2];
2312
+ if (!filePath) error('file path required for markdown-split check');
2313
+ const absPath: string = path.resolve(cwd, filePath);
2314
+ if (!fs.existsSync(absPath)) error(`File not found: ${absPath}`);
2315
+
2316
+ const content: string = fs.readFileSync(absPath, 'utf-8');
2317
+ const tokens: number = estimateTokens(content);
2318
+ const is_index: boolean = isIndexFile(content);
2319
+ output(
2320
+ {
2321
+ file: absPath,
2322
+ is_index,
2323
+ estimated_tokens: tokens,
2324
+ exceeds_threshold: tokens > 25000,
2325
+ },
2326
+ raw
2327
+ );
2328
+ break;
2329
+ }
2330
+ }
2331
+ break;
2332
+ }
2333
+ case 'parallel-progress':
2334
+ cmdParallelProgress(args.slice(1), raw);
2335
+ break;
2336
+ case 'overstory': {
2337
+ const sub = validateSubcommand(args[1] || '', ['detect', 'install'], 'overstory');
2338
+
2339
+ if (sub === 'detect') {
2340
+ const result = detectOverstory(cwd);
2341
+ output(result || { available: false, reason: 'Overstory not detected' }, raw);
2342
+ } else if (sub === 'install') {
2343
+ try {
2344
+ installOverstory(cwd);
2345
+ output({ ok: true, message: 'Overstory installed and initialized' }, raw);
2346
+ } catch (e: unknown) {
2347
+ const msg = e instanceof Error ? e.message : String(e);
2348
+ output({ ok: false, error: msg }, raw);
2349
+ }
2350
+ }
2351
+ break;
2352
+ }
2353
+ case 'metrics': {
2354
+ const { getCounters } = require('../lib/metrics') as {
2355
+ getCounters: () => Record<string, number>;
2356
+ };
2357
+ const counters = getCounters();
2358
+ output(counters, raw, JSON.stringify(counters, null, 2));
2359
+ break;
2360
+ }
2361
+ default: {
2362
+ const TOP_LEVEL_COMMANDS: readonly string[] = [
2363
+ 'state',
2364
+ 'resolve-model',
2365
+ 'find-phase',
2366
+ 'commit',
2367
+ 'verify-summary',
2368
+ 'template',
2369
+ 'frontmatter',
2370
+ 'verify',
2371
+ 'generate-slug',
2372
+ 'current-timestamp',
2373
+ 'list-todos',
2374
+ 'verify-path-exists',
2375
+ 'config-ensure-section',
2376
+ 'config-set',
2377
+ 'history-digest',
2378
+ 'phases',
2379
+ 'roadmap',
2380
+ 'phase',
2381
+ 'milestone',
2382
+ 'version',
2383
+ 'validate',
2384
+ 'progress',
2385
+ 'todo',
2386
+ 'scaffold',
2387
+ 'migrate-dirs',
2388
+ 'init',
2389
+ 'phase-plan-index',
2390
+ 'state-snapshot',
2391
+ 'summary-extract',
2392
+ 'tracker',
2393
+ 'dashboard',
2394
+ 'phase-detail',
2395
+ 'health',
2396
+ 'detect-backend',
2397
+ 'long-term-roadmap',
2398
+ 'quality-analysis',
2399
+ 'setup',
2400
+ 'search',
2401
+ 'requirement',
2402
+ 'worktree',
2403
+ 'settings',
2404
+ 'evolve',
2405
+ 'autopilot',
2406
+ 'multi-milestone-autopilot',
2407
+ 'autoplan',
2408
+ 'worktree-hook-create',
2409
+ 'worktree-hook-remove',
2410
+ 'teammate-idle-hook',
2411
+ 'task-completed-hook',
2412
+ 'instructions-loaded-hook',
2413
+ 'stop-failure-hook',
2414
+ 'post-compact-hook',
2415
+ 'coverage-report',
2416
+ 'health-check',
2417
+ 'markdown-split',
2418
+ 'parallel-progress',
2419
+ 'overstory',
2420
+ 'metrics',
2421
+ 'diagnose',
2422
+ 'export-research',
2423
+ 'import-research',
2424
+ 'deps',
2425
+ 'todos',
2426
+ 'knowhow',
2427
+ 'budget',
2428
+ 'blame',
2429
+ 'freshness',
2430
+ 'rollback',
2431
+ 'estimate',
2432
+ 'estimate-phase',
2433
+ 'impact',
2434
+ 'check-assumptions',
2435
+ 'execute-phase',
2436
+ 'phase-risk',
2437
+ 'citation-backlinks',
2438
+ 'eval-regression-check',
2439
+ 'phase-time-budget',
2440
+ 'config-diff',
2441
+ 'phase-readiness',
2442
+ 'milestone-health',
2443
+ 'decision-timeline',
2444
+ 'import-knowledge',
2445
+ 'todo-duplicates',
2446
+ 'citation-graph',
2447
+ 'artifact-dag',
2448
+ 'benchmark-report',
2449
+ 'forecast-phase',
2450
+ 'tail',
2451
+ 'eval',
2452
+ 'check-plans',
2453
+ 'knowledge',
2454
+ 'autoresearch',
2455
+ 'wireup',
2456
+ 'watch',
2457
+ 'research-gaps',
2458
+ 'deps-risk',
2459
+ 'import-knowhow',
2460
+ ];
2461
+ const suggestion: string | null = findClosestCommand(command, TOP_LEVEL_COMMANDS as string[]);
2462
+ const hint: string = suggestion ? ` Did you mean "${suggestion}"?` : '';
2463
+ error(`Unknown command: "${command}".${hint}`);
2464
+ }
2465
+ }
2466
+ }
2467
+
2468
+ main().catch((err: Error) => {
2469
+ process.stderr.write(`[grd] fatal error: ${err.message}\n`);
2470
+ process.exit(1);
2471
+ });