agentic-qe 3.15.4 → 3.15.6
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/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/.claude/skills/qe-court/evals/qe-court.yaml +3 -2
- package/.claude/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +191 -0
- package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/assets/skills/qe-court/evals/qe-court.yaml +3 -2
- package/assets/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/bridge/captured-experience-bridge.js +7 -9
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-MHJBRXMK.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G64SD7J2.js → agent-handler-KAMYBU3S.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-G4UXFPKH.js → agent-memory-branch-2CAW3KUM.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
- package/dist/cli/chunks/{arena-63M3M6EW.js → arena-4OFLJ3R2.js} +2 -2
- package/dist/cli/chunks/{arena-QJMKYPHS.js → arena-QCCVIOAH.js} +4 -4
- package/dist/cli/chunks/{audit-UDFVTWSX.js → audit-RBDQJQJB.js} +3 -3
- package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-JLX2G56I.js → better-sqlite3-5JRACCDQ.js} +2 -2
- package/dist/cli/chunks/{brain-handler-PWF32LLW.js → brain-handler-W4QIIRT4.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-PB7QWXDP.js → branch-enumerator-IBNGI572.js} +2 -2
- package/dist/cli/chunks/{browser-CYNV2F3U.js → browser-GMSCVAOI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
- package/dist/cli/chunks/{chunk-S5D3HCGN.js → chunk-22OZIJAD.js} +2 -2
- package/dist/cli/chunks/{chunk-NBMQOP2R.js → chunk-24ZSGYC6.js} +1 -1
- package/dist/cli/chunks/{chunk-HFSBONCS.js → chunk-2CIDFR2H.js} +3 -3
- package/dist/cli/chunks/{chunk-A4OPQJ4A.js → chunk-2IWPJUVV.js} +5 -5
- package/dist/cli/chunks/{chunk-RI4JPBZD.js → chunk-2ZTWPMTK.js} +2 -2
- package/dist/cli/chunks/{chunk-ZURYZEHX.js → chunk-34MDMFET.js} +2 -2
- package/dist/cli/chunks/chunk-3DJNKNBR.js +742 -0
- package/dist/cli/chunks/{chunk-GJVRQBLI.js → chunk-3NJ7O3OH.js} +2 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +2 -0
- package/dist/cli/chunks/chunk-46HBVDMU.js +2 -0
- package/dist/cli/chunks/{chunk-SCL2OYN7.js → chunk-47Q7JL3V.js} +2 -2
- package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
- package/dist/cli/chunks/{chunk-3ZIVBTX6.js → chunk-4KOVHQXK.js} +2 -2
- package/dist/cli/chunks/{chunk-BBKLVHDQ.js → chunk-4POOJYXA.js} +1 -1
- package/dist/cli/chunks/{chunk-DAYMT7TH.js → chunk-5DH5QI7G.js} +26 -26
- package/dist/cli/chunks/{chunk-2534PXIV.js → chunk-5GIJU2ZY.js} +2 -2
- package/dist/cli/chunks/{chunk-MBV57LKC.js → chunk-5HAPS6VD.js} +2 -2
- package/dist/cli/chunks/{chunk-NIJMLEAX.js → chunk-5LST62QR.js} +2 -2
- package/dist/cli/chunks/{chunk-33IUCP34.js → chunk-5MT7DMD7.js} +2 -2
- package/dist/cli/chunks/{chunk-LRTF5RMG.js → chunk-5NC7QEJ6.js} +4 -4
- package/dist/cli/chunks/{chunk-SJB4KMZS.js → chunk-5UPIL62W.js} +3 -3
- package/dist/cli/chunks/{chunk-76PRW2KY.js → chunk-5VUIXDY2.js} +2 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
- package/dist/cli/chunks/{chunk-J3RNVHDH.js → chunk-624QRKQX.js} +1 -1
- package/dist/cli/chunks/{chunk-N6CRIUTO.js → chunk-66NW3ZB4.js} +2 -2
- package/dist/cli/chunks/{chunk-PCWZCXBD.js → chunk-6HWARQWV.js} +2 -2
- package/dist/cli/chunks/{chunk-VAXQUD5G.js → chunk-6MXAJBEA.js} +1 -1
- package/dist/cli/chunks/{chunk-LOLAEDZD.js → chunk-6R3FBFCJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ASKPTGUU.js → chunk-6RDVY26I.js} +2 -2
- package/dist/cli/chunks/{chunk-35A22AUL.js → chunk-6T6AHVLF.js} +1 -1
- package/dist/cli/chunks/{chunk-IKWAPHJA.js → chunk-6WOZUSSN.js} +2 -2
- package/dist/cli/chunks/chunk-72MQCZSM.js +2 -0
- package/dist/cli/chunks/chunk-7QVPMH25.js +3 -0
- package/dist/cli/chunks/{chunk-5H7MR6HP.js → chunk-7SAMMQVS.js} +1 -1
- package/dist/cli/chunks/{chunk-B7J3O2WM.js → chunk-7TJZDRDU.js} +1 -1
- package/dist/cli/chunks/{chunk-OFQDM73J.js → chunk-7TVIX4WL.js} +2 -2
- package/dist/cli/chunks/{chunk-SZWXUG36.js → chunk-7VTKR44N.js} +2 -2
- package/dist/cli/chunks/{chunk-5B5D5KCV.js → chunk-7XTANLTN.js} +1 -1
- package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
- package/dist/cli/chunks/{chunk-GAXTPQCZ.js → chunk-A74J23QB.js} +2 -2
- package/dist/cli/chunks/{chunk-K2VUYRMG.js → chunk-A7ANPS4E.js} +2 -2
- package/dist/cli/chunks/{chunk-WO4NSPLX.js → chunk-AJT3XDRD.js} +2 -2
- package/dist/cli/chunks/{chunk-LPSE6DOQ.js → chunk-ALCIUWFC.js} +1 -1
- package/dist/cli/chunks/{chunk-UK5HY6LC.js → chunk-AUN4FG7V.js} +1 -1
- package/dist/cli/chunks/{chunk-MGH4XIHH.js → chunk-AUOSHM63.js} +2 -2
- package/dist/cli/chunks/{chunk-HX5KQK7I.js → chunk-AX26QJ6T.js} +2 -2
- package/dist/cli/chunks/{chunk-BZWZTGMF.js → chunk-B7RHBKHL.js} +2 -2
- package/dist/cli/chunks/{chunk-I5A3HGO6.js → chunk-BAYGQRNP.js} +2 -2
- package/dist/cli/chunks/{chunk-3C2BFLYC.js → chunk-BIXRTOH3.js} +18 -18
- package/dist/cli/chunks/{chunk-EWUFVWRT.js → chunk-BO7UFNYV.js} +2 -2
- package/dist/cli/chunks/{chunk-6TMUZGM2.js → chunk-BUTGIVKW.js} +1 -1
- package/dist/cli/chunks/{chunk-2MU4WCMQ.js → chunk-BXATKI5S.js} +2 -2
- package/dist/cli/chunks/{chunk-HEDLZWPM.js → chunk-CCL436IU.js} +44 -33
- package/dist/cli/chunks/{chunk-6EHVPFHW.js → chunk-CEXNW5TR.js} +1 -1
- package/dist/cli/chunks/{chunk-2ICC4H6K.js → chunk-CLAMMGY3.js} +2 -2
- package/dist/cli/chunks/{chunk-BPGFCUDO.js → chunk-CR66HNAE.js} +1 -1
- package/dist/cli/chunks/{chunk-CFXFGQEN.js → chunk-CZBIREL5.js} +2 -2
- package/dist/cli/chunks/{chunk-Z56QTRRB.js → chunk-D5N2O5EH.js} +2 -2
- package/dist/cli/chunks/{chunk-M6SJALLA.js → chunk-DA7DGDTI.js} +2 -2
- package/dist/cli/chunks/{chunk-R47LNH5W.js → chunk-DLSFT6PO.js} +2 -2
- package/dist/cli/chunks/{chunk-6HTO4BLV.js → chunk-DQNUPEY5.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ5Z56OP.js → chunk-EECF4CMA.js} +1 -1
- package/dist/cli/chunks/{chunk-DFJGXXCL.js → chunk-EF5UHDCG.js} +1 -1
- package/dist/cli/chunks/{chunk-PJAXWCFC.js → chunk-EJ4KZFZN.js} +1 -1
- package/dist/cli/chunks/{chunk-RA3MI5WK.js → chunk-ELI4GDQO.js} +2 -2
- package/dist/cli/chunks/{chunk-BND6M2JX.js → chunk-F3KS3TAB.js} +2 -2
- package/dist/cli/chunks/{chunk-RB2SL5GD.js → chunk-F7A2UBZO.js} +2 -2
- package/dist/cli/chunks/{chunk-X5S5UEM6.js → chunk-FOJRPEIP.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP6ANUP7.js → chunk-FQ5N666N.js} +1 -1
- package/dist/cli/chunks/{chunk-LZSLJJII.js → chunk-FU7LNUD7.js} +2 -2
- package/dist/cli/chunks/{chunk-FDK2GF4G.js → chunk-GFB6BZWU.js} +2 -2
- package/dist/cli/chunks/{chunk-C5EN5WB6.js → chunk-GI5HWS4H.js} +1 -1
- package/dist/cli/chunks/{chunk-SIUUAKCE.js → chunk-GNYOHZVV.js} +1 -1
- package/dist/cli/chunks/{chunk-OOK6GPJR.js → chunk-GVRFSXY6.js} +2 -2
- package/dist/cli/chunks/{chunk-6QPW4OVH.js → chunk-GWM4M5NF.js} +1 -1
- package/dist/cli/chunks/{chunk-PMXWDTDK.js → chunk-HAN4MS5T.js} +2 -2
- package/dist/cli/chunks/{chunk-WW6WUMS7.js → chunk-HEGGV2PT.js} +2 -2
- package/dist/cli/chunks/{chunk-4GLR2S2M.js → chunk-HOEWMEF2.js} +2 -2
- package/dist/cli/chunks/{chunk-BY3IL56R.js → chunk-HZFK2Z2Z.js} +1 -1
- package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
- package/dist/cli/chunks/{chunk-LXYTC62V.js → chunk-IEPWO4XP.js} +2 -2
- package/dist/cli/chunks/{chunk-3MSBVOYW.js → chunk-ITIJ23K2.js} +2 -2
- package/dist/cli/chunks/{chunk-PEA4DVXW.js → chunk-IVJIHZSM.js} +1 -1
- package/dist/cli/chunks/{chunk-P7GM3EE7.js → chunk-JAPBSSFY.js} +1 -1
- package/dist/cli/chunks/{chunk-SOSJFEFB.js → chunk-JCE76MPP.js} +2 -2
- package/dist/cli/chunks/{chunk-YZ2AGC7O.js → chunk-JPJEAK4G.js} +1 -1
- package/dist/cli/chunks/{chunk-RG67RZIX.js → chunk-JYKQVYX2.js} +2 -2
- package/dist/cli/chunks/{chunk-W6TJXK5Y.js → chunk-K55EAWZ5.js} +2 -2
- package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
- package/dist/cli/chunks/{chunk-W3PPYNHF.js → chunk-KIDOBLUO.js} +2 -2
- package/dist/cli/chunks/{chunk-JL3TI43V.js → chunk-KYVIOC3C.js} +2 -2
- package/dist/cli/chunks/{chunk-WEDVLKRB.js → chunk-L2TDHJR3.js} +2 -2
- package/dist/cli/chunks/{chunk-5GWTJJEO.js → chunk-L4D3TPFP.js} +1 -1
- package/dist/cli/chunks/{chunk-PB2WSCBW.js → chunk-LAY7NCQK.js} +3 -3
- package/dist/cli/chunks/{chunk-T3BMCEQR.js → chunk-LCCTJ2PC.js} +2 -2
- package/dist/cli/chunks/{chunk-7INP6HZH.js → chunk-LJCEDTUM.js} +3 -3
- package/dist/cli/chunks/{chunk-DEJM2P5K.js → chunk-LMAEMVPA.js} +1 -1
- package/dist/cli/chunks/{chunk-HCDTLV5J.js → chunk-LZWJ5BMP.js} +2 -2
- package/dist/cli/chunks/{chunk-D7RVZ5C2.js → chunk-MP3FSUNB.js} +2 -2
- package/dist/cli/chunks/{chunk-ADF6LGHZ.js → chunk-MQCTLTGE.js} +2 -2
- package/dist/cli/chunks/{chunk-OHH6BUZK.js → chunk-MQTA6KIO.js} +1 -1
- package/dist/cli/chunks/{chunk-ISASRHZP.js → chunk-NBUXM5X6.js} +10 -6
- package/dist/cli/chunks/{chunk-KOLHZSEC.js → chunk-NHRF3V4B.js} +2 -2
- package/dist/cli/chunks/chunk-NMY4KTWA.js +16 -0
- package/dist/cli/chunks/chunk-NYS2GUNO.js +2 -0
- package/dist/cli/chunks/{chunk-EGHK6NMH.js → chunk-ONPPBLRB.js} +2 -2
- package/dist/cli/chunks/{chunk-YQ6BK7QC.js → chunk-OPDZBRIL.js} +2 -2
- package/dist/cli/chunks/{chunk-DPL4ZXTE.js → chunk-OQ4S6B7P.js} +1 -1
- package/dist/cli/chunks/{chunk-6HO3XRXE.js → chunk-ORBODZSO.js} +2 -2
- package/dist/cli/chunks/{chunk-GLKLEHK3.js → chunk-ORFL3YXB.js} +2 -2
- package/dist/cli/chunks/{chunk-I43QRLLB.js → chunk-P7DXVL2S.js} +2 -2
- package/dist/cli/chunks/chunk-PEMSXSP2.js +4 -0
- package/dist/cli/chunks/chunk-PS6WFCA4.js +6 -0
- package/dist/cli/chunks/{chunk-HEKCN5XQ.js → chunk-Q2RBOC7V.js} +2 -2
- package/dist/cli/chunks/{chunk-54XTJBHV.js → chunk-QLKUCMZC.js} +1 -1
- package/dist/cli/chunks/{chunk-3BDDOFYW.js → chunk-QLYO3H7E.js} +9 -9
- package/dist/cli/chunks/{chunk-VMSO6DMF.js → chunk-QS5KZYUZ.js} +2 -2
- package/dist/cli/chunks/{chunk-JFQDWAU3.js → chunk-R363XXGH.js} +2 -2
- package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
- package/dist/cli/chunks/{chunk-73PCVMGA.js → chunk-RFDFET3O.js} +2 -2
- package/dist/cli/chunks/{chunk-LJRZAALA.js → chunk-RHIQ6QO5.js} +357 -351
- package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
- package/dist/cli/chunks/{chunk-RJ5CZ7B6.js → chunk-RUTO67PT.js} +2 -2
- package/dist/cli/chunks/{chunk-DF4Y3HPO.js → chunk-RV6HSMKJ.js} +1 -1
- package/dist/cli/chunks/{chunk-54ITMOFM.js → chunk-SOSJWM3E.js} +4 -4
- package/dist/cli/chunks/{chunk-5SS2Z7JC.js → chunk-SV5BUYHH.js} +2 -2
- package/dist/cli/chunks/{chunk-XHCCH7UC.js → chunk-TL5GV3PR.js} +8 -8
- package/dist/cli/chunks/{chunk-ZKXZTIVF.js → chunk-TLUIO37P.js} +2 -2
- package/dist/cli/chunks/{chunk-2LL35V3A.js → chunk-TUDENMAE.js} +2 -2
- package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
- package/dist/cli/chunks/{chunk-2DRMTRBM.js → chunk-UB6DQGWM.js} +2 -2
- package/dist/cli/chunks/chunk-UHHMAKPE.js +3 -0
- package/dist/cli/chunks/{chunk-DBIK4OFX.js → chunk-ULCHPPW2.js} +1 -1
- package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
- package/dist/cli/chunks/{chunk-I6E4X3L3.js → chunk-VAYZ5QIE.js} +1 -1
- package/dist/cli/chunks/{chunk-G3ZUB3HD.js → chunk-VCONCVSY.js} +3 -3
- package/dist/cli/chunks/{chunk-7X2IVMXN.js → chunk-VVF337SV.js} +2 -2
- package/dist/cli/chunks/{chunk-EY5IUF7U.js → chunk-WKDWRRDT.js} +2 -2
- package/dist/cli/chunks/{chunk-FRBCX46J.js → chunk-X2DR27AY.js} +2 -2
- package/dist/cli/chunks/{chunk-I53365HG.js → chunk-X33F7NXH.js} +3 -3
- package/dist/cli/chunks/{chunk-MVTUFPM2.js → chunk-XBEI2JBA.js} +2 -2
- package/dist/cli/chunks/{chunk-OG4KHX7S.js → chunk-XBFQJZWX.js} +2 -2
- package/dist/cli/chunks/{chunk-DVE5SM5G.js → chunk-XFPQIWEH.js} +3 -3
- package/dist/cli/chunks/{chunk-RWZ4F44Y.js → chunk-XPB5BVU6.js} +2 -2
- package/dist/cli/chunks/{chunk-TVQPYP2Z.js → chunk-XQ53PZEF.js} +3 -3
- package/dist/cli/chunks/{chunk-73MTUM6F.js → chunk-XZ46CI35.js} +2 -2
- package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
- package/dist/cli/chunks/{chunk-BY5PLEPZ.js → chunk-YNG7E26C.js} +2 -2
- package/dist/cli/chunks/{chunk-YUWUFYHK.js → chunk-YXU35GGD.js} +1 -1
- package/dist/cli/chunks/{chunk-B7GJXQD2.js → chunk-ZCP4P6O2.js} +2 -2
- package/dist/cli/chunks/{chunk-LGA6J4I4.js → chunk-ZL5LJT7D.js} +2 -2
- package/dist/cli/chunks/{chunk-TB22Y3WW.js → chunk-ZOUEQ6DL.js} +1 -1
- package/dist/cli/chunks/{chunk-U2E5F3VZ.js → chunk-ZSBD4FUX.js} +2 -2
- package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
- package/dist/cli/chunks/{chunk-WYO5VN2L.js → chunk-ZUTFHGEO.js} +1 -1
- package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
- package/dist/cli/chunks/ci-config-2ZVV4OXL.js +2 -0
- package/dist/cli/chunks/{ci-output-BMJABAEX.js → ci-output-E45OGVPR.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-GYD5CMJQ.js → circuit-breaker-X73ITYZC.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-MMOYVBVD.js → claude-flow-setup-W4PPH46C.js} +2 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
- package/dist/cli/chunks/{cline-installer-B2SOZ44R.js → cline-installer-NUEPMWDE.js} +2 -2
- package/dist/cli/chunks/{code-V3FIRAXD.js → code-6WQHBS7G.js} +4 -4
- package/dist/cli/chunks/{code-index-extractor-CV6A756Z.js → code-index-extractor-BXQIFIFT.js} +2 -2
- package/dist/cli/chunks/{codex-installer-EUC6J47Y.js → codex-installer-Z337R2KH.js} +2 -2
- package/dist/cli/chunks/{completions-DQQIBAHR.js → completions-F5DMYFHV.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-HPXMXP5I.js → complexity-analyzer-W2SYPZDI.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RCIYXH6V.js → continuedev-installer-ZCHUIFTN.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-VUH32SHF.js → copilot-installer-M5JNODXF.js} +2 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
- package/dist/cli/chunks/{cost-tracker-YLCKLOAL.js → cost-tracker-LSYTHBHV.js} +2 -2
- package/dist/cli/chunks/coverage-PGMRS5SS.js +49 -0
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +2 -0
- package/dist/cli/chunks/{cursor-installer-B42FN62K.js → cursor-installer-XPUA73UW.js} +2 -2
- package/dist/cli/chunks/{daemon-DECQRQII.js → daemon-ITKDIYMW.js} +5 -5
- package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
- package/dist/cli/chunks/{dag-attention-scheduler-RY7CDYSC.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
- package/dist/cli/chunks/{detect-NW53BMJN.js → detect-DR7J6K4O.js} +2 -2
- package/dist/cli/chunks/{dist-node-LE6KHXAB.js → dist-node-LAJJBOUT.js} +2 -2
- package/dist/cli/chunks/{domain-handler-JGXFT4LW.js → domain-handler-OMSHCRMK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GY3RYKKK.js → domain-plugins-EQXSKC5K.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-CGBRXNTC.js → domain-transfer-FKRAGVSW.js} +2 -2
- package/dist/cli/chunks/dream-3UABDRZJ.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-JZFPCNL3.js +3 -0
- package/dist/cli/chunks/{eval-YPYIZQUR.js → eval-JSNNASBW.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
- package/dist/cli/chunks/{fast-paths-HYQTAF2S.js → fast-paths-YNMIBS2E.js} +2 -2
- package/dist/cli/chunks/{feature-flags-HNSAFFX2.js → feature-flags-SRLXDKBI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-YACUH6OW.js → feature-flags-VIR7O4L7.js} +2 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
- package/dist/cli/chunks/{fleet-6M3BP4OO.js → fleet-K2ED46EL.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QLD7KHXV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EZP333X4.js → heartbeat-handler-YYQI4WZM.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +2 -0
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-47CUCSAU.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SVNYDJZH.js → hnswlib-node-SE3MJJYS.js} +2 -2
- package/dist/cli/chunks/{hooks-6V5LMWP6.js → hooks-C572SRDH.js} +43 -43
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-L2FOBIFF.js → hypergraph-engine-35A6G3M5.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DU6Z57EE.js → hypergraph-handler-U2756CWI.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +2 -0
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +88 -0
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +2 -0
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-NHKYGJ7Q.js → kilocode-installer-32PX5YH7.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-24UK6GGR.js → kiro-installer-C4ROMMUS.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +2 -0
- package/dist/cli/chunks/learning-GEPVZGJQ.js +122 -0
- package/dist/cli/chunks/{llm-router-XRMI2VMG.js → llm-router-XRKTTJTX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
- package/dist/cli/chunks/{load-W5UWL5C7.js → load-XVH6HW7E.js} +2 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
- package/dist/cli/chunks/{mcp-N7ALQ4BL.js → mcp-IULSTM4Z.js} +2 -2
- package/dist/cli/chunks/{memory-WV52DLSA.js → memory-6K7IAU4T.js} +5 -5
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +2 -0
- package/dist/cli/chunks/memory-handlers-CG6DRLAW.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3FVTZCSO.js → multi-model-executor-VZDUYPLX.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-NTPWGHUW.js → opencode-installer-QUTXKNH4.js} +2 -2
- package/dist/cli/chunks/orchestrator-PCKKUWOP.js +452 -0
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-WWXHUH5U.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
- package/dist/cli/chunks/{pipeline-ZOKZFXTH.js → pipeline-O562GTOG.js} +2 -2
- package/dist/cli/chunks/{platform-CDNL322F.js → platform-PM7Q2AZS.js} +2 -2
- package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-FVJDU2JY.js → prime-radiant-advanced-wasm-6CFXTHC2.js} +2 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +2 -0
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +2 -0
- package/dist/cli/chunks/{protocol-handler-4YBN5R23.js → protocol-handler-PPGNSAOS.js} +2 -2
- package/dist/cli/chunks/{prove-BHDHY664.js → prove-WQ3BKRZG.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
- package/dist/cli/chunks/quality-C5WUU3AA.js +8 -0
- package/dist/cli/chunks/{quality-gate-WANE7TCN.js → quality-gate-WSSRKD5U.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +2 -0
- package/dist/cli/chunks/real-embeddings-CFQE7IRQ.js +2 -0
- package/dist/cli/chunks/{ref-validation-S7UWXQIP.js → ref-validation-DHKHXVZT.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-TEYOQYL6.js → roocode-installer-3PPODABV.js} +2 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +2 -0
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +2 -0
- package/dist/cli/chunks/{routing-handler-KDTLMRWD.js → routing-handler-JNXTGT6T.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-AOUDXCYE.js → ruvector-commands-6YLROPVP.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-4DWB4WRK.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-QI47Y354.js → rvf-store-integrity-YKR2ZNBF.js} +2 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +2 -0
- package/dist/cli/chunks/schedule-KD2VN6GB.js +2 -0
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +2 -0
- package/dist/cli/chunks/{security-SN6MWOJT.js → security-PWQTGDRU.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-LNRLFP5I.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-WU7PFKQM.js → shared-rvf-dual-writer-GWU6YQNS.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +2 -0
- package/dist/cli/chunks/{standalone-memory-F6FSRFWC.js → standalone-memory-46KKBSSV.js} +2 -2
- package/dist/cli/chunks/{status-handler-DHD5MS4G.js → status-handler-35T5FTDQ.js} +2 -2
- package/dist/cli/chunks/{structural-health-P6HPSQMR.js → structural-health-P7QPQWLO.js} +2 -2
- package/dist/cli/chunks/{sync-LISJGDSE.js → sync-W6Z4R4PL.js} +2 -2
- package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
- package/dist/cli/chunks/{task-handler-ZT44NT5Z.js → task-handler-5CX3ZYT7.js} +2 -2
- package/dist/cli/chunks/{task-handlers-R6DQ5324.js → task-handlers-DQZGOJNE.js} +3 -3
- package/dist/cli/chunks/{test-MUFHR4JQ.js → test-TPP53VVV.js} +12 -12
- package/dist/cli/chunks/{test-scheduling-TAUSLZJP.js → test-scheduling-WBV4UMQH.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
- package/dist/cli/chunks/{token-usage-IX65ECBR.js → token-usage-AKK37RB7.js} +2 -2
- package/dist/cli/chunks/{transformers-QKPSVW2W.js → transformers-7MASPELS.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-Z7PPA2JO.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
- package/dist/cli/chunks/{types-ULNNGGGH.js → types-AZ3BTXDP.js} +2 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +2 -0
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +2 -0
- package/dist/cli/chunks/{upgrade-ECI3YUYA.js → upgrade-L7OTDKEK.js} +2 -2
- package/dist/cli/chunks/{validate-3JKRUW2S.js → validate-O3QVFIGP.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-LZWANCIE.js → validate-swarm-2UGBGLTX.js} +2 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-N5V4A6XG.js → web-tree-sitter-J75IYPRO.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-5TBM5B3C.js → windsurf-installer-FQ5DBFCG.js} +2 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
- package/dist/cli/chunks/{witness-chain-MFP3HBWQ.js → witness-chain-I7TN4MXZ.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-D3NE3NQK.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-SRAT7LVY.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
- package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
- package/dist/cli/chunks/{workflow-M7TUYYXY.js → workflow-6BWTNVV6.js} +28 -28
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +2 -0
- package/dist/cli/chunks/wrappers-URVP25VU.js +2 -0
- package/dist/cli/commands/ci.js +53 -23
- package/dist/cli/commands/code.js +1 -0
- package/dist/cli/commands/coverage.d.ts +1 -0
- package/dist/cli/commands/coverage.js +182 -138
- package/dist/cli/commands/daemon.js +7 -1
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
- package/dist/cli/commands/learning.js +47 -7
- package/dist/cli/commands/quality.d.ts +12 -1
- package/dist/cli/commands/quality.js +51 -3
- package/dist/cli/commands/test.js +6 -7
- package/dist/cli/commands/workflow.js +9 -5
- package/dist/cli/handlers/init-guard.d.ts +13 -0
- package/dist/cli/handlers/init-guard.js +23 -0
- package/dist/cli/handlers/init-handler.d.ts +3 -0
- package/dist/cli/handlers/init-handler.js +9 -0
- package/dist/cli/handlers/interfaces.js +5 -1
- package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
- package/dist/cli/scheduler/persistent-scheduler.js +107 -41
- package/dist/cli/utils/ci-output.d.ts +22 -5
- package/dist/cli/utils/ci-output.js +33 -5
- package/dist/cli/utils/coverage-data.d.ts +10 -0
- package/dist/cli/utils/coverage-data.js +34 -65
- package/dist/cli/utils/coverage-verdict.d.ts +130 -0
- package/dist/cli/utils/coverage-verdict.js +193 -0
- package/dist/cli/utils/file-discovery.js +5 -0
- package/dist/contracts/verdicts.d.ts +14 -0
- package/dist/contracts/verdicts.js +44 -3
- package/dist/coordination/deterministic-actions.js +24 -13
- package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
- package/dist/coordination/handlers/coverage-handlers.js +150 -121
- package/dist/coordination/handlers/coverage-runner.d.ts +143 -0
- package/dist/coordination/handlers/coverage-runner.js +462 -0
- package/dist/coordination/handlers/coverage-target.d.ts +145 -0
- package/dist/coordination/handlers/coverage-target.js +314 -0
- package/dist/coordination/handlers/handler-types.d.ts +9 -0
- package/dist/coordination/handlers/handler-utils.d.ts +23 -1
- package/dist/coordination/handlers/handler-utils.js +90 -23
- package/dist/coordination/handlers/quality-handlers.js +209 -33
- package/dist/coordination/handlers/test-execution-handlers.js +4 -1
- package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
- package/dist/coordination/protocols/defect-investigation.js +6 -3
- package/dist/coordination/protocols/quality-gate.js +10 -6
- package/dist/coordination/result-saver.d.ts +22 -0
- package/dist/coordination/result-saver.js +130 -46
- package/dist/coordination/task-executor.d.ts +12 -0
- package/dist/coordination/task-executor.js +37 -1
- package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
- package/dist/domains/code-intelligence/coordinator.js +10 -32
- package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
- package/dist/domains/code-intelligence/plugin.js +5 -0
- package/dist/domains/code-intelligence/project-root-resolver.d.ts +50 -0
- package/dist/domains/code-intelligence/project-root-resolver.js +121 -0
- package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +33 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +36 -0
- package/dist/domains/coverage-analysis/coordinator.js +22 -7
- package/dist/domains/coverage-analysis/interfaces.d.ts +59 -0
- package/dist/domains/coverage-analysis/interfaces.js +6 -1
- package/dist/domains/coverage-analysis/plugin.js +7 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +7 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +85 -38
- package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
- package/dist/domains/defect-intelligence/plugin.js +4 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +6 -4
- package/dist/domains/learning-optimization/coordinator.js +4 -0
- package/dist/domains/learning-optimization/plugin.js +4 -0
- package/dist/domains/quality-assessment/coordinator-claim-verifier.js +2 -1
- package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
- package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
- package/dist/domains/quality-assessment/coordinator.js +18 -14
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +49 -0
- package/dist/domains/quality-assessment/coverage-report-event.js +58 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.d.ts +57 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.js +97 -0
- package/dist/domains/quality-assessment/index.d.ts +2 -2
- package/dist/domains/quality-assessment/index.js +1 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
- package/dist/domains/quality-assessment/plugin.js +8 -8
- package/dist/domains/quality-assessment/quality-evidence.d.ts +98 -4
- package/dist/domains/quality-assessment/quality-evidence.js +152 -8
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
- package/dist/domains/quality-assessment/services/quality-analyzer.js +203 -116
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +22 -16
- package/dist/domains/test-execution/interfaces.d.ts +10 -6
- package/dist/domains/test-execution/plugin.js +4 -0
- package/dist/domains/test-execution/services/test-executor.js +152 -102
- package/dist/domains/test-generation/coordinator.js +4 -0
- package/dist/domains/test-generation/plugin.js +4 -0
- package/dist/feedback/coverage-learner.js +4 -1
- package/dist/feedback/coverage-session-provenance.d.ts +29 -0
- package/dist/feedback/coverage-session-provenance.js +39 -0
- package/dist/init/orchestrator.js +2 -0
- package/dist/init/phases/09-assets.d.ts +4 -0
- package/dist/init/phases/09-assets.js +35 -0
- package/dist/init/retired-assets.d.ts +86 -0
- package/dist/init/retired-assets.js +230 -0
- package/dist/init/skills-installer.d.ts +2 -0
- package/dist/init/skills-installer.js +4 -0
- package/dist/init/types.d.ts +3 -0
- package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
- package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
- package/dist/integrations/ruvector/server-client.js +4 -12
- package/dist/kernel/project-root.d.ts +17 -0
- package/dist/kernel/project-root.js +54 -2
- package/dist/kernel/shared-dirs.d.ts +66 -0
- package/dist/kernel/shared-dirs.js +168 -0
- package/dist/learning/daily-log.js +2 -1
- package/dist/learning/experience-capture-middleware.d.ts +22 -0
- package/dist/learning/experience-capture-middleware.js +35 -0
- package/dist/learning/learnable-result.d.ts +16 -0
- package/dist/learning/learnable-result.js +24 -0
- package/dist/learning/pattern-mutation-error.d.ts +8 -0
- package/dist/learning/pattern-mutation-error.js +12 -0
- package/dist/learning/qe-reasoning-bank.d.ts +10 -0
- package/dist/learning/qe-reasoning-bank.js +50 -1
- package/dist/learning/rvf-reconcile.d.ts +39 -0
- package/dist/learning/rvf-reconcile.js +40 -0
- package/dist/learning/sqlite-persistence.d.ts +14 -0
- package/dist/learning/sqlite-persistence.js +36 -0
- package/dist/mcp/bundle.js +524 -507
- package/dist/mcp/handlers/domain-handler-configs.d.ts +49 -2
- package/dist/mcp/handlers/domain-handler-configs.js +79 -7
- package/dist/mcp/handlers/handler-factory.js +43 -14
- package/dist/mcp/handlers/wrapped-domain-handlers.js +7 -1
- package/dist/mcp/protocol-server.js +30 -4
- package/dist/mcp/tool-cache-scope.d.ts +31 -0
- package/dist/mcp/tool-cache-scope.js +71 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
- package/dist/mcp/tools/coverage-analysis/index.js +1 -0
- package/dist/mcp/types.d.ts +10 -0
- package/dist/optimization/session-cache.d.ts +19 -1
- package/dist/optimization/session-cache.js +36 -2
- package/dist/plugins/cache.js +2 -1
- package/dist/plugins/sources/github.js +2 -1
- package/dist/plugins/sources/npm.js +2 -1
- package/dist/shared/aqe-managed-dirs.d.ts +24 -0
- package/dist/shared/aqe-managed-dirs.js +56 -0
- package/dist/shared/events/domain-events.d.ts +20 -3
- package/dist/shared/events/domain-events.js +4 -0
- package/dist/shared/http/http-client.d.ts +6 -0
- package/dist/shared/http/http-client.js +13 -15
- package/dist/shared/io/file-reader.d.ts +26 -0
- package/dist/shared/io/file-reader.js +111 -17
- package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
- package/dist/shared/llm/providers/response-deadline.js +17 -5
- package/dist/shared/metrics/code-metrics.d.ts +24 -0
- package/dist/shared/metrics/code-metrics.js +93 -6
- package/dist/shared/metrics/index.d.ts +1 -1
- package/dist/workers/interfaces.d.ts +9 -1
- package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
- package/dist/workers/quality-daemon/coverage-delta.js +13 -6
- package/dist/workers/quality-daemon/index.js +6 -5
- package/dist/workers/quality-daemon/notification-service.js +3 -3
- package/dist/workers/quality-daemon/persistent-memory.d.ts +2 -2
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-manager.js +5 -1
- package/dist/workers/workers/coverage-tracker.js +69 -33
- package/dist/workers/workers/regression-monitor.d.ts +18 -1
- package/dist/workers/workers/regression-monitor.js +276 -117
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-T54G3TBK.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-HLCJJ3JM.js +0 -2
- package/dist/cli/chunks/base-VLD755UU.js +0 -2
- package/dist/cli/chunks/browser-workflow-6M6VLWRF.js +0 -2
- package/dist/cli/chunks/chunk-5XXLWJU7.js +0 -2
- package/dist/cli/chunks/chunk-AHVN3UQZ.js +0 -4
- package/dist/cli/chunks/chunk-AOKSLWON.js +0 -742
- package/dist/cli/chunks/chunk-CQ3WSTJ2.js +0 -16
- package/dist/cli/chunks/chunk-LY53L6NH.js +0 -2
- package/dist/cli/chunks/chunk-O7TMY4GS.js +0 -2
- package/dist/cli/chunks/chunk-QIAX3JJB.js +0 -3
- package/dist/cli/chunks/chunk-RJMBHZYL.js +0 -2
- package/dist/cli/chunks/chunk-UORI2CZ4.js +0 -2
- package/dist/cli/chunks/chunk-V3NZ23X6.js +0 -2
- package/dist/cli/chunks/chunk-WI5AEB7Q.js +0 -2
- package/dist/cli/chunks/chunk-XKIFNKHV.js +0 -2
- package/dist/cli/chunks/chunk-ZAOQIVHG.js +0 -5
- package/dist/cli/chunks/chunk-ZF5JTQEE.js +0 -4
- package/dist/cli/chunks/ci-NGMGB43T.js +0 -82
- package/dist/cli/chunks/client-FUHNNK5O.js +0 -2
- package/dist/cli/chunks/core-handlers-F7TLX4LM.js +0 -2
- package/dist/cli/chunks/coverage-IVKDV236.js +0 -27
- package/dist/cli/chunks/cross-domain-router-EGWPY67O.js +0 -2
- package/dist/cli/chunks/daemon-IPTOSCHM.js +0 -10
- package/dist/cli/chunks/dream-V4QN6OF5.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-65H4XHWR.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-4JXVF5PL.js +0 -40
- package/dist/cli/chunks/file-discovery-R73BYEXB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-3N3L6CRM.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-2BXJYDXI.js +0 -2
- package/dist/cli/chunks/hnsw-index-2DLI5OVO.js +0 -2
- package/dist/cli/chunks/hybrid-backend-OW4J65YH.js +0 -2
- package/dist/cli/chunks/impact-analyzer-ZH5I2RG6.js +0 -2
- package/dist/cli/chunks/init-handler-HETPWU67.js +0 -86
- package/dist/cli/chunks/init-wizard-NIKM3ZOK.js +0 -2
- package/dist/cli/chunks/kernel-2EOSVM6X.js +0 -2
- package/dist/cli/chunks/knowledge-graph-D3BPWNNO.js +0 -2
- package/dist/cli/chunks/learning-QLVRZNHT.js +0 -122
- package/dist/cli/chunks/llm-router-service-TJPPZFUN.js +0 -2
- package/dist/cli/chunks/load-test-RFT7IDOL.js +0 -2
- package/dist/cli/chunks/memory-backend-O2O4CFKZ.js +0 -2
- package/dist/cli/chunks/memory-handlers-DAEGUDBD.js +0 -2
- package/dist/cli/chunks/orchestrator-ORGJ6VAA.js +0 -452
- package/dist/cli/chunks/pattern-null-store-TUBNXS34.js +0 -2
- package/dist/cli/chunks/plugin-ZVLFNZZ4.js +0 -27
- package/dist/cli/chunks/project-root-UCHQH3QL.js +0 -2
- package/dist/cli/chunks/protocol-executor-6FQTTO3Y.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-TKPND56C.js +0 -2
- package/dist/cli/chunks/quality-46AK277P.js +0 -7
- package/dist/cli/chunks/queen-coordinator-DWMXLPJG.js +0 -2
- package/dist/cli/chunks/real-embeddings-56MNGJGJ.js +0 -2
- package/dist/cli/chunks/router-QIMUYRCC.js +0 -2
- package/dist/cli/chunks/routing-feedback-4OH5ZNF4.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-S6JBZL54.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TSGMLMYR.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-V74MVBHS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-Z7QOW47S.js +0 -2
- package/dist/cli/chunks/safe-db-JLOVBJNC.js +0 -2
- package/dist/cli/chunks/schedule-IM6XOBGR.js +0 -2
- package/dist/cli/chunks/scheduler-XL2SVVK5.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-2LB56LP4.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-LWMIIC4U.js +0 -2
- package/dist/cli/chunks/sync-SNAXAVCN.js +0 -2
- package/dist/cli/chunks/token-bootstrap-UGRH7OPU.js +0 -2
- package/dist/cli/chunks/unified-memory-F5IJY7W7.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-C3WAMAQL.js +0 -2
- package/dist/cli/chunks/unified-persistence-EWXXOTCB.js +0 -2
- package/dist/cli/chunks/visual-security-CKLTAIAB.js +0 -2
- package/dist/cli/chunks/witness-chain-Z6LWFEZS.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-5QWRFVUK.js +0 -2
- package/dist/cli/chunks/witness-key-manager-FYZXQTLJ.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-OFTAR2NA.js +0 -2
- package/dist/cli/chunks/wrappers-COU73OQ6.js +0 -2
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage target resolution (issue #995).
|
|
3
|
+
*
|
|
4
|
+
* A coverage target can be the project root, a subfolder of it, a single source
|
|
5
|
+
* file, or an existing coverage report. Before #995 every target was treated as
|
|
6
|
+
* if it were the project root: `target: "src/"` ran vitest FROM `src/` (which
|
|
7
|
+
* found no tests, reported 0%, and wrote `src/coverage/` into the source tree),
|
|
8
|
+
* and `target: "coverage/lcov.info"` was searched for a `coverage/` folder
|
|
9
|
+
* inside a file and came back empty.
|
|
10
|
+
*
|
|
11
|
+
* This module answers the three questions every collector needs first:
|
|
12
|
+
* 1. Which project does the target belong to? (`findCoverageProjectRoot`)
|
|
13
|
+
* 2. Is the target itself a coverage report? (`isCoverageReportFile` /
|
|
14
|
+
* `loadCoverageReportFile`)
|
|
15
|
+
* 3. Which entries of a project-wide report belong to the target?
|
|
16
|
+
* (`scopeCoverageToTarget`)
|
|
17
|
+
*
|
|
18
|
+
* Kept free of task-executor and child-process imports so both the MCP handler
|
|
19
|
+
* and the CLI `coverage` command can share it.
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'fs';
|
|
22
|
+
import * as os from 'os';
|
|
23
|
+
import * as path from 'path';
|
|
24
|
+
import { loadCoverageData, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
|
|
25
|
+
import { isTestPath } from './coverage-collection.js';
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Project root
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Files whose presence marks a directory as a project root, i.e. the directory
|
|
31
|
+
* a test/coverage tool must be run from. `.git` bounds the walk for projects
|
|
32
|
+
* without a manifest.
|
|
33
|
+
*/
|
|
34
|
+
const PROJECT_ROOT_MARKERS = [
|
|
35
|
+
'package.json',
|
|
36
|
+
'pyproject.toml', 'setup.py', 'setup.cfg',
|
|
37
|
+
'go.mod', 'Cargo.toml',
|
|
38
|
+
'pom.xml', 'build.gradle', 'build.gradle.kts',
|
|
39
|
+
'.git',
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Walk up from a target to the nearest directory that holds a project marker.
|
|
43
|
+
*
|
|
44
|
+
* NEAREST rather than topmost: in a monorepo, `packages/core/src` belongs to
|
|
45
|
+
* `packages/core` (its own package.json and test config), not the workspace
|
|
46
|
+
* root. This intentionally differs from `kernel/findProjectRoot`, which locates
|
|
47
|
+
* the AQE data root (honouring AQE_PROJECT_ROOT and `.agentic-qe`).
|
|
48
|
+
*
|
|
49
|
+
* Returns `null` when the target does not exist (a typo must not silently
|
|
50
|
+
* resolve to — and run tests for — an ancestor project) or when no marker is
|
|
51
|
+
* found below the home directory / filesystem root within `maxDepth` levels.
|
|
52
|
+
*/
|
|
53
|
+
export function findCoverageProjectRoot(target, maxDepth = 12) {
|
|
54
|
+
let dir;
|
|
55
|
+
try {
|
|
56
|
+
const resolved = path.resolve(target);
|
|
57
|
+
if (!fs.existsSync(resolved))
|
|
58
|
+
return null;
|
|
59
|
+
const real = fs.realpathSync(resolved);
|
|
60
|
+
dir = fs.statSync(real).isDirectory() ? real : path.dirname(real);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
let home = null;
|
|
66
|
+
try {
|
|
67
|
+
home = fs.realpathSync(os.homedir());
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
home = null;
|
|
71
|
+
}
|
|
72
|
+
const start = dir;
|
|
73
|
+
for (let depth = 0; depth <= maxDepth; depth++) {
|
|
74
|
+
// A stray manifest in $HOME must not claim every directory beneath it.
|
|
75
|
+
// $HOME is still a valid root when it is the target itself.
|
|
76
|
+
if (home !== null && dir === home && dir !== start)
|
|
77
|
+
return null;
|
|
78
|
+
if (PROJECT_ROOT_MARKERS.some(m => fs.existsSync(path.join(dir, m))))
|
|
79
|
+
return dir;
|
|
80
|
+
const parent = path.dirname(dir);
|
|
81
|
+
if (parent === dir)
|
|
82
|
+
return null;
|
|
83
|
+
dir = parent;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
// ============================================================================
|
|
88
|
+
// Coverage report files as targets
|
|
89
|
+
// ============================================================================
|
|
90
|
+
const REPORT_BASENAMES = new Set([
|
|
91
|
+
'lcov.info',
|
|
92
|
+
'coverage-final.json',
|
|
93
|
+
'coverage-summary.json',
|
|
94
|
+
'coverage.xml',
|
|
95
|
+
'cobertura-coverage.xml',
|
|
96
|
+
'cobertura.xml',
|
|
97
|
+
]);
|
|
98
|
+
/** Is this path (by name) a coverage report rather than source code? */
|
|
99
|
+
export function isCoverageReportFile(filePath) {
|
|
100
|
+
const base = path.basename(filePath).toLowerCase();
|
|
101
|
+
return REPORT_BASENAMES.has(base) || base.endsWith('.lcov') || base.endsWith('.lcov.info');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse a coverage report file of any supported format.
|
|
105
|
+
*
|
|
106
|
+
* Returns `null` — never an empty "0%" report — when the file can't be read,
|
|
107
|
+
* can't be parsed, or lists no files.
|
|
108
|
+
*/
|
|
109
|
+
export async function loadCoverageReportFile(filePath) {
|
|
110
|
+
let content;
|
|
111
|
+
try {
|
|
112
|
+
content = await fs.promises.readFile(filePath, 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (content.trim().length === 0)
|
|
118
|
+
return null;
|
|
119
|
+
try {
|
|
120
|
+
const base = path.basename(filePath).toLowerCase();
|
|
121
|
+
let data;
|
|
122
|
+
if (base.endsWith('.json')) {
|
|
123
|
+
const parsed = JSON.parse(content);
|
|
124
|
+
// coverage-summary.json carries a `total` entry with per-metric totals.
|
|
125
|
+
if (isSummaryShape(parsed))
|
|
126
|
+
data = parseCoverageSummaryJson(content);
|
|
127
|
+
// Anything else must be istanbul's per-file map. Raw V8 output
|
|
128
|
+
// (`{ result: [...] }`) and arbitrary JSON are rejected, not parsed into
|
|
129
|
+
// a phantom file called "result" with 0/0 coverage.
|
|
130
|
+
else if (isIstanbulShape(parsed))
|
|
131
|
+
data = parseCoverageJson(content);
|
|
132
|
+
else
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
else if (base.endsWith('.xml')) {
|
|
136
|
+
data = parseCoberturaXml(content);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
data = parseLcovInfo(content);
|
|
140
|
+
}
|
|
141
|
+
return data.files.length > 0 ? data : null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function isIstanbulShape(parsed) {
|
|
148
|
+
const entries = Object.values(parsed);
|
|
149
|
+
return entries.length > 0 && entries.every(e => typeof e === 'object' && e !== null && !Array.isArray(e) &&
|
|
150
|
+
typeof e.s === 'object' &&
|
|
151
|
+
typeof e.statementMap === 'object');
|
|
152
|
+
}
|
|
153
|
+
function isSummaryShape(parsed) {
|
|
154
|
+
const total = parsed.total;
|
|
155
|
+
return typeof total === 'object' && total !== null && typeof total.lines === 'object';
|
|
156
|
+
}
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Scoping
|
|
159
|
+
// ============================================================================
|
|
160
|
+
/** True when `child` is `parent` or inside it (path-segment aware). */
|
|
161
|
+
function isWithin(child, parent) {
|
|
162
|
+
const rel = path.relative(parent, child);
|
|
163
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
164
|
+
}
|
|
165
|
+
/** Canonicalise a path without requiring it to exist (macOS /tmp → /private/tmp). */
|
|
166
|
+
function canonical(p) {
|
|
167
|
+
try {
|
|
168
|
+
return fs.realpathSync(p);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return path.resolve(p);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Keep only the report entries that lie under `target`.
|
|
176
|
+
*
|
|
177
|
+
* Report paths come in two shapes: absolute (istanbul `coverage-final.json`)
|
|
178
|
+
* and project-root-relative (vitest/jest `lcov.info` writes `SF:src/math.ts`).
|
|
179
|
+
* Relative entries are resolved against `root` before comparing. Entry paths are
|
|
180
|
+
* returned unchanged.
|
|
181
|
+
*/
|
|
182
|
+
export function scopeCoverageToTarget(data, root, target) {
|
|
183
|
+
const rootAbs = canonical(root);
|
|
184
|
+
const targetAbs = canonical(target);
|
|
185
|
+
if (targetAbs === rootAbs)
|
|
186
|
+
return [...data.files];
|
|
187
|
+
return data.files.filter(f => {
|
|
188
|
+
const abs = path.isAbsolute(f.path) ? canonical(f.path) : path.resolve(rootAbs, f.path);
|
|
189
|
+
return isWithin(abs, targetAbs);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Decide what a report says about `target`. Shared by the MCP handler and the
|
|
194
|
+
* CLI so the two cannot disagree (#995 review B2).
|
|
195
|
+
*
|
|
196
|
+
* "Unmeasured" is decided ONLY from evidence that nothing was measured:
|
|
197
|
+
* - the runner's own result says it ran 0 tests (`numTotalTests === 0`), or
|
|
198
|
+
* - the report has no entry under the target.
|
|
199
|
+
* Hit counts are never used: a file listed with 0 hits is a measured 0%,
|
|
200
|
+
* whether the report came from our run or from the user (#995 review B3).
|
|
201
|
+
*/
|
|
202
|
+
export function evaluateCoverageForTarget(report, projectRoot, target, options = {}) {
|
|
203
|
+
if (options.numTotalTests === 0)
|
|
204
|
+
return { status: 'no-data', reason: 'no-tests-ran' };
|
|
205
|
+
const scoped = scopeCoverageToTarget(report, projectRoot, target);
|
|
206
|
+
if (scoped.length === 0)
|
|
207
|
+
return { status: 'no-data', reason: 'target-not-covered' };
|
|
208
|
+
// Coverage OF a test file is not production coverage (#569). A report with
|
|
209
|
+
// only test entries yields no production figure — never the unfiltered set.
|
|
210
|
+
const production = scoped.filter(f => !isTestPath(f.path, projectRoot));
|
|
211
|
+
if (production.length === 0)
|
|
212
|
+
return { status: 'no-data', reason: 'test-only-report' };
|
|
213
|
+
return { status: 'measured', files: production };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Resolve a target to coverage that already exists on disk, without running
|
|
217
|
+
* anything:
|
|
218
|
+
* - a coverage report passed as the target is parsed and analysed whole;
|
|
219
|
+
* - otherwise the PROJECT ROOT's report (not the cwd's, not the subfolder's)
|
|
220
|
+
* is scoped to the target;
|
|
221
|
+
* - `no-report` tells the caller it may run tooling from `projectRoot`.
|
|
222
|
+
*/
|
|
223
|
+
export async function resolveExistingCoverage(targetPath) {
|
|
224
|
+
const target = path.resolve(targetPath);
|
|
225
|
+
let stat;
|
|
226
|
+
try {
|
|
227
|
+
stat = fs.statSync(target);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return { status: 'target-missing', target };
|
|
231
|
+
}
|
|
232
|
+
if (stat.isFile() && isCoverageReportFile(target)) {
|
|
233
|
+
const reportDir = path.dirname(target);
|
|
234
|
+
const projectRoot = findCoverageProjectRoot(reportDir)
|
|
235
|
+
?? (path.basename(reportDir) === 'coverage' ? path.dirname(reportDir) : reportDir);
|
|
236
|
+
const report = await loadCoverageReportFile(target);
|
|
237
|
+
const evaluation = report
|
|
238
|
+
? evaluateCoverageForTarget(report, projectRoot, projectRoot)
|
|
239
|
+
: { status: 'no-data', reason: 'unreadable-report' };
|
|
240
|
+
return { status: 'evaluated', target, projectRoot, source: 'report-file', evaluation };
|
|
241
|
+
}
|
|
242
|
+
const projectRoot = findCoverageProjectRoot(target) ?? (stat.isDirectory() ? target : path.dirname(target));
|
|
243
|
+
const existing = await loadCoverageData(projectRoot);
|
|
244
|
+
if (!existing)
|
|
245
|
+
return { status: 'no-report', target, projectRoot };
|
|
246
|
+
return {
|
|
247
|
+
status: 'evaluated', target, projectRoot, source: 'project-report',
|
|
248
|
+
evaluation: evaluateCoverageForTarget(existing, projectRoot, target),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Threshold verdict over the metrics that were actually collected. Shared by
|
|
253
|
+
* MCP and CLI (#995 review NB5): an uncollected metric (no branch data in the
|
|
254
|
+
* report) is null, and a null must not drag the average down as a fake 0.
|
|
255
|
+
*/
|
|
256
|
+
export function thresholdVerdict(summary, threshold, collected) {
|
|
257
|
+
// #1027 N7: lcov / Cobertura carry no statement data; it is left out too.
|
|
258
|
+
const metrics = [summary.line];
|
|
259
|
+
if (collected.statement !== false)
|
|
260
|
+
metrics.push(summary.statement);
|
|
261
|
+
if (collected.branch)
|
|
262
|
+
metrics.push(summary.branch);
|
|
263
|
+
if (collected.function)
|
|
264
|
+
metrics.push(summary.function);
|
|
265
|
+
const overall = metrics.reduce((a, b) => a + b, 0) / metrics.length;
|
|
266
|
+
return { overall, meetsThreshold: overall >= threshold };
|
|
267
|
+
}
|
|
268
|
+
const SHORTFALL_RE = /^Coverage is [\d.]+% below threshold/i;
|
|
269
|
+
/**
|
|
270
|
+
* Make the analyzer's recommendations agree with `thresholdVerdict`
|
|
271
|
+
* (#995 review NB-A). The analyzer computes its "Coverage is X% below
|
|
272
|
+
* threshold" line from a 4-metric average that counts an uncollected metric as
|
|
273
|
+
* 0 — so a line-only report at 90% got "Met" next to "35.0% below threshold".
|
|
274
|
+
* Here the shortfall line is recomputed from the collected-metrics verdict,
|
|
275
|
+
* and advice about a metric that was never collected is dropped.
|
|
276
|
+
*/
|
|
277
|
+
export function reconcileRecommendations(recommendations, verdict, threshold, collected) {
|
|
278
|
+
const kept = recommendations.filter(rec => !SHORTFALL_RE.test(rec) &&
|
|
279
|
+
(collected.branch || !/branch coverage/i.test(rec)) &&
|
|
280
|
+
(collected.function || !/function coverage/i.test(rec)));
|
|
281
|
+
if (verdict.meetsThreshold)
|
|
282
|
+
return kept;
|
|
283
|
+
return [
|
|
284
|
+
`Coverage is ${(threshold - verdict.overall).toFixed(1)}% below threshold. Focus on high-risk files first.`,
|
|
285
|
+
...kept,
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
/** Is this verdict "no measurement exists" (as opposed to an error or test-only report)? */
|
|
289
|
+
export function isUnmeasured(reason) {
|
|
290
|
+
return reason === 'target-not-covered' || reason === 'no-tests-ran';
|
|
291
|
+
}
|
|
292
|
+
/** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
|
|
293
|
+
export function describeNoData(reason, target, projectRoot) {
|
|
294
|
+
switch (reason) {
|
|
295
|
+
case 'target-missing':
|
|
296
|
+
return `Target does not exist: ${target}`;
|
|
297
|
+
case 'unreadable-report':
|
|
298
|
+
return `Unreadable coverage report: ${target}. It could not be parsed or lists no files. ` +
|
|
299
|
+
'Supported: lcov.info, istanbul coverage-final.json / coverage-summary.json, Cobertura XML. ' +
|
|
300
|
+
"Raw V8 output is not supported — convert it with c8 or your runner's istanbul reporter.";
|
|
301
|
+
case 'test-only-report':
|
|
302
|
+
return 'The coverage report contains only test files, so there is no production ' +
|
|
303
|
+
'coverage to report. Coverage OF a test file is not a meaningful metric. ' +
|
|
304
|
+
'Check that your coverage tool is instrumenting your source directory.';
|
|
305
|
+
case 'target-not-covered':
|
|
306
|
+
return `Target is UNMEASURED: the coverage data for project ${projectRoot ?? '?'} has no entry ` +
|
|
307
|
+
`for any production file under ${target}. This is not 0% coverage — no measurement exists ` +
|
|
308
|
+
"for it. Check your coverage tool's include/exclude settings, or regenerate the report.";
|
|
309
|
+
case 'no-tests-ran':
|
|
310
|
+
return `Target is UNMEASURED: the test runner reported running 0 tests from ${projectRoot ?? '?'}. ` +
|
|
311
|
+
'This is not 0% coverage.';
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=coverage-target.js.map
|
|
@@ -11,7 +11,10 @@ import type { CoverageAnalyzerService } from '../../domains/coverage-analysis';
|
|
|
11
11
|
import type { SecurityScannerService } from '../../domains/security-compliance';
|
|
12
12
|
import type { TestGeneratorService } from '../../domains/test-generation';
|
|
13
13
|
import type { KnowledgeGraphService } from '../../domains/code-intelligence';
|
|
14
|
+
import type { ICodeIntelligenceCoordinator } from '../../domains/code-intelligence/coordinator';
|
|
14
15
|
import type { QualityAnalyzerService } from '../../domains/quality-assessment';
|
|
16
|
+
/** The coordinator surface the MCP index-code handler needs (#999). */
|
|
17
|
+
export type ProjectMetricsCollector = Pick<ICodeIntelligenceCoordinator, 'collectProjectMetrics'>;
|
|
15
18
|
/** Signature of a single task handler */
|
|
16
19
|
export type InstanceTaskHandler = (task: QueenTask) => Promise<Result<unknown, Error>>;
|
|
17
20
|
/**
|
|
@@ -33,6 +36,12 @@ export interface TaskHandlerContext {
|
|
|
33
36
|
*/
|
|
34
37
|
getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
|
|
35
38
|
getKnowledgeGraph(): KnowledgeGraphService;
|
|
39
|
+
/**
|
|
40
|
+
* #999 MCP-CLI parity: the code-intelligence coordinator, whose
|
|
41
|
+
* collectProjectMetrics step `aqe code index` runs. Resolves to undefined when
|
|
42
|
+
* the domain is unavailable. Optional so lightweight contexts can omit it.
|
|
43
|
+
*/
|
|
44
|
+
getCodeIntelligenceCoordinator?(): Promise<ProjectMetricsCollector | undefined>;
|
|
36
45
|
getQualityAnalyzer(): QualityAnalyzerService;
|
|
37
46
|
/** Executor configuration */
|
|
38
47
|
readonly config: {
|
|
@@ -75,9 +75,31 @@ export interface IstanbulFileCoverage {
|
|
|
75
75
|
*/
|
|
76
76
|
export declare function loadCoverageData(targetPath: string): Promise<CoverageData | null>;
|
|
77
77
|
/**
|
|
78
|
-
*
|
|
78
|
+
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
79
|
+
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
80
|
+
* `lines` and lcov.info `DA:` records) does: each statement counts on its
|
|
81
|
+
* START line, and a line's count is the highest count of the statements that
|
|
82
|
+
* start on it. A line is covered when any statement on it ran (#1012).
|
|
83
|
+
*/
|
|
84
|
+
export declare function istanbulLineHits(fd: Pick<IstanbulFileCoverage, 'statementMap' | 's'>): Map<number, number>;
|
|
85
|
+
/**
|
|
86
|
+
* Parse Istanbul/nyc coverage-final.json format.
|
|
87
|
+
*
|
|
88
|
+
* #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
|
|
89
|
+
* as istanbul's own summary does), not statements. Before, statement counts
|
|
90
|
+
* were reported as "line", so one project had two different line figures
|
|
91
|
+
* depending on whether coverage-final.json or lcov.info was read.
|
|
79
92
|
*/
|
|
80
93
|
export declare function parseCoverageJson(content: string): CoverageData;
|
|
94
|
+
/**
|
|
95
|
+
* Parse istanbul `coverage-summary.json` (the `json-summary` reporter).
|
|
96
|
+
*
|
|
97
|
+
* Shape: `{ total: {...}, "<file>": { lines, statements, functions, branches } }`
|
|
98
|
+
* where each metric is `{ total, covered, skipped, pct }`. There is no
|
|
99
|
+
* per-line detail, so `uncoveredLines` is empty — a summary can report a
|
|
100
|
+
* figure but cannot locate a gap (#995).
|
|
101
|
+
*/
|
|
102
|
+
export declare function parseCoverageSummaryJson(content: string): CoverageData;
|
|
81
103
|
/**
|
|
82
104
|
* Parse LCOV info format
|
|
83
105
|
*/
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
8
|
import * as path from 'path';
|
|
9
|
+
import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
|
|
9
10
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Coverage Data Loaders
|
|
@@ -21,6 +22,8 @@ export async function loadCoverageData(targetPath) {
|
|
|
21
22
|
path.join(targetPath, 'coverage', 'lcov.info'),
|
|
22
23
|
path.join(targetPath, '.nyc_output', 'coverage-final.json'),
|
|
23
24
|
path.join(targetPath, 'coverage-final.json'),
|
|
25
|
+
// Summary-only (per-file totals, no line detail) — last JS resort (#995)
|
|
26
|
+
path.join(targetPath, 'coverage', 'coverage-summary.json'),
|
|
24
27
|
// Python (pytest-cov, coverage.py)
|
|
25
28
|
path.join(targetPath, 'coverage.xml'),
|
|
26
29
|
path.join(targetPath, 'htmlcov', 'status.json'),
|
|
@@ -30,7 +33,10 @@ export async function loadCoverageData(targetPath) {
|
|
|
30
33
|
for (const coveragePath of coverageLocations) {
|
|
31
34
|
try {
|
|
32
35
|
const content = await fs.readFile(coveragePath, 'utf-8');
|
|
33
|
-
if (coveragePath.endsWith('.json')) {
|
|
36
|
+
if (coveragePath.endsWith('coverage-summary.json')) {
|
|
37
|
+
return parseCoverageSummaryJson(content);
|
|
38
|
+
}
|
|
39
|
+
else if (coveragePath.endsWith('.json')) {
|
|
34
40
|
return parseCoverageJson(content);
|
|
35
41
|
}
|
|
36
42
|
else if (coveragePath.endsWith('.info')) {
|
|
@@ -47,7 +53,32 @@ export async function loadCoverageData(targetPath) {
|
|
|
47
53
|
return null;
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
|
-
*
|
|
56
|
+
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
57
|
+
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
58
|
+
* `lines` and lcov.info `DA:` records) does: each statement counts on its
|
|
59
|
+
* START line, and a line's count is the highest count of the statements that
|
|
60
|
+
* start on it. A line is covered when any statement on it ran (#1012).
|
|
61
|
+
*/
|
|
62
|
+
export function istanbulLineHits(fd) {
|
|
63
|
+
const lineHits = new Map();
|
|
64
|
+
const statementMap = fd.statementMap || {};
|
|
65
|
+
for (const [id, count] of Object.entries(fd.s || {})) {
|
|
66
|
+
const line = statementMap[id]?.start?.line;
|
|
67
|
+
if (typeof line !== 'number')
|
|
68
|
+
continue;
|
|
69
|
+
const prev = lineHits.get(line);
|
|
70
|
+
if (prev === undefined || prev < count)
|
|
71
|
+
lineHits.set(line, count);
|
|
72
|
+
}
|
|
73
|
+
return lineHits;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse Istanbul/nyc coverage-final.json format.
|
|
77
|
+
*
|
|
78
|
+
* #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
|
|
79
|
+
* as istanbul's own summary does), not statements. Before, statement counts
|
|
80
|
+
* were reported as "line", so one project had two different line figures
|
|
81
|
+
* depending on whether coverage-final.json or lcov.info was read.
|
|
51
82
|
*/
|
|
52
83
|
export function parseCoverageJson(content) {
|
|
53
84
|
const data = safeJsonParse(content);
|
|
@@ -58,30 +89,21 @@ export function parseCoverageJson(content) {
|
|
|
58
89
|
let totalStatements = 0, coveredStatements = 0;
|
|
59
90
|
for (const [filePath, fileData] of Object.entries(data)) {
|
|
60
91
|
const fd = fileData;
|
|
61
|
-
|
|
62
|
-
const lineMap = fd.statementMap || {};
|
|
63
|
-
const lineCounts = fd.s || {};
|
|
92
|
+
const statementCounts = fd.s || {};
|
|
64
93
|
const branchMap = fd.branchMap || {};
|
|
65
94
|
const branchCounts = fd.b || {};
|
|
66
95
|
const fnCounts = fd.f || {};
|
|
67
|
-
const
|
|
68
|
-
const
|
|
96
|
+
const lineHits = istanbulLineHits(fd);
|
|
97
|
+
const fileLines = lineHits.size;
|
|
98
|
+
const fileCoveredLines = [...lineHits.values()].filter(v => v > 0).length;
|
|
69
99
|
const fileBranches = Object.values(branchCounts).flat().length;
|
|
70
100
|
const fileCoveredBranches = Object.values(branchCounts).flat().filter((v) => v > 0).length;
|
|
71
101
|
const fileFunctions = Object.keys(fnCounts).length;
|
|
72
102
|
const fileCoveredFunctions = Object.values(fnCounts).filter((v) => v > 0).length;
|
|
73
|
-
const fileStatements = Object.keys(
|
|
74
|
-
const fileCoveredStatements = Object.values(
|
|
75
|
-
//
|
|
76
|
-
const uncoveredLines = [];
|
|
77
|
-
for (const [key, count] of Object.entries(lineCounts)) {
|
|
78
|
-
if (count === 0) {
|
|
79
|
-
const stmtInfo = lineMap[key];
|
|
80
|
-
if (stmtInfo?.start?.line) {
|
|
81
|
-
uncoveredLines.push(stmtInfo.start.line);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
103
|
+
const fileStatements = Object.keys(statementCounts).length;
|
|
104
|
+
const fileCoveredStatements = Object.values(statementCounts).filter((v) => v > 0).length;
|
|
105
|
+
// Uncovered lines: lines no statement on which ran.
|
|
106
|
+
const uncoveredLines = [...lineHits.entries()].filter(([, hits]) => hits === 0).map(([line]) => line);
|
|
85
107
|
// Find uncovered branches
|
|
86
108
|
const uncoveredBranches = [];
|
|
87
109
|
for (const [branchId, counts] of Object.entries(branchCounts)) {
|
|
@@ -98,7 +120,7 @@ export function parseCoverageJson(content) {
|
|
|
98
120
|
branches: { covered: fileCoveredBranches, total: fileBranches },
|
|
99
121
|
functions: { covered: fileCoveredFunctions, total: fileFunctions },
|
|
100
122
|
statements: { covered: fileCoveredStatements, total: fileStatements },
|
|
101
|
-
uncoveredLines:
|
|
123
|
+
uncoveredLines: uncoveredLines.sort((a, b) => a - b),
|
|
102
124
|
uncoveredBranches: Array.from(new Set(uncoveredBranches)).sort((a, b) => a - b),
|
|
103
125
|
});
|
|
104
126
|
totalLines += fileLines;
|
|
@@ -121,6 +143,44 @@ export function parseCoverageJson(content) {
|
|
|
121
143
|
},
|
|
122
144
|
};
|
|
123
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Parse istanbul `coverage-summary.json` (the `json-summary` reporter).
|
|
148
|
+
*
|
|
149
|
+
* Shape: `{ total: {...}, "<file>": { lines, statements, functions, branches } }`
|
|
150
|
+
* where each metric is `{ total, covered, skipped, pct }`. There is no
|
|
151
|
+
* per-line detail, so `uncoveredLines` is empty — a summary can report a
|
|
152
|
+
* figure but cannot locate a gap (#995).
|
|
153
|
+
*/
|
|
154
|
+
export function parseCoverageSummaryJson(content) {
|
|
155
|
+
const data = safeJsonParse(content);
|
|
156
|
+
const pick = (m) => ({ covered: Number(m?.covered) || 0, total: Number(m?.total) || 0 });
|
|
157
|
+
const files = [];
|
|
158
|
+
for (const [filePath, entry] of Object.entries(data)) {
|
|
159
|
+
if (filePath === 'total' || typeof entry !== 'object' || entry === null || !entry.lines)
|
|
160
|
+
continue;
|
|
161
|
+
files.push({
|
|
162
|
+
path: filePath,
|
|
163
|
+
lines: pick(entry.lines),
|
|
164
|
+
branches: pick(entry.branches),
|
|
165
|
+
functions: pick(entry.functions),
|
|
166
|
+
statements: pick(entry.statements ?? entry.lines),
|
|
167
|
+
uncoveredLines: [],
|
|
168
|
+
uncoveredBranches: [],
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const sum = (get) => files.reduce((acc, f) => ({ covered: acc.covered + get(f).covered, total: acc.total + get(f).total }), { covered: 0, total: 0 });
|
|
172
|
+
const pct = (m) => (m.total > 0 ? (m.covered / m.total) * 100 : 0);
|
|
173
|
+
return {
|
|
174
|
+
files,
|
|
175
|
+
summary: {
|
|
176
|
+
line: pct(sum(f => f.lines)),
|
|
177
|
+
branch: pct(sum(f => f.branches)),
|
|
178
|
+
function: pct(sum(f => f.functions)),
|
|
179
|
+
statement: pct(sum(f => f.statements)),
|
|
180
|
+
files: files.length,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
124
184
|
/**
|
|
125
185
|
* Parse LCOV info format
|
|
126
186
|
*/
|
|
@@ -175,7 +235,8 @@ export function parseLcovInfo(content) {
|
|
|
175
235
|
lines: { covered: linesCovered, total: linesTotal },
|
|
176
236
|
branches: { covered: branchesCovered, total: branchesTotal },
|
|
177
237
|
functions: { covered: functionsCovered, total: functionsTotal },
|
|
178
|
-
|
|
238
|
+
// #1027 N7: lcov has no statement detail — not collected, not a copy of lines.
|
|
239
|
+
statements: { covered: 0, total: 0 },
|
|
179
240
|
uncoveredLines: Array.from(new Set(uncoveredLines)),
|
|
180
241
|
uncoveredBranches: Array.from(new Set(uncoveredBranches)),
|
|
181
242
|
});
|
|
@@ -312,7 +373,8 @@ export function parseCoberturaXml(content) {
|
|
|
312
373
|
lines: { covered: linesCovered, total: linesTotal },
|
|
313
374
|
branches: { covered: branchesCovered, total: branchesTotal },
|
|
314
375
|
functions: { covered: functionsCovered, total: functionsTotal },
|
|
315
|
-
|
|
376
|
+
// #1027 N7: Cobertura has no statement detail — not collected.
|
|
377
|
+
statements: { covered: 0, total: 0 },
|
|
316
378
|
uncoveredLines,
|
|
317
379
|
uncoveredBranches,
|
|
318
380
|
});
|
|
@@ -406,11 +468,16 @@ export async function discoverSourceFiles(targetPath, options = {}) {
|
|
|
406
468
|
if (['node_modules', '.git', 'dist', 'build', 'coverage', '.nyc_output',
|
|
407
469
|
'__pycache__', '.venv', 'venv', '.tox', '.mypy_cache', 'target',
|
|
408
470
|
'.gradle', 'vendor', '.bundle',
|
|
409
|
-
'.
|
|
471
|
+
'.cache', '.npm', '.yarn',
|
|
410
472
|
'.next', '.nuxt', '.svelte-kit', 'out', '.turbo',
|
|
411
473
|
'tmp', 'temp', '.tmp'].includes(entry.name)) {
|
|
412
474
|
continue;
|
|
413
475
|
}
|
|
476
|
+
// #999: AQE state/assets are not source: .agentic-qe anywhere; .claude at
|
|
477
|
+
// the root or next to a nested .agentic-qe. A plugin's own .claude/hooks
|
|
478
|
+
// source (no AQE install beside it) is kept.
|
|
479
|
+
if (isAqeManagedDir(dir, entry.name, dir === targetPath))
|
|
480
|
+
continue;
|
|
414
481
|
if (files.length >= maxFiles)
|
|
415
482
|
return; // Cap reached
|
|
416
483
|
await walkDir(fullPath);
|