agentic-qe 3.13.0 → 3.13.2

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 (386) hide show
  1. package/.agents/skills/aqe-plan-quality/SKILL.md +25 -0
  2. package/.agents/skills/aqe-plan-quality/agents/openai.yaml +4 -0
  3. package/.agents/skills/aqe-plan-quality/references/qe-routing.md +22 -0
  4. package/.agents/skills/aqe-review-quality/SKILL.md +24 -0
  5. package/.agents/skills/aqe-review-quality/agents/openai.yaml +4 -0
  6. package/.agents/skills/aqe-review-quality/references/quality-gates.md +20 -0
  7. package/.agents/skills/aqe-test-change/SKILL.md +26 -0
  8. package/.agents/skills/aqe-test-change/agents/openai.yaml +4 -0
  9. package/.agents/skills/aqe-test-change/references/test-specialties.md +23 -0
  10. package/.claude/helpers/ruflo-hook.cjs +5 -1
  11. package/.claude/skills/skills-manifest.json +1 -1
  12. package/.codex/hooks/aqe-codex-hook.cjs +69 -0
  13. package/.codex/hooks/ruflo-codex-hook.cjs +94 -0
  14. package/.codex/hooks.json +169 -0
  15. package/CHANGELOG.md +123 -0
  16. package/assets/skills/skills-manifest.json +1 -1
  17. package/dist/cli/bundle.js +5 -5
  18. package/dist/cli/chunks/adapter-I4SNWMCM.js +2 -0
  19. package/dist/cli/chunks/{agent-booster-wasm-ACX2DK7Y.js → agent-booster-wasm-PZYYTKSS.js} +2 -2
  20. package/dist/cli/chunks/{agent-handler-B45WP4ZJ.js → agent-handler-DNN7GXUN.js} +2 -2
  21. package/dist/cli/chunks/{agent-memory-branch-QQLZDE56.js → agent-memory-branch-LVCBBCQY.js} +2 -2
  22. package/dist/cli/chunks/aqe-learning-engine-WI47XKXI.js +2 -0
  23. package/dist/cli/chunks/{arena-SDB7723R.js → arena-422HSTPE.js} +2 -2
  24. package/dist/cli/chunks/{arena-G3IKZAG5.js → arena-OCEOLMCH.js} +4 -4
  25. package/dist/cli/chunks/{audit-GY46XUZA.js → audit-5O45K34M.js} +3 -3
  26. package/dist/cli/chunks/base-VJ6VDLD7.js +2 -0
  27. package/dist/cli/chunks/{hnswlib-node-RJPBJU2Q.js → better-sqlite3-Y36THYK2.js} +2 -2
  28. package/dist/cli/chunks/{brain-handler-347CYMPN.js → brain-handler-7VHXYN3P.js} +3 -3
  29. package/dist/cli/chunks/{branch-enumerator-Z3ULBFSM.js → branch-enumerator-PZKOD6S6.js} +2 -2
  30. package/dist/cli/chunks/{browser-OYEIHD7F.js → browser-M74UO4WJ.js} +2 -2
  31. package/dist/cli/chunks/browser-workflow-WRYHQQDU.js +2 -0
  32. package/dist/cli/chunks/{chunk-RVJPWRV6.js → chunk-24S5IUSI.js} +2 -2
  33. package/dist/cli/chunks/{chunk-3NOCK6ED.js → chunk-2DG44UZ5.js} +2 -2
  34. package/dist/cli/chunks/{chunk-34PEINFS.js → chunk-2QJPAQE5.js} +2 -2
  35. package/dist/cli/chunks/{chunk-SHCTEXNH.js → chunk-4DKL4H5L.js} +2 -2
  36. package/dist/cli/chunks/{chunk-A4QLGPYO.js → chunk-4FYTWD4Q.js} +2 -2
  37. package/dist/cli/chunks/{chunk-YFGAHNCG.js → chunk-4HFNY3Z2.js} +3 -3
  38. package/dist/cli/chunks/{chunk-RVRBTOWX.js → chunk-4PM5VORA.js} +2 -2
  39. package/dist/cli/chunks/{chunk-QWYISZTN.js → chunk-4SFOQSXU.js} +2 -2
  40. package/dist/cli/chunks/{chunk-RSFIOR2I.js → chunk-4STE6VLR.js} +87 -87
  41. package/dist/cli/chunks/{chunk-54MFKCLT.js → chunk-54BCLRRJ.js} +2 -2
  42. package/dist/cli/chunks/{chunk-IYDYJ33J.js → chunk-5AAG7JTB.js} +2 -2
  43. package/dist/cli/chunks/{chunk-TVMFH5N2.js → chunk-5EFNZEOB.js} +2 -2
  44. package/dist/cli/chunks/{chunk-GUEZQOHL.js → chunk-5GGGZYFA.js} +1 -1
  45. package/dist/cli/chunks/{chunk-5KAT6WBQ.js → chunk-5KMBZTDI.js} +2 -2
  46. package/dist/cli/chunks/{chunk-ANYYTWOQ.js → chunk-5XYVRTI6.js} +2 -2
  47. package/dist/cli/chunks/{chunk-ANIDFJCT.js → chunk-62D27BDO.js} +3 -3
  48. package/dist/cli/chunks/{chunk-SNTUKW4Q.js → chunk-6DMB6WK5.js} +2 -2
  49. package/dist/cli/chunks/{chunk-ZCFZ4USU.js → chunk-6R7TX5L4.js} +1 -1
  50. package/dist/cli/chunks/chunk-6UGYFYS4.js +2 -0
  51. package/dist/cli/chunks/chunk-6XHDH3IJ.js +3 -0
  52. package/dist/cli/chunks/{chunk-IHQTXJAQ.js → chunk-73HALJY5.js} +1 -1
  53. package/dist/cli/chunks/{chunk-7YXT6BXN.js → chunk-7TCVVVFA.js} +3 -3
  54. package/dist/cli/chunks/{chunk-RJZRWVL4.js → chunk-A2OD5Z4B.js} +1 -1
  55. package/dist/cli/chunks/{chunk-ES7WCYOU.js → chunk-AJ7A52GF.js} +1 -1
  56. package/dist/cli/chunks/{chunk-QCEW4ZDW.js → chunk-AP2BBV2D.js} +2 -2
  57. package/dist/cli/chunks/{chunk-FQLWQWRU.js → chunk-AS2HVJ42.js} +3 -3
  58. package/dist/cli/chunks/{chunk-7UNY32PU.js → chunk-ASIGTVFQ.js} +1 -1
  59. package/dist/cli/chunks/{chunk-EECM5XKY.js → chunk-B7KZMPF2.js} +1 -1
  60. package/dist/cli/chunks/{chunk-Z6QCOZ2H.js → chunk-BFKXHXWW.js} +2 -2
  61. package/dist/cli/chunks/{chunk-VC6EXDGY.js → chunk-BO2RBAPF.js} +2 -2
  62. package/dist/cli/chunks/{chunk-OXXMVQDF.js → chunk-BSQ32ZS5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-WRYT4HTZ.js → chunk-CKTFKA7Q.js} +2 -2
  64. package/dist/cli/chunks/{chunk-QQB55ZJJ.js → chunk-CLBBFKXV.js} +2 -2
  65. package/dist/cli/chunks/{chunk-5FLTZ3KT.js → chunk-COOMXCCP.js} +2 -2
  66. package/dist/cli/chunks/{chunk-DYUC7WFA.js → chunk-DAHNHVND.js} +1 -1
  67. package/dist/cli/chunks/{chunk-6AOBLBR4.js → chunk-DCQQJLUY.js} +2 -2
  68. package/dist/cli/chunks/{chunk-LBE2P6UC.js → chunk-DIPOFCBX.js} +2 -2
  69. package/dist/cli/chunks/{chunk-EFRESRLB.js → chunk-DL2HDULJ.js} +5 -5
  70. package/dist/cli/chunks/{chunk-YRQLVGCI.js → chunk-DQXSDWRP.js} +2 -2
  71. package/dist/cli/chunks/{chunk-QI4CGJNK.js → chunk-E6JJ4ZRQ.js} +1 -1
  72. package/dist/cli/chunks/{chunk-KUA4HHU6.js → chunk-E6PYV3DB.js} +2 -2
  73. package/dist/cli/chunks/{chunk-ZJG6N2OK.js → chunk-EABGQVTV.js} +1 -1
  74. package/dist/cli/chunks/{chunk-U2SW6KK5.js → chunk-EFHMS7TJ.js} +2 -2
  75. package/dist/cli/chunks/{chunk-CWUBOLKY.js → chunk-ELVUERQW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-A7GLWWSE.js → chunk-EU7NUUL6.js} +1 -1
  77. package/dist/cli/chunks/{chunk-3UHEZ5HZ.js → chunk-F6UMLI5Y.js} +2 -2
  78. package/dist/cli/chunks/{chunk-TZPKTRJB.js → chunk-FECBWGCA.js} +2 -2
  79. package/dist/cli/chunks/{chunk-OETDMOOE.js → chunk-FFMUTX26.js} +1 -1
  80. package/dist/cli/chunks/{chunk-VLNPJAVH.js → chunk-FJ2L6P7O.js} +1 -1
  81. package/dist/cli/chunks/{chunk-2DIT5AUU.js → chunk-FMYNKZ2S.js} +2 -2
  82. package/dist/cli/chunks/{chunk-L4LLA5U7.js → chunk-FXXXLDB3.js} +1 -1
  83. package/dist/cli/chunks/{chunk-D3MPV5G7.js → chunk-FZEWEG6Q.js} +2 -2
  84. package/dist/cli/chunks/{chunk-BGYLNCL6.js → chunk-G4LZ5SBC.js} +2 -2
  85. package/dist/cli/chunks/{chunk-J3L52EA4.js → chunk-GHJRLC3C.js} +5 -5
  86. package/dist/cli/chunks/{chunk-3JVUWKCO.js → chunk-GKKD22CC.js} +2 -2
  87. package/dist/cli/chunks/{chunk-32ZGV4Q4.js → chunk-GMKJWOXZ.js} +1 -1
  88. package/dist/cli/chunks/chunk-GMKQJEKX.js +2 -0
  89. package/dist/cli/chunks/{chunk-3GSYD5SL.js → chunk-GZ775E5O.js} +2 -2
  90. package/dist/cli/chunks/{chunk-GTUFX7AR.js → chunk-H6C2YTPX.js} +2 -2
  91. package/dist/cli/chunks/{chunk-UIPPJKON.js → chunk-HANBJ37Z.js} +2 -2
  92. package/dist/cli/chunks/{chunk-ZOXWASCC.js → chunk-HANJESCY.js} +2 -2
  93. package/dist/cli/chunks/{chunk-JPIBPKBP.js → chunk-HD6PZHLC.js} +3 -3
  94. package/dist/cli/chunks/{chunk-FQY3UTGA.js → chunk-HHUKHEW5.js} +2 -2
  95. package/dist/cli/chunks/{chunk-W5YEIHIO.js → chunk-HQCJYUKC.js} +2 -2
  96. package/dist/cli/chunks/{chunk-CYL2FV23.js → chunk-IIZ3HBPV.js} +2 -2
  97. package/dist/cli/chunks/{chunk-HTPM3URI.js → chunk-IV77BQ2R.js} +2 -2
  98. package/dist/cli/chunks/{chunk-THBTN7XB.js → chunk-J722Z7VO.js} +2 -2
  99. package/dist/cli/chunks/{chunk-5EIOQCGN.js → chunk-JDRYENTD.js} +2 -2
  100. package/dist/cli/chunks/{chunk-NQNKKVNO.js → chunk-JKVUSXT4.js} +3 -3
  101. package/dist/cli/chunks/{chunk-CQFT7H3F.js → chunk-JMRUHQEL.js} +2 -2
  102. package/dist/cli/chunks/{chunk-PERJO2DY.js → chunk-JPO4AC5Q.js} +1 -1
  103. package/dist/cli/chunks/{chunk-KSYLRM4Q.js → chunk-JPPHM3I6.js} +2 -2
  104. package/dist/cli/chunks/{chunk-56WZFXTQ.js → chunk-K3MNTU4O.js} +2 -2
  105. package/dist/cli/chunks/{chunk-CPH5JP4L.js → chunk-K47EWX3M.js} +1 -1
  106. package/dist/cli/chunks/{chunk-7DMXCCSD.js → chunk-KAHMXURL.js} +1 -1
  107. package/dist/cli/chunks/{chunk-UNIBND6A.js → chunk-KHVW6DQS.js} +1 -1
  108. package/dist/cli/chunks/{chunk-RLCWR7TS.js → chunk-KKPWS3XJ.js} +98 -88
  109. package/dist/cli/chunks/chunk-KRRGOJ6K.js +2 -0
  110. package/dist/cli/chunks/chunk-LEOSNZR2.js +2 -0
  111. package/dist/cli/chunks/{chunk-TNRIGQ6U.js → chunk-LG6UUM55.js} +2 -2
  112. package/dist/cli/chunks/{chunk-HOKON5EL.js → chunk-LJWIBYTR.js} +2 -2
  113. package/dist/cli/chunks/{chunk-N7VOOI3U.js → chunk-LQDQTLWV.js} +2 -2
  114. package/dist/cli/chunks/{chunk-2NRZYQSF.js → chunk-LXYVWAFN.js} +2 -2
  115. package/dist/cli/chunks/{chunk-YPTGE5NJ.js → chunk-LZNJ7HXB.js} +2 -2
  116. package/dist/cli/chunks/{chunk-6SXKCIN5.js → chunk-M4JZOCV3.js} +1 -1
  117. package/dist/cli/chunks/{chunk-UMG5URNV.js → chunk-MBTVAIFF.js} +1 -1
  118. package/dist/cli/chunks/{chunk-N5MMBA35.js → chunk-MNDPSIEI.js} +1 -1
  119. package/dist/cli/chunks/{chunk-L4S722JD.js → chunk-MUSLUG6Y.js} +1 -1
  120. package/dist/cli/chunks/{chunk-VLBV2VL3.js → chunk-MVJ5UQI3.js} +1 -1
  121. package/dist/cli/chunks/{chunk-XFCWYQHW.js → chunk-N2AGOQCL.js} +2 -2
  122. package/dist/cli/chunks/{chunk-KVL63BSU.js → chunk-N4O2RWSL.js} +1 -1
  123. package/dist/cli/chunks/{chunk-L2SFGFE6.js → chunk-NBRKZOPM.js} +1 -1
  124. package/dist/cli/chunks/{chunk-NETN3OUG.js → chunk-NIE3SGZM.js} +1 -1
  125. package/dist/cli/chunks/{chunk-LOXVVMS4.js → chunk-NNIKJZA4.js} +3 -3
  126. package/dist/cli/chunks/{chunk-5ICQL42E.js → chunk-NTKIDOIW.js} +2 -2
  127. package/dist/cli/chunks/{chunk-Q7PBGNUD.js → chunk-ODE7Z667.js} +1 -1
  128. package/dist/cli/chunks/{chunk-K5N6SLHO.js → chunk-OYWZYG6Q.js} +1 -1
  129. package/dist/cli/chunks/{chunk-CFVEDUTW.js → chunk-P33EORZZ.js} +2 -2
  130. package/dist/cli/chunks/{chunk-R3GEXYO4.js → chunk-PILZKQX7.js} +2 -2
  131. package/dist/cli/chunks/{chunk-ZJIX5FGQ.js → chunk-PJOH5Z5I.js} +2 -2
  132. package/dist/cli/chunks/{chunk-JGM6XCCP.js → chunk-PNQWEOE2.js} +1 -1
  133. package/dist/cli/chunks/{chunk-XKFE3FLI.js → chunk-PRQPUOSH.js} +2 -2
  134. package/dist/cli/chunks/{chunk-LWYLW7RX.js → chunk-PT6NTWGT.js} +2 -2
  135. package/dist/cli/chunks/{chunk-FBBZHATF.js → chunk-Q45FBGVV.js} +1 -1
  136. package/dist/cli/chunks/{chunk-SRQ3CPJE.js → chunk-Q625ISQI.js} +4 -4
  137. package/dist/cli/chunks/{chunk-BOVH6WSM.js → chunk-QS6TI7NR.js} +2 -2
  138. package/dist/cli/chunks/{chunk-4BDLD7V2.js → chunk-QVD3LU27.js} +1 -1
  139. package/dist/cli/chunks/{chunk-ZLXBNNNT.js → chunk-QZACODX6.js} +2 -2
  140. package/dist/cli/chunks/{chunk-NUQBJGGF.js → chunk-REBNPQI7.js} +2 -2
  141. package/dist/cli/chunks/{chunk-FAQLI3P5.js → chunk-RF2DMPX2.js} +2 -2
  142. package/dist/cli/chunks/{chunk-2VQVEQS4.js → chunk-RI2V2U2N.js} +2 -2
  143. package/dist/cli/chunks/{chunk-GJMZR7WU.js → chunk-RJYAUJDC.js} +3 -3
  144. package/dist/cli/chunks/{chunk-KZTBNDNE.js → chunk-RWHHOQIC.js} +1 -1
  145. package/dist/cli/chunks/{chunk-ZEIG5IQ4.js → chunk-RWUK5VMZ.js} +2 -2
  146. package/dist/cli/chunks/{chunk-E3B5XTXJ.js → chunk-SOOI2HJB.js} +1 -1
  147. package/dist/cli/chunks/{chunk-IPHLXAMX.js → chunk-T2XXTEZV.js} +2 -2
  148. package/dist/cli/chunks/{chunk-USMDIIHY.js → chunk-T55XIENI.js} +2 -2
  149. package/dist/cli/chunks/{chunk-VSNRPMAZ.js → chunk-T726SRYP.js} +2 -2
  150. package/dist/cli/chunks/{chunk-RDU4WTV2.js → chunk-TLG56A27.js} +2 -2
  151. package/dist/cli/chunks/{chunk-FUU32QY5.js → chunk-TTWWCWAR.js} +2 -2
  152. package/dist/cli/chunks/{chunk-LXPB7H2P.js → chunk-TVWX7NYD.js} +1 -1
  153. package/dist/cli/chunks/{chunk-G5DFYX3J.js → chunk-U2FCUBBW.js} +2 -2
  154. package/dist/cli/chunks/{chunk-DRIJYTSK.js → chunk-UIQVVS7K.js} +2 -2
  155. package/dist/cli/chunks/{chunk-6DTOGSDV.js → chunk-UPGJZA3D.js} +4 -4
  156. package/dist/cli/chunks/{chunk-3K4SF57Q.js → chunk-UVLWT6QM.js} +1 -1
  157. package/dist/cli/chunks/{chunk-FL3BM54K.js → chunk-VKU5BUUC.js} +1 -1
  158. package/dist/cli/chunks/{chunk-AO7AHX6K.js → chunk-VOYUCJLK.js} +2 -2
  159. package/dist/cli/chunks/{chunk-BCKTBGDM.js → chunk-WMK2ZNLM.js} +3 -3
  160. package/dist/cli/chunks/{chunk-4BESADKE.js → chunk-WTSVP6OK.js} +2 -2
  161. package/dist/cli/chunks/{chunk-MBCGI3M2.js → chunk-XS2S3ECA.js} +5 -5
  162. package/dist/cli/chunks/chunk-XXQLFPIK.js +2 -0
  163. package/dist/cli/chunks/{chunk-HL2QMM4M.js → chunk-XZOTFJHU.js} +2 -2
  164. package/dist/cli/chunks/{chunk-QTU3CVOB.js → chunk-YTHUTBBH.js} +2 -2
  165. package/dist/cli/chunks/{chunk-BUGWPTMF.js → chunk-YWJ2GPD4.js} +2 -2
  166. package/dist/cli/chunks/{chunk-GFBLWFRV.js → chunk-YXTDCP6H.js} +1 -1
  167. package/dist/cli/chunks/{chunk-TZ73SXQ5.js → chunk-YZUMCXH6.js} +1 -1
  168. package/dist/cli/chunks/{chunk-VHYMSZNF.js → chunk-ZIT5VF43.js} +2 -2
  169. package/dist/cli/chunks/{chunk-IZRLIWFN.js → chunk-ZY5FB3JV.js} +2 -2
  170. package/dist/cli/chunks/{ci-74ZUCO5V.js → ci-EOFZKCSH.js} +2 -2
  171. package/dist/cli/chunks/{ci-output-HD6IZNJA.js → ci-output-TAJFQWDP.js} +2 -2
  172. package/dist/cli/chunks/{circuit-breaker-USZVMA42.js → circuit-breaker-QA7YJ3IF.js} +2 -2
  173. package/dist/cli/chunks/{claude-flow-setup-S4XKNCD5.js → claude-flow-setup-4RNAIALK.js} +2 -2
  174. package/dist/cli/chunks/client-N2WAM5IK.js +2 -0
  175. package/dist/cli/chunks/{cline-installer-6EW4CHAR.js → cline-installer-K25NUUA4.js} +2 -2
  176. package/dist/cli/chunks/{code-TOLWD2XL.js → code-JM4D3I2W.js} +2 -2
  177. package/dist/cli/chunks/{code-index-extractor-UA4QQ7B3.js → code-index-extractor-6B6TJ2B5.js} +2 -2
  178. package/dist/cli/chunks/codex-installer-GRUENCIO.js +10 -0
  179. package/dist/cli/chunks/{completions-KVUMQQ4K.js → completions-LADTXGCC.js} +2 -2
  180. package/dist/cli/chunks/{complexity-analyzer-DFH6LMK2.js → complexity-analyzer-IQITOJH5.js} +2 -2
  181. package/dist/cli/chunks/{continuedev-installer-LYDQSAU7.js → continuedev-installer-H6NAXFZK.js} +2 -2
  182. package/dist/cli/chunks/{copilot-installer-7USXLZHZ.js → copilot-installer-W7HCQKOS.js} +2 -2
  183. package/dist/cli/chunks/core-handlers-VSX474R3.js +2 -0
  184. package/dist/cli/chunks/{cost-tracker-JBDIUMKZ.js → cost-tracker-MC7KEENQ.js} +2 -2
  185. package/dist/cli/chunks/{coverage-RGO3K357.js → coverage-NOOKPFYQ.js} +3 -3
  186. package/dist/cli/chunks/cross-domain-router-VNE7QKX4.js +2 -0
  187. package/dist/cli/chunks/{cursor-installer-YEZGD37F.js → cursor-installer-GOZ64GZJ.js} +2 -2
  188. package/dist/cli/chunks/{daemon-FVETQ3LL.js → daemon-G4ABQMFJ.js} +3 -3
  189. package/dist/cli/chunks/{daemon-LPEXHNYG.js → daemon-V23WTCJJ.js} +4 -4
  190. package/dist/cli/chunks/{dag-attention-scheduler-UKYE2FII.js → dag-attention-scheduler-YKOO6ZWL.js} +2 -2
  191. package/dist/cli/chunks/{detect-WBG5P7ER.js → detect-SNEMKQGJ.js} +2 -2
  192. package/dist/cli/chunks/{dist-node-YW6YRBCU.js → dist-node-VBNEM6K6.js} +2 -2
  193. package/dist/cli/chunks/{domain-handler-HH7J4A32.js → domain-handler-2G5XEERC.js} +2 -2
  194. package/dist/cli/chunks/{domain-transfer-V34GXD5I.js → domain-transfer-HSEUUM7E.js} +2 -2
  195. package/dist/cli/chunks/dream-A5LVJU7T.js +2 -0
  196. package/dist/cli/chunks/{embed-and-insert-pattern-WYLRS3CL.js → embed-and-insert-pattern-H6MU5HK4.js} +2 -2
  197. package/dist/cli/chunks/{eval-EIMVXY5J.js → eval-XYVDJXJF.js} +2 -2
  198. package/dist/cli/chunks/{experience-capture-middleware-QMZHRUKM.js → experience-capture-middleware-BZQJVXTE.js} +3 -3
  199. package/dist/cli/chunks/{fast-paths-NHLW6XS6.js → fast-paths-76WWBJ4H.js} +2 -2
  200. package/dist/cli/chunks/{feature-flags-NE3MBL3P.js → feature-flags-7E5YZ4P5.js} +2 -2
  201. package/dist/cli/chunks/{feature-flags-N3UHMSZ3.js → feature-flags-SCQ35J6M.js} +2 -2
  202. package/dist/cli/chunks/{file-discovery-SI44X4YS.js → file-discovery-LU5MAXWA.js} +2 -2
  203. package/dist/cli/chunks/{fleet-MMYUXRRM.js → fleet-M3TH65SV.js} +3 -3
  204. package/dist/cli/chunks/{gnn-wrapper-RLYXYU2Q.js → gnn-wrapper-OYUJEJD2.js} +2 -2
  205. package/dist/cli/chunks/{heartbeat-handler-6EDRUYLV.js → heartbeat-handler-II4NSOXK.js} +4 -4
  206. package/dist/cli/chunks/heartbeat-scheduler-CFZ6DNQY.js +2 -0
  207. package/dist/cli/chunks/hnsw-adapter-I4Y2T4HO.js +2 -0
  208. package/dist/cli/chunks/hnsw-index-SBR5VYGN.js +2 -0
  209. package/dist/cli/chunks/{hnsw-legacy-bridge-RVM7EAIH.js → hnsw-legacy-bridge-322R2UAB.js} +2 -2
  210. package/dist/cli/chunks/{better-sqlite3-DUZ6FFAH.js → hnswlib-node-OVLAHTPU.js} +2 -2
  211. package/dist/cli/chunks/{hooks-ZF4VKHEO.js → hooks-2A27XCUJ.js} +37 -37
  212. package/dist/cli/chunks/hybrid-router-E6YM74NQ.js +2 -0
  213. package/dist/cli/chunks/{hypergraph-engine-YWS66PGO.js → hypergraph-engine-ERA527UR.js} +2 -2
  214. package/dist/cli/chunks/{hypergraph-handler-OQHVRPWB.js → hypergraph-handler-7XL4OL6W.js} +3 -3
  215. package/dist/cli/chunks/impact-analyzer-GHYFSSMJ.js +2 -0
  216. package/dist/cli/chunks/{init-handler-YW74YF2V.js → init-handler-WN6KQ5WY.js} +6 -6
  217. package/dist/cli/chunks/init-wizard-KAN5KOGD.js +2 -0
  218. package/dist/cli/chunks/kernel-LET4HEEF.js +2 -0
  219. package/dist/cli/chunks/{kilocode-installer-APWB2GMA.js → kilocode-installer-5UCCFZ7V.js} +2 -2
  220. package/dist/cli/chunks/{kiro-installer-DICKFVNC.js → kiro-installer-77DPEP3K.js} +2 -2
  221. package/dist/cli/chunks/knowledge-graph-P3UJWNQS.js +2 -0
  222. package/dist/cli/chunks/{learning-MXHNYW5D.js → learning-A5GKUD73.js} +3 -3
  223. package/dist/cli/chunks/{llm-router-LTFIX7NY.js → llm-router-SINJNEGP.js} +4 -4
  224. package/dist/cli/chunks/llm-router-service-BOBENURJ.js +2 -0
  225. package/dist/cli/chunks/{load-JUMIQ4LZ.js → load-Q56GLXHJ.js} +2 -2
  226. package/dist/cli/chunks/load-test-4VDCVB7S.js +2 -0
  227. package/dist/cli/chunks/{mcp-WHIARJGO.js → mcp-VBDU2WLY.js} +2 -2
  228. package/dist/cli/chunks/{memory-KAHS6Z5A.js → memory-IGWBRDIT.js} +5 -5
  229. package/dist/cli/chunks/memory-backend-RRFAYQYS.js +2 -0
  230. package/dist/cli/chunks/{memory-handlers-DG3RRXB6.js → memory-handlers-IITHQ7KV.js} +2 -2
  231. package/dist/cli/chunks/{multi-model-executor-E3Y2RHMX.js → multi-model-executor-2QUEY4CC.js} +2 -2
  232. package/dist/cli/chunks/{opencode-installer-3RKGNGGE.js → opencode-installer-FZJ5N2B3.js} +2 -2
  233. package/dist/cli/chunks/{orchestrator-TXITUKWD.js → orchestrator-BGLDS47V.js} +5 -5
  234. package/dist/cli/chunks/pattern-null-store-V7DEZEF2.js +2 -0
  235. package/dist/cli/chunks/{pattern-usage-recorder-EE2BUFZT.js → pattern-usage-recorder-4MFN4WKV.js} +2 -2
  236. package/dist/cli/chunks/{pipeline-AXTT6KZB.js → pipeline-GZHAORGP.js} +2 -2
  237. package/dist/cli/chunks/{platform-TICPVKE2.js → platform-TZEX4YZQ.js} +2 -2
  238. package/dist/cli/chunks/{plugin-VQKNV3EM.js → plugin-VEYUFCNY.js} +2 -2
  239. package/dist/cli/chunks/{prime-radiant-advanced-wasm-6GY5YY7D.js → prime-radiant-advanced-wasm-OA5DLXJJ.js} +2 -2
  240. package/dist/cli/chunks/protocol-executor-I3C2ZETP.js +2 -0
  241. package/dist/cli/chunks/{protocol-handler-YFWDR7UZ.js → protocol-handler-MVJ5N4X5.js} +2 -2
  242. package/dist/cli/chunks/{prove-FUMRCXAA.js → prove-VKF7YCUA.js} +2 -2
  243. package/dist/cli/chunks/provider-manager-HB4YVQDI.js +2 -0
  244. package/dist/cli/chunks/qe-reasoning-bank-RDLBAXJY.js +2 -0
  245. package/dist/cli/chunks/{quality-2APISBW5.js → quality-NLB5LVGM.js} +2 -2
  246. package/dist/cli/chunks/{quality-gate-MCC3E5TM.js → quality-gate-OM6A7FQM.js} +3 -3
  247. package/dist/cli/chunks/queen-coordinator-QRWRNUDR.js +2 -0
  248. package/dist/cli/chunks/{real-embeddings-CC5TNOTI.js → real-embeddings-NONEKGAV.js} +2 -2
  249. package/dist/cli/chunks/{roocode-installer-YAHTEVPI.js → roocode-installer-ORXQQO3F.js} +2 -2
  250. package/dist/cli/chunks/router-WDF7KV4M.js +2 -0
  251. package/dist/cli/chunks/routing-feedback-DHYB4ZNL.js +2 -0
  252. package/dist/cli/chunks/{routing-handler-6NQBW4TQ.js → routing-handler-LGMIBVDS.js} +2 -2
  253. package/dist/cli/chunks/{ruvector-commands-ZHXLHUPG.js → ruvector-commands-4GZMU4BZ.js} +2 -2
  254. package/dist/cli/chunks/{rvf-dual-writer-5KF2DGCW.js → rvf-dual-writer-45HKI22F.js} +2 -2
  255. package/dist/cli/chunks/{rvf-migration-adapter-BBU57BGF.js → rvf-migration-adapter-RHYIXI3I.js} +2 -2
  256. package/dist/cli/chunks/{rvf-migration-coordinator-VN4VRZA4.js → rvf-migration-coordinator-ANTAYKNN.js} +2 -2
  257. package/dist/cli/chunks/rvf-native-adapter-7W53TYTH.js +2 -0
  258. package/dist/cli/chunks/{rvf-store-integrity-XCY2XQZA.js → rvf-store-integrity-CPQUTFST.js} +2 -2
  259. package/dist/cli/chunks/safe-db-4HBFO7OQ.js +2 -0
  260. package/dist/cli/chunks/schedule-M2OSBJZM.js +2 -0
  261. package/dist/cli/chunks/scheduler-JWV5MSGE.js +2 -0
  262. package/dist/cli/chunks/{security-PYP4H3KN.js → security-BM6LMCBI.js} +3 -3
  263. package/dist/cli/chunks/{shared-rvf-adapter-3CJHRNX6.js → shared-rvf-adapter-3HGARKJX.js} +2 -2
  264. package/dist/cli/chunks/{shared-rvf-dual-writer-MKSLKWDI.js → shared-rvf-dual-writer-UQ4O46ZI.js} +2 -2
  265. package/dist/cli/chunks/sqlite-persistence-QA4JRQZ2.js +2 -0
  266. package/dist/cli/chunks/{status-handler-VYIZ3VJF.js → status-handler-TGRAM5PC.js} +2 -2
  267. package/dist/cli/chunks/{structural-health-MVV4OWXP.js → structural-health-RXETMBB3.js} +2 -2
  268. package/dist/cli/chunks/{sync-VNX6L3TI.js → sync-B4KEYFCP.js} +2 -2
  269. package/dist/cli/chunks/{sync-G47OYIQ3.js → sync-JTBZIACA.js} +2 -2
  270. package/dist/cli/chunks/{task-handler-GOWF2GEH.js → task-handler-D7VXHWPG.js} +2 -2
  271. package/dist/cli/chunks/{task-handlers-J2WC6J37.js → task-handlers-XF6VVPTR.js} +3 -3
  272. package/dist/cli/chunks/{test-DMCJ3BXS.js → test-BKEIMBSX.js} +4 -4
  273. package/dist/cli/chunks/{test-scheduling-TRFHHKFM.js → test-scheduling-A4OHR7KW.js} +3 -3
  274. package/dist/cli/chunks/{token-bootstrap-KEQ7AHFF.js → token-bootstrap-LIDDAOAK.js} +2 -2
  275. package/dist/cli/chunks/{token-usage-B54FOFOF.js → token-usage-BJUFIU4V.js} +2 -2
  276. package/dist/cli/chunks/{transformers-IACZG7IV.js → transformers-YYUQCGMV.js} +2 -2
  277. package/dist/cli/chunks/{tree-sitter-wasm-parser-N7H4X37E.js → tree-sitter-wasm-parser-DFXYTJ23.js} +2 -2
  278. package/dist/cli/chunks/{types-B3SHT4OD.js → types-Z75HK5HH.js} +2 -2
  279. package/dist/cli/chunks/unified-memory-BEUZQTTC.js +2 -0
  280. package/dist/cli/chunks/unified-memory-hnsw-FHLSAEX4.js +2 -0
  281. package/dist/cli/chunks/unified-persistence-TVEQGCSB.js +2 -0
  282. package/dist/cli/chunks/{upgrade-A2PQ5EWK.js → upgrade-NETNZZH3.js} +2 -2
  283. package/dist/cli/chunks/{validate-UXV7UQUT.js → validate-U2WQ7P6T.js} +2 -2
  284. package/dist/cli/chunks/{validate-swarm-MMBU4FPP.js → validate-swarm-DKD7H2E3.js} +2 -2
  285. package/dist/cli/chunks/{vibium-R4GUVADA.js → vibium-FOQ73JBW.js} +2 -2
  286. package/dist/cli/chunks/visual-security-AYV46OUO.js +2 -0
  287. package/dist/cli/chunks/{web-tree-sitter-MP6E6CJB.js → web-tree-sitter-PQXWMQO6.js} +2 -2
  288. package/dist/cli/chunks/{windsurf-installer-Z6BWMUUO.js → windsurf-installer-CTFSFOBX.js} +2 -2
  289. package/dist/cli/chunks/{witness-chain-EFLTABBA.js → witness-chain-NCRHNFQM.js} +2 -2
  290. package/dist/cli/chunks/witness-chain-RU356H6R.js +2 -0
  291. package/dist/cli/chunks/{witness-key-manager-PN36TV43.js → witness-key-manager-WGCSSB23.js} +2 -2
  292. package/dist/cli/chunks/{workflow-A2AX3RJU.js → workflow-FE5QGP2U.js} +4 -4
  293. package/dist/cli/chunks/workflow-orchestrator-N2DQTC3X.js +2 -0
  294. package/dist/cli/chunks/{wrappers-NA6FHA63.js → wrappers-AHL5K2LO.js} +2 -2
  295. package/dist/cli/commands/hooks-handlers/hooks-shared.d.ts +9 -0
  296. package/dist/cli/commands/hooks-handlers/hooks-shared.js +38 -0
  297. package/dist/cli/commands/hooks.d.ts +2 -2
  298. package/dist/cli/commands/hooks.js +8 -2
  299. package/dist/cli/handlers/init-handler.js +1 -1
  300. package/dist/coordination/handlers/coverage-collection.d.ts +161 -0
  301. package/dist/coordination/handlers/coverage-collection.js +643 -0
  302. package/dist/coordination/handlers/coverage-handlers.js +199 -146
  303. package/dist/coordination/handlers/handler-types.d.ts +6 -1
  304. package/dist/coordination/handlers/handler-utils.js +10 -3
  305. package/dist/coordination/handlers/security-handlers.js +17 -2
  306. package/dist/coordination/handlers/test-execution-handlers.js +16 -1
  307. package/dist/coordination/queen-coordinator.js +4 -3
  308. package/dist/coordination/result-saver.js +119 -97
  309. package/dist/coordination/task-executor.d.ts +26 -1
  310. package/dist/coordination/task-executor.js +52 -4
  311. package/dist/domains/code-intelligence/services/knowledge-graph.js +8 -0
  312. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +4 -0
  313. package/dist/domains/coverage-analysis/services/gap-detector.js +4 -0
  314. package/dist/domains/defect-intelligence/services/defect-predictor.js +4 -0
  315. package/dist/domains/defect-intelligence/services/root-cause-analyzer.js +4 -0
  316. package/dist/domains/quality-assessment/services/deployment-advisor.js +4 -0
  317. package/dist/domains/quality-assessment/services/quality-analyzer.js +4 -0
  318. package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -0
  319. package/dist/domains/test-generation/index.js +17 -2
  320. package/dist/domains/test-generation/services/test-generator.js +31 -9
  321. package/dist/init/codex-installer.d.ts +13 -0
  322. package/dist/init/codex-installer.js +122 -1
  323. package/dist/init/phases/09-assets.js +4 -0
  324. package/dist/init/phases/phase-interface.d.ts +1 -1
  325. package/dist/integrations/ruvector/rvf-store-integrity.js +5 -1
  326. package/dist/integrations/ruvector/shared-rvf-adapter.js +5 -5
  327. package/dist/learning/real-embeddings.js +15 -1
  328. package/dist/mcp/bundle.js +429 -419
  329. package/dist/mcp/handlers/domain-handler-configs.js +79 -14
  330. package/dist/mcp/types.d.ts +42 -4
  331. package/dist/optimization/session-cache.d.ts +13 -1
  332. package/dist/optimization/session-cache.js +27 -2
  333. package/dist/shared/llm/llm-router-service.js +59 -4
  334. package/dist/shared/llm/router/agent-router-config.d.ts +46 -2
  335. package/dist/shared/llm/router/agent-router-config.js +124 -2
  336. package/dist/shared/llm/router/config-store.d.ts +17 -1
  337. package/dist/shared/llm/router/config-store.js +103 -0
  338. package/dist/shared/llm/router/index.d.ts +2 -2
  339. package/dist/shared/llm/router/index.js +2 -0
  340. package/dist/shared/llm/router/types.d.ts +44 -0
  341. package/dist/shared/llm/router/types.js +1 -0
  342. package/package.json +9 -6
  343. package/dist/cli/chunks/adapter-CWIMFWAI.js +0 -2
  344. package/dist/cli/chunks/aqe-learning-engine-OTXT2DLN.js +0 -2
  345. package/dist/cli/chunks/base-O3SPSWBA.js +0 -2
  346. package/dist/cli/chunks/browser-workflow-MXS3ZKY2.js +0 -2
  347. package/dist/cli/chunks/chunk-G4GTE3RJ.js +0 -2
  348. package/dist/cli/chunks/chunk-G7FMYFTN.js +0 -2
  349. package/dist/cli/chunks/chunk-HVB2L52I.js +0 -2
  350. package/dist/cli/chunks/chunk-MVI2QMRW.js +0 -2
  351. package/dist/cli/chunks/chunk-OZR25R7W.js +0 -2
  352. package/dist/cli/chunks/chunk-PP2RYSHT.js +0 -3
  353. package/dist/cli/chunks/client-33PGO5FA.js +0 -2
  354. package/dist/cli/chunks/codex-installer-C2CUP4FW.js +0 -8
  355. package/dist/cli/chunks/core-handlers-CSNZIM3A.js +0 -2
  356. package/dist/cli/chunks/cross-domain-router-DRIBR5L3.js +0 -2
  357. package/dist/cli/chunks/dream-WUNO723O.js +0 -2
  358. package/dist/cli/chunks/heartbeat-scheduler-VAFQDJLL.js +0 -2
  359. package/dist/cli/chunks/hnsw-adapter-TIRPA7XE.js +0 -2
  360. package/dist/cli/chunks/hnsw-index-SSQBRQCQ.js +0 -2
  361. package/dist/cli/chunks/hybrid-router-AKBWZOQ3.js +0 -2
  362. package/dist/cli/chunks/impact-analyzer-46FQIZ6Y.js +0 -2
  363. package/dist/cli/chunks/init-wizard-U3NHGYSS.js +0 -2
  364. package/dist/cli/chunks/kernel-ZDXHT6QF.js +0 -2
  365. package/dist/cli/chunks/knowledge-graph-6XTW6WO6.js +0 -2
  366. package/dist/cli/chunks/llm-router-service-3F4E64SY.js +0 -2
  367. package/dist/cli/chunks/load-test-SWZNGEIY.js +0 -2
  368. package/dist/cli/chunks/memory-backend-PR74ZPBA.js +0 -2
  369. package/dist/cli/chunks/pattern-null-store-EPE36BVT.js +0 -2
  370. package/dist/cli/chunks/protocol-executor-IELENNST.js +0 -2
  371. package/dist/cli/chunks/provider-manager-3R3KOBHG.js +0 -2
  372. package/dist/cli/chunks/qe-reasoning-bank-S2R2PCBS.js +0 -2
  373. package/dist/cli/chunks/queen-coordinator-2E23NEV4.js +0 -2
  374. package/dist/cli/chunks/router-3FVLWO6S.js +0 -2
  375. package/dist/cli/chunks/routing-feedback-ZQLRNNR7.js +0 -2
  376. package/dist/cli/chunks/rvf-native-adapter-YFGLQNEB.js +0 -2
  377. package/dist/cli/chunks/safe-db-4SBLBTW7.js +0 -2
  378. package/dist/cli/chunks/schedule-5Y3BGVAA.js +0 -2
  379. package/dist/cli/chunks/scheduler-DOID3QF3.js +0 -2
  380. package/dist/cli/chunks/sqlite-persistence-M4JEQO57.js +0 -2
  381. package/dist/cli/chunks/unified-memory-WNYWTGVX.js +0 -2
  382. package/dist/cli/chunks/unified-memory-hnsw-YPAV7U4E.js +0 -2
  383. package/dist/cli/chunks/unified-persistence-TJ252S7L.js +0 -2
  384. package/dist/cli/chunks/visual-security-VKYXEGJB.js +0 -2
  385. package/dist/cli/chunks/witness-chain-WVXRXKQP.js +0 -2
  386. package/dist/cli/chunks/workflow-orchestrator-GOWSPR3G.js +0 -2
