@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,1680 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
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
+ const fs = require('fs');
9
+ const path = require('path');
10
+ // ─── Typed Imports ──────────────────────────────────────────────────────────
11
+ const { parseIncludeFlag, output, error, loadConfig, validatePhaseArg, validateFileArg, validateSubcommand, validateGitRef, findClosestCommand, } = require('../lib/utils');
12
+ const { cmdFrontmatterGet, cmdFrontmatterSet, cmdFrontmatterMerge, cmdFrontmatterValidate, } = require('../lib/frontmatter');
13
+ const { cmdStateLoad, cmdStateGet, cmdStatePatch, cmdStateUpdate, cmdStateAdvancePlan, cmdStateRecordMetric, cmdStateUpdateProgress, cmdStateAddDecision, cmdStateAddBlocker, cmdStateResolveBlocker, cmdStateRecordSession, cmdStateSnapshot, } = require('../lib/state');
14
+ const { cmdRoadmapGetPhase, cmdPhaseNextDecimal, cmdRoadmapAnalyze, } = require('../lib/roadmap');
15
+ const { cmdTemplateSelect, cmdTemplateFill, cmdScaffold, } = require('../lib/scaffold');
16
+ const { cmdVerifySummary, cmdVerifyPlanStructure, cmdVerifyPhaseCompleteness, cmdVerifyReferences, cmdVerifyCommits, cmdVerifyArtifacts, cmdVerifyKeyLinks, cmdVerifyMechanical, } = require('../lib/verify');
17
+ const { cmdPhasesList, cmdPhaseAdd, cmdPhaseInsert, cmdPhaseRemove, cmdPhaseComplete, cmdMilestoneComplete, cmdValidateConsistency, cmdVersionBump, } = require('../lib/phase');
18
+ const { cmdTracker, } = require('../lib/tracker');
19
+ const { cmdWorktreeCreate, cmdWorktreeRemove, cmdWorktreeList, cmdWorktreeRemoveStale, cmdWorktreePushAndPR, cmdWorktreeEnsureMilestoneBranch, cmdWorktreeMerge, cmdWorktreeHookCreate, cmdWorktreeHookRemove, cmdTeammateIdleHook, cmdTaskCompletedHook, cmdInstructionsLoadedHook, cmdStopFailureHook, cmdPostCompactHook, } = require('../lib/worktree');
20
+ const { cmdPhaseAnalyzeDeps, } = require('../lib/deps');
21
+ const { detectOverstory, installOverstory, } = require('../lib/overstory');
22
+ const { cmdAutopilot, cmdInitAutopilot, cmdMultiMilestoneAutopilot, cmdInitMultiMilestoneAutopilot, } = require('../lib/autopilot');
23
+ const { cmdAutoplan, cmdInitAutoplan, } = require('../lib/autoplan');
24
+ const { createScheduler, } = require('../lib/scheduler');
25
+ const { cmdAutoResearch, cmdInitAutoResearch, } = require('../lib/autoresearch');
26
+ const { cmdEvolve, cmdEvolveDiscover, cmdEvolveState, cmdEvolveAdvance, cmdEvolveReset, cmdInitEvolve, } = require('../lib/evolve/index');
27
+ const { cmdInitExecuteParallel, cmdParallelProgress, } = require('../lib/parallel');
28
+ const { cmdWireup, cmdInitWireup, } = require('../lib/wireup/index');
29
+ const { splitMarkdown, isIndexFile, estimateTokens, } = require('../lib/markdown-split');
30
+ const { cmdInitExecutePhase, cmdInitPlanPhase, cmdInitNewProject, cmdInitNewMilestone, cmdInitQuick, cmdInitResume, cmdInitVerifyWork, cmdInitPhaseOp, cmdInitTodos, cmdInitMilestoneOp, cmdInitMapCodebase, cmdInitProgress, cmdInitResearchWorkflow, cmdInitPlanMilestoneGaps, cmdInitDebug, cmdInitIntegrationCheck, cmdInitMigrate, cmdInitPlanCheck, cmdInitPhaseResearch, cmdInitCodeReview, cmdInitAssessBaseline, cmdInitDeepDive, cmdInitEvalPlan, cmdInitEvalReport, cmdInitFeasibility, cmdInitProductOwner, cmdInitProjectResearcher, cmdInitResearchSynthesizer, cmdInitRoadmapper, cmdInitSurveyor, cmdInitVerifier, } = require('../lib/context/index');
31
+ const { cmdGenerateSlug, cmdCurrentTimestamp, cmdListTodos, cmdTodoComplete, cmdVerifyPathExists, cmdConfigEnsureSection, cmdConfigSet, cmdHistoryDigest, cmdResolveModel, cmdFindPhase, cmdCommit, cmdPhasePlanIndex, cmdSummaryExtract, cmdProgressRender, cmdDashboard, cmdPhaseDetail, cmdHealth, cmdDetectBackend, cmdLongTermRoadmap, cmdQualityAnalysis, cmdSetup, cmdRequirementGet, cmdRequirementList, cmdRequirementTraceability, cmdRequirementUpdateStatus, cmdSearch, cmdMigrateDirs, cmdCoverageReport, cmdHealthCheck, cmdPhaseRiskAssessment, cmdCitationBacklinks, cmdEvalRegressionCheck, cmdPhaseTimeBudget, cmdConfigDiff, cmdPhaseReadiness, cmdMilestoneHealth, cmdDecisionTimeline, cmdImportKnowledge, cmdTodoDuplicates, cmdKnowhowList, cmdCitationGraph, cmdArtifactDAG, cmdBenchmarkReport, cmdKnowhowSearch, cmdCheckPlans, cmdEvalDiff, cmdTail, cmdEstimatePhase, cmdImpact, cmdCheckAssumptions, } = require('../lib/commands/index');
32
+ const { cmdDeadEndAdd, cmdDeadEndPromoteFromPhase, } = require('../lib/dead-ends');
33
+ const { cmdPlanTournament, } = require('../lib/plan-tournament');
34
+ const { cmdThink, } = require('../lib/think');
35
+ const { cmdExportResearch, cmdImportResearch, } = require('../lib/research-bundle');
36
+ const { cmdDiagnosePhase, } = require('../lib/verify');
37
+ const { cmdKnowhowAudit, cmdKnowhowDedup, cmdKnowhowRank, } = require('../lib/knowledge');
38
+ const { cmdPhaseDepsVisualize, cmdExecutePhaseDryRun, } = require('../lib/deps');
39
+ const { cmdTodosRank, } = require('../lib/commands/todo');
40
+ const { cmdRollback, } = require('../lib/commands/rollback');
41
+ const { cmdEstimate, } = require('../lib/commands/estimate');
42
+ const { cmdBudget, } = require('../lib/commands/budget');
43
+ const { cmdBlame, } = require('../lib/commands/blame');
44
+ const { cmdKnowhowAggregate, cmdImportKnowhow, } = require('../lib/commands/knowhow-aggregator');
45
+ const { cmdFreshness, } = require('../lib/commands/freshness');
46
+ const { cmdGenomeInit, cmdGenomeShow, cmdGenomeSnapshot, cmdGenomePromoteSuggestion, } = require('../lib/genome');
47
+ const { cmdResearchGaps, } = require('../lib/commands/progress');
48
+ const { cmdDepsRisk, } = require('../lib/commands/phase-info');
49
+ const { cmdWatch, } = require('../lib/commands/watch');
50
+ const { cmdSingularity, } = require('../lib/commands/singularity');
51
+ const { cmdPlanLint, } = require('../lib/commands/plan-lint');
52
+ const { cmdPlanPhase, } = require('../lib/commands/plan-phase');
53
+ const { cmdSelectCandidate, } = require('../lib/commands/select-candidate');
54
+ const { cmdPatterns, } = require('../lib/commands/patterns');
55
+ const { cmdInstall, } = require('../lib/commands/install');
56
+ // ─── Helpers ────────────────────────────────────────────────────────────────
57
+ /** Extract --flag value from args, returns value or fallback */
58
+ function flag(args, name, fallback) {
59
+ const i = args.indexOf(name);
60
+ return i !== -1 ? args[i + 1] : fallback;
61
+ }
62
+ /**
63
+ * Print a deprecation warning to stderr. See docs/DEPRECATIONS.md for the
64
+ * v0.4.x trim plan. Commands listed in DEPRECATED_COMMANDS will be removed
65
+ * in v0.4.0; this helper fires once per invocation.
66
+ */
67
+ const DEPRECATED_COMMANDS = {
68
+ dashboard: 'Use `gd health` + `gd think` instead',
69
+ 'health-check': 'Subset of `gd health`',
70
+ 'coverage-report': 'Use `npx jest --coverage` directly',
71
+ 'phase-time-budget': 'Subsumed by `gd estimate-phase`',
72
+ 'todo-duplicates': 'One-off helper; rarely used',
73
+ 'markdown-split': 'Internal infrastructure — surfaced by accident',
74
+ setup: '`gd init` does this',
75
+ };
76
+ function _warnDeprecated(cmd) {
77
+ const replacement = DEPRECATED_COMMANDS[cmd];
78
+ if (!replacement)
79
+ return;
80
+ process.stderr.write(`Warning: \`gd ${cmd}\` is DEPRECATED and will be removed in v0.4.0.\n` +
81
+ ` ${replacement}.\n` +
82
+ ` See docs/DEPRECATIONS.md.\n`);
83
+ }
84
+ // ─── Descriptor-Based Dispatch Table ────────────────────────────────────────
85
+ /**
86
+ * Descriptor-based dispatch table for simple top-level commands.
87
+ * Each entry maps a command string to a handler function.
88
+ * routeCommand() checks this table first before falling through to the switch.
89
+ */
90
+ const ROUTE_DESCRIPTORS = [
91
+ { command: 'generate-slug', handler: (args, _cwd, raw) => cmdGenerateSlug(args[1], raw) },
92
+ {
93
+ command: 'current-timestamp',
94
+ handler: (args, _cwd, raw) => cmdCurrentTimestamp(args[1] || 'full', raw),
95
+ },
96
+ { command: 'list-todos', handler: (args, cwd, raw) => cmdListTodos(cwd, args[1], raw) },
97
+ {
98
+ command: 'verify-path-exists',
99
+ handler: (args, cwd, raw) => cmdVerifyPathExists(cwd, args[1], raw, args.includes('--dry-run')),
100
+ },
101
+ {
102
+ command: 'config-ensure-section',
103
+ handler: (args, cwd, raw) => cmdConfigEnsureSection(cwd, raw, args.includes('--dry-run')),
104
+ },
105
+ {
106
+ command: 'config-set',
107
+ handler: (args, cwd, raw) => cmdConfigSet(cwd, args[1], args[2], raw, args.includes('--dry-run')),
108
+ },
109
+ { command: 'history-digest', handler: (_args, cwd, raw) => cmdHistoryDigest(cwd, raw) },
110
+ {
111
+ command: 'progress',
112
+ handler: (args, cwd, raw) => cmdProgressRender(cwd, args[1] || 'json', raw),
113
+ },
114
+ {
115
+ command: 'migrate-dirs',
116
+ handler: (args, cwd, raw) => cmdMigrateDirs(cwd, raw, args.includes('--dry-run')),
117
+ },
118
+ {
119
+ command: 'dashboard',
120
+ handler: (_args, cwd, raw) => {
121
+ _warnDeprecated('dashboard');
122
+ cmdDashboard(cwd, raw);
123
+ },
124
+ },
125
+ { command: 'health', handler: (_args, cwd, raw) => cmdHealth(cwd, raw) },
126
+ { command: 'detect-backend', handler: (_args, cwd, raw) => cmdDetectBackend(cwd, raw) },
127
+ {
128
+ command: 'quality-analysis',
129
+ handler: (args, cwd, raw) => cmdQualityAnalysis(cwd, args.slice(1), raw),
130
+ },
131
+ {
132
+ command: 'setup',
133
+ handler: (_args, cwd, raw) => {
134
+ _warnDeprecated('setup');
135
+ cmdSetup(cwd, raw);
136
+ },
137
+ },
138
+ {
139
+ command: 'parallel-progress',
140
+ handler: (args, _cwd, raw) => cmdParallelProgress(args.slice(1), raw),
141
+ },
142
+ { command: 'resolve-model', handler: (args, cwd, raw) => cmdResolveModel(cwd, args[1], raw) },
143
+ { command: 'find-phase', handler: (args, cwd, raw) => cmdFindPhase(cwd, args[1], raw) },
144
+ {
145
+ command: 'coverage-report',
146
+ handler: (args, cwd, raw) => {
147
+ _warnDeprecated('coverage-report');
148
+ return cmdCoverageReport(cwd, { threshold: parseInt(flag(args, '--threshold', '85'), 10) }, raw);
149
+ },
150
+ },
151
+ {
152
+ command: 'health-check',
153
+ handler: (args, cwd, raw) => {
154
+ _warnDeprecated('health-check');
155
+ return cmdHealthCheck(cwd, { fix: args.includes('--fix') }, raw);
156
+ },
157
+ },
158
+ {
159
+ command: 'phase-detail',
160
+ handler: (args, cwd, raw) => {
161
+ validatePhaseArg(args[1]);
162
+ return cmdPhaseDetail(cwd, args[1], raw);
163
+ },
164
+ },
165
+ {
166
+ command: 'phase-plan-index',
167
+ handler: (args, cwd, raw) => {
168
+ validatePhaseArg(args[1]);
169
+ return cmdPhasePlanIndex(cwd, args[1], raw);
170
+ },
171
+ },
172
+ {
173
+ command: 'search',
174
+ handler: (args, cwd, raw) => {
175
+ if (!args[1])
176
+ error('Search query is required');
177
+ return cmdSearch(cwd, args[1], raw);
178
+ },
179
+ },
180
+ {
181
+ command: 'phase-risk',
182
+ handler: (args, cwd, raw) => {
183
+ validatePhaseArg(args[1]);
184
+ return cmdPhaseRiskAssessment(cwd, args[1], raw);
185
+ },
186
+ },
187
+ { command: 'citation-backlinks', handler: (_args, cwd, raw) => cmdCitationBacklinks(cwd, raw) },
188
+ {
189
+ command: 'eval-regression-check',
190
+ handler: (args, cwd, raw) => {
191
+ validatePhaseArg(args[1]);
192
+ const t = flag(args, '--threshold');
193
+ return cmdEvalRegressionCheck(cwd, args[1], raw, t ? parseFloat(t) : undefined);
194
+ },
195
+ },
196
+ {
197
+ command: 'phase-time-budget',
198
+ handler: (_args, cwd, raw) => {
199
+ _warnDeprecated('phase-time-budget');
200
+ cmdPhaseTimeBudget(cwd, raw);
201
+ },
202
+ },
203
+ {
204
+ command: 'config-diff',
205
+ handler: (args, cwd, raw) => cmdConfigDiff(cwd, raw, args.includes('--reset'), args.includes('--dry-run')),
206
+ },
207
+ {
208
+ command: 'phase-readiness',
209
+ handler: (args, cwd, raw) => {
210
+ validatePhaseArg(args[1]);
211
+ return cmdPhaseReadiness(cwd, args[1], raw);
212
+ },
213
+ },
214
+ { command: 'milestone-health', handler: (_args, cwd, raw) => cmdMilestoneHealth(cwd, raw) },
215
+ { command: 'decision-timeline', handler: (_args, cwd, raw) => cmdDecisionTimeline(cwd, raw) },
216
+ {
217
+ command: 'import-knowledge',
218
+ handler: (args, cwd, raw) => {
219
+ if (!args[1])
220
+ error('Source path required');
221
+ return cmdImportKnowledge(cwd, args[1], flag(args, '--types') || 'all', raw, args.includes('--force'), args.includes('--dry-run'));
222
+ },
223
+ },
224
+ {
225
+ command: 'todo-duplicates',
226
+ handler: (args, cwd, raw) => {
227
+ _warnDeprecated('todo-duplicates');
228
+ const t = flag(args, '--threshold');
229
+ return cmdTodoDuplicates(cwd, raw, t ? parseFloat(t) : undefined);
230
+ },
231
+ },
232
+ { command: 'teammate-idle-hook', handler: (_args, cwd, raw) => cmdTeammateIdleHook(cwd, raw) },
233
+ { command: 'task-completed-hook', handler: (_args, cwd, raw) => cmdTaskCompletedHook(cwd, raw) },
234
+ {
235
+ command: 'instructions-loaded-hook',
236
+ handler: (_args, cwd, raw) => cmdInstructionsLoadedHook(cwd, raw),
237
+ },
238
+ { command: 'stop-failure-hook', handler: (_args, cwd, raw) => cmdStopFailureHook(cwd, raw) },
239
+ { command: 'post-compact-hook', handler: (_args, cwd, raw) => cmdPostCompactHook(cwd, raw) },
240
+ {
241
+ command: 'citation-graph',
242
+ handler: (args, cwd, raw) => cmdCitationGraph(cwd, raw, args.includes('--unresolved')),
243
+ },
244
+ {
245
+ command: 'artifact-dag',
246
+ handler: (args, cwd, raw) => {
247
+ validatePhaseArg(args[1]);
248
+ return cmdArtifactDAG(cwd, args[1], raw);
249
+ },
250
+ },
251
+ { command: 'benchmark-report', handler: (_args, cwd, raw) => cmdBenchmarkReport(cwd, raw) },
252
+ {
253
+ command: 'diagnose',
254
+ handler: (args, cwd, raw) => {
255
+ if (!args[1])
256
+ error('phase required. Usage: gd diagnose <phase>');
257
+ validatePhaseArg(args[1]);
258
+ return cmdDiagnosePhase(cwd, args[1], raw);
259
+ },
260
+ },
261
+ {
262
+ command: 'export-research',
263
+ handler: (args, cwd, raw) => cmdExportResearch(cwd, flag(args, '--output') ?? null, raw),
264
+ },
265
+ {
266
+ command: 'import-research',
267
+ handler: (args, cwd, raw) => {
268
+ if (!args[1])
269
+ error('bundle path required. Usage: gd import-research <bundle.tar.gz>');
270
+ return cmdImportResearch(cwd, args[1], raw);
271
+ },
272
+ },
273
+ {
274
+ command: 'deps',
275
+ handler: (args, cwd, raw) => cmdPhaseDepsVisualize(cwd, { milestone: flag(args, '--milestone') ?? null, format: flag(args, '--format') ?? null }, raw),
276
+ },
277
+ {
278
+ command: 'todos',
279
+ handler: (args, cwd, raw) => {
280
+ const sub = args[1];
281
+ if (sub === 'rank') {
282
+ const topStr = flag(args, '--top');
283
+ const topN = topStr ? parseInt(topStr, 10) : undefined;
284
+ if (topN !== undefined && (isNaN(topN) || topN < 0)) {
285
+ error('--top must be a non-negative integer');
286
+ }
287
+ return cmdTodosRank(cwd, raw, topN);
288
+ }
289
+ error(`Unknown todos subcommand: ${sub || '(none)'}. Valid: rank`);
290
+ },
291
+ },
292
+ {
293
+ command: 'knowhow',
294
+ handler: (args, cwd, raw) => {
295
+ const sub = args[1];
296
+ if (sub === 'audit')
297
+ return cmdKnowhowAudit(cwd, raw);
298
+ if (sub === 'aggregate' || sub === 'agg')
299
+ return cmdKnowhowAggregate(cwd, raw, args.includes('--export'), args.includes('--dry-run'));
300
+ if (sub === 'dedup') {
301
+ const t = flag(args, '--threshold');
302
+ return cmdKnowhowDedup(cwd, raw, t ? parseFloat(t) : undefined);
303
+ }
304
+ if (sub === 'rank') {
305
+ const query = args[2];
306
+ if (!query)
307
+ error('query required. Usage: gd knowhow rank "<query>"');
308
+ const topStr = flag(args, '--top');
309
+ const topN = topStr ? parseInt(topStr, 10) : 5;
310
+ if (isNaN(topN) || topN <= 0)
311
+ error('--top must be a positive integer');
312
+ return cmdKnowhowRank(cwd, query, topN, raw);
313
+ }
314
+ return cmdKnowhowList(cwd, raw, flag(args, '--module'), flag(args, '--limit') ? parseInt(flag(args, '--limit'), 10) : undefined);
315
+ },
316
+ },
317
+ {
318
+ command: 'budget',
319
+ handler: (args, cwd, raw) => {
320
+ if (!args[1])
321
+ error('phase required. Usage: gd budget <phase>');
322
+ return cmdBudget(cwd, args[1], raw);
323
+ },
324
+ },
325
+ {
326
+ command: 'blame',
327
+ handler: (args, cwd, raw) => {
328
+ if (!args[1])
329
+ error('phase required. Usage: gd blame <phase>');
330
+ return cmdBlame(cwd, args[1], raw);
331
+ },
332
+ },
333
+ {
334
+ command: 'freshness',
335
+ handler: (args, cwd, raw) => cmdFreshness(cwd, args[1] ?? null, raw),
336
+ },
337
+ {
338
+ command: 'rollback',
339
+ handler: (args, cwd, raw) => {
340
+ if (!args[1])
341
+ error('phase required. Usage: gd rollback <phase>');
342
+ validatePhaseArg(args[1]);
343
+ return cmdRollback(cwd, args[1], raw);
344
+ },
345
+ },
346
+ {
347
+ command: 'estimate',
348
+ handler: (args, cwd, raw) => {
349
+ if (!args[1])
350
+ error('phase required. Usage: gd estimate <phase>');
351
+ validatePhaseArg(args[1]);
352
+ return cmdEstimate(cwd, args[1], raw);
353
+ },
354
+ },
355
+ {
356
+ command: 'estimate-phase',
357
+ handler: (args, cwd, raw) => {
358
+ if (!args[1])
359
+ error('phase required. Usage: gd estimate-phase <phase>');
360
+ validatePhaseArg(args[1]);
361
+ return cmdEstimatePhase(cwd, args[1], raw);
362
+ },
363
+ },
364
+ {
365
+ command: 'impact',
366
+ handler: (args, cwd, raw) => {
367
+ if (!args[1])
368
+ error('phase required. Usage: gd impact <phase>');
369
+ validatePhaseArg(args[1]);
370
+ return cmdImpact(cwd, args[1], raw);
371
+ },
372
+ },
373
+ {
374
+ command: 'check-assumptions',
375
+ handler: (args, cwd, raw) => {
376
+ if (!args[1])
377
+ error('phase required. Usage: gd check-assumptions <phase>');
378
+ validatePhaseArg(args[1]);
379
+ return cmdCheckAssumptions(cwd, args[1], raw, args.includes('--skip-assumption-check'));
380
+ },
381
+ },
382
+ {
383
+ command: 'execute-phase',
384
+ handler: (args, cwd, raw) => {
385
+ if (args.includes('--dry-run')) {
386
+ if (!args[1] || args[1].startsWith('--'))
387
+ error('phase required. Usage: gd execute-phase <phase> --dry-run');
388
+ validatePhaseArg(args[1]);
389
+ return cmdExecutePhaseDryRun(cwd, args[1], raw);
390
+ }
391
+ // Non-dry-run execute-phase falls through to init workflow
392
+ const includes = parseIncludeFlag(args);
393
+ const phase = args[1];
394
+ if (!phase || phase.startsWith('--'))
395
+ error('phase required. Usage: gd execute-phase <phase>');
396
+ validatePhaseArg(phase);
397
+ const { cmdInitExecutePhase } = require('../lib/context/index');
398
+ return cmdInitExecutePhase(cwd, phase, includes, raw);
399
+ },
400
+ },
401
+ {
402
+ command: 'knowledge',
403
+ handler: (args, cwd, raw) => {
404
+ const sub = args[1];
405
+ if (sub === 'search') {
406
+ // Codex r3 P2: skip both the flag and its value so e.g.
407
+ // `gd knowledge search cache --top 5` searches for "cache",
408
+ // not "cache 5". Walks the slice, skipping flags and the
409
+ // token immediately following any value-bearing flag.
410
+ const FLAGS_WITH_VALUE = new Set(['--top']);
411
+ const queryParts = [];
412
+ const rest = args.slice(2);
413
+ for (let i = 0; i < rest.length; i++) {
414
+ const a = rest[i];
415
+ if (a.startsWith('--')) {
416
+ if (FLAGS_WITH_VALUE.has(a))
417
+ i++;
418
+ continue;
419
+ }
420
+ queryParts.push(a);
421
+ }
422
+ const query = queryParts.join(' ');
423
+ if (!query)
424
+ error('query required. Usage: gd knowledge search <query>');
425
+ const topN = parseInt(flag(args, '--top') ?? '10', 10);
426
+ return cmdKnowhowSearch(cwd, query, topN, raw);
427
+ }
428
+ error(`Unknown knowledge subcommand: ${sub || '(none)'}. Valid: search`);
429
+ },
430
+ },
431
+ {
432
+ command: 'check-plans',
433
+ handler: (args, cwd, raw) => {
434
+ const phase = flag(args, '--phase') ?? null;
435
+ const milestone = flag(args, '--milestone') ?? null;
436
+ return cmdCheckPlans(cwd, { phase, milestone }, raw);
437
+ },
438
+ },
439
+ {
440
+ command: 'eval',
441
+ handler: (args, cwd, raw) => {
442
+ const sub = args[1];
443
+ if (sub === 'diff') {
444
+ const phaseA = args[2];
445
+ const phaseB = args[3] ?? 'latest';
446
+ if (!phaseA)
447
+ error('Usage: gd eval diff <phaseA> <phaseB> — or: gd eval diff latest');
448
+ if (phaseA !== 'latest')
449
+ validatePhaseArg(phaseA);
450
+ if (phaseB !== 'latest')
451
+ validatePhaseArg(phaseB);
452
+ return cmdEvalDiff(cwd, phaseA, phaseB, raw);
453
+ }
454
+ error(`Unknown eval subcommand: ${sub || '(none)'}. Valid: diff`);
455
+ },
456
+ },
457
+ {
458
+ command: 'tail',
459
+ handler: (args, cwd, raw) => {
460
+ const phaseFilter = flag(args, '--phase') ?? null;
461
+ const follow = args.includes('-f') || args.includes('--follow');
462
+ return cmdTail(cwd, phaseFilter, follow, raw);
463
+ },
464
+ },
465
+ {
466
+ command: 'forecast-phase',
467
+ handler: (args, cwd, raw) => {
468
+ const phase = args[1];
469
+ if (!phase)
470
+ error('phase required. Usage: gd forecast-phase <phase>');
471
+ validatePhaseArg(phase);
472
+ const { phasesDir: _phasesDir } = require('../lib/paths');
473
+ const { safeReadFile: _safeRead, execGit: _execGit } = require('../lib/utils');
474
+ const phasesBase = _phasesDir(cwd);
475
+ let phaseDir = null;
476
+ try {
477
+ // Codex r15 P2: match the canonical zero-padded form too so
478
+ // `gd forecast-phase 1` resolves to `01-test/`.
479
+ const padded = /^\d+$/.test(phase) ? phase.padStart(2, '0') : phase;
480
+ const dirs = fs.readdirSync(phasesBase);
481
+ const match = dirs.find((d) => d === phase || d === padded ||
482
+ d.startsWith(`${phase}-`) || d.startsWith(`${padded}-`));
483
+ if (match)
484
+ phaseDir = path.join(phasesBase, match);
485
+ }
486
+ catch { /* phases dir not found */ }
487
+ if (!phaseDir) {
488
+ output({ phase, error: `Phase ${phase} not found`, files: [] }, raw, `Phase ${phase} not found`);
489
+ return;
490
+ }
491
+ // Extract file paths from all PLAN.md files via regex
492
+ const fileRegex = /(?:^|[\s`"'(,])([a-zA-Z][a-zA-Z0-9_/-]*\.[a-zA-Z]{1,5})(?=$|[\s`"',):])/gm;
493
+ const fileCounts = new Map();
494
+ let planFiles = [];
495
+ try {
496
+ planFiles = fs.readdirSync(phaseDir).filter((f) => f.endsWith('-PLAN.md') || f === 'PLAN.md');
497
+ }
498
+ catch { /* ignore */ }
499
+ for (const pf of planFiles) {
500
+ const content = _safeRead(path.join(phaseDir, pf));
501
+ if (!content)
502
+ continue;
503
+ let m;
504
+ fileRegex.lastIndex = 0;
505
+ while ((m = fileRegex.exec(content)) !== null) {
506
+ const fp = m[1];
507
+ if (fp && fp.length > 3 && fp.includes('.') && !fp.startsWith('.')) {
508
+ fileCounts.set(fp, (fileCounts.get(fp) ?? 0) + 1);
509
+ }
510
+ }
511
+ }
512
+ const fileScores = [];
513
+ for (const [fp, mentions] of fileCounts) {
514
+ const logResult = _execGit(cwd, ['log', '--oneline', '--', fp]);
515
+ const gitTouches = logResult.exitCode === 0 ? logResult.stdout.trim().split('\n').filter(Boolean).length : 0;
516
+ const lastResult = _execGit(cwd, ['log', '-1', '--format=%ci', '--', fp]);
517
+ const lastModified = lastResult.exitCode === 0 ? lastResult.stdout.trim().slice(0, 10) : '';
518
+ const confidence = Math.round(Math.min(1, mentions * 0.4 + Math.min(gitTouches, 10) * 0.06) * 100) / 100;
519
+ fileScores.push({ file: fp, mentions, git_touches: gitTouches, confidence, last_modified: lastModified });
520
+ }
521
+ fileScores.sort((a, b) => b.confidence - a.confidence || b.mentions - a.mentions);
522
+ const top = fileScores.slice(0, 20);
523
+ // Write FORECAST.md to phase dir
524
+ let forecastPath = null;
525
+ try {
526
+ const lines = [
527
+ `# File Touch Forecast — Phase ${phase}`,
528
+ '',
529
+ `Generated: ${new Date().toISOString().slice(0, 10)}`,
530
+ '',
531
+ '| File | Mentions | Git Touches | Confidence | Last Modified |',
532
+ '|------|----------|-------------|------------|---------------|',
533
+ ...top.map((r) => `| \`${r.file}\` | ${r.mentions} | ${r.git_touches} | ${r.confidence} | ${r.last_modified || 'n/a'} |`),
534
+ ];
535
+ const fp = path.join(phaseDir, 'FORECAST.md');
536
+ fs.writeFileSync(fp, lines.join('\n') + '\n', 'utf-8');
537
+ forecastPath = path.relative(cwd, fp);
538
+ }
539
+ catch { /* non-fatal */ }
540
+ const summary = top.length > 0
541
+ ? `Top predicted files:\n${top.slice(0, 5).map((r, i) => ` ${i + 1}. ${r.file} (confidence: ${r.confidence})`).join('\n')}`
542
+ : 'No file paths found in plan descriptions';
543
+ output({ phase, files_found: fileScores.length, top_files: top, forecast_path: forecastPath }, raw, summary);
544
+ },
545
+ },
546
+ {
547
+ command: 'import-knowhow',
548
+ handler: (args, cwd, raw) => {
549
+ if (!args[1])
550
+ error('source project directory required. Usage: gd import-knowhow <source-dir>');
551
+ const topStr = flag(args, '--top');
552
+ const topN = topStr ? parseInt(topStr, 10) : undefined;
553
+ return cmdImportKnowhow(cwd, args[1], raw, topN, args.includes('--all'), args.includes('--dry-run'));
554
+ },
555
+ },
556
+ { command: 'research-gaps', handler: (_args, cwd, raw) => cmdResearchGaps(cwd, raw) },
557
+ {
558
+ command: 'deps-risk',
559
+ handler: (args, cwd, raw) => cmdDepsRisk(cwd, args[1] ?? null, raw),
560
+ },
561
+ { command: 'watch', handler: (_args, cwd, raw) => cmdWatch(cwd, raw) },
562
+ {
563
+ command: 'singularity',
564
+ handler: (args, cwd, raw) => {
565
+ const since = flag(args, '--since') ?? null;
566
+ const all = args.includes('--all');
567
+ const byIteration = args.includes('--by-iteration');
568
+ cmdSingularity(cwd, { since, all, byIteration }, raw);
569
+ },
570
+ },
571
+ {
572
+ command: 'plan-lint',
573
+ handler: (args, cwd, raw) => {
574
+ if (!args[1]) {
575
+ error('milestone name required. Usage: gd plan-lint <milestone>');
576
+ }
577
+ cmdPlanLint(cwd, args[1], raw);
578
+ },
579
+ },
580
+ {
581
+ command: 'plan-candidates',
582
+ handler: (args, cwd, raw) => {
583
+ if (!args[1]) {
584
+ error('phase number required. Usage: gd plan-candidates <N> --candidates K [--input FILE] [--allow-partial-candidates]');
585
+ }
586
+ const phaseNum = args[1];
587
+ const candidatesArg = flag(args, '--candidates');
588
+ const inputFile = flag(args, '--input');
589
+ const allowPartial = args.includes('--allow-partial-candidates');
590
+ const candidates = candidatesArg ? parseInt(candidatesArg, 10) : 0;
591
+ if (candidatesArg && (!Number.isInteger(candidates) || candidates < 1)) {
592
+ error(`--candidates must be a positive integer, got "${candidatesArg}"`);
593
+ }
594
+ cmdPlanPhase(cwd, phaseNum, { candidates, inputFile, allowPartial }, raw);
595
+ },
596
+ },
597
+ {
598
+ command: 'select-candidate',
599
+ handler: (args, cwd, raw) => {
600
+ if (!args[1]) {
601
+ error('phase number required. Usage: gd select-candidate <N> [--dry-run] [--force] [--run-verification-commands]');
602
+ }
603
+ const phaseNum = args[1];
604
+ const dryRun = args.includes('--dry-run');
605
+ const force = args.includes('--force');
606
+ const runVerificationCommands = args.includes('--run-verification-commands');
607
+ cmdSelectCandidate(cwd, phaseNum, { dryRun, force, runVerificationCommands }, raw);
608
+ },
609
+ },
610
+ {
611
+ command: 'patterns',
612
+ handler: (args, cwd, raw) => {
613
+ // --dry-run is the default; --apply requires --yes (never-auto-write).
614
+ const apply = args.includes('--apply');
615
+ const yes = args.includes('--yes');
616
+ const minOcc = flag(args, '--min-occurrences');
617
+ const effSize = flag(args, '--effect-size');
618
+ const fdr = flag(args, '--fdr-q');
619
+ cmdPatterns(cwd, {
620
+ apply,
621
+ yes,
622
+ minOccurrences: minOcc !== undefined ? parseInt(minOcc, 10) : undefined,
623
+ effectSize: effSize !== undefined ? parseFloat(effSize) : undefined,
624
+ fdrQ: fdr !== undefined ? parseFloat(fdr) : undefined,
625
+ }, raw);
626
+ },
627
+ },
628
+ {
629
+ command: 'install',
630
+ handler: (args, cwd, raw) => {
631
+ // Positional harness names (everything after `install` that isn't a flag).
632
+ const harnesses = args
633
+ .slice(1)
634
+ .filter((a) => !a.startsWith('--'));
635
+ cmdInstall(cwd, {
636
+ harnesses,
637
+ all: args.includes('--all'),
638
+ list: args.includes('--list'),
639
+ dryRun: args.includes('--dry-run'),
640
+ }, raw);
641
+ },
642
+ },
643
+ ];
644
+ // ─── Subcommand Arrays ──────────────────────────────────────────────────────
645
+ const STATE_SUBS = [
646
+ 'load',
647
+ 'get',
648
+ 'patch',
649
+ 'update',
650
+ 'advance-plan',
651
+ 'record-metric',
652
+ 'update-progress',
653
+ 'add-decision',
654
+ 'add-blocker',
655
+ 'resolve-blocker',
656
+ 'record-session',
657
+ ];
658
+ const TEMPLATE_SUBS = ['select', 'fill'];
659
+ const FRONTMATTER_SUBS = ['get', 'set', 'merge', 'validate'];
660
+ const VERIFY_SUBS = [
661
+ 'plan-structure',
662
+ 'phase-completeness',
663
+ 'references',
664
+ 'commits',
665
+ 'artifacts',
666
+ 'key-links',
667
+ 'mechanical',
668
+ ];
669
+ const PHASES_SUBS = ['list'];
670
+ const ROADMAP_SUBS = ['get-phase', 'analyze'];
671
+ const PHASE_SUBS = [
672
+ 'next-decimal',
673
+ 'add',
674
+ 'insert',
675
+ 'remove',
676
+ 'complete',
677
+ 'analyze-deps',
678
+ ];
679
+ const MILESTONE_SUBS = ['complete'];
680
+ const VALIDATE_SUBS = ['consistency'];
681
+ const TODO_SUBS = ['complete'];
682
+ const TRACKER_SUBS = [
683
+ 'get-config',
684
+ 'sync-roadmap',
685
+ 'sync-phase',
686
+ 'update-status',
687
+ 'add-comment',
688
+ 'sync-status',
689
+ 'schedule',
690
+ 'prepare-reschedule',
691
+ 'prepare-roadmap-sync',
692
+ 'prepare-phase-sync',
693
+ 'record-mapping',
694
+ 'record-status',
695
+ ];
696
+ const REQUIREMENT_SUBS = ['get', 'list', 'traceability', 'update-status'];
697
+ const WORKTREE_SUBS = [
698
+ 'create',
699
+ 'remove',
700
+ 'list',
701
+ 'push-pr',
702
+ 'ensure-milestone-branch',
703
+ 'merge',
704
+ 'hook',
705
+ ];
706
+ const { INIT_WORKFLOWS } = require('../lib/cli/index');
707
+ // ─── Main ───────────────────────────────────────────────────────────────────
708
+ async function main() {
709
+ const args = process.argv.slice(2);
710
+ const rawIndex = args.indexOf('--raw');
711
+ const raw = rawIndex !== -1;
712
+ if (rawIndex !== -1)
713
+ args.splice(rawIndex, 1);
714
+ const command = args[0];
715
+ const cwd = process.cwd();
716
+ if (!command) {
717
+ error('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');
718
+ }
719
+ try {
720
+ await routeCommand(command, args, cwd, raw);
721
+ }
722
+ catch (e) {
723
+ error(e.stack || String(e));
724
+ }
725
+ }
726
+ // ─── Route Command ──────────────────────────────────────────────────────────
727
+ /** Validate and route CLI commands */
728
+ async function routeCommand(command, args, cwd, raw) {
729
+ // Descriptor-based dispatch: check ROUTE_DESCRIPTORS before falling through to switch
730
+ const descriptor = ROUTE_DESCRIPTORS.find((d) => d.command === command);
731
+ if (descriptor) {
732
+ return descriptor.handler(args, cwd, raw);
733
+ }
734
+ switch (command) {
735
+ case 'state': {
736
+ const sub = args[1];
737
+ // No subcommand defaults to load -- only validate if provided
738
+ if (sub)
739
+ validateSubcommand(sub, STATE_SUBS, 'state');
740
+ if (sub === 'update')
741
+ cmdStateUpdate(cwd, args[2], args[3]);
742
+ else if (sub === 'get')
743
+ cmdStateGet(cwd, args[2], raw);
744
+ else if (sub === 'patch') {
745
+ const patches = {};
746
+ for (let i = 2; i < args.length; i += 2) {
747
+ const k = args[i].replace(/^--/, '');
748
+ if (k && args[i + 1] !== undefined)
749
+ patches[k] = args[i + 1];
750
+ }
751
+ cmdStatePatch(cwd, patches, raw);
752
+ }
753
+ else if (sub === 'advance-plan')
754
+ cmdStateAdvancePlan(cwd, raw);
755
+ else if (sub === 'record-metric') {
756
+ cmdStateRecordMetric(cwd, {
757
+ phase: flag(args, '--phase') ?? null,
758
+ plan: flag(args, '--plan') ?? null,
759
+ duration: flag(args, '--duration') ?? null,
760
+ tasks: flag(args, '--tasks') ?? null,
761
+ files: flag(args, '--files') ?? null,
762
+ }, raw);
763
+ }
764
+ else if (sub === 'update-progress')
765
+ cmdStateUpdateProgress(cwd, raw);
766
+ else if (sub === 'add-decision') {
767
+ cmdStateAddDecision(cwd, {
768
+ phase: flag(args, '--phase') ?? null,
769
+ summary: flag(args, '--summary') ?? null,
770
+ rationale: flag(args, '--rationale') ?? '',
771
+ }, raw);
772
+ }
773
+ else if (sub === 'add-blocker')
774
+ cmdStateAddBlocker(cwd, flag(args, '--text') ?? '', raw);
775
+ else if (sub === 'resolve-blocker')
776
+ cmdStateResolveBlocker(cwd, flag(args, '--text') ?? '', raw);
777
+ else if (sub === 'record-session') {
778
+ cmdStateRecordSession(cwd, {
779
+ stopped_at: flag(args, '--stopped-at') ?? null,
780
+ resume_file: flag(args, '--resume-file') ?? 'None',
781
+ }, raw);
782
+ }
783
+ else
784
+ cmdStateLoad(cwd, raw);
785
+ break;
786
+ }
787
+ case 'resolve-model':
788
+ cmdResolveModel(cwd, args[1], raw);
789
+ break;
790
+ case 'find-phase':
791
+ cmdFindPhase(cwd, args[1], raw);
792
+ break;
793
+ case 'commit': {
794
+ const filesIndex = args.indexOf('--files');
795
+ cmdCommit(cwd, args[1], filesIndex !== -1
796
+ ? args.slice(filesIndex + 1).filter((a) => !a.startsWith('--'))
797
+ : [], raw, args.includes('--amend'));
798
+ break;
799
+ }
800
+ case 'verify-summary': {
801
+ validateFileArg(args[1], cwd);
802
+ const cc = args.indexOf('--check-count');
803
+ cmdVerifySummary(cwd, args[1], cc !== -1 ? parseInt(args[cc + 1], 10) : 2, raw);
804
+ break;
805
+ }
806
+ case 'template': {
807
+ const sub = args[1];
808
+ validateSubcommand(sub, TEMPLATE_SUBS, 'template');
809
+ if (sub === 'select')
810
+ cmdTemplateSelect(cwd, args[2], raw);
811
+ else if (sub === 'fill') {
812
+ cmdTemplateFill(cwd, args[2], {
813
+ phase: flag(args, '--phase') ?? null,
814
+ plan: flag(args, '--plan') ?? null,
815
+ name: flag(args, '--name') ?? null,
816
+ type: flag(args, '--type') ?? 'execute',
817
+ wave: flag(args, '--wave') ?? '1',
818
+ fields: flag(args, '--fields') ? JSON.parse(flag(args, '--fields')) : {},
819
+ }, raw);
820
+ }
821
+ break;
822
+ }
823
+ case 'frontmatter': {
824
+ const sub = args[1];
825
+ validateSubcommand(sub, FRONTMATTER_SUBS, 'frontmatter');
826
+ const file = args[2];
827
+ validateFileArg(file, cwd);
828
+ if (sub === 'get')
829
+ cmdFrontmatterGet(cwd, file, flag(args, '--field') ?? null, raw);
830
+ else if (sub === 'set')
831
+ cmdFrontmatterSet(cwd, file, flag(args, '--field') ?? '', flag(args, '--value') ?? '', raw);
832
+ else if (sub === 'merge')
833
+ cmdFrontmatterMerge(cwd, file, flag(args, '--data') ?? '', raw);
834
+ else if (sub === 'validate')
835
+ cmdFrontmatterValidate(cwd, file, flag(args, '--schema') ?? '', raw);
836
+ break;
837
+ }
838
+ case 'verify': {
839
+ const sub = args[1];
840
+ validateSubcommand(sub, VERIFY_SUBS, 'verify');
841
+ if (sub === 'commits') {
842
+ for (const ref of args.slice(2))
843
+ validateGitRef(ref);
844
+ cmdVerifyCommits(cwd, args.slice(2), raw);
845
+ }
846
+ else if (sub === 'mechanical') {
847
+ // Bundle: arg is a phase number/name, not a file path
848
+ cmdVerifyMechanical(cwd, args[2], raw);
849
+ }
850
+ else {
851
+ validateFileArg(args[2], cwd);
852
+ if (sub === 'plan-structure')
853
+ cmdVerifyPlanStructure(cwd, args[2], raw);
854
+ else if (sub === 'phase-completeness')
855
+ cmdVerifyPhaseCompleteness(cwd, args[2], raw);
856
+ else if (sub === 'references')
857
+ cmdVerifyReferences(cwd, args[2], raw);
858
+ else if (sub === 'artifacts')
859
+ cmdVerifyArtifacts(cwd, args[2], raw);
860
+ else if (sub === 'key-links')
861
+ cmdVerifyKeyLinks(cwd, args[2], raw);
862
+ }
863
+ break;
864
+ }
865
+ case 'generate-slug':
866
+ cmdGenerateSlug(args[1], raw);
867
+ break;
868
+ case 'current-timestamp':
869
+ cmdCurrentTimestamp(args[1] || 'full', raw);
870
+ break;
871
+ case 'list-todos':
872
+ cmdListTodos(cwd, args[1], raw);
873
+ break;
874
+ case 'verify-path-exists':
875
+ cmdVerifyPathExists(cwd, args[1], raw, args.includes('--dry-run'));
876
+ break;
877
+ case 'config-ensure-section':
878
+ cmdConfigEnsureSection(cwd, raw, args.includes('--dry-run'));
879
+ break;
880
+ case 'config-set':
881
+ cmdConfigSet(cwd, args[1], args[2], raw, args.includes('--dry-run'));
882
+ break;
883
+ case 'history-digest':
884
+ cmdHistoryDigest(cwd, raw);
885
+ break;
886
+ case 'dead-end': {
887
+ const sub = args[1];
888
+ if (sub === 'add') {
889
+ // Collect all --evidence flags (repeatable)
890
+ const evidence = [];
891
+ for (let i = 0; i < args.length; i++) {
892
+ if (args[i] === '--evidence' && args[i + 1])
893
+ evidence.push(args[i + 1]);
894
+ }
895
+ cmdDeadEndAdd(cwd, {
896
+ approach: flag(args, '--approach') ?? '',
897
+ phase: flag(args, '--phase') ?? '',
898
+ verdict: flag(args, '--verdict'),
899
+ evidence,
900
+ notes: flag(args, '--notes'),
901
+ }, raw);
902
+ }
903
+ else if (sub === 'promote-from-phase') {
904
+ // Prefer the explicit --phase flag when present. Fall back to
905
+ // positional args[2], but only if it is NOT itself a flag —
906
+ // otherwise `promote-from-phase --phase 1` would pass the literal
907
+ // string "--phase" to findPhaseInternal (codex r1 P2 on PR #37).
908
+ const flagPhase = flag(args, '--phase');
909
+ const positional = args[2] && !args[2].startsWith('--') ? args[2] : undefined;
910
+ const phaseArg = flagPhase ?? positional ?? '';
911
+ cmdDeadEndPromoteFromPhase(cwd, phaseArg, raw);
912
+ }
913
+ else {
914
+ error(`Unknown dead-end subcommand: ${sub}. Valid: add, promote-from-phase`);
915
+ }
916
+ break;
917
+ }
918
+ case 'genome': {
919
+ const sub = args[1];
920
+ if (sub === 'init') {
921
+ cmdGenomeInit(cwd, raw);
922
+ }
923
+ else if (sub === 'show') {
924
+ cmdGenomeShow(cwd, raw);
925
+ }
926
+ else if (sub === 'snapshot') {
927
+ cmdGenomeSnapshot(cwd, raw);
928
+ }
929
+ else if (sub === 'promote-suggestion') {
930
+ const slug = args[2] && !args[2].startsWith('--') ? args[2] : '';
931
+ cmdGenomePromoteSuggestion(cwd, slug, raw);
932
+ }
933
+ else {
934
+ error(`Unknown genome subcommand: ${sub}. Valid: init, show, snapshot, promote-suggestion`);
935
+ }
936
+ break;
937
+ }
938
+ case 'think': {
939
+ // Tier-3 #11 of the Ouroboros integration. One-shot project-state
940
+ // aggregator. No daemon, no LLM, writes only to .planning/thoughts/.
941
+ //
942
+ // codex r1 P3 on PR #42: strictly validate --limit. Pre-fix:
943
+ // `--limit 1.5` parseInt → 1 (silent truncation)
944
+ // `--limit 3abc` parseInt → 3 (silent truncation)
945
+ // `--limit` (no value) → silently defaulted
946
+ // All three slipped past the positive-integer check downstream.
947
+ let limit;
948
+ if (args.indexOf('--limit') !== -1) {
949
+ const limitRaw = flag(args, '--limit');
950
+ if (limitRaw === undefined || !/^\d+$/.test(limitRaw)) {
951
+ error(`--limit requires a positive integer value (got ${limitRaw === undefined ? '<missing>' : `"${limitRaw}"`})`);
952
+ }
953
+ limit = parseInt(limitRaw, 10);
954
+ }
955
+ cmdThink(cwd, { limit }, raw);
956
+ break;
957
+ }
958
+ case 'plan-tournament': {
959
+ // Tier-3 #9 of the Ouroboros integration. Scoring + selection over
960
+ // N candidate PLAN.md files. Caller supplies paths; this command
961
+ // does NOT auto-generate candidates (that's a deliberate follow-up
962
+ // to avoid worktree orchestration + backend variance per the
963
+ // proposal's caveat).
964
+ const rawCandidates = [];
965
+ for (let i = 0; i < args.length; i++) {
966
+ if (args[i] === '--candidate' && args[i + 1])
967
+ rawCandidates.push(args[i + 1]);
968
+ }
969
+ // Also accept comma-separated list via --candidates "a.md,b.md"
970
+ const csv = flag(args, '--candidates');
971
+ if (csv) {
972
+ for (const p of csv.split(',')) {
973
+ const trimmed = p.trim();
974
+ if (trimmed)
975
+ rawCandidates.push(trimmed);
976
+ }
977
+ }
978
+ // codex r4 P2 on PR #41: validate each candidate path against the
979
+ // project boundary before passing it to the scorer. Without this
980
+ // guard, absolute paths or `../` traversal could read files
981
+ // outside the repo when gd is invoked via automation / MCP.
982
+ //
983
+ // codex r5 P2 on PR #41: validateFileArg's underlying check is
984
+ // prefix-based, so a sibling like `${cwd}-secrets/PLAN.md` would
985
+ // squeak through. Tighten with a path.relative containment check.
986
+ const path_lib = require('path');
987
+ const candidates = rawCandidates.map((p) => {
988
+ const validated = validateFileArg(p, cwd);
989
+ const rel = path_lib.relative(cwd, validated);
990
+ if (rel === '' || rel.startsWith('..') || path_lib.isAbsolute(rel)) {
991
+ error(`Candidate path "${p}" is outside the project directory`);
992
+ }
993
+ return validated;
994
+ });
995
+ // codex r5 P3: validate phase format before interpolating into
996
+ // _extractRoadmapGoal's regex, where a malformed value would
997
+ // crash with a regex syntax error.
998
+ const phaseArg = flag(args, '--phase') ?? '';
999
+ if (phaseArg)
1000
+ validatePhaseArg(phaseArg);
1001
+ cmdPlanTournament(cwd, { phase: phaseArg, candidates }, raw);
1002
+ break;
1003
+ }
1004
+ case 'phases': {
1005
+ const sub = args[1];
1006
+ validateSubcommand(sub, PHASES_SUBS, 'phases');
1007
+ cmdPhasesList(cwd, { type: flag(args, '--type') ?? null, phase: flag(args, '--phase') ?? null }, raw);
1008
+ break;
1009
+ }
1010
+ case 'roadmap': {
1011
+ const sub = args[1];
1012
+ validateSubcommand(sub, ROADMAP_SUBS, 'roadmap');
1013
+ if (sub === 'get-phase') {
1014
+ validatePhaseArg(args[2]);
1015
+ cmdRoadmapGetPhase(cwd, args[2], raw);
1016
+ }
1017
+ else if (sub === 'analyze')
1018
+ cmdRoadmapAnalyze(cwd, raw);
1019
+ break;
1020
+ }
1021
+ case 'phase': {
1022
+ const sub = args[1];
1023
+ validateSubcommand(sub, PHASE_SUBS, 'phase');
1024
+ if (sub === 'next-decimal') {
1025
+ validatePhaseArg(args[2]);
1026
+ cmdPhaseNextDecimal(cwd, args[2], raw);
1027
+ }
1028
+ else if (sub === 'add') {
1029
+ const ctxIdx = args.indexOf('--context');
1030
+ let context;
1031
+ if (ctxIdx !== -1) {
1032
+ context = args.slice(ctxIdx + 1).join(' ');
1033
+ args.splice(ctxIdx);
1034
+ }
1035
+ cmdPhaseAdd(cwd, args.slice(2).join(' '), raw, context);
1036
+ }
1037
+ else if (sub === 'insert') {
1038
+ validatePhaseArg(args[2]);
1039
+ cmdPhaseInsert(cwd, args[2], args.slice(3).join(' '), raw);
1040
+ }
1041
+ else if (sub === 'remove') {
1042
+ validatePhaseArg(args[2]);
1043
+ cmdPhaseRemove(cwd, args[2], { force: args.includes('--force'), dryRun: args.includes('--dry-run') }, raw);
1044
+ }
1045
+ else if (sub === 'complete') {
1046
+ validatePhaseArg(args[2]);
1047
+ await cmdPhaseComplete(cwd, args[2], raw, { dryRun: args.includes('--dry-run') });
1048
+ }
1049
+ else if (sub === 'analyze-deps') {
1050
+ cmdPhaseAnalyzeDeps(cwd, raw);
1051
+ }
1052
+ break;
1053
+ }
1054
+ case 'milestone': {
1055
+ const sub = args[1];
1056
+ validateSubcommand(sub, MILESTONE_SUBS, 'milestone');
1057
+ if (sub === 'complete') {
1058
+ const ni = args.indexOf('--name');
1059
+ const version = args.slice(2).find((a) => !a.startsWith('--')) || null;
1060
+ cmdMilestoneComplete(cwd, version, {
1061
+ name: ni !== -1 ? args[ni + 1] : null,
1062
+ dryRun: args.includes('--dry-run'),
1063
+ }, raw);
1064
+ }
1065
+ break;
1066
+ }
1067
+ case 'version': {
1068
+ const VERSION_SUBS = ['bump'];
1069
+ validateSubcommand(args[1], VERSION_SUBS, 'version');
1070
+ if (args[1] === 'bump') {
1071
+ if (!args[2])
1072
+ error('version string required (e.g., v1.0.0)');
1073
+ cmdVersionBump(cwd, args[2], raw);
1074
+ }
1075
+ break;
1076
+ }
1077
+ case 'validate': {
1078
+ validateSubcommand(args[1], VALIDATE_SUBS, 'validate');
1079
+ cmdValidateConsistency(cwd, raw);
1080
+ break;
1081
+ }
1082
+ case 'progress':
1083
+ cmdProgressRender(cwd, args[1] || 'json', raw);
1084
+ break;
1085
+ case 'todo': {
1086
+ validateSubcommand(args[1], TODO_SUBS, 'todo');
1087
+ cmdTodoComplete(cwd, args[2], raw, args.includes('--dry-run'));
1088
+ break;
1089
+ }
1090
+ case 'scaffold': {
1091
+ const pi = args.indexOf('--phase');
1092
+ const ni = args.indexOf('--name');
1093
+ cmdScaffold(cwd, args[1], {
1094
+ phase: pi !== -1 ? args[pi + 1] : null,
1095
+ name: ni !== -1 ? args.slice(ni + 1).join(' ') : null,
1096
+ }, raw);
1097
+ break;
1098
+ }
1099
+ case 'migrate-dirs':
1100
+ cmdMigrateDirs(cwd, raw, args.includes('--dry-run'));
1101
+ break;
1102
+ case 'init': {
1103
+ const wf = args[1];
1104
+ const includes = parseIncludeFlag(args);
1105
+ validateSubcommand(wf, INIT_WORKFLOWS, 'init');
1106
+ switch (wf) {
1107
+ case 'execute-phase':
1108
+ validatePhaseArg(args[2]);
1109
+ cmdInitExecutePhase(cwd, args[2], includes, raw);
1110
+ break;
1111
+ case 'execute-parallel': {
1112
+ const phases = args.slice(2).filter((a) => !a.startsWith('--'));
1113
+ if (phases.length === 0)
1114
+ error('At least one phase number required for init execute-parallel');
1115
+ for (const p of phases)
1116
+ validatePhaseArg(p);
1117
+ cmdInitExecuteParallel(cwd, phases, includes, raw);
1118
+ break;
1119
+ }
1120
+ case 'plan-phase':
1121
+ validatePhaseArg(args[2]);
1122
+ cmdInitPlanPhase(cwd, args[2], includes, raw);
1123
+ break;
1124
+ case 'new-project':
1125
+ cmdInitNewProject(cwd, raw);
1126
+ break;
1127
+ case 'new-milestone':
1128
+ cmdInitNewMilestone(cwd, raw);
1129
+ break;
1130
+ case 'quick':
1131
+ cmdInitQuick(cwd, args.slice(2).join(' '), raw);
1132
+ break;
1133
+ case 'resume':
1134
+ cmdInitResume(cwd, raw);
1135
+ break;
1136
+ case 'verify-work':
1137
+ validatePhaseArg(args[2]);
1138
+ cmdInitVerifyWork(cwd, args[2], raw);
1139
+ break;
1140
+ case 'phase-op':
1141
+ validatePhaseArg(args[2]);
1142
+ cmdInitPhaseOp(cwd, args[2], raw);
1143
+ break;
1144
+ case 'todos':
1145
+ cmdInitTodos(cwd, args[2], raw);
1146
+ break;
1147
+ case 'milestone-op':
1148
+ cmdInitMilestoneOp(cwd, raw);
1149
+ break;
1150
+ case 'plan-milestone-gaps':
1151
+ cmdInitPlanMilestoneGaps(cwd, raw);
1152
+ break;
1153
+ case 'map-codebase':
1154
+ cmdInitMapCodebase(cwd, raw);
1155
+ break;
1156
+ case 'progress':
1157
+ cmdInitProgress(cwd, includes, raw, args.includes('--refresh'));
1158
+ break;
1159
+ case 'survey':
1160
+ cmdInitSurveyor(cwd, args.slice(2).join(' ') || '', raw);
1161
+ break;
1162
+ case 'deep-dive':
1163
+ cmdInitDeepDive(cwd, args.slice(2).join(' ') || '', raw);
1164
+ break;
1165
+ case 'feasibility':
1166
+ cmdInitFeasibility(cwd, args.slice(2).join(' ') || '', raw);
1167
+ break;
1168
+ case 'eval-plan':
1169
+ cmdInitEvalPlan(cwd, args[2] || null, raw);
1170
+ break;
1171
+ case 'eval-report':
1172
+ cmdInitEvalReport(cwd, args[2] || null, raw);
1173
+ break;
1174
+ case 'assess-baseline':
1175
+ cmdInitAssessBaseline(cwd, raw);
1176
+ break;
1177
+ case 'product-plan':
1178
+ cmdInitProductOwner(cwd, raw);
1179
+ break;
1180
+ case 'iterate':
1181
+ cmdInitResearchWorkflow(cwd, 'iterate', args.slice(2).join(' '), includes, raw);
1182
+ break;
1183
+ case 'project-researcher':
1184
+ cmdInitProjectResearcher(cwd, args.slice(2).join(' ') || '', raw);
1185
+ break;
1186
+ case 'research-synthesizer':
1187
+ cmdInitResearchSynthesizer(cwd, raw);
1188
+ break;
1189
+ case 'roadmapper':
1190
+ cmdInitRoadmapper(cwd, raw);
1191
+ break;
1192
+ case 'verifier':
1193
+ cmdInitVerifier(cwd, args[2] || null, raw);
1194
+ break;
1195
+ case 'autopilot':
1196
+ cmdInitAutopilot(cwd, raw);
1197
+ break;
1198
+ case 'multi-milestone-autopilot':
1199
+ cmdInitMultiMilestoneAutopilot(cwd, raw);
1200
+ break;
1201
+ case 'autoplan':
1202
+ cmdInitAutoplan(cwd, raw);
1203
+ break;
1204
+ case 'autoresearch':
1205
+ cmdInitAutoResearch(cwd, raw);
1206
+ break;
1207
+ case 'evolve':
1208
+ cmdInitEvolve(cwd, raw);
1209
+ break;
1210
+ case 'wireup':
1211
+ cmdInitWireup(cwd, raw);
1212
+ break;
1213
+ case 'debug':
1214
+ cmdInitDebug(cwd, args[2] || null, raw);
1215
+ break;
1216
+ case 'integration-check':
1217
+ cmdInitIntegrationCheck(cwd, args[2] || null, raw);
1218
+ break;
1219
+ case 'migrate':
1220
+ cmdInitMigrate(cwd, raw);
1221
+ break;
1222
+ case 'plan-check':
1223
+ validatePhaseArg(args[2]);
1224
+ cmdInitPlanCheck(cwd, args[2], raw);
1225
+ break;
1226
+ case 'phase-research':
1227
+ validatePhaseArg(args[2]);
1228
+ cmdInitPhaseResearch(cwd, args[2], includes, raw);
1229
+ break;
1230
+ case 'code-review':
1231
+ validatePhaseArg(args[2]);
1232
+ cmdInitCodeReview(cwd, args[2], raw);
1233
+ break;
1234
+ }
1235
+ break;
1236
+ }
1237
+ case 'phase-plan-index':
1238
+ validatePhaseArg(args[1]);
1239
+ cmdPhasePlanIndex(cwd, args[1], raw);
1240
+ break;
1241
+ case 'state-snapshot': {
1242
+ const sinceIdx = args.indexOf('--since');
1243
+ const snapshotOptions = sinceIdx !== -1 ? { since: args[sinceIdx + 1] } : {};
1244
+ cmdStateSnapshot(cwd, raw, snapshotOptions);
1245
+ break;
1246
+ }
1247
+ case 'summary-extract': {
1248
+ validateFileArg(args[1], cwd);
1249
+ const fi = args.indexOf('--fields');
1250
+ cmdSummaryExtract(cwd, args[1], fi !== -1 ? args[fi + 1].split(',') : null, raw);
1251
+ break;
1252
+ }
1253
+ case 'tracker': {
1254
+ validateSubcommand(args[1], TRACKER_SUBS, 'tracker');
1255
+ await cmdTracker(cwd, args[1], args.slice(2), raw);
1256
+ break;
1257
+ }
1258
+ case 'dashboard':
1259
+ cmdDashboard(cwd, raw);
1260
+ break;
1261
+ case 'phase-detail':
1262
+ validatePhaseArg(args[1]);
1263
+ cmdPhaseDetail(cwd, args[1], raw);
1264
+ break;
1265
+ case 'health':
1266
+ cmdHealth(cwd, raw);
1267
+ break;
1268
+ case 'detect-backend':
1269
+ cmdDetectBackend(cwd, raw);
1270
+ break;
1271
+ case 'long-term-roadmap': {
1272
+ const sub = args[1];
1273
+ if (!sub)
1274
+ error('subcommand required: list, add, remove, update, refine, link, unlink, display, init, history, parse, validate');
1275
+ const subArgs = args.slice(2);
1276
+ cmdLongTermRoadmap(cwd, sub, subArgs, raw);
1277
+ break;
1278
+ }
1279
+ case 'quality-analysis':
1280
+ cmdQualityAnalysis(cwd, args.slice(1), raw);
1281
+ break;
1282
+ case 'setup':
1283
+ cmdSetup(cwd, raw);
1284
+ break;
1285
+ case 'search':
1286
+ if (!args[1])
1287
+ error('Search query is required');
1288
+ cmdSearch(cwd, args[1], raw);
1289
+ break;
1290
+ case 'requirement': {
1291
+ const sub = args[1];
1292
+ validateSubcommand(sub, REQUIREMENT_SUBS, 'requirement');
1293
+ if (sub === 'get') {
1294
+ if (!args[2])
1295
+ error('REQ-ID required');
1296
+ cmdRequirementGet(cwd, args[2], raw);
1297
+ }
1298
+ else if (sub === 'list') {
1299
+ cmdRequirementList(cwd, {
1300
+ phase: flag(args, '--phase') ?? null,
1301
+ priority: flag(args, '--priority') ?? null,
1302
+ status: flag(args, '--status') ?? null,
1303
+ category: flag(args, '--category') ?? null,
1304
+ all: args.includes('--all'),
1305
+ }, raw);
1306
+ }
1307
+ else if (sub === 'traceability') {
1308
+ cmdRequirementTraceability(cwd, {
1309
+ phase: flag(args, '--phase') ?? null,
1310
+ }, raw);
1311
+ }
1312
+ else if (sub === 'update-status') {
1313
+ if (!args[2])
1314
+ error('REQ-ID required');
1315
+ if (!args[3])
1316
+ error('Status required (Pending, In Progress, Done, Deferred)');
1317
+ // Handle multi-word status "In Progress" -- args[3] might be "In" and args[4] "Progress"
1318
+ let status = args[3];
1319
+ if (args[3] === 'In' && args[4] === 'Progress') {
1320
+ status = 'In Progress';
1321
+ }
1322
+ cmdRequirementUpdateStatus(cwd, args[2], status, raw, args.includes('--dry-run'));
1323
+ }
1324
+ break;
1325
+ }
1326
+ case 'worktree': {
1327
+ const sub = args[1];
1328
+ validateSubcommand(sub, WORKTREE_SUBS, 'worktree');
1329
+ if (sub === 'create') {
1330
+ cmdWorktreeCreate(cwd, {
1331
+ phase: flag(args, '--phase') ?? null,
1332
+ milestone: flag(args, '--milestone') ?? null,
1333
+ slug: flag(args, '--slug') ?? null,
1334
+ startPoint: flag(args, '--start-point') ?? null,
1335
+ }, raw);
1336
+ }
1337
+ else if (sub === 'remove') {
1338
+ if (args.includes('--stale')) {
1339
+ cmdWorktreeRemoveStale(cwd, raw);
1340
+ }
1341
+ else {
1342
+ cmdWorktreeRemove(cwd, {
1343
+ phase: flag(args, '--phase') ?? null,
1344
+ path: flag(args, '--path') ?? null,
1345
+ milestone: flag(args, '--milestone') ?? null,
1346
+ }, raw);
1347
+ }
1348
+ }
1349
+ else if (sub === 'list') {
1350
+ cmdWorktreeList(cwd, raw);
1351
+ }
1352
+ else if (sub === 'push-pr') {
1353
+ cmdWorktreePushAndPR(cwd, {
1354
+ phase: flag(args, '--phase') ?? null,
1355
+ milestone: flag(args, '--milestone') ?? null,
1356
+ title: flag(args, '--title') ?? null,
1357
+ body: flag(args, '--body') ?? null,
1358
+ base: flag(args, '--base') ?? null,
1359
+ }, raw);
1360
+ }
1361
+ else if (sub === 'ensure-milestone-branch') {
1362
+ cmdWorktreeEnsureMilestoneBranch(cwd, {
1363
+ milestone: flag(args, '--milestone') ?? null,
1364
+ baseBranch: flag(args, '--base-branch') ?? null,
1365
+ }, raw);
1366
+ }
1367
+ else if (sub === 'merge') {
1368
+ cmdWorktreeMerge(cwd, {
1369
+ phase: flag(args, '--phase') ?? null,
1370
+ milestone: flag(args, '--milestone') ?? null,
1371
+ slug: flag(args, '--slug') ?? null,
1372
+ base: flag(args, '--base') ?? null,
1373
+ branch: flag(args, '--branch') ?? null,
1374
+ deleteBranch: args.includes('--delete-branch'),
1375
+ }, raw);
1376
+ }
1377
+ else if (sub === 'hook') {
1378
+ const hookSub = args[2];
1379
+ if (hookSub === 'create') {
1380
+ cmdWorktreeHookCreate(cwd, args[3], args[4], raw);
1381
+ }
1382
+ else if (hookSub === 'remove') {
1383
+ cmdWorktreeHookRemove(cwd, args[3], args[4], raw);
1384
+ }
1385
+ else {
1386
+ error(`Unknown worktree hook subcommand: ${hookSub}. Use 'create' or 'remove'.`);
1387
+ }
1388
+ }
1389
+ break;
1390
+ }
1391
+ case 'settings': {
1392
+ const sub = args[1];
1393
+ if (sub === 'token_profile') {
1394
+ const value = args[2];
1395
+ const validProfiles = ['frugal', 'balanced', 'quality'];
1396
+ if (!value || !validProfiles.includes(value)) {
1397
+ error(`Invalid token_profile value "${value || ''}". Valid values: ${validProfiles.join(', ')}`);
1398
+ }
1399
+ cmdConfigSet(cwd, 'token_profile', value, raw);
1400
+ }
1401
+ else if (sub === 'phase_complete_llm_fallback') {
1402
+ const value = args[2];
1403
+ if (value !== 'true' && value !== 'false') {
1404
+ error(`Invalid phase_complete_llm_fallback value "${value || ''}". Valid values: true, false`);
1405
+ }
1406
+ cmdConfigSet(cwd, 'phase_complete_llm_fallback', value, raw);
1407
+ }
1408
+ else if (sub === 'effort') {
1409
+ // v0.4 Phase 1: effort axis
1410
+ const value = args[2];
1411
+ const validEffortLevels = ['thrifty', 'balanced', 'deep'];
1412
+ if (!value || !validEffortLevels.includes(value)) {
1413
+ error(`Invalid effort value "${value || ''}". Valid values: ${validEffortLevels.join(', ')}`);
1414
+ }
1415
+ cmdConfigSet(cwd, 'effort', value, raw);
1416
+ }
1417
+ else {
1418
+ error(`Unknown settings subcommand "${sub || ''}". Tool-mode settings subcommands: token_profile, effort, phase_complete_llm_fallback`);
1419
+ }
1420
+ break;
1421
+ }
1422
+ case 'evolve': {
1423
+ const sub = args[1];
1424
+ validateSubcommand(sub, ['run', 'discover', 'state', 'advance', 'reset'], 'evolve');
1425
+ switch (sub) {
1426
+ case 'run':
1427
+ await cmdEvolve(cwd, args.slice(2), raw);
1428
+ return;
1429
+ case 'discover':
1430
+ await cmdEvolveDiscover(cwd, args.slice(2), raw);
1431
+ return;
1432
+ case 'state':
1433
+ cmdEvolveState(cwd, args.slice(2), raw);
1434
+ return;
1435
+ case 'advance':
1436
+ cmdEvolveAdvance(cwd, args.slice(2), raw);
1437
+ return;
1438
+ case 'reset':
1439
+ cmdEvolveReset(cwd, args.slice(2), raw);
1440
+ return;
1441
+ }
1442
+ break;
1443
+ }
1444
+ case 'wireup': {
1445
+ const sub = args[1];
1446
+ validateSubcommand(sub, ['run'], 'wireup');
1447
+ if (sub === 'run') {
1448
+ await cmdWireup(cwd, args.slice(2), raw);
1449
+ return;
1450
+ }
1451
+ break;
1452
+ }
1453
+ case 'autopilot':
1454
+ await cmdAutopilot(cwd, args.slice(1), raw);
1455
+ break;
1456
+ case 'multi-milestone-autopilot':
1457
+ await cmdMultiMilestoneAutopilot(cwd, args.slice(1), raw);
1458
+ break;
1459
+ case 'autoplan':
1460
+ await cmdAutoplan(cwd, args.slice(1), raw);
1461
+ break;
1462
+ case 'autoresearch': {
1463
+ const arConfig = loadConfig(cwd);
1464
+ const arScheduler = createScheduler(arConfig.scheduler, arConfig.superpowers);
1465
+ if (arScheduler) {
1466
+ arScheduler.loadPersistedState(path.join(cwd, '.planning'));
1467
+ }
1468
+ await cmdAutoResearch(cwd, args.slice(1), raw, arScheduler);
1469
+ break;
1470
+ }
1471
+ case 'worktree-hook-create':
1472
+ cmdWorktreeHookCreate(cwd, args[1], args[2], raw);
1473
+ break;
1474
+ case 'worktree-hook-remove':
1475
+ cmdWorktreeHookRemove(cwd, args[1], args[2], raw);
1476
+ break;
1477
+ case 'coverage-report':
1478
+ cmdCoverageReport(cwd, { threshold: parseInt(flag(args, '--threshold', '85'), 10) }, raw);
1479
+ break;
1480
+ case 'health-check':
1481
+ cmdHealthCheck(cwd, { fix: args.includes('--fix') }, raw);
1482
+ break;
1483
+ case 'markdown-split': {
1484
+ _warnDeprecated('markdown-split');
1485
+ const sub = args[1];
1486
+ validateSubcommand(sub, ['split', 'check'], 'markdown-split');
1487
+ switch (sub) {
1488
+ case 'split': {
1489
+ const filePath = args[2];
1490
+ if (!filePath)
1491
+ error('file path required for markdown-split split');
1492
+ const absPath = path.resolve(cwd, filePath);
1493
+ if (!fs.existsSync(absPath))
1494
+ error(`File not found: ${absPath}`);
1495
+ const thresholdIdx = args.indexOf('--threshold');
1496
+ const threshold = thresholdIdx !== -1 ? parseInt(args[thresholdIdx + 1], 10) : undefined;
1497
+ const content = fs.readFileSync(absPath, 'utf-8');
1498
+ const basename = path.basename(absPath, '.md');
1499
+ const dir = path.dirname(absPath);
1500
+ const result = splitMarkdown(content, { threshold, basename });
1501
+ if (!result.split_performed) {
1502
+ output({ split_performed: false, reason: result.reason, file: absPath }, raw);
1503
+ break;
1504
+ }
1505
+ // Write index file (overwrite original)
1506
+ fs.writeFileSync(absPath, result.index_content, 'utf-8');
1507
+ // Write partial files
1508
+ const partials = [];
1509
+ for (const part of result.parts || []) {
1510
+ const partPath = path.join(dir, part.filename);
1511
+ fs.writeFileSync(partPath, part.content, 'utf-8');
1512
+ partials.push(partPath);
1513
+ }
1514
+ output({
1515
+ split_performed: true,
1516
+ index_file: absPath,
1517
+ partials,
1518
+ part_count: (result.parts || []).length,
1519
+ }, raw);
1520
+ break;
1521
+ }
1522
+ case 'check': {
1523
+ const filePath = args[2];
1524
+ if (!filePath)
1525
+ error('file path required for markdown-split check');
1526
+ const absPath = path.resolve(cwd, filePath);
1527
+ if (!fs.existsSync(absPath))
1528
+ error(`File not found: ${absPath}`);
1529
+ const content = fs.readFileSync(absPath, 'utf-8');
1530
+ const tokens = estimateTokens(content);
1531
+ const is_index = isIndexFile(content);
1532
+ output({
1533
+ file: absPath,
1534
+ is_index,
1535
+ estimated_tokens: tokens,
1536
+ exceeds_threshold: tokens > 25000,
1537
+ }, raw);
1538
+ break;
1539
+ }
1540
+ }
1541
+ break;
1542
+ }
1543
+ case 'parallel-progress':
1544
+ cmdParallelProgress(args.slice(1), raw);
1545
+ break;
1546
+ case 'overstory': {
1547
+ const sub = validateSubcommand(args[1] || '', ['detect', 'install'], 'overstory');
1548
+ if (sub === 'detect') {
1549
+ const result = detectOverstory(cwd);
1550
+ output(result || { available: false, reason: 'Overstory not detected' }, raw);
1551
+ }
1552
+ else if (sub === 'install') {
1553
+ try {
1554
+ installOverstory(cwd);
1555
+ output({ ok: true, message: 'Overstory installed and initialized' }, raw);
1556
+ }
1557
+ catch (e) {
1558
+ const msg = e instanceof Error ? e.message : String(e);
1559
+ output({ ok: false, error: msg }, raw);
1560
+ }
1561
+ }
1562
+ break;
1563
+ }
1564
+ case 'metrics': {
1565
+ const { getCounters } = require('../lib/metrics');
1566
+ const counters = getCounters();
1567
+ output(counters, raw, JSON.stringify(counters, null, 2));
1568
+ break;
1569
+ }
1570
+ default: {
1571
+ const TOP_LEVEL_COMMANDS = [
1572
+ 'state',
1573
+ 'resolve-model',
1574
+ 'find-phase',
1575
+ 'commit',
1576
+ 'verify-summary',
1577
+ 'template',
1578
+ 'frontmatter',
1579
+ 'verify',
1580
+ 'generate-slug',
1581
+ 'current-timestamp',
1582
+ 'list-todos',
1583
+ 'verify-path-exists',
1584
+ 'config-ensure-section',
1585
+ 'config-set',
1586
+ 'history-digest',
1587
+ 'phases',
1588
+ 'roadmap',
1589
+ 'phase',
1590
+ 'milestone',
1591
+ 'version',
1592
+ 'validate',
1593
+ 'progress',
1594
+ 'todo',
1595
+ 'scaffold',
1596
+ 'migrate-dirs',
1597
+ 'init',
1598
+ 'phase-plan-index',
1599
+ 'state-snapshot',
1600
+ 'summary-extract',
1601
+ 'tracker',
1602
+ 'dashboard',
1603
+ 'phase-detail',
1604
+ 'health',
1605
+ 'detect-backend',
1606
+ 'long-term-roadmap',
1607
+ 'quality-analysis',
1608
+ 'setup',
1609
+ 'search',
1610
+ 'requirement',
1611
+ 'worktree',
1612
+ 'settings',
1613
+ 'evolve',
1614
+ 'autopilot',
1615
+ 'multi-milestone-autopilot',
1616
+ 'autoplan',
1617
+ 'worktree-hook-create',
1618
+ 'worktree-hook-remove',
1619
+ 'teammate-idle-hook',
1620
+ 'task-completed-hook',
1621
+ 'instructions-loaded-hook',
1622
+ 'stop-failure-hook',
1623
+ 'post-compact-hook',
1624
+ 'coverage-report',
1625
+ 'health-check',
1626
+ 'markdown-split',
1627
+ 'parallel-progress',
1628
+ 'overstory',
1629
+ 'metrics',
1630
+ 'diagnose',
1631
+ 'export-research',
1632
+ 'import-research',
1633
+ 'deps',
1634
+ 'todos',
1635
+ 'knowhow',
1636
+ 'budget',
1637
+ 'blame',
1638
+ 'freshness',
1639
+ 'rollback',
1640
+ 'estimate',
1641
+ 'estimate-phase',
1642
+ 'impact',
1643
+ 'check-assumptions',
1644
+ 'execute-phase',
1645
+ 'phase-risk',
1646
+ 'citation-backlinks',
1647
+ 'eval-regression-check',
1648
+ 'phase-time-budget',
1649
+ 'config-diff',
1650
+ 'phase-readiness',
1651
+ 'milestone-health',
1652
+ 'decision-timeline',
1653
+ 'import-knowledge',
1654
+ 'todo-duplicates',
1655
+ 'citation-graph',
1656
+ 'artifact-dag',
1657
+ 'benchmark-report',
1658
+ 'forecast-phase',
1659
+ 'tail',
1660
+ 'eval',
1661
+ 'check-plans',
1662
+ 'knowledge',
1663
+ 'autoresearch',
1664
+ 'wireup',
1665
+ 'watch',
1666
+ 'research-gaps',
1667
+ 'deps-risk',
1668
+ 'import-knowhow',
1669
+ ];
1670
+ const suggestion = findClosestCommand(command, TOP_LEVEL_COMMANDS);
1671
+ const hint = suggestion ? ` Did you mean "${suggestion}"?` : '';
1672
+ error(`Unknown command: "${command}".${hint}`);
1673
+ }
1674
+ }
1675
+ }
1676
+ main().catch((err) => {
1677
+ process.stderr.write(`[grd] fatal error: ${err.message}\n`);
1678
+ process.exit(1);
1679
+ });
1680
+ //# sourceMappingURL=grd-tools.js.map