@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
package/lib/drift.ts ADDED
@@ -0,0 +1,519 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * GRD project-drift score.
5
+ *
6
+ * Tier-2 #7 of the Ouroboros integration. The proposal required
7
+ * concrete data sources before shipping a weighted formula; this
8
+ * module supplies them:
9
+ *
10
+ * goal — ROADMAP.md phase Title+Description+Scope tokens
11
+ * vs SUMMARY.md ## Accomplishments tokens.
12
+ * Jaccard distance, mean over recent phases.
13
+ *
14
+ * constraint — Count of banned-phrasing occurrences (locked by
15
+ * tests/integration/verifier-evidence.test.ts) in
16
+ * recent {phase}-VERIFICATION.md and {phase}-SUMMARY.md
17
+ * files, normalised and clamped to [0, 1].
18
+ *
19
+ * ontology — Vocabulary Jaccard distance between recent phases'
20
+ * SUMMARY frontmatter (tech-stack.added,
21
+ * patterns-established) and the baseline first phases'.
22
+ *
23
+ * Weighted aggregate: 0.5·goal + 0.3·constraint + 0.2·ontology
24
+ * (matches Q00 / Ouroboros). Threshold default ≤ 0.3 = healthy.
25
+ *
26
+ * All three components are pure functions of files on disk — no LLM
27
+ * calls, no embeddings, no network. Insufficient data → score 0 with
28
+ * sufficient_data: false so callers can decide what to do.
29
+ */
30
+
31
+ import * as fs from 'fs';
32
+ import * as path from 'path';
33
+
34
+ const { planningDir: getPlanningDir }: { planningDir: (cwd: string) => string } = require('./paths');
35
+ const { safeReadFile }: { safeReadFile: (p: string) => string | null } = require('./utils');
36
+ const { extractFrontmatter }: { extractFrontmatter: (content: string) => Record<string, unknown> } =
37
+ require('./frontmatter');
38
+
39
+ // ─── Domain Types ──────────────────────────────────────────────────────────
40
+
41
+ export interface ComponentResult {
42
+ /** Drift score for this component, in [0, 1]. 0 = no drift. */
43
+ score: number;
44
+ /** True if there was enough data to compute a meaningful score. */
45
+ sufficient_data: boolean;
46
+ /** Human-readable reason when sufficient_data is false. */
47
+ reason?: string;
48
+ /** Component-specific structured detail for the caller to surface. */
49
+ detail?: Record<string, unknown>;
50
+ }
51
+
52
+ export interface DriftWeights {
53
+ goal: number;
54
+ constraint: number;
55
+ ontology: number;
56
+ }
57
+
58
+ export const DEFAULT_WEIGHTS: DriftWeights = { goal: 0.5, constraint: 0.3, ontology: 0.2 };
59
+
60
+ export interface DriftScore {
61
+ weighted: number;
62
+ threshold: number;
63
+ exceeded: boolean;
64
+ weights: DriftWeights;
65
+ goal: ComponentResult;
66
+ constraint: ComponentResult;
67
+ ontology: ComponentResult;
68
+ }
69
+
70
+ // ─── Tokenisation helpers ──────────────────────────────────────────────────
71
+
72
+ /** Tokenise a string into lowercase alphanumeric word tokens of length ≥ 3. */
73
+ function _tokens(text: string): Set<string> {
74
+ const set = new Set<string>();
75
+ const matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]{2,}/g);
76
+ if (!matches) return set;
77
+ for (const t of matches) {
78
+ if (_STOP_WORDS.has(t)) continue;
79
+ set.add(t);
80
+ }
81
+ return set;
82
+ }
83
+
84
+ const _STOP_WORDS: Set<string> = new Set([
85
+ 'the', 'and', 'for', 'with', 'from', 'into', 'over', 'this', 'that',
86
+ 'are', 'was', 'were', 'has', 'have', 'had', 'will', 'would', 'should',
87
+ 'phase', 'plan', 'summary', 'roadmap', 'task', 'goal',
88
+ ]);
89
+
90
+ /** Jaccard distance between two sets: 1 - |A∩B| / |A∪B|. 0 if both empty. */
91
+ function _jaccardDistance(a: Set<string>, b: Set<string>): number {
92
+ if (a.size === 0 && b.size === 0) return 0;
93
+ let intersection = 0;
94
+ for (const x of a) if (b.has(x)) intersection++;
95
+ const union = a.size + b.size - intersection;
96
+ return union === 0 ? 0 : 1 - intersection / union;
97
+ }
98
+
99
+ // ─── Phase enumeration ─────────────────────────────────────────────────────
100
+
101
+ interface PhaseInfo {
102
+ phase_number: string;
103
+ phase_dir: string;
104
+ }
105
+
106
+ /**
107
+ * List completed phase directories across all milestones, sorted by
108
+ * the leading numeric prefix (componentwise — `01.10` > `01.9`). A
109
+ * phase is "completed" when it has at least one *-SUMMARY.md file.
110
+ */
111
+ function _listCompletedPhases(cwd: string): PhaseInfo[] {
112
+ const planning = getPlanningDir(cwd);
113
+ const milestones = path.join(planning, 'milestones');
114
+ if (!fs.existsSync(milestones)) return [];
115
+
116
+ const found: PhaseInfo[] = [];
117
+ for (const ms of fs.readdirSync(milestones, { withFileTypes: true })) {
118
+ if (!ms.isDirectory()) continue;
119
+ const phasesDir = path.join(milestones, ms.name, 'phases');
120
+ if (!fs.existsSync(phasesDir)) continue;
121
+ for (const ph of fs.readdirSync(phasesDir, { withFileTypes: true })) {
122
+ if (!ph.isDirectory()) continue;
123
+ const m = ph.name.match(/^(\d+(?:\.\d+)?)/);
124
+ if (!m) continue;
125
+ const phaseDir = path.join(phasesDir, ph.name);
126
+ const hasSummary = fs
127
+ .readdirSync(phaseDir)
128
+ .some((f) => /-SUMMARY\.md$/i.test(f) || f === 'SUMMARY.md');
129
+ if (!hasSummary) continue;
130
+ found.push({ phase_number: m[1], phase_dir: phaseDir });
131
+ }
132
+ }
133
+ found.sort((a, b) => _comparePhaseIds(a.phase_number, b.phase_number));
134
+ return found;
135
+ }
136
+
137
+ /** Componentwise phase-id comparison (matches lib/context/execute.ts). */
138
+ function _comparePhaseIds(a: string, b: string): number {
139
+ const pa = a.split('.').map((p) => parseInt(p, 10));
140
+ const pb = b.split('.').map((p) => parseInt(p, 10));
141
+ const n = Math.max(pa.length, pb.length);
142
+ for (let i = 0; i < n; i++) {
143
+ const ai = pa[i] ?? 0;
144
+ const bi = pb[i] ?? 0;
145
+ if (ai !== bi) return ai - bi;
146
+ }
147
+ return 0;
148
+ }
149
+
150
+ // ─── Goal drift ────────────────────────────────────────────────────────────
151
+
152
+ /**
153
+ * Extract the {Title, Scope items, Description} text for a given phase
154
+ * from ROADMAP.md. Returns null if the phase block cannot be found.
155
+ *
156
+ * Heading levels: GRD ROADMAPs use `## Phase` (flat), `### Phase`
157
+ * (milestone-grouped), or `#### Phase` (milestone-grouped under an H3
158
+ * version heading). All three forms are accepted. codex r3 P2: prior
159
+ * regex only matched `### Phase`, missing real ROADMAPs with `#### Phase`.
160
+ */
161
+ function _extractRoadmapGoal(roadmap: string, phaseNumber: string): string | null {
162
+ // codex r3 P2 on PR #41 (applied here for consistency): accept padded
163
+ // decimal phase IDs in ROADMAP headings (`Phase 06.1` vs `Phase 6.1`).
164
+ const trim = phaseNumber.replace(/^0+/, '') || '0';
165
+ const numberPattern = trim
166
+ .split('.')
167
+ .map((p) => `0*${p.replace(/^0+/, '') || '0'}`)
168
+ .join('\\.');
169
+ // Note: no `m` flag — `$` must mean end-of-input, not end-of-line, so
170
+ // the body capture extends to the next heading or EOF (not the very
171
+ // first newline). The `\n` literals in the body and the stop lookahead
172
+ // already provide the boundary semantics we need.
173
+ const re = new RegExp(
174
+ `(#{2,4})\\s+Phase ${numberPattern}:[^\\n]*\\n([\\s\\S]*?)(?=\\n#{2,4}\\s+Phase\\s|\\n##[^#]|$)`,
175
+ 'i'
176
+ );
177
+ const m = roadmap.match(re);
178
+ if (!m) return null;
179
+ return m[0]; // heading + body together
180
+ }
181
+
182
+ /** Extract the `## Accomplishments` section body from a SUMMARY.md. */
183
+ function _extractSummaryAccomplishments(summary: string): string | null {
184
+ const m = summary.match(/##\s+Accomplishments\s*\n([\s\S]*?)(?=\n##\s|$)/i);
185
+ return m ? m[1] : null;
186
+ }
187
+
188
+ function computeGoalDrift(cwd: string, recentK = 3): ComponentResult {
189
+ const planning = getPlanningDir(cwd);
190
+ const roadmap = safeReadFile(path.join(planning, 'ROADMAP.md'));
191
+ if (!roadmap) {
192
+ return { score: 0, sufficient_data: false, reason: 'ROADMAP.md not found' };
193
+ }
194
+ const completed = _listCompletedPhases(cwd);
195
+ const recent = completed.slice(-recentK);
196
+ if (recent.length === 0) {
197
+ return { score: 0, sufficient_data: false, reason: 'No completed phases' };
198
+ }
199
+
200
+ const perPhase: Array<{ phase: string; distance: number; comparable: boolean }> = [];
201
+ for (const phase of recent) {
202
+ const goalText = _extractRoadmapGoal(roadmap, phase.phase_number);
203
+ // Aggregate accomplishments from ALL SUMMARY.md files in the phase
204
+ // dir — phases routinely have multiple plans (e.g. 01-01-SUMMARY.md,
205
+ // 01-02-SUMMARY.md). codex r2 P2: prior code used .find() and read
206
+ // only one arbitrary summary.
207
+ const summaryFiles = fs
208
+ .readdirSync(phase.phase_dir)
209
+ .filter((f) => /-SUMMARY\.md$/i.test(f) || f === 'SUMMARY.md');
210
+ const accomplishmentChunks: string[] = [];
211
+ for (const sf of summaryFiles) {
212
+ const c = safeReadFile(path.join(phase.phase_dir, sf));
213
+ if (!c) continue;
214
+ const a = _extractSummaryAccomplishments(c);
215
+ if (a) accomplishmentChunks.push(a);
216
+ }
217
+ if (!goalText || accomplishmentChunks.length === 0) {
218
+ perPhase.push({ phase: phase.phase_number, distance: 0, comparable: false });
219
+ continue;
220
+ }
221
+ const distance = _jaccardDistance(_tokens(goalText), _tokens(accomplishmentChunks.join('\n')));
222
+ perPhase.push({ phase: phase.phase_number, distance, comparable: true });
223
+ }
224
+
225
+ const comparable = perPhase.filter((p) => p.comparable);
226
+ if (comparable.length === 0) {
227
+ return {
228
+ score: 0,
229
+ sufficient_data: false,
230
+ reason: 'No phase has both ROADMAP goal block and SUMMARY ## Accomplishments',
231
+ detail: { per_phase: perPhase },
232
+ };
233
+ }
234
+ const score = comparable.reduce((s, p) => s + p.distance, 0) / comparable.length;
235
+ return {
236
+ score,
237
+ sufficient_data: true,
238
+ detail: { per_phase: perPhase, recent_k: recentK },
239
+ };
240
+ }
241
+
242
+ // ─── Constraint drift ──────────────────────────────────────────────────────
243
+
244
+ /**
245
+ * Banned phrasings from the Evidence Standard (locked by
246
+ * tests/integration/verifier-evidence.test.ts). Each occurrence in a
247
+ * recent VERIFICATION.md or SUMMARY.md counts as one constraint violation.
248
+ */
249
+ const _BANNED_PHRASINGS: readonly RegExp[] = [
250
+ /\blooks good\b/i,
251
+ /\bseems fine\b/i,
252
+ /\blooks correct\b/i,
253
+ /\bappears to work\b/i,
254
+ /\bshould work\b/i,
255
+ /\bI verified this\b/i,
256
+ ];
257
+
258
+ function computeConstraintDrift(cwd: string, recentK = 3): ComponentResult {
259
+ const completed = _listCompletedPhases(cwd);
260
+ const recent = completed.slice(-recentK);
261
+ if (recent.length === 0) {
262
+ return { score: 0, sufficient_data: false, reason: 'No completed phases' };
263
+ }
264
+
265
+ let violations = 0;
266
+ let opportunities = 0;
267
+ const perPhase: Array<{ phase: string; violations: number; files_scanned: number }> = [];
268
+ for (const phase of recent) {
269
+ const files = fs
270
+ .readdirSync(phase.phase_dir)
271
+ .filter(
272
+ (f) =>
273
+ /-VERIFICATION\.md$/i.test(f) ||
274
+ f === 'VERIFICATION.md' ||
275
+ /-SUMMARY\.md$/i.test(f) ||
276
+ f === 'SUMMARY.md'
277
+ );
278
+ let phaseViolations = 0;
279
+ for (const f of files) {
280
+ const content = safeReadFile(path.join(phase.phase_dir, f)) ?? '';
281
+ for (const re of _BANNED_PHRASINGS) {
282
+ const matches = content.match(new RegExp(re.source, re.flags + 'g'));
283
+ if (matches) phaseViolations += matches.length;
284
+ }
285
+ }
286
+ perPhase.push({ phase: phase.phase_number, violations: phaseViolations, files_scanned: files.length });
287
+ violations += phaseViolations;
288
+ // Each phase × each rule is an opportunity to violate.
289
+ opportunities += _BANNED_PHRASINGS.length;
290
+ }
291
+
292
+ if (opportunities === 0) {
293
+ return { score: 0, sufficient_data: false, reason: 'No verifiable phase artifacts' };
294
+ }
295
+ // Clamp to [0, 1]. A single phase with N rule-violations contributes
296
+ // N/RULES to its slot, capped so a degenerate file cannot dominate.
297
+ const raw = violations / opportunities;
298
+ const score = Math.min(1, raw);
299
+ return {
300
+ score,
301
+ sufficient_data: true,
302
+ detail: { per_phase: perPhase, violations, opportunities, recent_k: recentK },
303
+ };
304
+ }
305
+
306
+ // ─── Ontology drift ────────────────────────────────────────────────────────
307
+
308
+ /**
309
+ * Extract the vocabulary set for one phase from its SUMMARY.md
310
+ * frontmatter via the shared extractFrontmatter parser. Supports the
311
+ * three shapes seen in the wild:
312
+ *
313
+ * tech_stack: (canonical — used by recent planner output)
314
+ * added: [...]
315
+ * patterns: [...]
316
+ * tech-stack: (legacy / test fixtures — hyphenated)
317
+ * added: [...]
318
+ * patterns: [...]
319
+ * tech-stack: (older fixtures — `patterns-established` instead of `patterns`)
320
+ * added: [...]
321
+ * patterns-established: [...]
322
+ *
323
+ * Block-list and inline-list forms are both handled by extractFrontmatter.
324
+ * codex r2 P2: prior regex-only extractor missed `tech_stack` and
325
+ * block-list shapes entirely, producing false high drift.
326
+ */
327
+ function _extractPhaseVocab(summaryContent: string): Set<string> {
328
+ const vocab = new Set<string>();
329
+ const fm = extractFrontmatter(summaryContent);
330
+
331
+ // Source 1: nested tech_stack / tech-stack section
332
+ const sections: unknown[] = [fm['tech_stack'], fm['tech-stack']];
333
+ for (const sec of sections) {
334
+ if (!sec || typeof sec !== 'object') continue;
335
+ const obj = sec as Record<string, unknown>;
336
+ for (const fieldName of ['added', 'patterns', 'patterns-established', 'patterns_established']) {
337
+ const arr = obj[fieldName];
338
+ if (!Array.isArray(arr)) continue;
339
+ for (const item of arr) {
340
+ if (typeof item !== 'string') continue;
341
+ const v = item.trim();
342
+ if (v) vocab.add(v.toLowerCase());
343
+ }
344
+ }
345
+ }
346
+
347
+ // Source 2: top-level patterns-established (real GRD summaries shape).
348
+ // codex r3 P2: previously ignored, which dropped a documented data
349
+ // source. Also accept the underscore variant for symmetry.
350
+ for (const topKey of ['patterns-established', 'patterns_established']) {
351
+ const arr = fm[topKey];
352
+ if (!Array.isArray(arr)) continue;
353
+ for (const item of arr) {
354
+ if (typeof item !== 'string') continue;
355
+ const v = item.trim();
356
+ if (v) vocab.add(v.toLowerCase());
357
+ }
358
+ }
359
+
360
+ return vocab;
361
+ }
362
+
363
+ function computeOntologyDrift(cwd: string, recentK = 3, baselineK = 3): ComponentResult {
364
+ const completed = _listCompletedPhases(cwd);
365
+ if (completed.length < 2) {
366
+ return {
367
+ score: 0,
368
+ sufficient_data: false,
369
+ reason: `Need at least 2 completed phases for ontology drift (have ${completed.length})`,
370
+ };
371
+ }
372
+
373
+ // baseline = first baselineK phases; recent = last recentK phases.
374
+ // If the project has only a handful of phases, baseline and recent may
375
+ // overlap — that is acceptable: the score just trends toward 0.
376
+ const baselinePhases = completed.slice(0, baselineK);
377
+ const recentPhases = completed.slice(-recentK);
378
+
379
+ // Aggregate vocab across ALL SUMMARY.md files in each phase (a phase
380
+ // can have multiple plans). codex r2 P2: prior code used .find() and
381
+ // sampled only one summary, making the score sensitive to filesystem
382
+ // order rather than the whole phase output.
383
+ const collectVocab = (phases: PhaseInfo[]): Set<string> => {
384
+ const v = new Set<string>();
385
+ for (const p of phases) {
386
+ const summaryFiles = fs
387
+ .readdirSync(p.phase_dir)
388
+ .filter((f) => /-SUMMARY\.md$/i.test(f) || f === 'SUMMARY.md');
389
+ for (const sf of summaryFiles) {
390
+ const content = safeReadFile(path.join(p.phase_dir, sf));
391
+ if (!content) continue;
392
+ for (const term of _extractPhaseVocab(content)) v.add(term);
393
+ }
394
+ }
395
+ return v;
396
+ };
397
+
398
+ const baselineVocab = collectVocab(baselinePhases);
399
+ const recentVocab = collectVocab(recentPhases);
400
+ if (baselineVocab.size === 0 || recentVocab.size === 0) {
401
+ return {
402
+ score: 0,
403
+ sufficient_data: false,
404
+ reason: 'No tech-stack/patterns-established vocab extractable from SUMMARYs',
405
+ detail: { baseline_size: baselineVocab.size, recent_size: recentVocab.size },
406
+ };
407
+ }
408
+ let intersection = 0;
409
+ for (const t of recentVocab) if (baselineVocab.has(t)) intersection++;
410
+ const union = baselineVocab.size + recentVocab.size - intersection;
411
+ const score = union === 0 ? 0 : 1 - intersection / union;
412
+ return {
413
+ score,
414
+ sufficient_data: true,
415
+ detail: {
416
+ baseline_size: baselineVocab.size,
417
+ recent_size: recentVocab.size,
418
+ intersection,
419
+ union,
420
+ recent_k: recentK,
421
+ baseline_k: baselineK,
422
+ },
423
+ };
424
+ }
425
+
426
+ // ─── Convergence check ─────────────────────────────────────────────────────
427
+
428
+ export interface ConvergenceResult {
429
+ /** True if baseline/recent vocab are similar enough to declare convergence. */
430
+ converged: boolean;
431
+ /** Similarity = 1 - ontology_drift. Present when converged === true. */
432
+ similarity?: number;
433
+ /** Threshold used. */
434
+ threshold: number;
435
+ /** Why convergence was not declared, when converged === false. */
436
+ reason?: string;
437
+ }
438
+
439
+ /**
440
+ * Check whether ontology has converged: similarity (1 - drift) >= threshold,
441
+ * AND the baseline/recent windows are NON-OVERLAPPING (so similarity is a
442
+ * real measurement, not the trivial "same set" 1.0). Used by autopilot's
443
+ * opt-in termination criterion (Tier-3 #10 of the Ouroboros integration).
444
+ *
445
+ * codex r1 P2 on PR #40: prior wiring used computeOntologyDrift directly,
446
+ * which reports sufficient_data with only 2 completed phases. With default
447
+ * K=3 baseline + K=3 recent, the windows overlap entirely for any project
448
+ * with <= 3 completed phases, producing similarity 1.0 regardless of actual
449
+ * vocab change. This helper requires `completed_phases >= 2 * recentK`
450
+ * (default 6) before declaring convergence.
451
+ */
452
+ function isOntologyConverged(
453
+ cwd: string,
454
+ threshold = 0.95,
455
+ recentK = 3
456
+ ): ConvergenceResult {
457
+ const completed = _listCompletedPhases(cwd);
458
+ if (completed.length < 2 * recentK) {
459
+ return {
460
+ converged: false,
461
+ threshold,
462
+ reason: `Need >= ${2 * recentK} completed phases for non-overlapping ontology windows (have ${completed.length})`,
463
+ };
464
+ }
465
+ const drift = computeOntologyDrift(cwd, recentK, recentK);
466
+ if (!drift.sufficient_data) {
467
+ return { converged: false, threshold, reason: drift.reason ?? 'insufficient drift data' };
468
+ }
469
+ const similarity = 1 - drift.score;
470
+ if (similarity < threshold) {
471
+ return {
472
+ converged: false,
473
+ threshold,
474
+ reason: `similarity ${similarity.toFixed(3)} < ${threshold}`,
475
+ };
476
+ }
477
+ return { converged: true, similarity, threshold };
478
+ }
479
+
480
+ // ─── Aggregator ────────────────────────────────────────────────────────────
481
+
482
+ /**
483
+ * Compute the weighted drift score. Each component is computed
484
+ * independently; if a component reports sufficient_data: false, its
485
+ * score contributes 0 to the weighted aggregate (so the absence of
486
+ * data is treated as "no drift", not "max drift").
487
+ */
488
+ function computeDriftScore(
489
+ cwd: string,
490
+ weights: DriftWeights = DEFAULT_WEIGHTS,
491
+ threshold = 0.3,
492
+ recentK = 3
493
+ ): DriftScore {
494
+ const goal = computeGoalDrift(cwd, recentK);
495
+ const constraint = computeConstraintDrift(cwd, recentK);
496
+ const ontology = computeOntologyDrift(cwd, recentK);
497
+ const weighted =
498
+ weights.goal * goal.score +
499
+ weights.constraint * constraint.score +
500
+ weights.ontology * ontology.score;
501
+ return {
502
+ weighted,
503
+ threshold,
504
+ exceeded: weighted > threshold,
505
+ weights,
506
+ goal,
507
+ constraint,
508
+ ontology,
509
+ };
510
+ }
511
+
512
+ module.exports = {
513
+ computeGoalDrift,
514
+ computeConstraintDrift,
515
+ computeOntologyDrift,
516
+ computeDriftScore,
517
+ isOntologyConverged,
518
+ DEFAULT_WEIGHTS,
519
+ };