@@ -177,14 +177,24 @@ export class ResultSaver {
177
177
  }
178
178
  async saveCoverage(result, prefix, options) {
179
179
  const files = [];
180
+ // #569: branch/function coverage are nullable — `null` means the metric was
181
+ // never collected, which the report must render as "n/a" rather than crash
182
+ // on (or, worse, print as 0.0%).
180
183
  const data = result;
181
184
  const coverageDir = path.join(this.resultsDir, 'coverage');
182
185
  // Save JSON
183
186
  const jsonPath = path.join(coverageDir, `${prefix}_coverage.json`);
184
187
  await fs.writeFile(jsonPath, JSON.stringify(data, null, 2));
185
188
  files.push(await this.createFileEntry(jsonPath, 'json'));
186
- // Save LCOV format
187
- if (options.includeSecondary !== false) {
189
+ // Save LCOV format — ONLY for genuinely measured coverage.
190
+ //
191
+ // #569/ADR-126: LCOV has nowhere to record provenance. Emitting it for an
192
+ // estimated (or absent) result hands downstream tools a file that is
193
+ // indistinguishable from instrumented output — `null` would serialize as
194
+ // `DA:1,0 / LF:100 / LH:0`, asserting a measured 0% over 100 lines that
195
+ // nothing ever measured. The JSON artifact above keeps the full result with
196
+ // its provenance; the lossy format is simply not written when it would lie.
197
+ if (options.includeSecondary !== false && data.measured === true) {
188
198
  const lcovPath = path.join(coverageDir, `${prefix}_coverage.lcov`);
189
199
  const lcovContent = this.generateLcov(data);
190
200
  await fs.writeFile(lcovPath, lcovContent);
@@ -299,12 +309,13 @@ export class ResultSaver {
299
309
  // ==========================================================================
300
310
  generateLcov(data) {
301
311
  // Simplified LCOV - real implementation would have per-file data
302
- return `TN:agentic-qe-coverage
303
- SF:summary
304
- DA:1,${Math.round(data.lineCoverage)}
305
- LF:100
306
- LH:${Math.round(data.lineCoverage)}
307
- end_of_record
312
+ const line = Math.round(data.lineCoverage ?? 0);
313
+ return `TN:agentic-qe-coverage
314
+ SF:summary
315
+ DA:1,${line}
316
+ LF:100
317
+ LH:${line}
318
+ end_of_record
308
319
  `;
309
320
  }
310
321
  generateSarif(data) {
@@ -334,104 +345,115 @@ end_of_record
334
345
  }, null, 2);
335
346
  }
336
347
  generateTestReport(data, options) {
337
- return `# Test Generation Report
338
-
339
- **Generated:** ${new Date().toISOString()}
340
- **Language:** ${options.language || 'typescript'}
341
- **Framework:** ${options.framework || 'vitest'}
342
-
343
- ## Summary
344
-
345
- | Metric | Value |
346
- |--------|-------|
347
- | Tests Generated | ${data.testsGenerated} |
348
- | Coverage Estimate | ${data.coverageEstimate}% |
349
- | Patterns Used | ${data.patternsUsed.length} |
350
-
351
- ## Patterns Applied
352
-
353
- ${data.patternsUsed.map(p => `- ${p}`).join('\n')}
354
-
355
- ## Generated Tests
356
-
357
- ${data.tests.map(t => `### ${t.name}
358
- - **File:** ${t.file}
359
- - **Type:** ${t.type}
360
- `).join('\n')}
348
+ return `# Test Generation Report
349
+
350
+ **Generated:** ${new Date().toISOString()}
351
+ **Language:** ${options.language || 'typescript'}
352
+ **Framework:** ${options.framework || 'vitest'}
353
+
354
+ ## Summary
355
+
356
+ | Metric | Value |
357
+ |--------|-------|
358
+ | Tests Generated | ${data.testsGenerated} |
359
+ | Coverage Estimate | ${data.coverageEstimate}% |
360
+ | Patterns Used | ${data.patternsUsed.length} |
361
+
362
+ ## Patterns Applied
363
+
364
+ ${data.patternsUsed.map(p => `- ${p}`).join('\n')}
365
+
366
+ ## Generated Tests
367
+
368
+ ${data.tests.map(t => `### ${t.name}
369
+ - **File:** ${t.file}
370
+ - **Type:** ${t.type}
371
+ `).join('\n')}
361
372
  `;
362
373
  }
363
374
  generateCoverageReport(data) {
364
- return `# Coverage Analysis Report
365
-
366
- **Generated:** ${new Date().toISOString()}
367
- **Algorithm:** Sublinear O(log n)
368
-
369
- ## Summary
370
-
371
- | Metric | Coverage |
372
- |--------|----------|
373
- | Line Coverage | ${data.lineCoverage.toFixed(1)}% |
374
- | Branch Coverage | ${data.branchCoverage.toFixed(1)}% |
375
- | Function Coverage | ${data.functionCoverage.toFixed(1)}% |
376
- | Statement Coverage | ${data.statementCoverage.toFixed(1)}% |
377
- | Total Files | ${data.totalFiles} |
378
-
379
- ## Coverage Gaps
380
-
381
- ${data.gaps.length === 0 ? 'No significant gaps detected.' : data.gaps.map(g => `### ${g.file}
382
- - **Risk:** ${g.risk}
383
- - **Uncovered Lines:** ${g.lines.join(', ')}
384
- `).join('\n')}
375
+ // #569: a metric that was never collected renders as "not collected", not
376
+ // as a number. Rendering `null` as 0.0% is how "no branch data" became
377
+ // "0% branch coverage" — and the inverse formula made it 100%.
378
+ const metric = (value) => value === null ? '_not collected_' : `${value.toFixed(1)}%`;
379
+ const provenanceBanner = data.estimated
380
+ ? `\n> ⚠️ **ESTIMATED — NOT MEASURED.** No instrumentation ran; these figures are a\n` +
381
+ `> static estimate derived from source shape. Do not treat them as coverage\n` +
382
+ `> measurements or act on individual gaps without running real instrumentation.\n` +
383
+ (data.warning ? `>\n> ${data.warning}\n` : '')
384
+ : '';
385
+ return `# Coverage Analysis Report
386
+
387
+ **Generated:** ${new Date().toISOString()}
388
+ **Algorithm:** Sublinear O(log n)
389
+ **Method:** ${data.coverageMethod ?? 'unknown'}${provenanceBanner}
390
+
391
+ ## Summary
392
+
393
+ | Metric | Coverage |
394
+ |--------|----------|
395
+ | Line Coverage | ${metric(data.lineCoverage)} |
396
+ | Branch Coverage | ${metric(data.branchCoverage)} |
397
+ | Function Coverage | ${metric(data.functionCoverage)} |
398
+ | Statement Coverage | ${metric(data.statementCoverage)} |
399
+ | Total Files | ${data.totalFiles} |
400
+
401
+ ## Coverage Gaps
402
+
403
+ ${data.gaps.length === 0 ? 'No significant gaps detected.' : data.gaps.map(g => `### ${g.file}
404
+ - **Risk:** ${g.risk}
405
+ - **Uncovered Lines:** ${g.lines.join(', ')}
406
+ `).join('\n')}
385
407
  `;
386
408
  }
387
409
  generateSecurityReport(data) {
388
- return `# Security Scan Report
389
-
390
- **Generated:** ${new Date().toISOString()}
391
- **Scanner:** Agentic QE v3 Security
392
-
393
- ## Summary
394
-
395
- | Severity | Count |
396
- |----------|-------|
397
- | Critical | ${data.critical} |
398
- | High | ${data.high} |
399
- | Medium | ${data.medium} |
400
- | Low | ${data.low} |
401
- | **Total** | **${data.vulnerabilities}** |
402
-
403
- ## Top Vulnerabilities
404
-
405
- ${data.topVulnerabilities.map(v => `### ${v.type}
406
- - **Severity:** ${v.severity.toUpperCase()}
407
- - **File:** ${v.file}
408
- - **Line:** ${v.line}
409
- `).join('\n')}
410
-
411
- ## Recommendations
412
-
413
- ${data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
410
+ return `# Security Scan Report
411
+
412
+ **Generated:** ${new Date().toISOString()}
413
+ **Scanner:** Agentic QE v3 Security
414
+
415
+ ## Summary
416
+
417
+ | Severity | Count |
418
+ |----------|-------|
419
+ | Critical | ${data.critical} |
420
+ | High | ${data.high} |
421
+ | Medium | ${data.medium} |
422
+ | Low | ${data.low} |
423
+ | **Total** | **${data.vulnerabilities}** |
424
+
425
+ ## Top Vulnerabilities
426
+
427
+ ${data.topVulnerabilities.map(v => `### ${v.type}
428
+ - **Severity:** ${v.severity.toUpperCase()}
429
+ - **File:** ${v.file}
430
+ - **Line:** ${v.line}
431
+ `).join('\n')}
432
+
433
+ ## Recommendations
434
+
435
+ ${data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
414
436
  `;
415
437
  }
416
438
  generateQualityReport(data) {
417
- return `# Quality Assessment Report
418
-
419
- **Generated:** ${new Date().toISOString()}
420
- **Status:** ${data.passed ? 'PASSED' : 'FAILED'}
421
-
422
- ## Quality Score
423
-
424
- **${data.qualityScore.toFixed(1)}** / 100
425
-
426
- ## Metrics
427
-
428
- | Metric | Score |
429
- |--------|-------|
430
- ${Object.entries(data.metrics).map(([k, v]) => `| ${k} | ${v.toFixed(1)} |`).join('\n')}
431
-
432
- ## Recommendations
433
-
434
- ${data.recommendations.length === 0 ? 'No recommendations - all quality gates passed.' : data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
439
+ return `# Quality Assessment Report
440
+
441
+ **Generated:** ${new Date().toISOString()}
442
+ **Status:** ${data.passed ? 'PASSED' : 'FAILED'}
443
+
444
+ ## Quality Score
445
+
446
+ **${data.qualityScore.toFixed(1)}** / 100
447
+
448
+ ## Metrics
449
+
450
+ | Metric | Score |
451
+ |--------|-------|
452
+ ${Object.entries(data.metrics).map(([k, v]) => `| ${k} | ${v.toFixed(1)} |`).join('\n')}
453
+
454
+ ## Recommendations
455
+
456
+ ${data.recommendations.length === 0 ? 'No recommendations - all quality gates passed.' : data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
435
457
  `;
436
458
  }
437
459
  // ==========================================================================
@@ -53,6 +53,8 @@ export declare class DomainTaskExecutor implements TaskHandlerContext {
53
53
  private coverageAnalyzer;
54
54
  private securityScanner;
55
55
  private testGenerator;
56
+ /** #567: router-free instance for callers that opt out of LLM enhancement. */
57
+ private deterministicTestGenerator;
56
58
  private knowledgeGraph;
57
59
  private qualityAnalyzer;
58
60
  private agentBooster;
@@ -72,7 +74,30 @@ export declare class DomainTaskExecutor implements TaskHandlerContext {
72
74
  setQualityFeedbackLoop(loop: QualityFeedbackLoop | null): void;
73
75
  getCoverageAnalyzer(): CoverageAnalyzerService;
74
76
  getSecurityScanner(): SecurityScannerService;
75
- getTestGenerator(): TestGeneratorService;
77
+ /**
78
+ * Issue #567: async so the ADR-043 LLM router can be resolved before the
79
+ * generator is constructed. `TestGeneratorService` captures `llmRouter` in its
80
+ * constructor, so a router obtained after construction would never be seen —
81
+ * the service must not be built until we know whether one exists.
82
+ *
83
+ * Router resolution order:
84
+ * 1. `kernel.llmRouter` — set during `QEKernelImpl.initialize()`.
85
+ * 2. the shared MCP singleton — same instance the kernel registers via
86
+ * `setSharedLLMRouter()`, and the lazily-built one in standalone MCP mode.
87
+ *
88
+ * Both may be absent (no provider keys, no llm-config.json, or the
89
+ * `AQE_LLM_ROUTER_DISABLED` kill-switch). That is not an error: the generator
90
+ * falls back to deterministic template generation exactly as before.
91
+ */
92
+ getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
93
+ /**
94
+ * Best-effort LLM router lookup. Never throws — a missing or failed router
95
+ * degrades to `undefined` so deterministic generation still runs.
96
+ *
97
+ * The import is dynamic: `mcp/tools/base` transitively reaches back into
98
+ * coordination, so a static import here would be circular.
99
+ */
100
+ private resolveLLMRouter;
76
101
  getKnowledgeGraph(): KnowledgeGraphService;
77
102
  getQualityAnalyzer(): QualityAnalyzerService;
78
103
  private registerHandlers;
@@ -40,9 +40,9 @@ function resolveSecurityScannerService(memory) {
40
40
  const factory = DomainServiceRegistry.resolve(ServiceKeys.SecurityScannerService);
41
41
  return factory(memory);
42
42
  }
43
- function resolveTestGeneratorService(memory) {
43
+ function resolveTestGeneratorService(memory, llmRouter) {
44
44
  const factory = DomainServiceRegistry.resolve(ServiceKeys.createTestGeneratorService);
45
- return factory(memory);
45
+ return factory(memory, llmRouter);
46
46
  }
47
47
  function resolveKnowledgeGraphService(memory) {
48
48
  const factory = DomainServiceRegistry.resolve(ServiceKeys.KnowledgeGraphService);
@@ -119,6 +119,8 @@ export class DomainTaskExecutor {
119
119
  coverageAnalyzer = null;
120
120
  securityScanner = null;
121
121
  testGenerator = null;
122
+ /** #567: router-free instance for callers that opt out of LLM enhancement. */
123
+ deterministicTestGenerator = null;
122
124
  knowledgeGraph = null;
123
125
  qualityAnalyzer = null;
124
126
  // ADR-051: Lazy-initialized Agent Booster and Task Router (instance-level)
@@ -175,12 +177,58 @@ export class DomainTaskExecutor {
175
177
  }
176
178
  return this.securityScanner;
177
179
  }
178
- getTestGenerator() {
180
+ /**
181
+ * Issue #567: async so the ADR-043 LLM router can be resolved before the
182
+ * generator is constructed. `TestGeneratorService` captures `llmRouter` in its
183
+ * constructor, so a router obtained after construction would never be seen —
184
+ * the service must not be built until we know whether one exists.
185
+ *
186
+ * Router resolution order:
187
+ * 1. `kernel.llmRouter` — set during `QEKernelImpl.initialize()`.
188
+ * 2. the shared MCP singleton — same instance the kernel registers via
189
+ * `setSharedLLMRouter()`, and the lazily-built one in standalone MCP mode.
190
+ *
191
+ * Both may be absent (no provider keys, no llm-config.json, or the
192
+ * `AQE_LLM_ROUTER_DISABLED` kill-switch). That is not an error: the generator
193
+ * falls back to deterministic template generation exactly as before.
194
+ */
195
+ async getTestGenerator(useLLM = true) {
196
+ // Two cached instances, because the router is a constructor-captured
197
+ // dependency: callers passing `aiEnhancement: false` must get a service
198
+ // that was never handed a router, not one that merely declines to use it.
199
+ if (!useLLM) {
200
+ if (!this.deterministicTestGenerator) {
201
+ this.deterministicTestGenerator = resolveTestGeneratorService(this.kernel.memory);
202
+ }
203
+ return this.deterministicTestGenerator;
204
+ }
179
205
  if (!this.testGenerator) {
180
- this.testGenerator = resolveTestGeneratorService(this.kernel.memory);
206
+ this.testGenerator = resolveTestGeneratorService(this.kernel.memory, await this.resolveLLMRouter());
181
207
  }
182
208
  return this.testGenerator;
183
209
  }
210
+ /**
211
+ * Best-effort LLM router lookup. Never throws — a missing or failed router
212
+ * degrades to `undefined` so deterministic generation still runs.
213
+ *
214
+ * The import is dynamic: `mcp/tools/base` transitively reaches back into
215
+ * coordination, so a static import here would be circular.
216
+ */
217
+ async resolveLLMRouter() {
218
+ if (this.kernel.llmRouter) {
219
+ return this.kernel.llmRouter;
220
+ }
221
+ try {
222
+ const { getSharedLLMRouter } = await import('../mcp/tools/base.js');
223
+ return (await getSharedLLMRouter()) ?? undefined;
224
+ }
225
+ catch (error) {
226
+ logger.debug('LLM router unavailable; using deterministic generation', {
227
+ error: toErrorMessage(error),
228
+ });
229
+ return undefined;
230
+ }
231
+ }
184
232
  getKnowledgeGraph() {
185
233
  if (!this.knowledgeGraph) {
186
234
  this.knowledgeGraph = resolveKnowledgeGraphService(this.kernel.memory);
@@ -384,6 +384,10 @@ Be precise and only report high-confidence findings.`,
384
384
  model: modelId,
385
385
  maxTokens: this.config.llmMaxTokens ?? 2048,
386
386
  temperature: 0.2, // Low temperature for consistent analysis
387
+ // Issue #568: per-agent routing rules (including the user's on-disk
388
+ // `agentOverrides`) match on `agentType`; without it an override for
389
+ // this agent never fires.
390
+ agentType: 'qe-code-intelligence',
387
391
  });
388
392
  if (response.content) {
389
393
  return this.parseLLMRelationshipResponse(response.content);
@@ -472,6 +476,10 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
472
476
  model: modelId,
473
477
  maxTokens: 1024,
474
478
  temperature: 0.3,
479
+ // Issue #568: per-agent routing rules (including the user's on-disk
480
+ // `agentOverrides`) match on `agentType`; without it an override for
481
+ // this agent never fires.
482
+ agentType: 'qe-code-intelligence',
475
483
  });
476
484
  if (response.content) {
477
485
  try {
@@ -245,6 +245,10 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
245
245
  model: modelId,
246
246
  maxTokens: this.config.llmMaxTokens ?? 2048,
247
247
  temperature: 0.3, // Low temperature for consistent analysis
248
+ // Issue #568: per-agent routing rules (including the user's on-disk
249
+ // `agentOverrides`) match on `agentType`; without it an override for
250
+ // this agent never fires.
251
+ agentType: 'qe-coverage-specialist',
248
252
  });
249
253
  if (response.content && response.content.length > 0) {
250
254
  return this.parseInsightsResponse(response.content);
@@ -116,6 +116,10 @@ Return JSON in this exact format:
116
116
  model: modelId,
117
117
  maxTokens: this.config.llmMaxTokens ?? 2048,
118
118
  temperature: 0.3, // Low temperature for consistent analysis
119
+ // Issue #568: per-agent routing rules (including the user's on-disk
120
+ // `agentOverrides`) match on `agentType`; without it an override for
121
+ // this agent never fires.
122
+ agentType: 'qe-gap-detector',
119
123
  });
120
124
  if (response.content) {
121
125
  const analysis = this.parseGapAnalysisResponse(response.content, gaps);
@@ -160,6 +160,10 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
160
160
  model: modelId,
161
161
  maxTokens: this.config.llmMaxTokens ?? 2048,
162
162
  temperature: 0.3, // Low temperature for consistent analysis
163
+ // Issue #568: per-agent routing rules (including the user's on-disk
164
+ // `agentOverrides`) match on `agentType`; without it an override for
165
+ // this agent never fires.
166
+ agentType: 'qe-defect-predictor',
163
167
  });
164
168
  if (response.content && response.content.length > 0) {
165
169
  return this.parseLLMDefectAnalysis(response.content);
@@ -243,6 +243,10 @@ Return your analysis as JSON with this structure:
243
243
  model: modelId,
244
244
  maxTokens: this.config.llmMaxTokens ?? 2048,
245
245
  temperature: 0.3, // Low temperature for consistent analysis
246
+ // Issue #568: per-agent routing rules (including the user's on-disk
247
+ // `agentOverrides`) match on `agentType`; without it an override for
248
+ // this agent never fires.
249
+ agentType: 'qe-root-cause-analyzer',
246
250
  });
247
251
  if (response.content && response.content.length > 0) {
248
252
  return this.parseLLMAnalysisResponse(response.content);
@@ -134,6 +134,10 @@ Provide deployment advice specific to these metrics.`,
134
134
  model: modelId,
135
135
  maxTokens: 2048,
136
136
  temperature: 0.3, // Low temperature for consistent advice
137
+ // Issue #568: per-agent routing rules (including the user's on-disk
138
+ // `agentOverrides`) match on `agentType`; without it an override for
139
+ // this agent never fires.
140
+ agentType: 'qe-deployment-advisor',
137
141
  });
138
142
  if (response.content) {
139
143
  try {
@@ -131,6 +131,10 @@ Focus on:
131
131
  model: modelId,
132
132
  maxTokens: this.config.llmMaxTokens ?? 2048,
133
133
  temperature: 0.3, // Low temperature for consistent analysis
134
+ // Issue #568: per-agent routing rules (including the user's on-disk
135
+ // `agentOverrides`) match on `agentType`; without it an override for
136
+ // this agent never fires.
137
+ agentType: 'qe-quality-gate',
134
138
  });
135
139
  if (response.content && response.content.length > 0) {
136
140
  return this.parseQualityInsightsResponse(response.content);
@@ -538,6 +538,10 @@ Provide detailed remediation advice specific to this code.`,
538
538
  model: modelId,
539
539
  maxTokens: 1500,
540
540
  temperature: 0.2,
541
+ // Issue #568: per-agent routing rules (including the user's on-disk
542
+ // `agentOverrides`) match on `agentType`; without it an override for
543
+ // this agent never fires.
544
+ agentType: 'qe-security-scanner',
541
545
  });
