@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,465 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * GRD Commands/Patterns — v0.4 Phase 5 deterministic pattern extractor.
5
+ *
6
+ * Scans VERIFICATION.md `<reflection>` blocks, computes per-token verdict
7
+ * statistics over each plan's PLAN.md vocabulary, and *suggests*
8
+ * statistically significant heuristics for human review. The defensible
9
+ * fraction of the meta-review-agent idea that DEAD-ENDS rules out
10
+ * (`meta-review-agent-with-write-access`): same data source (reflections),
11
+ * same goal (compound learnings into GENOME), but the write path is
12
+ * deterministic statistics + human review, NOT LLM judgment.
13
+ *
14
+ * Statistical floor — a token is "significant" only if ALL hold:
15
+ * (a) appears in >= min_occurrences plans (default 10)
16
+ * (b) |confirmed_rate - baseline| >= effect_size (default 0.20)
17
+ * (c) raw two-sided binomial p < 0.05 against the baseline rate
18
+ * (d) Benjamini-Hochberg FDR-corrected q < fdr_q (default 0.10)
19
+ *
20
+ * (b)+(d) are the codex r-bkknb6i9g P2 #7 additions: a bare per-token
21
+ * p<0.05 across many tokens invites multiple-comparison noise.
22
+ *
23
+ * Output: suggestions go to .planning/GENOME-SUGGESTIONS.md (a SEPARATE
24
+ * file — codex P1 #5 + DEAD-ENDS slug `auto-suggestions-in-genome-file`).
25
+ * GENOME.md is NEVER written here; promotion is the human-curated
26
+ * `gd genome promote-suggestion <slug>`. --dry-run is the default;
27
+ * --apply requires --yes. No autopilot integration, no LLM round-trip.
28
+ */
29
+
30
+ const fs = require('fs') as typeof import('fs');
31
+ const path = require('path') as typeof import('path');
32
+
33
+ const {
34
+ safeReadMarkdown,
35
+ output,
36
+ error,
37
+ }: {
38
+ safeReadMarkdown: (p: string) => string | null;
39
+ output: (result: unknown, raw: boolean, rawValue?: unknown) => never;
40
+ error: (message: string) => never;
41
+ } = require('../utils');
42
+
43
+ const {
44
+ atomicWriteFileSync,
45
+ }: { atomicWriteFileSync: (filePath: string, data: string) => void } = require('../autopilot-waves');
46
+
47
+ // ─── Types ─────────────────────────────────────────────────────────────────
48
+
49
+ export interface Reflection {
50
+ /** Phase directory the reflection came from (for diagnostics). */
51
+ source: string;
52
+ /** Raw verdict string as found in the reflection YAML. */
53
+ verdict: string;
54
+ /** Binary outcome: true when the verdict confirms the hypothesis. */
55
+ confirmed: boolean;
56
+ /** Token vocabulary of the parent PLAN.md. */
57
+ vocabulary: Set<string>;
58
+ }
59
+
60
+ export interface TokenStat {
61
+ token: string;
62
+ n: number;
63
+ confirmed: number;
64
+ confirmed_rate: number;
65
+ baseline: number;
66
+ effect_size: number;
67
+ raw_p: number;
68
+ fdr_q: number;
69
+ significant: boolean;
70
+ }
71
+
72
+ export interface PatternsOptions {
73
+ minOccurrences?: number;
74
+ effectSize?: number;
75
+ fdrQ?: number;
76
+ apply?: boolean;
77
+ yes?: boolean;
78
+ }
79
+
80
+ export interface PatternsResult {
81
+ reflections_scanned: number;
82
+ baseline_confirmed_rate: number;
83
+ tokens_tested: number;
84
+ suggestions: TokenStat[];
85
+ applied: boolean;
86
+ suggestions_path: string | null;
87
+ }
88
+
89
+ // ─── Tokenisation ───────────────────────────────────────────────────────────
90
+
91
+ /**
92
+ * Low-information implementation tokens suppressed from pattern mining —
93
+ * they appear in nearly every plan and carry no strategy signal. Combines
94
+ * generic English stopwords with TypeScript/JS implementation keywords.
95
+ */
96
+ const STOPWORDS: Set<string> = new Set([
97
+ // generic (mirrors lib/drift.ts + plan-tournament.ts)
98
+ 'the', 'and', 'for', 'with', 'from', 'into', 'over', 'this', 'that',
99
+ 'are', 'was', 'were', 'has', 'have', 'had', 'will', 'would', 'should',
100
+ 'phase', 'plan', 'summary', 'roadmap', 'task', 'goal',
101
+ // implementation keywords (codex P2 #7: suppress low-information tokens)
102
+ 'function', 'const', 'let', 'var', 'import', 'export', 'return', 'async',
103
+ 'await', 'type', 'interface', 'class', 'module', 'require', 'test', 'tests',
104
+ 'unit', 'integration', 'file', 'files', 'code', 'add', 'added', 'update',
105
+ 'implement', 'use', 'using', 'new',
106
+ ]);
107
+
108
+ function tokenize(text: string): Set<string> {
109
+ const set = new Set<string>();
110
+ const matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]{2,}/g);
111
+ if (!matches) return set;
112
+ for (const t of matches) {
113
+ if (STOPWORDS.has(t)) continue;
114
+ set.add(t);
115
+ }
116
+ return set;
117
+ }
118
+
119
+ // ─── Reflection scanning ──────────────────────────────────────────────────
120
+
121
+ /**
122
+ * True when a verdict string asserts the hypothesis held. Reflection
123
+ * verdicts are `confirmed | falsified | partial` (and variants). Anything
124
+ * that isn't an affirmative confirmation counts as not-confirmed.
125
+ */
126
+ export function isConfirmed(verdict: string): boolean {
127
+ const v = verdict.trim().toLowerCase();
128
+ if (/\b(not|un)[\s-]?confirmed\b/.test(v)) return false;
129
+ return /\b(confirmed|validated|pass(ed)?|holds?|supported|true)\b/.test(v);
130
+ }
131
+
132
+ function extractVerdict(reflectionYaml: string): string | null {
133
+ const m = reflectionYaml.match(/^\s*verdict:\s*["']?([^"'\n]+?)["']?\s*$/m);
134
+ return m ? m[1].trim() : null;
135
+ }
136
+
137
+ /**
138
+ * Scan all VERIFICATION.md files under .planning/milestones (and a bare
139
+ * top-level VERIFICATION.md) for `<reflection>` blocks carrying a verdict.
140
+ * Each reflection's plan vocabulary comes from the sibling PLAN.md.
141
+ *
142
+ * Uses safeReadMarkdown so GRD-INDEX split-format files reassemble (GENOME
143
+ * heuristic). Returns one Reflection per verdict-bearing block found.
144
+ */
145
+ export function scanReflections(cwd: string): Reflection[] {
146
+ const reflections: Reflection[] = [];
147
+ const planningDir = path.join(cwd, '.planning');
148
+ const verificationFiles = findVerificationFiles(planningDir);
149
+
150
+ for (const vf of verificationFiles) {
151
+ const content = safeReadMarkdown(vf);
152
+ if (!content) continue;
153
+ // Parent-dir PLAN.md vocabulary (prefer resolved PLAN.md, else PLAN-1.md).
154
+ const dir = path.dirname(vf);
155
+ const planContent = readSiblingPlan(dir);
156
+ const vocabulary = planContent ? tokenize(planContent) : new Set<string>();
157
+
158
+ for (const block of extractReflectionBlocks(content)) {
159
+ const verdict = extractVerdict(block);
160
+ if (!verdict) continue;
161
+ reflections.push({
162
+ source: path.relative(cwd, vf),
163
+ verdict,
164
+ confirmed: isConfirmed(verdict),
165
+ vocabulary,
166
+ });
167
+ }
168
+ }
169
+ return reflections;
170
+ }
171
+
172
+ function findVerificationFiles(planningDir: string): string[] {
173
+ const out: string[] = [];
174
+ const bare = path.join(planningDir, 'VERIFICATION.md');
175
+ if (fileExists(bare)) out.push(bare);
176
+ const milestonesDir = path.join(planningDir, 'milestones');
177
+ // .planning/milestones/<m>/phases/<p>/VERIFICATION.md (and bare/prefixed forms).
178
+ for (const milestone of listDirs(milestonesDir)) {
179
+ const phasesDir = path.join(milestonesDir, milestone, 'phases');
180
+ for (const phase of listDirs(phasesDir)) {
181
+ const phaseDir = path.join(phasesDir, phase);
182
+ for (const name of listFiles(phaseDir)) {
183
+ if (name === 'VERIFICATION.md' || /-VERIFICATION\.md$/.test(name)) {
184
+ out.push(path.join(phaseDir, name));
185
+ }
186
+ }
187
+ }
188
+ }
189
+ return out;
190
+ }
191
+
192
+ function readSiblingPlan(dir: string): string | null {
193
+ // Prefer the resolved PLAN.md; fall back to the first candidate.
194
+ const direct = path.join(dir, 'PLAN.md');
195
+ if (fileExists(direct)) return safeReadMarkdown(direct);
196
+ for (const name of listFiles(dir)) {
197
+ if (/^PLAN-\d+\.md$/.test(name) || /-PLAN\.md$/.test(name)) {
198
+ return safeReadMarkdown(path.join(dir, name));
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+
204
+ function extractReflectionBlocks(content: string): string[] {
205
+ // <reflection> ... </reflection> blocks; the YAML inside may be fenced.
206
+ const blocks: string[] = [];
207
+ const re = /<reflection>([\s\S]*?)<\/reflection>/g;
208
+ for (const m of content.matchAll(re)) blocks.push(m[1]);
209
+ return blocks;
210
+ }
211
+
212
+ function fileExists(p: string): boolean {
213
+ try {
214
+ return fs.statSync(p).isFile();
215
+ } catch {
216
+ return false;
217
+ }
218
+ }
219
+
220
+ function listDirs(p: string): string[] {
221
+ try {
222
+ return fs
223
+ .readdirSync(p, { withFileTypes: true })
224
+ .filter((e) => e.isDirectory())
225
+ .map((e) => e.name);
226
+ } catch {
227
+ return [];
228
+ }
229
+ }
230
+
231
+ function listFiles(p: string): string[] {
232
+ try {
233
+ return fs
234
+ .readdirSync(p, { withFileTypes: true })
235
+ .filter((e) => e.isFile())
236
+ .map((e) => e.name);
237
+ } catch {
238
+ return [];
239
+ }
240
+ }
241
+
242
+ // ─── Binomial test + Benjamini-Hochberg FDR ─────────────────────────────────
243
+
244
+ const _logFactCache: number[] = [0, 0];
245
+ function logFactorial(n: number): number {
246
+ for (let i = _logFactCache.length; i <= n; i++) {
247
+ _logFactCache[i] = _logFactCache[i - 1] + Math.log(i);
248
+ }
249
+ return _logFactCache[n];
250
+ }
251
+
252
+ function logChoose(n: number, k: number): number {
253
+ return logFactorial(n) - logFactorial(k) - logFactorial(n - k);
254
+ }
255
+
256
+ function binomPmf(k: number, n: number, p: number): number {
257
+ if (p <= 0) return k === 0 ? 1 : 0;
258
+ if (p >= 1) return k === n ? 1 : 0;
259
+ return Math.exp(logChoose(n, k) + k * Math.log(p) + (n - k) * Math.log(1 - p));
260
+ }
261
+
262
+ /**
263
+ * Two-sided exact binomial test p-value: the total probability of all
264
+ * outcomes no more likely than the observed count under the null rate p0
265
+ * (method of small p-values). Returns 1 when p0 is degenerate (0 or 1).
266
+ */
267
+ export function binomTwoSidedP(k: number, n: number, p0: number): number {
268
+ if (n === 0) return 1;
269
+ if (p0 <= 0 || p0 >= 1) return 1;
270
+ const pObs = binomPmf(k, n, p0);
271
+ let total = 0;
272
+ const tol = pObs * (1 + 1e-7);
273
+ for (let j = 0; j <= n; j++) {
274
+ const pj = binomPmf(j, n, p0);
275
+ if (pj <= tol) total += pj;
276
+ }
277
+ return Math.min(1, total);
278
+ }
279
+
280
+ /**
281
+ * Benjamini-Hochberg FDR adjustment. Given raw p-values, returns the
282
+ * adjusted q-values in the SAME order as the input. Standard step-up:
283
+ * sort ascending, q_i = p_i * m / rank, then enforce monotonicity from
284
+ * the largest rank downward, clamp to [0, 1].
285
+ */
286
+ export function benjaminiHochberg(pvalues: number[]): number[] {
287
+ const m = pvalues.length;
288
+ if (m === 0) return [];
289
+ const indexed = pvalues.map((p, i) => ({ p, i })).sort((a, b) => a.p - b.p);
290
+ const q = new Array<number>(m);
291
+ let prev = 1;
292
+ for (let rank = m; rank >= 1; rank--) {
293
+ const { p, i } = indexed[rank - 1];
294
+ const raw = (p * m) / rank;
295
+ prev = Math.min(prev, raw);
296
+ q[i] = Math.min(1, prev);
297
+ }
298
+ return q;
299
+ }
300
+
301
+ // ─── Per-token statistics ─────────────────────────────────────────────────
302
+
303
+ /**
304
+ * Compute per-token verdict statistics with the full significance floor.
305
+ * Only tokens appearing in >= minOccurrences plans are TESTED (and thus
306
+ * counted in the multiple-comparison correction). A tested token is
307
+ * `significant` iff effect_size >= effectSize AND raw_p < 0.05 AND
308
+ * fdr_q < fdrQ.
309
+ *
310
+ * STATISTICAL CAVEAT (codex review P2): the null rate is the observed global
311
+ * baseline, which INCLUDES the token's own rows. The token and the baseline
312
+ * are therefore not independent, so `raw_p` / `fdr_q` are an *approximate
313
+ * association signal*, NOT exactly calibrated p-values. This is deliberate
314
+ * and acceptable for a suggest-to-a-human heuristic miner — the floor exists
315
+ * to rank and gate noise, not to publish inference. A properly independent
316
+ * test (two-sample / Fisher exact: token-rows vs non-token-rows) is a v0.5
317
+ * follow-up if these suggestions ever feed an automated decision. They do
318
+ * not: every suggestion is human-reviewed before promotion.
319
+ */
320
+ export function computeTokenStats(
321
+ reflections: Reflection[],
322
+ opts: { minOccurrences: number; effectSize: number; fdrQ: number }
323
+ ): { baseline: number; stats: TokenStat[] } {
324
+ const total = reflections.length;
325
+ if (total === 0) return { baseline: 0, stats: [] };
326
+
327
+ const confirmedTotal = reflections.filter((r) => r.confirmed).length;
328
+ const baseline = confirmedTotal / total;
329
+
330
+ // Tally per token.
331
+ const counts = new Map<string, { n: number; confirmed: number }>();
332
+ for (const r of reflections) {
333
+ for (const tok of r.vocabulary) {
334
+ const c = counts.get(tok) ?? { n: 0, confirmed: 0 };
335
+ c.n += 1;
336
+ if (r.confirmed) c.confirmed += 1;
337
+ counts.set(tok, c);
338
+ }
339
+ }
340
+
341
+ // Only tokens meeting the occurrence floor are tested (drives FDR m).
342
+ const tested: Array<{ token: string; n: number; confirmed: number; raw_p: number }> = [];
343
+ for (const [token, c] of counts) {
344
+ if (c.n < opts.minOccurrences) continue;
345
+ const raw_p = binomTwoSidedP(c.confirmed, c.n, baseline);
346
+ tested.push({ token, n: c.n, confirmed: c.confirmed, raw_p });
347
+ }
348
+
349
+ const qvals = benjaminiHochberg(tested.map((t) => t.raw_p));
350
+
351
+ const stats: TokenStat[] = tested.map((t, idx) => {
352
+ const confirmed_rate = t.confirmed / t.n;
353
+ const effect_size = Math.abs(confirmed_rate - baseline);
354
+ const fdr_q = qvals[idx];
355
+ const significant =
356
+ effect_size >= opts.effectSize && t.raw_p < 0.05 && fdr_q < opts.fdrQ;
357
+ return {
358
+ token: t.token,
359
+ n: t.n,
360
+ confirmed: t.confirmed,
361
+ confirmed_rate,
362
+ baseline,
363
+ effect_size,
364
+ raw_p: t.raw_p,
365
+ fdr_q,
366
+ significant,
367
+ };
368
+ });
369
+
370
+ // Deterministic ordering: significant first, then by effect size desc,
371
+ // then token asc for stable output.
372
+ stats.sort((a, b) => {
373
+ if (a.significant !== b.significant) return a.significant ? -1 : 1;
374
+ if (b.effect_size !== a.effect_size) return b.effect_size - a.effect_size;
375
+ return a.token < b.token ? -1 : a.token > b.token ? 1 : 0;
376
+ });
377
+ return { baseline, stats };
378
+ }
379
+
380
+ // ─── Suggestion formatting ──────────────────────────────────────────────────
381
+
382
+ function formatSuggestionsBlock(suggestions: TokenStat[], baseline: number): string {
383
+ const date = new Date().toISOString().slice(0, 10);
384
+ const lines: string[] = [`## Run ${date}`, ''];
385
+ for (const s of suggestions) {
386
+ const dir = s.confirmed_rate >= baseline ? 'more' : 'less';
387
+ const sign = s.confirmed_rate >= baseline ? '+' : '-';
388
+ lines.push(
389
+ `- Plans containing "${s.token}" have ${(s.confirmed_rate * 100).toFixed(0)}% confirmed ` +
390
+ `(baseline ${(baseline * 100).toFixed(0)}%, n=${s.n}, raw_p=${s.raw_p.toFixed(4)}, ` +
391
+ `fdr_q=${s.fdr_q.toFixed(4)}, effect_size=${sign}${s.effect_size.toFixed(2)}).`
392
+ );
393
+ lines.push(
394
+ ` Suggested heuristic: "Plans involving \`${s.token}\` succeed ${dir} often than baseline."`
395
+ );
396
+ lines.push(` Promote with: \`gd genome promote-suggestion ${s.token}-rate\``);
397
+ lines.push('');
398
+ }
399
+ return lines.join('\n');
400
+ }
401
+
402
+ // ─── CLI entry ─────────────────────────────────────────────────────────────
403
+
404
+ export function cmdPatterns(cwd: string, opts: PatternsOptions, raw: boolean): void {
405
+ const minOccurrences = opts.minOccurrences ?? 10;
406
+ const effectSize = opts.effectSize ?? 0.2;
407
+ const fdrQ = opts.fdrQ ?? 0.1;
408
+
409
+ const reflections = scanReflections(cwd);
410
+ const { baseline, stats } = computeTokenStats(reflections, {
411
+ minOccurrences,
412
+ effectSize,
413
+ fdrQ,
414
+ });
415
+ const suggestions = stats.filter((s) => s.significant);
416
+
417
+ let applied = false;
418
+ let suggestionsPath: string | null = null;
419
+
420
+ if (opts.apply) {
421
+ // never-auto-write: --apply requires explicit --yes confirmation.
422
+ if (!opts.yes) {
423
+ error('--apply requires --yes (writes to .planning/GENOME-SUGGESTIONS.md). Refusing.');
424
+ }
425
+ suggestionsPath = path.join(cwd, '.planning', 'GENOME-SUGGESTIONS.md');
426
+ if (suggestions.length > 0) {
427
+ const header = fileExists(suggestionsPath)
428
+ ? safeReadMarkdown(suggestionsPath) ?? ''
429
+ : '# GENOME suggestions (auto-generated — NOT read by the planner)\n\n' +
430
+ 'Deterministic pattern-extractor output. Promote an entry into the\n' +
431
+ 'prescriptive GENOME.md only via `gd genome promote-suggestion <slug>`\n' +
432
+ '(human-curated). The planner reads GENOME.md ONLY.\n\n';
433
+ const block = formatSuggestionsBlock(suggestions, baseline);
434
+ atomicWriteFileSync(suggestionsPath, `${header}${block}\n`);
435
+ applied = true;
436
+ }
437
+ }
438
+
439
+ const result: PatternsResult = {
440
+ reflections_scanned: reflections.length,
441
+ baseline_confirmed_rate: baseline,
442
+ tokens_tested: stats.length,
443
+ suggestions,
444
+ applied,
445
+ suggestions_path: applied ? path.relative(cwd, suggestionsPath as string) : null,
446
+ };
447
+
448
+ const rawSummary =
449
+ suggestions.length === 0
450
+ ? `no significant patterns (${reflections.length} reflections, ${stats.length} tokens tested)`
451
+ : `${suggestions.length} suggestion(s) from ${reflections.length} reflections` +
452
+ (applied ? ` → written to ${result.suggestions_path}` : ' (dry-run; --apply --yes to write)') +
453
+ '\n' +
454
+ formatSuggestionsBlock(suggestions, baseline);
455
+ output(result, raw, rawSummary);
456
+ }
457
+
458
+ module.exports = {
459
+ isConfirmed,
460
+ scanReflections,
461
+ binomTwoSidedP,
462
+ benjaminiHochberg,
463
+ computeTokenStats,
464
+ cmdPatterns,
465
+ };