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.
- package/.agents/skills/aqe-plan-quality/SKILL.md +25 -0
- package/.agents/skills/aqe-plan-quality/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-plan-quality/references/qe-routing.md +22 -0
- package/.agents/skills/aqe-review-quality/SKILL.md +24 -0
- package/.agents/skills/aqe-review-quality/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-review-quality/references/quality-gates.md +20 -0
- package/.agents/skills/aqe-test-change/SKILL.md +26 -0
- package/.agents/skills/aqe-test-change/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-test-change/references/test-specialties.md +23 -0
- package/.claude/helpers/ruflo-hook.cjs +5 -1
- package/.claude/skills/skills-manifest.json +1 -1
- package/.codex/hooks/aqe-codex-hook.cjs +69 -0
- package/.codex/hooks/ruflo-codex-hook.cjs +94 -0
- package/.codex/hooks.json +169 -0
- package/CHANGELOG.md +123 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-I4SNWMCM.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-ACX2DK7Y.js → agent-booster-wasm-PZYYTKSS.js} +2 -2
- package/dist/cli/chunks/{agent-handler-B45WP4ZJ.js → agent-handler-DNN7GXUN.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-QQLZDE56.js → agent-memory-branch-LVCBBCQY.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-WI47XKXI.js +2 -0
- package/dist/cli/chunks/{arena-SDB7723R.js → arena-422HSTPE.js} +2 -2
- package/dist/cli/chunks/{arena-G3IKZAG5.js → arena-OCEOLMCH.js} +4 -4
- package/dist/cli/chunks/{audit-GY46XUZA.js → audit-5O45K34M.js} +3 -3
- package/dist/cli/chunks/base-VJ6VDLD7.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-RJPBJU2Q.js → better-sqlite3-Y36THYK2.js} +2 -2
- package/dist/cli/chunks/{brain-handler-347CYMPN.js → brain-handler-7VHXYN3P.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-Z3ULBFSM.js → branch-enumerator-PZKOD6S6.js} +2 -2
- package/dist/cli/chunks/{browser-OYEIHD7F.js → browser-M74UO4WJ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WRYHQQDU.js +2 -0
- package/dist/cli/chunks/{chunk-RVJPWRV6.js → chunk-24S5IUSI.js} +2 -2
- package/dist/cli/chunks/{chunk-3NOCK6ED.js → chunk-2DG44UZ5.js} +2 -2
- package/dist/cli/chunks/{chunk-34PEINFS.js → chunk-2QJPAQE5.js} +2 -2
- package/dist/cli/chunks/{chunk-SHCTEXNH.js → chunk-4DKL4H5L.js} +2 -2
- package/dist/cli/chunks/{chunk-A4QLGPYO.js → chunk-4FYTWD4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-YFGAHNCG.js → chunk-4HFNY3Z2.js} +3 -3
- package/dist/cli/chunks/{chunk-RVRBTOWX.js → chunk-4PM5VORA.js} +2 -2
- package/dist/cli/chunks/{chunk-QWYISZTN.js → chunk-4SFOQSXU.js} +2 -2
- package/dist/cli/chunks/{chunk-RSFIOR2I.js → chunk-4STE6VLR.js} +87 -87
- package/dist/cli/chunks/{chunk-54MFKCLT.js → chunk-54BCLRRJ.js} +2 -2
- package/dist/cli/chunks/{chunk-IYDYJ33J.js → chunk-5AAG7JTB.js} +2 -2
- package/dist/cli/chunks/{chunk-TVMFH5N2.js → chunk-5EFNZEOB.js} +2 -2
- package/dist/cli/chunks/{chunk-GUEZQOHL.js → chunk-5GGGZYFA.js} +1 -1
- package/dist/cli/chunks/{chunk-5KAT6WBQ.js → chunk-5KMBZTDI.js} +2 -2
- package/dist/cli/chunks/{chunk-ANYYTWOQ.js → chunk-5XYVRTI6.js} +2 -2
- package/dist/cli/chunks/{chunk-ANIDFJCT.js → chunk-62D27BDO.js} +3 -3
- package/dist/cli/chunks/{chunk-SNTUKW4Q.js → chunk-6DMB6WK5.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCFZ4USU.js → chunk-6R7TX5L4.js} +1 -1
- package/dist/cli/chunks/chunk-6UGYFYS4.js +2 -0
- package/dist/cli/chunks/chunk-6XHDH3IJ.js +3 -0
- package/dist/cli/chunks/{chunk-IHQTXJAQ.js → chunk-73HALJY5.js} +1 -1
- package/dist/cli/chunks/{chunk-7YXT6BXN.js → chunk-7TCVVVFA.js} +3 -3
- package/dist/cli/chunks/{chunk-RJZRWVL4.js → chunk-A2OD5Z4B.js} +1 -1
- package/dist/cli/chunks/{chunk-ES7WCYOU.js → chunk-AJ7A52GF.js} +1 -1
- package/dist/cli/chunks/{chunk-QCEW4ZDW.js → chunk-AP2BBV2D.js} +2 -2
- package/dist/cli/chunks/{chunk-FQLWQWRU.js → chunk-AS2HVJ42.js} +3 -3
- package/dist/cli/chunks/{chunk-7UNY32PU.js → chunk-ASIGTVFQ.js} +1 -1
- package/dist/cli/chunks/{chunk-EECM5XKY.js → chunk-B7KZMPF2.js} +1 -1
- package/dist/cli/chunks/{chunk-Z6QCOZ2H.js → chunk-BFKXHXWW.js} +2 -2
- package/dist/cli/chunks/{chunk-VC6EXDGY.js → chunk-BO2RBAPF.js} +2 -2
- package/dist/cli/chunks/{chunk-OXXMVQDF.js → chunk-BSQ32ZS5.js} +2 -2
- package/dist/cli/chunks/{chunk-WRYT4HTZ.js → chunk-CKTFKA7Q.js} +2 -2
- package/dist/cli/chunks/{chunk-QQB55ZJJ.js → chunk-CLBBFKXV.js} +2 -2
- package/dist/cli/chunks/{chunk-5FLTZ3KT.js → chunk-COOMXCCP.js} +2 -2
- package/dist/cli/chunks/{chunk-DYUC7WFA.js → chunk-DAHNHVND.js} +1 -1
- package/dist/cli/chunks/{chunk-6AOBLBR4.js → chunk-DCQQJLUY.js} +2 -2
- package/dist/cli/chunks/{chunk-LBE2P6UC.js → chunk-DIPOFCBX.js} +2 -2
- package/dist/cli/chunks/{chunk-EFRESRLB.js → chunk-DL2HDULJ.js} +5 -5
- package/dist/cli/chunks/{chunk-YRQLVGCI.js → chunk-DQXSDWRP.js} +2 -2
- package/dist/cli/chunks/{chunk-QI4CGJNK.js → chunk-E6JJ4ZRQ.js} +1 -1
- package/dist/cli/chunks/{chunk-KUA4HHU6.js → chunk-E6PYV3DB.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJG6N2OK.js → chunk-EABGQVTV.js} +1 -1
- package/dist/cli/chunks/{chunk-U2SW6KK5.js → chunk-EFHMS7TJ.js} +2 -2
- package/dist/cli/chunks/{chunk-CWUBOLKY.js → chunk-ELVUERQW.js} +2 -2
- package/dist/cli/chunks/{chunk-A7GLWWSE.js → chunk-EU7NUUL6.js} +1 -1
- package/dist/cli/chunks/{chunk-3UHEZ5HZ.js → chunk-F6UMLI5Y.js} +2 -2
- package/dist/cli/chunks/{chunk-TZPKTRJB.js → chunk-FECBWGCA.js} +2 -2
- package/dist/cli/chunks/{chunk-OETDMOOE.js → chunk-FFMUTX26.js} +1 -1
- package/dist/cli/chunks/{chunk-VLNPJAVH.js → chunk-FJ2L6P7O.js} +1 -1
- package/dist/cli/chunks/{chunk-2DIT5AUU.js → chunk-FMYNKZ2S.js} +2 -2
- package/dist/cli/chunks/{chunk-L4LLA5U7.js → chunk-FXXXLDB3.js} +1 -1
- package/dist/cli/chunks/{chunk-D3MPV5G7.js → chunk-FZEWEG6Q.js} +2 -2
- package/dist/cli/chunks/{chunk-BGYLNCL6.js → chunk-G4LZ5SBC.js} +2 -2
- package/dist/cli/chunks/{chunk-J3L52EA4.js → chunk-GHJRLC3C.js} +5 -5
- package/dist/cli/chunks/{chunk-3JVUWKCO.js → chunk-GKKD22CC.js} +2 -2
- package/dist/cli/chunks/{chunk-32ZGV4Q4.js → chunk-GMKJWOXZ.js} +1 -1
- package/dist/cli/chunks/chunk-GMKQJEKX.js +2 -0
- package/dist/cli/chunks/{chunk-3GSYD5SL.js → chunk-GZ775E5O.js} +2 -2
- package/dist/cli/chunks/{chunk-GTUFX7AR.js → chunk-H6C2YTPX.js} +2 -2
- package/dist/cli/chunks/{chunk-UIPPJKON.js → chunk-HANBJ37Z.js} +2 -2
- package/dist/cli/chunks/{chunk-ZOXWASCC.js → chunk-HANJESCY.js} +2 -2
- package/dist/cli/chunks/{chunk-JPIBPKBP.js → chunk-HD6PZHLC.js} +3 -3
- package/dist/cli/chunks/{chunk-FQY3UTGA.js → chunk-HHUKHEW5.js} +2 -2
- package/dist/cli/chunks/{chunk-W5YEIHIO.js → chunk-HQCJYUKC.js} +2 -2
- package/dist/cli/chunks/{chunk-CYL2FV23.js → chunk-IIZ3HBPV.js} +2 -2
- package/dist/cli/chunks/{chunk-HTPM3URI.js → chunk-IV77BQ2R.js} +2 -2
- package/dist/cli/chunks/{chunk-THBTN7XB.js → chunk-J722Z7VO.js} +2 -2
- package/dist/cli/chunks/{chunk-5EIOQCGN.js → chunk-JDRYENTD.js} +2 -2
- package/dist/cli/chunks/{chunk-NQNKKVNO.js → chunk-JKVUSXT4.js} +3 -3
- package/dist/cli/chunks/{chunk-CQFT7H3F.js → chunk-JMRUHQEL.js} +2 -2
- package/dist/cli/chunks/{chunk-PERJO2DY.js → chunk-JPO4AC5Q.js} +1 -1
- package/dist/cli/chunks/{chunk-KSYLRM4Q.js → chunk-JPPHM3I6.js} +2 -2
- package/dist/cli/chunks/{chunk-56WZFXTQ.js → chunk-K3MNTU4O.js} +2 -2
- package/dist/cli/chunks/{chunk-CPH5JP4L.js → chunk-K47EWX3M.js} +1 -1
- package/dist/cli/chunks/{chunk-7DMXCCSD.js → chunk-KAHMXURL.js} +1 -1
- package/dist/cli/chunks/{chunk-UNIBND6A.js → chunk-KHVW6DQS.js} +1 -1
- package/dist/cli/chunks/{chunk-RLCWR7TS.js → chunk-KKPWS3XJ.js} +98 -88
- package/dist/cli/chunks/chunk-KRRGOJ6K.js +2 -0
- package/dist/cli/chunks/chunk-LEOSNZR2.js +2 -0
- package/dist/cli/chunks/{chunk-TNRIGQ6U.js → chunk-LG6UUM55.js} +2 -2
- package/dist/cli/chunks/{chunk-HOKON5EL.js → chunk-LJWIBYTR.js} +2 -2
- package/dist/cli/chunks/{chunk-N7VOOI3U.js → chunk-LQDQTLWV.js} +2 -2
- package/dist/cli/chunks/{chunk-2NRZYQSF.js → chunk-LXYVWAFN.js} +2 -2
- package/dist/cli/chunks/{chunk-YPTGE5NJ.js → chunk-LZNJ7HXB.js} +2 -2
- package/dist/cli/chunks/{chunk-6SXKCIN5.js → chunk-M4JZOCV3.js} +1 -1
- package/dist/cli/chunks/{chunk-UMG5URNV.js → chunk-MBTVAIFF.js} +1 -1
- package/dist/cli/chunks/{chunk-N5MMBA35.js → chunk-MNDPSIEI.js} +1 -1
- package/dist/cli/chunks/{chunk-L4S722JD.js → chunk-MUSLUG6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-VLBV2VL3.js → chunk-MVJ5UQI3.js} +1 -1
- package/dist/cli/chunks/{chunk-XFCWYQHW.js → chunk-N2AGOQCL.js} +2 -2
- package/dist/cli/chunks/{chunk-KVL63BSU.js → chunk-N4O2RWSL.js} +1 -1
- package/dist/cli/chunks/{chunk-L2SFGFE6.js → chunk-NBRKZOPM.js} +1 -1
- package/dist/cli/chunks/{chunk-NETN3OUG.js → chunk-NIE3SGZM.js} +1 -1
- package/dist/cli/chunks/{chunk-LOXVVMS4.js → chunk-NNIKJZA4.js} +3 -3
- package/dist/cli/chunks/{chunk-5ICQL42E.js → chunk-NTKIDOIW.js} +2 -2
- package/dist/cli/chunks/{chunk-Q7PBGNUD.js → chunk-ODE7Z667.js} +1 -1
- package/dist/cli/chunks/{chunk-K5N6SLHO.js → chunk-OYWZYG6Q.js} +1 -1
- package/dist/cli/chunks/{chunk-CFVEDUTW.js → chunk-P33EORZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-R3GEXYO4.js → chunk-PILZKQX7.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJIX5FGQ.js → chunk-PJOH5Z5I.js} +2 -2
- package/dist/cli/chunks/{chunk-JGM6XCCP.js → chunk-PNQWEOE2.js} +1 -1
- package/dist/cli/chunks/{chunk-XKFE3FLI.js → chunk-PRQPUOSH.js} +2 -2
- package/dist/cli/chunks/{chunk-LWYLW7RX.js → chunk-PT6NTWGT.js} +2 -2
- package/dist/cli/chunks/{chunk-FBBZHATF.js → chunk-Q45FBGVV.js} +1 -1
- package/dist/cli/chunks/{chunk-SRQ3CPJE.js → chunk-Q625ISQI.js} +4 -4
- package/dist/cli/chunks/{chunk-BOVH6WSM.js → chunk-QS6TI7NR.js} +2 -2
- package/dist/cli/chunks/{chunk-4BDLD7V2.js → chunk-QVD3LU27.js} +1 -1
- package/dist/cli/chunks/{chunk-ZLXBNNNT.js → chunk-QZACODX6.js} +2 -2
- package/dist/cli/chunks/{chunk-NUQBJGGF.js → chunk-REBNPQI7.js} +2 -2
- package/dist/cli/chunks/{chunk-FAQLI3P5.js → chunk-RF2DMPX2.js} +2 -2
- package/dist/cli/chunks/{chunk-2VQVEQS4.js → chunk-RI2V2U2N.js} +2 -2
- package/dist/cli/chunks/{chunk-GJMZR7WU.js → chunk-RJYAUJDC.js} +3 -3
- package/dist/cli/chunks/{chunk-KZTBNDNE.js → chunk-RWHHOQIC.js} +1 -1
- package/dist/cli/chunks/{chunk-ZEIG5IQ4.js → chunk-RWUK5VMZ.js} +2 -2
- package/dist/cli/chunks/{chunk-E3B5XTXJ.js → chunk-SOOI2HJB.js} +1 -1
- package/dist/cli/chunks/{chunk-IPHLXAMX.js → chunk-T2XXTEZV.js} +2 -2
- package/dist/cli/chunks/{chunk-USMDIIHY.js → chunk-T55XIENI.js} +2 -2
- package/dist/cli/chunks/{chunk-VSNRPMAZ.js → chunk-T726SRYP.js} +2 -2
- package/dist/cli/chunks/{chunk-RDU4WTV2.js → chunk-TLG56A27.js} +2 -2
- package/dist/cli/chunks/{chunk-FUU32QY5.js → chunk-TTWWCWAR.js} +2 -2
- package/dist/cli/chunks/{chunk-LXPB7H2P.js → chunk-TVWX7NYD.js} +1 -1
- package/dist/cli/chunks/{chunk-G5DFYX3J.js → chunk-U2FCUBBW.js} +2 -2
- package/dist/cli/chunks/{chunk-DRIJYTSK.js → chunk-UIQVVS7K.js} +2 -2
- package/dist/cli/chunks/{chunk-6DTOGSDV.js → chunk-UPGJZA3D.js} +4 -4
- package/dist/cli/chunks/{chunk-3K4SF57Q.js → chunk-UVLWT6QM.js} +1 -1
- package/dist/cli/chunks/{chunk-FL3BM54K.js → chunk-VKU5BUUC.js} +1 -1
- package/dist/cli/chunks/{chunk-AO7AHX6K.js → chunk-VOYUCJLK.js} +2 -2
- package/dist/cli/chunks/{chunk-BCKTBGDM.js → chunk-WMK2ZNLM.js} +3 -3
- package/dist/cli/chunks/{chunk-4BESADKE.js → chunk-WTSVP6OK.js} +2 -2
- package/dist/cli/chunks/{chunk-MBCGI3M2.js → chunk-XS2S3ECA.js} +5 -5
- package/dist/cli/chunks/chunk-XXQLFPIK.js +2 -0
- package/dist/cli/chunks/{chunk-HL2QMM4M.js → chunk-XZOTFJHU.js} +2 -2
- package/dist/cli/chunks/{chunk-QTU3CVOB.js → chunk-YTHUTBBH.js} +2 -2
- package/dist/cli/chunks/{chunk-BUGWPTMF.js → chunk-YWJ2GPD4.js} +2 -2
- package/dist/cli/chunks/{chunk-GFBLWFRV.js → chunk-YXTDCP6H.js} +1 -1
- package/dist/cli/chunks/{chunk-TZ73SXQ5.js → chunk-YZUMCXH6.js} +1 -1
- package/dist/cli/chunks/{chunk-VHYMSZNF.js → chunk-ZIT5VF43.js} +2 -2
- package/dist/cli/chunks/{chunk-IZRLIWFN.js → chunk-ZY5FB3JV.js} +2 -2
- package/dist/cli/chunks/{ci-74ZUCO5V.js → ci-EOFZKCSH.js} +2 -2
- package/dist/cli/chunks/{ci-output-HD6IZNJA.js → ci-output-TAJFQWDP.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-USZVMA42.js → circuit-breaker-QA7YJ3IF.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-S4XKNCD5.js → claude-flow-setup-4RNAIALK.js} +2 -2
- package/dist/cli/chunks/client-N2WAM5IK.js +2 -0
- package/dist/cli/chunks/{cline-installer-6EW4CHAR.js → cline-installer-K25NUUA4.js} +2 -2
- package/dist/cli/chunks/{code-TOLWD2XL.js → code-JM4D3I2W.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-UA4QQ7B3.js → code-index-extractor-6B6TJ2B5.js} +2 -2
- package/dist/cli/chunks/codex-installer-GRUENCIO.js +10 -0
- package/dist/cli/chunks/{completions-KVUMQQ4K.js → completions-LADTXGCC.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-DFH6LMK2.js → complexity-analyzer-IQITOJH5.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-LYDQSAU7.js → continuedev-installer-H6NAXFZK.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-7USXLZHZ.js → copilot-installer-W7HCQKOS.js} +2 -2
- package/dist/cli/chunks/core-handlers-VSX474R3.js +2 -0
- package/dist/cli/chunks/{cost-tracker-JBDIUMKZ.js → cost-tracker-MC7KEENQ.js} +2 -2
- package/dist/cli/chunks/{coverage-RGO3K357.js → coverage-NOOKPFYQ.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-VNE7QKX4.js +2 -0
- package/dist/cli/chunks/{cursor-installer-YEZGD37F.js → cursor-installer-GOZ64GZJ.js} +2 -2
- package/dist/cli/chunks/{daemon-FVETQ3LL.js → daemon-G4ABQMFJ.js} +3 -3
- package/dist/cli/chunks/{daemon-LPEXHNYG.js → daemon-V23WTCJJ.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-UKYE2FII.js → dag-attention-scheduler-YKOO6ZWL.js} +2 -2
- package/dist/cli/chunks/{detect-WBG5P7ER.js → detect-SNEMKQGJ.js} +2 -2
- package/dist/cli/chunks/{dist-node-YW6YRBCU.js → dist-node-VBNEM6K6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-HH7J4A32.js → domain-handler-2G5XEERC.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-V34GXD5I.js → domain-transfer-HSEUUM7E.js} +2 -2
- package/dist/cli/chunks/dream-A5LVJU7T.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-WYLRS3CL.js → embed-and-insert-pattern-H6MU5HK4.js} +2 -2
- package/dist/cli/chunks/{eval-EIMVXY5J.js → eval-XYVDJXJF.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-QMZHRUKM.js → experience-capture-middleware-BZQJVXTE.js} +3 -3
- package/dist/cli/chunks/{fast-paths-NHLW6XS6.js → fast-paths-76WWBJ4H.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NE3MBL3P.js → feature-flags-7E5YZ4P5.js} +2 -2
- package/dist/cli/chunks/{feature-flags-N3UHMSZ3.js → feature-flags-SCQ35J6M.js} +2 -2
- package/dist/cli/chunks/{file-discovery-SI44X4YS.js → file-discovery-LU5MAXWA.js} +2 -2
- package/dist/cli/chunks/{fleet-MMYUXRRM.js → fleet-M3TH65SV.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-RLYXYU2Q.js → gnn-wrapper-OYUJEJD2.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-6EDRUYLV.js → heartbeat-handler-II4NSOXK.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-CFZ6DNQY.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-I4Y2T4HO.js +2 -0
- package/dist/cli/chunks/hnsw-index-SBR5VYGN.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-RVM7EAIH.js → hnsw-legacy-bridge-322R2UAB.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-DUZ6FFAH.js → hnswlib-node-OVLAHTPU.js} +2 -2
- package/dist/cli/chunks/{hooks-ZF4VKHEO.js → hooks-2A27XCUJ.js} +37 -37
- package/dist/cli/chunks/hybrid-router-E6YM74NQ.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-YWS66PGO.js → hypergraph-engine-ERA527UR.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-OQHVRPWB.js → hypergraph-handler-7XL4OL6W.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-GHYFSSMJ.js +2 -0
- package/dist/cli/chunks/{init-handler-YW74YF2V.js → init-handler-WN6KQ5WY.js} +6 -6
- package/dist/cli/chunks/init-wizard-KAN5KOGD.js +2 -0
- package/dist/cli/chunks/kernel-LET4HEEF.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-APWB2GMA.js → kilocode-installer-5UCCFZ7V.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-DICKFVNC.js → kiro-installer-77DPEP3K.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-P3UJWNQS.js +2 -0
- package/dist/cli/chunks/{learning-MXHNYW5D.js → learning-A5GKUD73.js} +3 -3
- package/dist/cli/chunks/{llm-router-LTFIX7NY.js → llm-router-SINJNEGP.js} +4 -4
- package/dist/cli/chunks/llm-router-service-BOBENURJ.js +2 -0
- package/dist/cli/chunks/{load-JUMIQ4LZ.js → load-Q56GLXHJ.js} +2 -2
- package/dist/cli/chunks/load-test-4VDCVB7S.js +2 -0
- package/dist/cli/chunks/{mcp-WHIARJGO.js → mcp-VBDU2WLY.js} +2 -2
- package/dist/cli/chunks/{memory-KAHS6Z5A.js → memory-IGWBRDIT.js} +5 -5
- package/dist/cli/chunks/memory-backend-RRFAYQYS.js +2 -0
- package/dist/cli/chunks/{memory-handlers-DG3RRXB6.js → memory-handlers-IITHQ7KV.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-E3Y2RHMX.js → multi-model-executor-2QUEY4CC.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-3RKGNGGE.js → opencode-installer-FZJ5N2B3.js} +2 -2
- package/dist/cli/chunks/{orchestrator-TXITUKWD.js → orchestrator-BGLDS47V.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-V7DEZEF2.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-EE2BUFZT.js → pattern-usage-recorder-4MFN4WKV.js} +2 -2
- package/dist/cli/chunks/{pipeline-AXTT6KZB.js → pipeline-GZHAORGP.js} +2 -2
- package/dist/cli/chunks/{platform-TICPVKE2.js → platform-TZEX4YZQ.js} +2 -2
- package/dist/cli/chunks/{plugin-VQKNV3EM.js → plugin-VEYUFCNY.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6GY5YY7D.js → prime-radiant-advanced-wasm-OA5DLXJJ.js} +2 -2
- package/dist/cli/chunks/protocol-executor-I3C2ZETP.js +2 -0
- package/dist/cli/chunks/{protocol-handler-YFWDR7UZ.js → protocol-handler-MVJ5N4X5.js} +2 -2
- package/dist/cli/chunks/{prove-FUMRCXAA.js → prove-VKF7YCUA.js} +2 -2
- package/dist/cli/chunks/provider-manager-HB4YVQDI.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-RDLBAXJY.js +2 -0
- package/dist/cli/chunks/{quality-2APISBW5.js → quality-NLB5LVGM.js} +2 -2
- package/dist/cli/chunks/{quality-gate-MCC3E5TM.js → quality-gate-OM6A7FQM.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-QRWRNUDR.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CC5TNOTI.js → real-embeddings-NONEKGAV.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-YAHTEVPI.js → roocode-installer-ORXQQO3F.js} +2 -2
- package/dist/cli/chunks/router-WDF7KV4M.js +2 -0
- package/dist/cli/chunks/routing-feedback-DHYB4ZNL.js +2 -0
- package/dist/cli/chunks/{routing-handler-6NQBW4TQ.js → routing-handler-LGMIBVDS.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-ZHXLHUPG.js → ruvector-commands-4GZMU4BZ.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-5KF2DGCW.js → rvf-dual-writer-45HKI22F.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-BBU57BGF.js → rvf-migration-adapter-RHYIXI3I.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-VN4VRZA4.js → rvf-migration-coordinator-ANTAYKNN.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-7W53TYTH.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-XCY2XQZA.js → rvf-store-integrity-CPQUTFST.js} +2 -2
- package/dist/cli/chunks/safe-db-4HBFO7OQ.js +2 -0
- package/dist/cli/chunks/schedule-M2OSBJZM.js +2 -0
- package/dist/cli/chunks/scheduler-JWV5MSGE.js +2 -0
- package/dist/cli/chunks/{security-PYP4H3KN.js → security-BM6LMCBI.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-3CJHRNX6.js → shared-rvf-adapter-3HGARKJX.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-MKSLKWDI.js → shared-rvf-dual-writer-UQ4O46ZI.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-QA4JRQZ2.js +2 -0
- package/dist/cli/chunks/{status-handler-VYIZ3VJF.js → status-handler-TGRAM5PC.js} +2 -2
- package/dist/cli/chunks/{structural-health-MVV4OWXP.js → structural-health-RXETMBB3.js} +2 -2
- package/dist/cli/chunks/{sync-VNX6L3TI.js → sync-B4KEYFCP.js} +2 -2
- package/dist/cli/chunks/{sync-G47OYIQ3.js → sync-JTBZIACA.js} +2 -2
- package/dist/cli/chunks/{task-handler-GOWF2GEH.js → task-handler-D7VXHWPG.js} +2 -2
- package/dist/cli/chunks/{task-handlers-J2WC6J37.js → task-handlers-XF6VVPTR.js} +3 -3
- package/dist/cli/chunks/{test-DMCJ3BXS.js → test-BKEIMBSX.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-TRFHHKFM.js → test-scheduling-A4OHR7KW.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-KEQ7AHFF.js → token-bootstrap-LIDDAOAK.js} +2 -2
- package/dist/cli/chunks/{token-usage-B54FOFOF.js → token-usage-BJUFIU4V.js} +2 -2
- package/dist/cli/chunks/{transformers-IACZG7IV.js → transformers-YYUQCGMV.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-N7H4X37E.js → tree-sitter-wasm-parser-DFXYTJ23.js} +2 -2
- package/dist/cli/chunks/{types-B3SHT4OD.js → types-Z75HK5HH.js} +2 -2
- package/dist/cli/chunks/unified-memory-BEUZQTTC.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-FHLSAEX4.js +2 -0
- package/dist/cli/chunks/unified-persistence-TVEQGCSB.js +2 -0
- package/dist/cli/chunks/{upgrade-A2PQ5EWK.js → upgrade-NETNZZH3.js} +2 -2
- package/dist/cli/chunks/{validate-UXV7UQUT.js → validate-U2WQ7P6T.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-MMBU4FPP.js → validate-swarm-DKD7H2E3.js} +2 -2
- package/dist/cli/chunks/{vibium-R4GUVADA.js → vibium-FOQ73JBW.js} +2 -2
- package/dist/cli/chunks/visual-security-AYV46OUO.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-MP6E6CJB.js → web-tree-sitter-PQXWMQO6.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-Z6BWMUUO.js → windsurf-installer-CTFSFOBX.js} +2 -2
- package/dist/cli/chunks/{witness-chain-EFLTABBA.js → witness-chain-NCRHNFQM.js} +2 -2
- package/dist/cli/chunks/witness-chain-RU356H6R.js +2 -0
- package/dist/cli/chunks/{witness-key-manager-PN36TV43.js → witness-key-manager-WGCSSB23.js} +2 -2
- package/dist/cli/chunks/{workflow-A2AX3RJU.js → workflow-FE5QGP2U.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-N2DQTC3X.js +2 -0
- package/dist/cli/chunks/{wrappers-NA6FHA63.js → wrappers-AHL5K2LO.js} +2 -2
- package/dist/cli/commands/hooks-handlers/hooks-shared.d.ts +9 -0
- package/dist/cli/commands/hooks-handlers/hooks-shared.js +38 -0
- package/dist/cli/commands/hooks.d.ts +2 -2
- package/dist/cli/commands/hooks.js +8 -2
- package/dist/cli/handlers/init-handler.js +1 -1
- package/dist/coordination/handlers/coverage-collection.d.ts +161 -0
- package/dist/coordination/handlers/coverage-collection.js +643 -0
- package/dist/coordination/handlers/coverage-handlers.js +199 -146
- package/dist/coordination/handlers/handler-types.d.ts +6 -1
- package/dist/coordination/handlers/handler-utils.js +10 -3
- package/dist/coordination/handlers/security-handlers.js +17 -2
- package/dist/coordination/handlers/test-execution-handlers.js +16 -1
- package/dist/coordination/queen-coordinator.js +4 -3
- package/dist/coordination/result-saver.js +119 -97
- package/dist/coordination/task-executor.d.ts +26 -1
- package/dist/coordination/task-executor.js +52 -4
- package/dist/domains/code-intelligence/services/knowledge-graph.js +8 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +4 -0
- package/dist/domains/coverage-analysis/services/gap-detector.js +4 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +4 -0
- package/dist/domains/defect-intelligence/services/root-cause-analyzer.js +4 -0
- package/dist/domains/quality-assessment/services/deployment-advisor.js +4 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.js +4 -0
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -0
- package/dist/domains/test-generation/index.js +17 -2
- package/dist/domains/test-generation/services/test-generator.js +31 -9
- package/dist/init/codex-installer.d.ts +13 -0
- package/dist/init/codex-installer.js +122 -1
- package/dist/init/phases/09-assets.js +4 -0
- package/dist/init/phases/phase-interface.d.ts +1 -1
- package/dist/integrations/ruvector/rvf-store-integrity.js +5 -1
- package/dist/integrations/ruvector/shared-rvf-adapter.js +5 -5
- package/dist/learning/real-embeddings.js +15 -1
- package/dist/mcp/bundle.js +429 -419
- package/dist/mcp/handlers/domain-handler-configs.js +79 -14
- package/dist/mcp/types.d.ts +42 -4
- package/dist/optimization/session-cache.d.ts +13 -1
- package/dist/optimization/session-cache.js +27 -2
- package/dist/shared/llm/llm-router-service.js +59 -4
- package/dist/shared/llm/router/agent-router-config.d.ts +46 -2
- package/dist/shared/llm/router/agent-router-config.js +124 -2
- package/dist/shared/llm/router/config-store.d.ts +17 -1
- package/dist/shared/llm/router/config-store.js +103 -0
- package/dist/shared/llm/router/index.d.ts +2 -2
- package/dist/shared/llm/router/index.js +2 -0
- package/dist/shared/llm/router/types.d.ts +44 -0
- package/dist/shared/llm/router/types.js +1 -0
- package/package.json +9 -6
- package/dist/cli/chunks/adapter-CWIMFWAI.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-OTXT2DLN.js +0 -2
- package/dist/cli/chunks/base-O3SPSWBA.js +0 -2
- package/dist/cli/chunks/browser-workflow-MXS3ZKY2.js +0 -2
- package/dist/cli/chunks/chunk-G4GTE3RJ.js +0 -2
- package/dist/cli/chunks/chunk-G7FMYFTN.js +0 -2
- package/dist/cli/chunks/chunk-HVB2L52I.js +0 -2
- package/dist/cli/chunks/chunk-MVI2QMRW.js +0 -2
- package/dist/cli/chunks/chunk-OZR25R7W.js +0 -2
- package/dist/cli/chunks/chunk-PP2RYSHT.js +0 -3
- package/dist/cli/chunks/client-33PGO5FA.js +0 -2
- package/dist/cli/chunks/codex-installer-C2CUP4FW.js +0 -8
- package/dist/cli/chunks/core-handlers-CSNZIM3A.js +0 -2
- package/dist/cli/chunks/cross-domain-router-DRIBR5L3.js +0 -2
- package/dist/cli/chunks/dream-WUNO723O.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-VAFQDJLL.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-TIRPA7XE.js +0 -2
- package/dist/cli/chunks/hnsw-index-SSQBRQCQ.js +0 -2
- package/dist/cli/chunks/hybrid-router-AKBWZOQ3.js +0 -2
- package/dist/cli/chunks/impact-analyzer-46FQIZ6Y.js +0 -2
- package/dist/cli/chunks/init-wizard-U3NHGYSS.js +0 -2
- package/dist/cli/chunks/kernel-ZDXHT6QF.js +0 -2
- package/dist/cli/chunks/knowledge-graph-6XTW6WO6.js +0 -2
- package/dist/cli/chunks/llm-router-service-3F4E64SY.js +0 -2
- package/dist/cli/chunks/load-test-SWZNGEIY.js +0 -2
- package/dist/cli/chunks/memory-backend-PR74ZPBA.js +0 -2
- package/dist/cli/chunks/pattern-null-store-EPE36BVT.js +0 -2
- package/dist/cli/chunks/protocol-executor-IELENNST.js +0 -2
- package/dist/cli/chunks/provider-manager-3R3KOBHG.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-S2R2PCBS.js +0 -2
- package/dist/cli/chunks/queen-coordinator-2E23NEV4.js +0 -2
- package/dist/cli/chunks/router-3FVLWO6S.js +0 -2
- package/dist/cli/chunks/routing-feedback-ZQLRNNR7.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-YFGLQNEB.js +0 -2
- package/dist/cli/chunks/safe-db-4SBLBTW7.js +0 -2
- package/dist/cli/chunks/schedule-5Y3BGVAA.js +0 -2
- package/dist/cli/chunks/scheduler-DOID3QF3.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-M4JEQO57.js +0 -2
- package/dist/cli/chunks/unified-memory-WNYWTGVX.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-YPAV7U4E.js +0 -2
- package/dist/cli/chunks/unified-persistence-TJ252S7L.js +0 -2
- package/dist/cli/chunks/visual-security-VKYXEGJB.js +0 -2
- package/dist/cli/chunks/witness-chain-WVXRXKQP.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-GOWSPR3G.js +0 -2
|
@@ -5,106 +5,155 @@
|
|
|
5
5
|
* Covers: analyze-coverage
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
|
-
import * as fsSync from 'fs';
|
|
9
8
|
import * as path from 'path';
|
|
10
9
|
import { ok, err } from '../../shared/types';
|
|
11
10
|
import { toError } from '../../shared/error-utils.js';
|
|
12
11
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
13
12
|
import { loadCoverageData } from './handler-utils';
|
|
13
|
+
import { buildEstimatedCoverage, collectRustCoverage, isCoverageExecDisabled, isRustProject, isTestPath, } from './coverage-collection';
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Try to produce a JS/TS coverage report by running the project's test runner.
|
|
16
|
+
* Returns true if the runner completed (which does not guarantee a report was
|
|
17
|
+
* written — the caller re-checks disk).
|
|
17
18
|
*/
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return;
|
|
28
|
-
let entries;
|
|
19
|
+
async function tryRunJsCoverage(targetPath) {
|
|
20
|
+
// Running the project's test suite executes code from the analyzed repository
|
|
21
|
+
// (the tests themselves, plus npm lifecycle scripts via npx). Honor the
|
|
22
|
+
// opt-out before doing that.
|
|
23
|
+
if (isCoverageExecDisabled())
|
|
24
|
+
return false;
|
|
25
|
+
try {
|
|
26
|
+
const { execSync } = await import('child_process');
|
|
27
|
+
let coverageCmd = 'npx vitest run --coverage --reporter=json 2>/dev/null';
|
|
29
28
|
try {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
continue;
|
|
39
|
-
walk(path.join(dir, entry.name), depth + 1);
|
|
29
|
+
const pkgContent = await fs.readFile(path.join(targetPath, 'package.json'), 'utf-8');
|
|
30
|
+
const pkg = safeJsonParse(pkgContent);
|
|
31
|
+
const deps = {
|
|
32
|
+
...(pkg.devDependencies || {}),
|
|
33
|
+
...(pkg.dependencies || {}),
|
|
34
|
+
};
|
|
35
|
+
if (deps['jest'] || deps['@jest/core']) {
|
|
36
|
+
coverageCmd = 'npx jest --coverage --json 2>/dev/null';
|
|
40
37
|
}
|
|
41
|
-
else if (
|
|
42
|
-
|
|
43
|
-
if (!SOURCE_EXTENSIONS.has(ext))
|
|
44
|
-
continue;
|
|
45
|
-
if (TEST_PATTERNS.some(p => entry.name.includes(p)))
|
|
46
|
-
continue;
|
|
47
|
-
sourceFiles.push(path.join(dir, entry.name));
|
|
38
|
+
else if (deps['mocha'] || deps['nyc']) {
|
|
39
|
+
coverageCmd = 'npx nyc mocha 2>/dev/null';
|
|
48
40
|
}
|
|
41
|
+
// vitest is the default — covers vitest, @vitest/coverage-v8, etc.
|
|
49
42
|
}
|
|
43
|
+
catch {
|
|
44
|
+
// No package.json — use default vitest
|
|
45
|
+
}
|
|
46
|
+
execSync(coverageCmd, {
|
|
47
|
+
cwd: targetPath,
|
|
48
|
+
timeout: 120000,
|
|
49
|
+
encoding: 'utf-8',
|
|
50
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
51
|
+
});
|
|
52
|
+
return true;
|
|
50
53
|
}
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
catch {
|
|
55
|
+
// Test runner failed or not available.
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Narrow an instrumented report to production files only, recomputing the
|
|
61
|
+
* aggregate from what survives.
|
|
62
|
+
*
|
|
63
|
+
* Returns `null` when the report contains no production files at all — the
|
|
64
|
+
* caller must NOT fall back to the unfiltered set, because that reports the test
|
|
65
|
+
* files' own coverage as the project's (#569's third contradiction).
|
|
66
|
+
*/
|
|
67
|
+
function productionOnly(report, targetPath) {
|
|
68
|
+
const files = report.files.filter(f => !isTestPath(f.path, targetPath));
|
|
69
|
+
if (files.length === 0)
|
|
53
70
|
return null;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const branchCount = Math.max((content.match(/\b(if|switch|case|\?\?|\|\|)\b/g) || []).length, 1);
|
|
64
|
-
// Check for co-located test file
|
|
65
|
-
const testVariants = [
|
|
66
|
-
filePath.replace('.ts', '.test.ts').replace('/src/', '/tests/'),
|
|
67
|
-
filePath.replace('.ts', '.spec.ts').replace('/src/', '/tests/'),
|
|
68
|
-
filePath.replace('.ts', '.test.ts'),
|
|
69
|
-
filePath.replace('.js', '.test.js'),
|
|
70
|
-
filePath.replace('.js', '.test.js').replace('/src/', '/tests/'),
|
|
71
|
-
];
|
|
72
|
-
const hasTest = testVariants.some(t => fsSync.existsSync(t));
|
|
73
|
-
const complexityPenalty = Math.min(branchCount * 0.005, 0.15);
|
|
74
|
-
const sizePenalty = Math.min(totalLines * 0.0001, 0.1);
|
|
75
|
-
const coverageRate = Math.max(0.05, Math.min(0.95, hasTest ? 0.85 - complexityPenalty - sizePenalty : 0.20));
|
|
76
|
-
const coveredLines = Math.floor(totalLines * coverageRate);
|
|
77
|
-
const branchCoverage = Math.min(Math.floor(coveredLines * 0.7), branchCount);
|
|
78
|
-
const functionCoverage = Math.min(Math.floor(functionCount * coverageRate * 0.9), functionCount);
|
|
79
|
-
const uncoveredLines = Array.from({ length: totalLines - coveredLines }, (_, i) => i + coveredLines + 1);
|
|
80
|
-
return {
|
|
81
|
-
path: filePath,
|
|
82
|
-
lines: { covered: coveredLines, total: totalLines },
|
|
83
|
-
branches: { covered: branchCoverage, total: branchCount },
|
|
84
|
-
functions: { covered: functionCoverage, total: functionCount },
|
|
85
|
-
statements: { covered: coveredLines, total: totalLines },
|
|
86
|
-
uncoveredLines,
|
|
87
|
-
uncoveredBranches: uncoveredLines.slice(0, Math.floor(uncoveredLines.length / 2)),
|
|
88
|
-
};
|
|
89
|
-
});
|
|
90
|
-
const totalLines = files.reduce((s, f) => s + f.lines.total, 0);
|
|
91
|
-
const coveredLines = files.reduce((s, f) => s + f.lines.covered, 0);
|
|
92
|
-
const totalBranches = files.reduce((s, f) => s + f.branches.total, 0);
|
|
93
|
-
const coveredBranches = files.reduce((s, f) => s + f.branches.covered, 0);
|
|
94
|
-
const totalFunctions = files.reduce((s, f) => s + f.functions.total, 0);
|
|
95
|
-
const coveredFunctions = files.reduce((s, f) => s + f.functions.covered, 0);
|
|
96
|
-
const safeDiv = (a, b) => b > 0 ? Math.round((a / b) * 100) : 0;
|
|
71
|
+
// Recompute rather than carrying the original summary: it was computed over
|
|
72
|
+
// the unfiltered set, so keeping it would blend test-file coverage into the
|
|
73
|
+
// production headline figure.
|
|
74
|
+
const sum = (pick) => files.reduce((acc, f) => acc + pick(f), 0);
|
|
75
|
+
const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 100) : 0;
|
|
76
|
+
const totalLines = sum(f => f.lines.total);
|
|
77
|
+
const coveredLines = sum(f => f.lines.covered);
|
|
78
|
+
const branchDataCollected = files.some(f => f.branches.total > 0);
|
|
79
|
+
const functionDataCollected = files.some(f => f.functions.total > 0);
|
|
97
80
|
return {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
81
|
+
data: {
|
|
82
|
+
files,
|
|
83
|
+
summary: {
|
|
84
|
+
line: pct(coveredLines, totalLines),
|
|
85
|
+
branch: pct(sum(f => f.branches.covered), sum(f => f.branches.total)),
|
|
86
|
+
function: pct(sum(f => f.functions.covered), sum(f => f.functions.total)),
|
|
87
|
+
statement: pct(coveredLines, totalLines),
|
|
88
|
+
files: files.length,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
provenance: {
|
|
92
|
+
method: 'instrumented-report',
|
|
93
|
+
estimated: false,
|
|
94
|
+
branchDataCollected,
|
|
95
|
+
functionDataCollected,
|
|
96
|
+
notes: [],
|
|
105
97
|
},
|
|
106
98
|
};
|
|
107
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Collect coverage for a target, preferring real measurement over estimation
|
|
102
|
+
* and always reporting which one happened (#569).
|
|
103
|
+
*
|
|
104
|
+
* Cascade:
|
|
105
|
+
* 1. an instrumented report already on disk (istanbul/lcov/cobertura)
|
|
106
|
+
* 2. language-specific instrumentation we can run — `cargo llvm-cov` for Rust,
|
|
107
|
+
* the project's test runner for JS/TS
|
|
108
|
+
* 3. static estimation, explicitly labelled `estimated: true`
|
|
109
|
+
*/
|
|
110
|
+
async function collectCoverage(targetPath) {
|
|
111
|
+
const existing = await loadCoverageData(targetPath);
|
|
112
|
+
if (existing) {
|
|
113
|
+
const fromReport = productionOnly(existing, targetPath);
|
|
114
|
+
// A report whose only entries are test files yields NO production coverage.
|
|
115
|
+
// Falling back to the unfiltered set here would report the test files'
|
|
116
|
+
// own coverage as the project's — recreating #569's third contradiction
|
|
117
|
+
// (`tests/verifier_matrix.rs` analysed at 79.2% as if it were a target).
|
|
118
|
+
if (!fromReport)
|
|
119
|
+
return { collected: null, ranTests: false, testOnlyReport: true };
|
|
120
|
+
return { collected: fromReport, ranTests: false };
|
|
121
|
+
}
|
|
122
|
+
// #569 work item 1: delegate to real instrumentation where available.
|
|
123
|
+
if (isRustProject(targetPath)) {
|
|
124
|
+
const rust = await collectRustCoverage(targetPath);
|
|
125
|
+
if (rust)
|
|
126
|
+
return { collected: rust, ranTests: true };
|
|
127
|
+
}
|
|
128
|
+
const ranTests = await tryRunJsCoverage(targetPath);
|
|
129
|
+
const afterRun = await loadCoverageData(targetPath);
|
|
130
|
+
if (afterRun) {
|
|
131
|
+
const fromRun = productionOnly(afterRun, targetPath);
|
|
132
|
+
if (!fromRun)
|
|
133
|
+
return { collected: null, ranTests, testOnlyReport: true };
|
|
134
|
+
return { collected: fromRun, ranTests };
|
|
135
|
+
}
|
|
136
|
+
return { collected: buildEstimatedCoverage(targetPath), ranTests };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Build the guidance string shown when a result is an estimate rather than a
|
|
140
|
+
* measurement, tailored to what the target actually is.
|
|
141
|
+
*/
|
|
142
|
+
function estimationGuidance(targetPath) {
|
|
143
|
+
// When the caller turned execution off, naming the tool to install is the
|
|
144
|
+
// wrong advice — nothing will be run either way until they opt back in.
|
|
145
|
+
if (isCoverageExecDisabled()) {
|
|
146
|
+
return 'Coverage tooling execution is disabled (AQE_COVERAGE_NO_EXEC). No tests ' +
|
|
147
|
+
'were run and no build tooling was invoked. Unset it, or generate a coverage ' +
|
|
148
|
+
'report yourself and re-run, to get real measurements.';
|
|
149
|
+
}
|
|
150
|
+
if (isRustProject(targetPath)) {
|
|
151
|
+
return 'To get real measurements for this Rust crate, install cargo-llvm-cov ' +
|
|
152
|
+
'(`cargo install cargo-llvm-cov`) and re-run; agentic-qe will invoke it automatically.';
|
|
153
|
+
}
|
|
154
|
+
return 'To get real measurements, run your tests with coverage enabled ' +
|
|
155
|
+
'(e.g. `npm test -- --coverage`, `pytest --cov`) and re-run this analysis.';
|
|
156
|
+
}
|
|
108
157
|
export function registerCoverageHandlers(ctx) {
|
|
109
158
|
// Register coverage analysis handler - REAL IMPLEMENTATION
|
|
110
159
|
ctx.registerHandler('analyze-coverage', async (task) => {
|
|
@@ -113,63 +162,30 @@ export function registerCoverageHandlers(ctx) {
|
|
|
113
162
|
const analyzer = ctx.getCoverageAnalyzer();
|
|
114
163
|
const targetPath = payload.target || process.cwd();
|
|
115
164
|
const threshold = payload.threshold || 80;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// vitest is the default — covers vitest, @vitest/coverage-v8, etc.
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
// No package.json — use default vitest
|
|
139
|
-
}
|
|
140
|
-
execSync(coverageCmd, {
|
|
141
|
-
cwd: targetPath,
|
|
142
|
-
timeout: 120000,
|
|
143
|
-
encoding: 'utf-8',
|
|
144
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
145
|
-
});
|
|
146
|
-
collected = true;
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
// Test runner failed or not available — that's OK, we'll check for output anyway
|
|
150
|
-
}
|
|
151
|
-
// Re-check for coverage data after collection attempt
|
|
152
|
-
coverageData = await loadCoverageData(targetPath);
|
|
153
|
-
// Still no instrumented coverage — fall back to heuristic estimation
|
|
154
|
-
if (!coverageData) {
|
|
155
|
-
coverageData = buildHeuristicCoverage(targetPath);
|
|
156
|
-
}
|
|
157
|
-
if (!coverageData) {
|
|
158
|
-
return ok({
|
|
159
|
-
lineCoverage: 0,
|
|
160
|
-
branchCoverage: 0,
|
|
161
|
-
functionCoverage: 0,
|
|
162
|
-
statementCoverage: 0,
|
|
163
|
-
totalFiles: 0,
|
|
164
|
-
coverageByFile: [],
|
|
165
|
-
gaps: [],
|
|
166
|
-
algorithm: 'sublinear-O(log n)',
|
|
167
|
-
warning: collected
|
|
165
|
+
const { collected, ranTests, testOnlyReport } = await collectCoverage(targetPath);
|
|
166
|
+
if (!collected) {
|
|
167
|
+
return ok({
|
|
168
|
+
lineCoverage: null,
|
|
169
|
+
branchCoverage: null,
|
|
170
|
+
functionCoverage: null,
|
|
171
|
+
statementCoverage: null,
|
|
172
|
+
totalFiles: 0,
|
|
173
|
+
coverageByFile: [],
|
|
174
|
+
gaps: [],
|
|
175
|
+
estimated: false,
|
|
176
|
+
measured: false,
|
|
177
|
+
coverageMethod: 'none',
|
|
178
|
+
algorithm: 'sublinear-O(log n)',
|
|
179
|
+
warning: testOnlyReport
|
|
180
|
+
? 'The coverage report contains only test files, so there is no production ' +
|
|
181
|
+
'coverage to report. Coverage OF a test file is not a meaningful metric. ' +
|
|
182
|
+
'Check that your coverage tool is instrumenting your source directory.'
|
|
183
|
+
: ranTests
|
|
168
184
|
? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
|
|
169
|
-
: 'No coverage data found and could not run tests automatically.
|
|
170
|
-
|
|
171
|
-
}
|
|
185
|
+
: 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath),
|
|
186
|
+
});
|
|
172
187
|
}
|
|
188
|
+
const { data: coverageData, provenance } = collected;
|
|
173
189
|
// Analyze coverage using the real CoverageAnalyzerService
|
|
174
190
|
const analysisResult = await analyzer.analyze({
|
|
175
191
|
coverageData,
|
|
@@ -189,26 +205,63 @@ export function registerCoverageHandlers(ctx) {
|
|
|
189
205
|
file: gap.file,
|
|
190
206
|
lines: gap.lines,
|
|
191
207
|
risk: gap.severity,
|
|
208
|
+
// #569: a gap derived from an estimate is a hypothesis, not a
|
|
209
|
+
// finding. Carry that all the way to the caller rather than letting
|
|
210
|
+
// it inherit a default riskScore/confidence downstream.
|
|
211
|
+
estimated: provenance.estimated,
|
|
212
|
+
...(provenance.estimated
|
|
213
|
+
? {
|
|
214
|
+
confidence: 0.2,
|
|
215
|
+
reason: 'Possible coverage gap (STATIC ESTIMATE — no instrumentation ran)',
|
|
216
|
+
}
|
|
217
|
+
: {}),
|
|
192
218
|
}));
|
|
193
219
|
}
|
|
194
220
|
}
|
|
221
|
+
const round = (n) => Math.round(n * 10) / 10;
|
|
222
|
+
const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 1000) / 10 : null;
|
|
223
|
+
const warnings = [...provenance.notes];
|
|
224
|
+
if (provenance.estimated)
|
|
225
|
+
warnings.push(estimationGuidance(targetPath));
|
|
226
|
+
// #569: the analyzer generates recommendations from the summary numbers.
|
|
227
|
+
// When branch or function data was never collected, those numbers are 0
|
|
228
|
+
// by construction, and the resulting advice ("Branch coverage is
|
|
229
|
+
// significantly lower than line coverage", "Function coverage is below
|
|
230
|
+
// 70%") is a statement about a metric nobody measured. Drop it rather
|
|
231
|
+
// than send a developer to fix a number that doesn't exist.
|
|
232
|
+
const recommendations = report.recommendations.filter(rec => {
|
|
233
|
+
if (!provenance.branchDataCollected && /branch coverage/i.test(rec))
|
|
234
|
+
return false;
|
|
235
|
+
if (!provenance.functionDataCollected && /function coverage/i.test(rec))
|
|
236
|
+
return false;
|
|
237
|
+
return true;
|
|
238
|
+
});
|
|
195
239
|
return ok({
|
|
196
|
-
lineCoverage:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
240
|
+
lineCoverage: round(report.summary.line),
|
|
241
|
+
// #569 work item 4: never report a branch percentage — least of all
|
|
242
|
+
// 100% — when no branch data was collected.
|
|
243
|
+
branchCoverage: provenance.branchDataCollected ? round(report.summary.branch) : null,
|
|
244
|
+
functionCoverage: provenance.functionDataCollected ? round(report.summary.function) : null,
|
|
245
|
+
statementCoverage: round(report.summary.statement),
|
|
200
246
|
totalFiles: report.summary.files,
|
|
201
247
|
coverageByFile: coverageData.files.map(f => ({
|
|
202
248
|
file: f.path,
|
|
203
|
-
lineCoverage:
|
|
204
|
-
branchCoverage:
|
|
205
|
-
functionCoverage:
|
|
249
|
+
lineCoverage: pct(f.lines.covered, f.lines.total) ?? 0,
|
|
250
|
+
branchCoverage: provenance.branchDataCollected ? pct(f.branches.covered, f.branches.total) : null,
|
|
251
|
+
functionCoverage: provenance.functionDataCollected ? pct(f.functions.covered, f.functions.total) : null,
|
|
206
252
|
})),
|
|
207
253
|
gaps,
|
|
208
254
|
meetsThreshold: report.meetsThreshold,
|
|
209
255
|
delta: report.delta,
|
|
210
|
-
recommendations
|
|
256
|
+
recommendations,
|
|
211
257
|
algorithm: 'sublinear-O(log n)',
|
|
258
|
+
// #569 work item 5: the caller must be able to tell measurement from guess.
|
|
259
|
+
estimated: provenance.estimated,
|
|
260
|
+
measured: !provenance.estimated,
|
|
261
|
+
coverageMethod: provenance.method,
|
|
262
|
+
branchDataCollected: provenance.branchDataCollected,
|
|
263
|
+
functionDataCollected: provenance.functionDataCollected,
|
|
264
|
+
...(warnings.length > 0 ? { warning: warnings.join(' ') } : {}),
|
|
212
265
|
});
|
|
213
266
|
}
|
|
214
267
|
catch (error) {
|
|
@@ -23,7 +23,12 @@ export interface TaskHandlerContext {
|
|
|
23
23
|
/** Lazy service getters */
|
|
24
24
|
getCoverageAnalyzer(): CoverageAnalyzerService;
|
|
25
25
|
getSecurityScanner(): SecurityScannerService;
|
|
26
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Async (#567): resolves the ADR-043 LLM router before constructing the
|
|
28
|
+
* service. Pass `useLLM: false` to get a router-free generator (deterministic
|
|
29
|
+
* templates only) for callers that set `aiEnhancement: false`.
|
|
30
|
+
*/
|
|
31
|
+
getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
|
|
27
32
|
getKnowledgeGraph(): KnowledgeGraphService;
|
|
28
33
|
getQualityAnalyzer(): QualityAnalyzerService;
|
|
29
34
|
/** Executor configuration */
|
|
@@ -295,10 +295,17 @@ export function parseCoberturaXml(content) {
|
|
|
295
295
|
functionsCovered++;
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
|
-
//
|
|
298
|
+
// No per-line <line> entries — fall back to the file's reported line-rate.
|
|
299
|
+
//
|
|
300
|
+
// #569/ADR-126: the previous form (`linesTotal = 1; linesCovered = rate >= 0.5
|
|
301
|
+
// ? 1 : 0`) turned a measured 47% into 0% and a measured 51% into 100%, and
|
|
302
|
+
// the result was still labelled `estimated: false`. The line-rate itself IS
|
|
303
|
+
// instrumented data; only the per-line detail is missing. Scale it to a
|
|
304
|
+
// 100-line denominator so the measured rate survives at 1% granularity
|
|
305
|
+
// instead of being rounded to an extreme.
|
|
299
306
|
if (linesTotal === 0 && !isNaN(lineRate)) {
|
|
300
|
-
linesTotal =
|
|
301
|
-
linesCovered =
|
|
307
|
+
linesTotal = 100;
|
|
308
|
+
linesCovered = Math.round(Math.max(0, Math.min(1, lineRate)) * 100);
|
|
302
309
|
}
|
|
303
310
|
files.push({
|
|
304
311
|
path: filename,
|
|
@@ -242,8 +242,23 @@ export function registerSecurityHandlers(ctx) {
|
|
|
242
242
|
jstsFilesScanned: jstsFiles.length,
|
|
243
243
|
otherFilesScanned: otherFiles.length,
|
|
244
244
|
coverage: sastResult?.coverage,
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
// #569 (companion note): "zero findings" from a scan that ran no
|
|
246
|
+
// language-specific analysis is not evidence of absence, and combined
|
|
247
|
+
// with a coverage number it reads as "this code is clean and covered".
|
|
248
|
+
// Say plainly which depth of analysis actually ran.
|
|
249
|
+
deepAnalysisPerformed: jstsFiles.length > 0,
|
|
250
|
+
analysisDepth: jstsFiles.length > 0
|
|
251
|
+
? (otherFiles.length > 0 ? 'full-sast-on-js-ts; pattern-matching-on-other-languages' : 'full-sast')
|
|
252
|
+
: 'pattern-matching-only',
|
|
253
|
+
...(jstsFiles.length === 0 ? {
|
|
254
|
+
note: otherFiles.length > 0
|
|
255
|
+
? 'NO LANGUAGE-SPECIFIC ANALYSIS RAN. Only cross-language pattern matching ' +
|
|
256
|
+
'(secrets, CORS, eval/exec) was applied to these files — full SAST is ' +
|
|
257
|
+
'implemented for JS/TS only. A zero-finding result here means "nothing ' +
|
|
258
|
+
'matched a generic pattern", NOT "no vulnerabilities". Run a ' +
|
|
259
|
+
'language-specific tool (cargo audit / clippy, bandit, gosec, semgrep) ' +
|
|
260
|
+
'for real coverage of this codebase.'
|
|
261
|
+
: 'No source files were analyzed.',
|
|
247
262
|
} : {}),
|
|
248
263
|
});
|
|
249
264
|
}
|
|
@@ -56,7 +56,8 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
56
56
|
ctx.registerHandler('generate-tests', async (task) => {
|
|
57
57
|
const payload = task.payload;
|
|
58
58
|
try {
|
|
59
|
-
|
|
59
|
+
// #567: honor the tool's documented `aiEnhancement` knob (default true).
|
|
60
|
+
const generator = await ctx.getTestGenerator(payload.aiEnhancement !== false);
|
|
60
61
|
// Determine source files to analyze
|
|
61
62
|
let sourceFiles = [];
|
|
62
63
|
let tempPath;
|
|
@@ -134,11 +135,25 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
134
135
|
testCode: rewritten.testCode,
|
|
135
136
|
};
|
|
136
137
|
});
|
|
138
|
+
// #567: surface whether the LLM branch actually ran. Previously the only
|
|
139
|
+
// clue that generation had silently fallen back to template scaffolding
|
|
140
|
+
// was a suspiciously constant coverage estimate and a sub-20ms duration.
|
|
141
|
+
const llmEnhanced = generatedTests.tests.some(t => t.llmEnhanced === true);
|
|
137
142
|
return ok({
|
|
138
143
|
testsGenerated: tests.length,
|
|
139
144
|
coverageEstimate: generatedTests.coverageEstimate,
|
|
140
145
|
tests,
|
|
141
146
|
patternsUsed: generatedTests.patternsUsed,
|
|
147
|
+
llmEnhanced,
|
|
148
|
+
...(llmEnhanced ? {} : {
|
|
149
|
+
generationMode: 'deterministic-template',
|
|
150
|
+
note: payload.aiEnhancement === false
|
|
151
|
+
? 'LLM enhancement was disabled by the caller (aiEnhancement: false).'
|
|
152
|
+
: 'No LLM provider was available, so tests are deterministic template ' +
|
|
153
|
+
'scaffolding rather than source-aware. Configure a provider in ' +
|
|
154
|
+
'.agentic-qe/llm-config.json (or set a provider API key) and ensure ' +
|
|
155
|
+
'AQE_LLM_ROUTER_DISABLED is not set.',
|
|
156
|
+
}),
|
|
142
157
|
});
|
|
143
158
|
}
|
|
144
159
|
catch (error) {
|
|
@@ -299,7 +299,10 @@ export class QueenCoordinator {
|
|
|
299
299
|
const governanceContext = {
|
|
300
300
|
taskId: task.id,
|
|
301
301
|
taskType: task.type,
|
|
302
|
-
|
|
302
|
+
// Requester-less tasks must not share one global governance identity.
|
|
303
|
+
// Otherwise unrelated tasks accumulate under "unknown" and eventually
|
|
304
|
+
// trip the ContinueGate step limit for every subsequent submission.
|
|
305
|
+
agentId: task.requester || `queen-task:${task.id}`,
|
|
303
306
|
domain: task.targetDomains[0] || 'test-generation',
|
|
304
307
|
priority: task.priority,
|
|
305
308
|
payload: task.payload,
|
|
@@ -545,11 +548,9 @@ export class QueenCoordinator {
|
|
|
545
548
|
}
|
|
546
549
|
getMetrics() {
|
|
547
550
|
const domainUtilization = new Map();
|
|
548
|
-
let totalLoad = 0;
|
|
549
551
|
for (const domain of ALL_DOMAINS) {
|
|
550
552
|
const load = this.getDomainLoad(domain);
|
|
551
553
|
domainUtilization.set(domain, load);
|
|
552
|
-
totalLoad += load;
|
|
553
554
|
}
|
|
554
555
|
const agents = this.agentCoordinator.listAgents();
|
|
555
556
|
const activeAgents = agents.filter(a => a.status === 'running').length;
|