542
546
  if (response.content) {
543
547
  try {
@@ -29,6 +29,21 @@ export { TestGenerationCoherenceGate, createTestGenerationCoherenceGate, Coheren
29
29
  // so coordination/ can resolve them without importing from domains/.
30
30
  // ============================================================================
31
31
  import { DomainServiceRegistry, ServiceKeys } from '../../shared/domain-service-registry';
32
- import { createTestGeneratorService as _createTestGeneratorService } from './services/test-generator';
33
- DomainServiceRegistry.register(ServiceKeys.createTestGeneratorService, (memory) => _createTestGeneratorService(memory));
32
+ import { createTestGeneratorService as _createTestGeneratorService, createTestGeneratorServiceWithDependencies as _createTestGeneratorServiceWithDependencies, } from './services/test-generator';
33
+ /**
34
+ * Issue #567: the factory MUST accept an optional `llmRouter`.
35
+ *
36
+ * The flat MCP tool `test_generate_enhanced` and the CLI both reach the
37
+ * generator through the task-executor, which resolves it from this registry.
38
+ * When the factory dropped `llmRouter` on the floor,
39
+ * `TestGeneratorService.isLLMEnhancementAvailable()` was permanently false and
40
+ * the ADR-051 LLM branch was unreachable on those paths — the tool silently
41
+ * returned generic template scaffolding no matter how the provider was
42
+ * configured. Keep the second parameter optional so the router stays a
43
+ * degradation-friendly dependency: no router => deterministic templates, same
44
+ * as before.
45
+ */
46
+ DomainServiceRegistry.register(ServiceKeys.createTestGeneratorService, (memory, llmRouter) => llmRouter
47
+ ? _createTestGeneratorServiceWithDependencies({ memory, llmRouter })
48
+ : _createTestGeneratorService(memory));
34
49
  //# sourceMappingURL=index.js.map
@@ -12,6 +12,7 @@ import * as fs from 'fs';
12
12
  import * as path from 'path';
13
13
  import ts from 'typescript';
14
14
  import { ok, err } from '../../../shared/types';
15
+ import { toErrorMessage } from '../../../shared/error-utils.js';
15
16
  import { TestGeneratorFactory } from '../factories/test-generator-factory';
16
17
  import { TDDGeneratorService } from './tdd-generator';
17
18
  import { PropertyTestGeneratorService } from './property-test-generator';
@@ -128,7 +129,7 @@ export class TestGeneratorService {
128
129
  */
129
130
  async enhanceTestWithLLM(testCode, sourceCode, analysis, context) {
130
131
  if (!this.llmRouter)
131
- return testCode;
132
+ return { code: testCode, enhanced: false };
132
133
  try {
133
134
  let prompt = this.buildTestEnhancementPrompt(testCode, sourceCode, analysis);
134
135
  // Prepend historical edge case patterns if injector is available (loki-mode Item 5)
@@ -189,6 +190,10 @@ Return ONLY the enhanced test code, no explanations.`,
189
190
  model: modelId,
190
191
  maxTokens: this.config.llmMaxTokens,
191
192
  temperature: 0.3, // Low temperature for consistent code generation
193
+ // Issue #568: the router's per-agent routing rules (including the user's
194
+ // on-disk `agentOverrides`) match on `agentType`. Without it, an override
195
+ // for `qe-test-architect` silently never fires on this call.
196
+ agentType: 'qe-test-architect',
192
197
  });
193
198
  if (response.content && response.content.length > 0) {
194
199
  // Extract code from response, handling potential markdown fences
@@ -197,13 +202,22 @@ Return ONLY the enhanced test code, no explanations.`,
197
202
  if (codeMatch) {
198
203
  enhancedCode = codeMatch[1].trim();
199
204
  }
200
- return enhancedCode || testCode;
205
+ // #567: only claim enhancement when the model actually returned code.
206
+ // An empty/unusable response falls back to the template, and the caller
207
+ // must be told that is what happened.
208
+ return enhancedCode
209
+ ? { code: enhancedCode, enhanced: true }
210
+ : { code: testCode, enhanced: false };
201
211
  }
202
- return testCode;
212
+ return { code: testCode, enhanced: false };
203
213
  }
204
214
  catch (error) {
205
- logger.warn('LLM enhancement failed, using original:');
206
- return testCode;
215
+ // #567: a configured-but-broken provider (401, timeout, wrong model) used
216
+ // to fall back to the template while the result still reported
217
+ // `llmEnhanced: true` — the exact "silently receives non-LLM scaffolding"
218
+ // failure this issue is about, just one layer deeper. Report the truth.
219
+ logger.warn(`LLM enhancement failed, using deterministic template: ${toErrorMessage(error)}`);
220
+ return { code: testCode, enhanced: false };
207
221
  }
208
222
  }
209
223
  /**
@@ -261,6 +275,8 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
261
275
  model: modelId,
262
276
  maxTokens: 1024,
263
277
  temperature: 0.5,
278
+ // Issue #568: see above — required for per-agent routing to apply.
279
+ agentType: 'qe-test-architect',
264
280
  });
265
281
  if (response.content) {
266
282
  try {
@@ -443,9 +459,15 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
443
459
  similarCode,
444
460
  };
445
461
  let testCode = generator.generateTests(context);
446
- // ADR-051: Enhance with LLM if enabled and available
462
+ // ADR-051: Enhance with LLM if enabled and available.
463
+ // #567: `llmEnhanced` reflects whether the LLM actually produced the code,
464
+ // not merely whether a router was configured — a broken provider must not
465
+ // report AI-enhanced output it did not produce.
466
+ let llmEnhanced = false;
447
467
  if (this.isLLMEnhancementAvailable() && sourceContent) {
448
- testCode = await this.enhanceTestWithLLM(testCode, sourceContent, codeAnalysis, context);
468
+ const result = await this.enhanceTestWithLLM(testCode, sourceContent, codeAnalysis, context);
469
+ testCode = result.code;
470
+ llmEnhanced = result.enhanced;
449
471
  }
450
472
  const test = {
451
473
  id: uuidv4(),
@@ -458,8 +480,8 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
458
480
  // ADR-078: Include detected language and framework
459
481
  language: effectiveLanguage,
460
482
  framework: framework,
461
- // ADR-051: Mark if LLM-enhanced
462
- llmEnhanced: this.isLLMEnhancementAvailable(),
483
+ // ADR-051 / #567: true only when the LLM actually produced this code.
484
+ llmEnhanced,
463
485
  };
464
486
  // ADR-077: Compilation validation if requested
465
487
  if (originalRequest?.compileValidation && effectiveLanguage) {
@@ -18,9 +18,13 @@ export interface CodexInstallResult {
18
18
  success: boolean;
19
19
  mcpConfigured: boolean;
20
20
  agentsMdInstalled: boolean;
21
+ hooksConfigured: boolean;
22
+ skillsInstalled: number;
21
23
  errors: string[];
22
24
  configPath: string;
23
25
  agentsMdPath: string;
26
+ hooksPath: string;
27
+ skillsPath: string;
24
28
  }
25
29
  export declare class CodexInstaller {
26
30
  private projectRoot;
@@ -29,6 +33,15 @@ export declare class CodexInstaller {
29
33
  private generator;
30
34
  constructor(options: CodexInstallerOptions);
31
35
  install(): Promise<CodexInstallResult>;
36
+ /**
37
+ * Install Codex-native lifecycle adapters and merge AQE/ruflo hook groups
38
+ * without removing user-defined hooks.
39
+ */
40
+ private installCodexHooks;
41
+ /** Install the curated repo-scoped AQE skills Codex discovers automatically. */
42
+ private installCodexSkills;
43
+ private copyDirectory;
44
+ private resolvePackageRoot;
32
45
  /**
33
46
  * Merge AQE MCP server config into existing TOML.
34
47
  * Simple approach: if [mcp_servers.agentic-qe] already exists, skip.