@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,283 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectMetrics = collectMetrics;
4
+ exports.detectMinima = detectMinima;
5
+ exports.checkConvergence = checkConvergence;
6
+ exports.classifyBranch = classifyBranch;
7
+ exports.buildCritiquePrompt = buildCritiquePrompt;
8
+ /**
9
+ * Collect quantitative metrics from npm test, tsc, and eslint output.
10
+ *
11
+ * @param testOutput - Raw stdout from `npm test` (Jest output with coverage table)
12
+ * @param tscOutput - Raw stdout/stderr from `tsc --noEmit`
13
+ * @param lintOutput - Raw stdout from `eslint`
14
+ * @returns RefinementMetrics with current ISO timestamp
15
+ */
16
+ function collectMetrics(testOutput, tscOutput, lintOutput) {
17
+ // Parse test coverage from Jest output: look for "All files" line
18
+ // Jest coverage table format: | All files | XX.XX | XX.XX | XX.XX | ...
19
+ let test_coverage_pct = 0;
20
+ // Jest coverage table "All files" row has 5 columns: File | Stmts | Branch | Funcs | Lines
21
+ // We want the Lines column (4th numeric value after "All files |")
22
+ const coverageLineMatch = testOutput.match(/All files\s*\|\s*([\d.]+)\s*\|\s*([\d.]+)\s*\|\s*([\d.]+)\s*\|\s*([\d.]+)\s*\|/);
23
+ if (coverageLineMatch) {
24
+ // Group 4 = Lines coverage
25
+ test_coverage_pct = parseFloat(coverageLineMatch[4]) || 0;
26
+ }
27
+ else {
28
+ // Fallback: look for "Statements" or "Lines" percentage on a summary line
29
+ const statementsMatch = testOutput.match(/Statements\s*:\s*([\d.]+)%/);
30
+ if (statementsMatch) {
31
+ test_coverage_pct = parseFloat(statementsMatch[1]) || 0;
32
+ }
33
+ else {
34
+ // Try "Lines" percentage
35
+ const linesMatch = testOutput.match(/Lines\s*:\s*([\d.]+)%/);
36
+ if (linesMatch) {
37
+ test_coverage_pct = parseFloat(linesMatch[1]) || 0;
38
+ }
39
+ }
40
+ }
41
+ // Parse type error count from tsc output: count lines matching /error TS\d+/
42
+ const tscErrorMatches = tscOutput.match(/error TS\d+/g);
43
+ const type_error_count = tscErrorMatches ? tscErrorMatches.length : 0;
44
+ // Parse lint violation count from eslint output.
45
+ // Strategy: count individual violation lines AND check the "N problems" summary.
46
+ // Take max of both to handle cases where the summary underreports or is absent.
47
+ // Count individual error/warning lines (indented lines with rule names)
48
+ const violationLines = lintOutput
49
+ .split('\n')
50
+ .filter((line) => /^\s+\d+:\d+\s+(error|warning)\s+/.test(line));
51
+ const individualCount = violationLines.length;
52
+ // Check for summary line "N problems"
53
+ const problemsMatch = lintOutput.match(/(\d+)\s+problems?/);
54
+ const summaryCount = problemsMatch ? (parseInt(problemsMatch[1], 10) || 0) : 0;
55
+ const lint_violation_count = Math.max(individualCount, summaryCount);
56
+ return {
57
+ test_coverage_pct,
58
+ type_error_count,
59
+ lint_violation_count,
60
+ timestamp: new Date().toISOString(),
61
+ };
62
+ }
63
+ /**
64
+ * Detect metric-minima regions from a time series of MetricSnapshot objects.
65
+ *
66
+ * For test_coverage_pct: finds local minima (dips where coverage < both neighbors).
67
+ * For type_error_count and lint_violation_count: finds local maxima (spikes where
68
+ * count > both neighbors).
69
+ *
70
+ * Adapted from NERFIFY PSNR-minima ROI analysis.
71
+ *
72
+ * @param snapshots - Ordered array of metric snapshots
73
+ * @returns Array of MinimaRegion objects sorted by |delta| descending
74
+ */
75
+ function detectMinima(snapshots) {
76
+ // Need at least 3 snapshots to detect local minima/maxima (requires both neighbors)
77
+ if (snapshots.length < 3)
78
+ return [];
79
+ const regions = [];
80
+ for (let i = 1; i < snapshots.length - 1; i++) {
81
+ const prev = snapshots[i - 1].metrics;
82
+ const curr = snapshots[i].metrics;
83
+ const next = snapshots[i + 1].metrics;
84
+ // Coverage: find local minima (dips)
85
+ if (curr.test_coverage_pct < prev.test_coverage_pct && curr.test_coverage_pct < next.test_coverage_pct) {
86
+ const neighborAvg = (prev.test_coverage_pct + next.test_coverage_pct) / 2;
87
+ const delta = Math.abs(neighborAvg - curr.test_coverage_pct);
88
+ regions.push({
89
+ dimension: 'test_coverage_pct',
90
+ index: i,
91
+ value: curr.test_coverage_pct,
92
+ delta,
93
+ });
94
+ }
95
+ // Type errors: find local maxima (spikes)
96
+ if (curr.type_error_count > prev.type_error_count && curr.type_error_count > next.type_error_count) {
97
+ const neighborAvg = (prev.type_error_count + next.type_error_count) / 2;
98
+ const delta = Math.abs(curr.type_error_count - neighborAvg);
99
+ regions.push({
100
+ dimension: 'type_error_count',
101
+ index: i,
102
+ value: curr.type_error_count,
103
+ delta,
104
+ });
105
+ }
106
+ // Lint violations: find local maxima (spikes)
107
+ if (curr.lint_violation_count > prev.lint_violation_count && curr.lint_violation_count > next.lint_violation_count) {
108
+ const neighborAvg = (prev.lint_violation_count + next.lint_violation_count) / 2;
109
+ const delta = Math.abs(curr.lint_violation_count - neighborAvg);
110
+ regions.push({
111
+ dimension: 'lint_violation_count',
112
+ index: i,
113
+ value: curr.lint_violation_count,
114
+ delta,
115
+ });
116
+ }
117
+ }
118
+ // Sort by absolute delta descending (worst regions first)
119
+ return regions.sort((a, b) => b.delta - a.delta);
120
+ }
121
+ /**
122
+ * Check whether metrics have converged (stopped improving meaningfully).
123
+ *
124
+ * @param snapshots - Ordered array of metric snapshots (newest last)
125
+ * @param config - Convergence thresholds and max iteration cap
126
+ * @returns { converged: boolean, reason: string }
127
+ */
128
+ function checkConvergence(snapshots, config) {
129
+ if (snapshots.length < 2) {
130
+ return { converged: false, reason: 'insufficient data' };
131
+ }
132
+ if (snapshots.length >= config.max_iterations) {
133
+ return { converged: true, reason: 'max iterations reached' };
134
+ }
135
+ const last = snapshots[snapshots.length - 1].metrics;
136
+ const prev = snapshots[snapshots.length - 2].metrics;
137
+ // Codex r43 P1 #3: detect the "no real progress" sentinel — when both
138
+ // snapshots report all zeros, the measurement path is almost
139
+ // certainly broken (e.g. jest/tsc/eslint never ran, or stdout was
140
+ // discarded). Don't celebrate this as convergence.
141
+ const lastAllZero = last.test_coverage_pct === 0 &&
142
+ last.type_error_count === 0 &&
143
+ last.lint_violation_count === 0;
144
+ const prevAllZero = prev.test_coverage_pct === 0 &&
145
+ prev.type_error_count === 0 &&
146
+ prev.lint_violation_count === 0;
147
+ if (lastAllZero && prevAllZero) {
148
+ return {
149
+ converged: false,
150
+ reason: 'no progress (all metrics zero — measurement path likely broken)',
151
+ };
152
+ }
153
+ const deltaCoverage = Math.abs(last.test_coverage_pct - prev.test_coverage_pct);
154
+ const deltaTypeErrors = Math.abs(last.type_error_count - prev.type_error_count);
155
+ const deltaLint = Math.abs(last.lint_violation_count - prev.lint_violation_count);
156
+ const coverageConverged = deltaCoverage < config.epsilon_coverage;
157
+ const typeErrorsConverged = deltaTypeErrors < config.epsilon_type_errors;
158
+ const lintConverged = deltaLint < config.epsilon_lint;
159
+ if (coverageConverged && typeErrorsConverged && lintConverged) {
160
+ return { converged: true, reason: 'all dimensions within epsilon' };
161
+ }
162
+ const stillChanging = [];
163
+ if (!coverageConverged) {
164
+ stillChanging.push(`coverage (delta=${deltaCoverage.toFixed(2)}, epsilon=${config.epsilon_coverage})`);
165
+ }
166
+ if (!typeErrorsConverged) {
167
+ stillChanging.push(`type_errors (delta=${deltaTypeErrors}, epsilon=${config.epsilon_type_errors})`);
168
+ }
169
+ if (!lintConverged) {
170
+ stillChanging.push(`lint (delta=${deltaLint}, epsilon=${config.epsilon_lint})`);
171
+ }
172
+ return {
173
+ converged: false,
174
+ reason: `still changing: ${stillChanging.join(', ')}`,
175
+ };
176
+ }
177
+ /**
178
+ * Classify which refinement branch should handle the current metric state.
179
+ *
180
+ * Computes normalized gap for each dimension and routes to the branch
181
+ * with the largest gap to target:
182
+ * - 'macro': coverage gap is largest (metric-minima guided patching)
183
+ * - 'geometry': type error gap is largest (structural validation)
184
+ * - 'generative': lint gap is largest (artifact analysis)
185
+ *
186
+ * @param current - Current metric snapshot
187
+ * @param targets - Target metrics to reach
188
+ * @returns The CritiqueBranch that should handle refinement
189
+ */
190
+ function classifyBranch(current, targets) {
191
+ // Normalized gap for coverage: (target - current) / target; higher = worse (lower coverage)
192
+ const coverageTarget = targets.test_coverage_pct;
193
+ const coverageGap = coverageTarget > 0
194
+ ? Math.max(0, (coverageTarget - current.test_coverage_pct) / coverageTarget)
195
+ : 0;
196
+ // Normalized gap for type errors: (current - target) / max(current, 1); higher = worse (more errors)
197
+ const typeErrorsGap = current.type_error_count > 0
198
+ ? (current.type_error_count - targets.type_error_count) / Math.max(current.type_error_count, 1)
199
+ : 0;
200
+ // Normalized gap for lint: (current - target) / max(current, 1); higher = worse (more violations)
201
+ const lintGap = current.lint_violation_count > 0
202
+ ? (current.lint_violation_count - targets.lint_violation_count) / Math.max(current.lint_violation_count, 1)
203
+ : 0;
204
+ // Tie-break order: macro > geometry > generative
205
+ if (coverageGap >= typeErrorsGap && coverageGap >= lintGap) {
206
+ return 'macro';
207
+ }
208
+ if (typeErrorsGap >= lintGap) {
209
+ return 'geometry';
210
+ }
211
+ return 'generative';
212
+ }
213
+ /**
214
+ * Build a structured critique prompt for the refinement agent.
215
+ *
216
+ * @param branch - Which critique branch this prompt is for
217
+ * @param metrics - Current metrics
218
+ * @param targets - Target metrics
219
+ * @param minimaRegions - Top minima regions to surface in the prompt
220
+ * @returns Formatted prompt string for the critique agent
221
+ */
222
+ function buildCritiquePrompt(branch, metrics, targets, minimaRegions) {
223
+ const topRegions = minimaRegions.slice(0, 3);
224
+ const regionsText = topRegions.length > 0
225
+ ? topRegions
226
+ .map((r, i) => ` ${i + 1}. ${r.dimension} at index ${r.index}: value=${r.value}, delta=${r.delta.toFixed(2)}`)
227
+ .join('\n')
228
+ : ' (none detected — first iteration or insufficient history)';
229
+ const branchInstructions = {
230
+ macro: `Focus on coverage recovery:
231
+ - Identify files with the lowest test coverage
232
+ - Add test cases for uncovered branches and lines
233
+ - Prioritize files that appear in minima regions (coverage dips)
234
+ - High-ROI targets: frequently modified files with low coverage`,
235
+ geometry: `Focus on type error resolution:
236
+ - Parse tsc error output and categorize errors by type
237
+ - Fix errors starting from leaf modules (no dependents) toward root
238
+ - Check export consistency: every module.exports key has a matching function/const
239
+ - Verify import chains are correct`,
240
+ generative: `Focus on lint pattern analysis:
241
+ - Cluster ESLint violations by rule
242
+ - Fix violations by cluster (all no-unused-vars together, all no-explicit-any together)
243
+ - Identify code patterns generating violations and refactor the pattern
244
+ - Never disable ESLint rules — fix the code`,
245
+ };
246
+ return `CRITIQUE BRANCH: ${branch.toUpperCase()}
247
+
248
+ ## Current Metrics
249
+
250
+ - test_coverage_pct: ${metrics.test_coverage_pct.toFixed(2)}%
251
+ - type_error_count: ${metrics.type_error_count}
252
+ - lint_violation_count: ${metrics.lint_violation_count}
253
+ - collected_at: ${metrics.timestamp}
254
+
255
+ ## Target Metrics
256
+
257
+ - test_coverage_pct: ${targets.test_coverage_pct.toFixed(2)}%
258
+ - type_error_count: ${targets.type_error_count}
259
+ - lint_violation_count: ${targets.lint_violation_count}
260
+
261
+ ## Top Minima Regions
262
+
263
+ ${regionsText}
264
+
265
+ ## Branch Instructions
266
+
267
+ ${branchInstructions[branch]}
268
+
269
+ ## Constraints
270
+
271
+ - Modify at most 5 files per iteration
272
+ - Run npm run build:check after every change to avoid regression
273
+ - Never lower coverage thresholds in jest.config.js
274
+ - Never disable ESLint rules`;
275
+ }
276
+ module.exports = {
277
+ collectMetrics,
278
+ detectMinima,
279
+ checkConvergence,
280
+ classifyBranch,
281
+ buildCritiquePrompt,
282
+ };
283
+ //# sourceMappingURL=refinement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refinement.js","sourceRoot":"","sources":["../../lib/refinement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../lib/requirements.ts"],"names":[],"mappings":""}
@@ -0,0 +1,355 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { safeReadFile, output, error } = require('./utils');
6
+ const { milestonesDir: getMilestonesDirPath } = require('./paths');
7
+ // Module-level cache for REQUIREMENTS.md reads across command calls.
8
+ // Prevents redundant disk reads when multiple requirement commands access the same file in one process.
9
+ const _reqContentCache = new Map();
10
+ /**
11
+ * Read REQUIREMENTS.md with per-process caching.
12
+ */
13
+ function readCachedRequirements(reqFilePath) {
14
+ if (!_reqContentCache.has(reqFilePath)) {
15
+ const content = safeReadFile(reqFilePath);
16
+ if (content !== null)
17
+ _reqContentCache.set(reqFilePath, content);
18
+ return content;
19
+ }
20
+ return _reqContentCache.get(reqFilePath);
21
+ }
22
+ /**
23
+ * Parse requirements from REQUIREMENTS.md content into structured array.
24
+ */
25
+ function parseRequirements(content) {
26
+ if (!content)
27
+ return [];
28
+ const requirements = [];
29
+ // Split by ### REQ- headings
30
+ const parts = content.split(/(?=^### REQ-)/m);
31
+ for (const part of parts) {
32
+ const headingMatch = part.match(/^### (REQ-\d+):\s*(.+)/m);
33
+ if (!headingMatch)
34
+ continue;
35
+ const id = headingMatch[1];
36
+ const title = headingMatch[2].trim();
37
+ const priorityMatch = part.match(/\*\*Priority:\*\*\s*(\S+)/);
38
+ const categoryMatch = part.match(/\*\*Category:\*\*\s*(.+)/);
39
+ const deferredMatch = part.match(/\*\*Deferred from:\*\*\s*(.+)/);
40
+ const resolvesMatch = part.match(/\*\*Resolves:\*\*\s*(.+)/);
41
+ // Description: everything after the metadata lines, stop at next section heading or separator
42
+ const lines = part.split('\n');
43
+ const descLines = [];
44
+ let pastHeading = false;
45
+ for (const line of lines) {
46
+ if (/^### REQ-/.test(line)) {
47
+ pastHeading = true;
48
+ continue;
49
+ }
50
+ if (!pastHeading)
51
+ continue;
52
+ if (/^\*\*(Priority|Category|Deferred from|Resolves):\*\*/.test(line))
53
+ continue;
54
+ // Stop at next section heading or separator
55
+ if (/^##\s/.test(line) || /^---\s*$/.test(line))
56
+ break;
57
+ descLines.push(line);
58
+ }
59
+ const description = descLines.join('\n').trim();
60
+ requirements.push({
61
+ id,
62
+ title,
63
+ priority: priorityMatch ? priorityMatch[1].trim() : null,
64
+ category: categoryMatch ? categoryMatch[1].trim() : null,
65
+ deferred_from: deferredMatch ? deferredMatch[1].trim() : null,
66
+ resolves: resolvesMatch ? resolvesMatch[1].trim() : null,
67
+ description: description || null,
68
+ });
69
+ }
70
+ return requirements;
71
+ }
72
+ /**
73
+ * Parse the Traceability Matrix table from REQUIREMENTS.md content.
74
+ */
75
+ function parseTraceabilityMatrix(content) {
76
+ if (!content)
77
+ return [];
78
+ const matrix = [];
79
+ // Find section starting with ## Traceability Matrix
80
+ const sectionMatch = content.match(/##\s*Traceability Matrix\s*\n([\s\S]*?)(?=\n---|\n##|$)/i);
81
+ if (!sectionMatch)
82
+ return [];
83
+ const tableContent = sectionMatch[1];
84
+ const rows = tableContent.split('\n').filter((r) => r.startsWith('|'));
85
+ // Skip header row and separator row
86
+ const dataRows = rows.filter((r) => !r.match(/^\|\s*REQ\s*\|/i) && !r.match(/^\|[\s-]+\|/));
87
+ for (const row of dataRows) {
88
+ const cells = row
89
+ .split('|')
90
+ .map((c) => c.trim())
91
+ .filter(Boolean);
92
+ if (cells.length >= 5) {
93
+ matrix.push({
94
+ req: cells[0],
95
+ feature: cells[1],
96
+ priority: cells[2],
97
+ phase: cells[3],
98
+ status: cells[4],
99
+ });
100
+ }
101
+ }
102
+ return matrix;
103
+ }
104
+ /**
105
+ * CLI command: Look up a single requirement by ID, returning structured JSON.
106
+ * Falls back to archived milestone REQUIREMENTS.md files if not in current file.
107
+ */
108
+ function cmdRequirementGet(cwd, reqId, raw) {
109
+ const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
110
+ const content = readCachedRequirements(reqFilePath);
111
+ // Search current file first
112
+ if (content) {
113
+ const requirements = parseRequirements(content);
114
+ const match = requirements.find((r) => r.id.toLowerCase() === reqId.toLowerCase());
115
+ if (match) {
116
+ // Merge status and phase from traceability matrix
117
+ const matrix = parseTraceabilityMatrix(content);
118
+ const matrixRow = matrix.find((m) => m.req.toLowerCase() === reqId.toLowerCase());
119
+ if (matrixRow) {
120
+ match.status = matrixRow.status;
121
+ match.phase = matrixRow.phase;
122
+ }
123
+ output(match, raw, `${match.id}: ${match.title || ''} [${match.status || 'unknown'}]`);
124
+ return;
125
+ }
126
+ }
127
+ // Fallback: scan archived milestone REQUIREMENTS.md files
128
+ const milestonesDir = getMilestonesDirPath(cwd);
129
+ try {
130
+ const files = fs
131
+ .readdirSync(milestonesDir)
132
+ .filter((f) => f.match(/^v[\d.]+-REQUIREMENTS\.md$/i));
133
+ for (const file of files) {
134
+ const filePath = path.join(milestonesDir, file);
135
+ const archiveContent = safeReadFile(filePath);
136
+ if (!archiveContent)
137
+ continue;
138
+ const archiveReqs = parseRequirements(archiveContent);
139
+ const match = archiveReqs.find((r) => r.id.toLowerCase() === reqId.toLowerCase());
140
+ if (match) {
141
+ // Merge status from archived traceability matrix
142
+ const matrix = parseTraceabilityMatrix(archiveContent);
143
+ const matrixRow = matrix.find((m) => m.req.toLowerCase() === reqId.toLowerCase());
144
+ if (matrixRow) {
145
+ match.status = matrixRow.status;
146
+ match.phase = matrixRow.phase;
147
+ }
148
+ // Extract milestone version from filename
149
+ const versionMatch = file.match(/^(v[\d.]+)-REQUIREMENTS\.md$/i);
150
+ match.milestone = versionMatch ? versionMatch[1] : file;
151
+ output(match, raw, `${match.id}: ${match.title || ''} [${match.status || 'unknown'}]`);
152
+ return;
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // milestones directory may not exist
158
+ }
159
+ // Not found anywhere
160
+ output({ error: 'Requirement not found', id: reqId }, raw);
161
+ }
162
+ /**
163
+ * CLI command: List requirements with optional filters.
164
+ */
165
+ function cmdRequirementList(cwd, filters, raw) {
166
+ const f = filters || {};
167
+ const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
168
+ const content = readCachedRequirements(reqFilePath);
169
+ let allReqs = [];
170
+ if (content) {
171
+ allReqs = parseRequirements(content);
172
+ const matrix = parseTraceabilityMatrix(content);
173
+ // Merge status/phase from matrix into each requirement
174
+ for (const req of allReqs) {
175
+ const matrixRow = matrix.find((m) => m.req.toLowerCase() === req.id.toLowerCase());
176
+ if (matrixRow) {
177
+ req.status = matrixRow.status;
178
+ req.phase = matrixRow.phase;
179
+ }
180
+ }
181
+ }
182
+ // If --all, include archived milestone requirements
183
+ if (f.all) {
184
+ const milestonesDir = getMilestonesDirPath(cwd);
185
+ try {
186
+ const files = fs
187
+ .readdirSync(milestonesDir)
188
+ .filter((fname) => fname.match(/^v[\d.]+-REQUIREMENTS\.md$/i));
189
+ for (const file of files) {
190
+ const filePath = path.join(milestonesDir, file);
191
+ const archiveContent = safeReadFile(filePath);
192
+ if (!archiveContent)
193
+ continue;
194
+ const archiveReqs = parseRequirements(archiveContent);
195
+ const archiveMatrix = parseTraceabilityMatrix(archiveContent);
196
+ const versionMatch = file.match(/^(v[\d.]+)-REQUIREMENTS\.md$/i);
197
+ const milestone = versionMatch ? versionMatch[1] : file;
198
+ for (const req of archiveReqs) {
199
+ // Skip if already in current file
200
+ if (allReqs.find((r) => r.id.toLowerCase() === req.id.toLowerCase()))
201
+ continue;
202
+ const matrixRow = archiveMatrix.find((m) => m.req.toLowerCase() === req.id.toLowerCase());
203
+ if (matrixRow) {
204
+ req.status = matrixRow.status;
205
+ req.phase = matrixRow.phase;
206
+ }
207
+ req.milestone = milestone;
208
+ allReqs.push(req);
209
+ }
210
+ }
211
+ }
212
+ catch {
213
+ // milestones directory may not exist
214
+ }
215
+ }
216
+ // Apply filters (AND logic)
217
+ let filtered = allReqs;
218
+ if (f.phase) {
219
+ filtered = filtered.filter((r) => {
220
+ if (!r.phase)
221
+ return false;
222
+ // Match "Phase N" where N matches filter value
223
+ const phaseNum = r.phase.match(/(\d+)/);
224
+ return phaseNum && phaseNum[1] === String(f.phase);
225
+ });
226
+ }
227
+ if (f.priority) {
228
+ filtered = filtered.filter((r) => r.priority === f.priority);
229
+ }
230
+ if (f.status) {
231
+ filtered = filtered.filter((r) => r.status === f.status);
232
+ }
233
+ if (f.category) {
234
+ filtered = filtered.filter((r) => r.category === f.category);
235
+ }
236
+ const filtersApplied = {};
237
+ if (f.phase)
238
+ filtersApplied.phase = f.phase;
239
+ if (f.priority)
240
+ filtersApplied.priority = f.priority;
241
+ if (f.status)
242
+ filtersApplied.status = f.status;
243
+ if (f.category)
244
+ filtersApplied.category = f.category;
245
+ if (f.all)
246
+ filtersApplied.all = true;
247
+ const result = {
248
+ requirements: filtered,
249
+ count: filtered.length,
250
+ filters_applied: filtersApplied,
251
+ };
252
+ output(result, raw, `${result.count} requirement(s)`);
253
+ }
254
+ /**
255
+ * CLI command: Return traceability matrix as structured JSON.
256
+ */
257
+ function cmdRequirementTraceability(cwd, filters, raw) {
258
+ const f = filters || {};
259
+ const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
260
+ const content = readCachedRequirements(reqFilePath);
261
+ let matrix = [];
262
+ if (content) {
263
+ matrix = parseTraceabilityMatrix(content);
264
+ }
265
+ // Apply phase filter
266
+ if (f.phase) {
267
+ matrix = matrix.filter((row) => {
268
+ const phaseNum = row.phase.match(/(\d+)/);
269
+ return phaseNum && phaseNum[1] === String(f.phase);
270
+ });
271
+ }
272
+ const result = { matrix, count: matrix.length };
273
+ output(result, raw, `${result.count} traceability entries`);
274
+ }
275
+ /** Valid requirement statuses */
276
+ const VALID_REQUIREMENT_STATUSES = [
277
+ 'Pending',
278
+ 'In Progress',
279
+ 'Done',
280
+ 'Deferred',
281
+ ];
282
+ /**
283
+ * CLI command: Update the status of a requirement in the Traceability Matrix.
284
+ * Validates REQ-ID exists and status is valid before writing.
285
+ */
286
+ function cmdRequirementUpdateStatus(cwd, reqId, newStatus, raw, dryRun) {
287
+ // Validate status
288
+ if (!VALID_REQUIREMENT_STATUSES.includes(newStatus)) {
289
+ error(`Invalid status "${newStatus}". Valid statuses: ${VALID_REQUIREMENT_STATUSES.join(', ')}`);
290
+ }
291
+ const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
292
+ const content = readCachedRequirements(reqFilePath);
293
+ if (!content) {
294
+ error('REQUIREMENTS.md not found');
295
+ }
296
+ // Parse traceability matrix to validate REQ-ID exists and get old status
297
+ const matrix = parseTraceabilityMatrix(content);
298
+ const matrixRow = matrix.find((m) => m.req.toLowerCase() === reqId.toLowerCase());
299
+ if (!matrixRow) {
300
+ error(`Requirement ${reqId} not found in Traceability Matrix. Run "requirement list" to see valid requirement IDs, or check .planning/REQUIREMENTS.md`);
301
+ }
302
+ // After the error() calls above (which call process.exit), TypeScript needs
303
+ // to know matrixRow is defined. The error() function has return type never,
304
+ // so execution cannot reach here if matrixRow is undefined.
305
+ const row = matrixRow;
306
+ const oldStatus = row.status;
307
+ // Use regex to replace the status cell in the matching row
308
+ // Escape special regex characters in reqId and oldStatus
309
+ const escapedReqId = row.req.replace(/[-]/g, '\\-');
310
+ const escapedOldStatus = oldStatus.replace(/\s+/g, '\\s+');
311
+ const reqPattern = new RegExp(`^(\\|\\s*${escapedReqId}\\s*\\|.+\\|)\\s*${escapedOldStatus}\\s*(\\|)\\s*$`, 'im');
312
+ // If old and new status are the same, skip the write but still report success
313
+ if (oldStatus === newStatus) {
314
+ output({
315
+ updated: true,
316
+ id: row.req,
317
+ old_status: oldStatus,
318
+ new_status: newStatus,
319
+ }, raw);
320
+ return;
321
+ }
322
+ const updatedContent = content.replace(reqPattern, `$1 ${newStatus} $2`);
323
+ if (updatedContent === content) {
324
+ error(`Failed to update status for ${reqId} in Traceability Matrix. Ensure the requirement row format matches the expected pattern in .planning/REQUIREMENTS.md`);
325
+ }
326
+ if (dryRun) {
327
+ output({
328
+ dry_run: true,
329
+ id: row.req,
330
+ old_status: oldStatus,
331
+ new_status: newStatus,
332
+ }, raw, `dry-run: would update ${reqId} from "${oldStatus}" to "${newStatus}"`);
333
+ return;
334
+ }
335
+ // Write updated content back to disk and invalidate the cache so subsequent reads see the new content
336
+ fs.writeFileSync(reqFilePath, updatedContent, 'utf-8');
337
+ _reqContentCache.delete(reqFilePath);
338
+ output({
339
+ updated: true,
340
+ id: row.req,
341
+ old_status: oldStatus,
342
+ new_status: newStatus,
343
+ }, raw);
344
+ }
345
+ module.exports = {
346
+ readCachedRequirements,
347
+ parseRequirements,
348
+ parseTraceabilityMatrix,
349
+ VALID_REQUIREMENT_STATUSES,
350
+ cmdRequirementGet,
351
+ cmdRequirementList,
352
+ cmdRequirementTraceability,
353
+ cmdRequirementUpdateStatus,
354
+ };
355
+ //# sourceMappingURL=requirements.js.map