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
|
@@ -4,143 +4,159 @@
|
|
|
4
4
|
* Extracted from task-executor.ts registerHandlers().
|
|
5
5
|
* Covers: analyze-coverage
|
|
6
6
|
*/
|
|
7
|
-
import * as fs from 'fs/promises';
|
|
8
|
-
import * as path from 'path';
|
|
9
7
|
import { ok, err } from '../../shared/types/index.js';
|
|
10
8
|
import { toError } from '../../shared/error-utils.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
9
|
+
import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
|
|
10
|
+
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
|
|
13
|
+
import { collectedMetrics } from '../../domains/coverage-analysis/collected-metrics.js';
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* written — the caller re-checks disk).
|
|
15
|
+
* How long the project's test runner may take before its process tree is
|
|
16
|
+
* killed. `AQE_COVERAGE_TIMEOUT_MS` overrides the 120s default.
|
|
18
17
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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';
|
|
28
|
-
try {
|
|
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';
|
|
37
|
-
}
|
|
38
|
-
else if (deps['mocha'] || deps['nyc']) {
|
|
39
|
-
coverageCmd = 'npx nyc mocha 2>/dev/null';
|
|
40
|
-
}
|
|
41
|
-
// vitest is the default — covers vitest, @vitest/coverage-v8, etc.
|
|
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;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// Test runner failed or not available.
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
18
|
+
function coverageTimeoutMs(env = process.env) {
|
|
19
|
+
const parsed = Number.parseInt(env.AQE_COVERAGE_TIMEOUT_MS ?? '', 10);
|
|
20
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 120000;
|
|
58
21
|
}
|
|
59
|
-
/**
|
|
60
|
-
|
|
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)
|
|
70
|
-
return null;
|
|
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.
|
|
22
|
+
/** Aggregate a file list into whole-number percentages. */
|
|
23
|
+
function recomputeSummary(files) {
|
|
74
24
|
const sum = (pick) => files.reduce((acc, f) => acc + pick(f), 0);
|
|
75
|
-
const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 100) : 0;
|
|
25
|
+
const pct = (covered, total) => (total > 0 ? Math.round((covered / total) * 100) : 0);
|
|
76
26
|
const totalLines = sum(f => f.lines.total);
|
|
77
27
|
const coveredLines = sum(f => f.lines.covered);
|
|
78
|
-
|
|
79
|
-
const
|
|
28
|
+
// #1012: statements are statements (lcov carries its line figures there).
|
|
29
|
+
const totalStatements = sum(f => f.statements.total);
|
|
80
30
|
return {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
31
|
+
line: pct(coveredLines, totalLines),
|
|
32
|
+
branch: pct(sum(f => f.branches.covered), sum(f => f.branches.total)),
|
|
33
|
+
function: pct(sum(f => f.functions.covered), sum(f => f.functions.total)),
|
|
34
|
+
statement: totalStatements > 0
|
|
35
|
+
? pct(sum(f => f.statements.covered), totalStatements)
|
|
36
|
+
: pct(coveredLines, totalLines),
|
|
37
|
+
files: files.length,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** An instrumented verdict as a collected result with honest provenance. */
|
|
41
|
+
function instrumented(files) {
|
|
42
|
+
return {
|
|
43
|
+
data: { files, summary: recomputeSummary(files) },
|
|
91
44
|
provenance: {
|
|
92
45
|
method: 'instrumented-report',
|
|
93
46
|
estimated: false,
|
|
94
|
-
branchDataCollected,
|
|
95
|
-
functionDataCollected,
|
|
47
|
+
branchDataCollected: files.some(f => f.branches.total > 0),
|
|
48
|
+
functionDataCollected: files.some(f => f.functions.total > 0),
|
|
96
49
|
notes: [],
|
|
97
50
|
},
|
|
98
51
|
};
|
|
99
52
|
}
|
|
53
|
+
function fromEvaluation(evaluation, ranTests, projectRoot) {
|
|
54
|
+
return evaluation.status === 'measured'
|
|
55
|
+
? { collected: instrumented(evaluation.files), ranTests, projectRoot }
|
|
56
|
+
: { collected: null, ranTests, noData: evaluation.reason, projectRoot };
|
|
57
|
+
}
|
|
100
58
|
/**
|
|
101
59
|
* Collect coverage for a target, preferring real measurement over estimation
|
|
102
60
|
* and always reporting which one happened (#569).
|
|
103
61
|
*
|
|
62
|
+
* The target may be the project root, a subfolder or file inside it, or an
|
|
63
|
+
* existing coverage report (#995). Tooling always runs from the project root
|
|
64
|
+
* and the result is scoped back down to the target. The decision about what
|
|
65
|
+
* a report says for a target is shared with the CLI (`resolveExistingCoverage`
|
|
66
|
+
* / `evaluateCoverageForTarget`).
|
|
67
|
+
*
|
|
104
68
|
* Cascade:
|
|
105
|
-
*
|
|
69
|
+
* 0. the target IS a coverage report — parse it, run nothing
|
|
70
|
+
* 1. an instrumented report already on disk at the project root
|
|
106
71
|
* 2. language-specific instrumentation we can run — `cargo llvm-cov` for Rust,
|
|
107
|
-
* the project's test runner for JS/TS
|
|
72
|
+
* the project's test runner for JS/TS — writing to a temp dir
|
|
108
73
|
* 3. static estimation, explicitly labelled `estimated: true`
|
|
109
74
|
*/
|
|
110
75
|
async function collectCoverage(targetPath) {
|
|
111
|
-
const existing = await
|
|
112
|
-
if (existing) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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 };
|
|
76
|
+
const existing = await resolveExistingCoverage(targetPath);
|
|
77
|
+
if (existing.status === 'target-missing') {
|
|
78
|
+
return { collected: null, ranTests: false, noData: 'target-missing', projectRoot: null };
|
|
79
|
+
}
|
|
80
|
+
if (existing.status === 'evaluated') {
|
|
81
|
+
return fromEvaluation(existing.evaluation, false, existing.projectRoot);
|
|
121
82
|
}
|
|
83
|
+
const { target, projectRoot } = existing;
|
|
122
84
|
// #569 work item 1: delegate to real instrumentation where available.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
85
|
+
if (isRustProject(target)) {
|
|
86
|
+
const rust = await collectRustCoverage(target);
|
|
87
|
+
if (rust) {
|
|
88
|
+
// cargo ran from the crate root; scope its crate-wide output to the target.
|
|
89
|
+
const crateRoot = findCargoRoot(target) ?? projectRoot;
|
|
90
|
+
const scoped = scopeCoverageToTarget(rust.data, crateRoot, target);
|
|
91
|
+
if (scoped.length === 0) {
|
|
92
|
+
return { collected: null, ranTests: true, noData: 'target-not-covered', projectRoot: crateRoot };
|
|
93
|
+
}
|
|
94
|
+
const collected = scoped.length === rust.data.files.length
|
|
95
|
+
? rust
|
|
96
|
+
: { data: { files: scoped, summary: recomputeSummary(scoped) }, provenance: rust.provenance };
|
|
97
|
+
return { collected, ranTests: true, projectRoot: crateRoot };
|
|
98
|
+
}
|
|
128
99
|
// This target is a Rust crate. Do not continue into the JS/TS runner:
|
|
129
100
|
// `npx vitest --coverage` can still be available through the parent
|
|
130
101
|
// process PATH and will write an empty report even though the crate has no
|
|
131
102
|
// JavaScript tests. Treating that artifact as coverage hides the intended
|
|
132
103
|
// Rust static-estimation fallback and mislabels the result.
|
|
133
|
-
return { collected: buildEstimatedCoverage(
|
|
104
|
+
return { collected: buildEstimatedCoverage(target), ranTests: false, projectRoot };
|
|
134
105
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return { collected: null, ranTests, testOnlyReport: true };
|
|
141
|
-
return { collected: fromRun, ranTests };
|
|
106
|
+
// Running the project's test suite executes code from the analyzed repository
|
|
107
|
+
// (the tests themselves, plus npm lifecycle scripts via npx). Honor the
|
|
108
|
+
// opt-out before doing that.
|
|
109
|
+
if (isCoverageExecDisabled()) {
|
|
110
|
+
return { collected: buildEstimatedCoverage(target), ranTests: false, projectRoot };
|
|
142
111
|
}
|
|
143
|
-
|
|
112
|
+
const run = await runJsCoverage(projectRoot, { timeoutMs: coverageTimeoutMs() });
|
|
113
|
+
// An EMPTY report (`{}`) from a run that reported its tests means "the run
|
|
114
|
+
// instrumented nothing under the target" → unmeasured, never an estimate
|
|
115
|
+
// (#995 review BL2). An empty report from a run that crashed before
|
|
116
|
+
// reporting any tests is a crash, handled below.
|
|
117
|
+
const crashedEmpty = run.data !== null && run.data.files.length === 0 &&
|
|
118
|
+
run.numTotalTests === null && !run.exitedCleanly;
|
|
119
|
+
if ((run.data && !crashedEmpty) || run.numTotalTests === 0) {
|
|
120
|
+
const evaluation = run.data
|
|
121
|
+
? evaluateCoverageForTarget(run.data, projectRoot, target, { numTotalTests: run.numTotalTests })
|
|
122
|
+
: { status: 'no-data', reason: 'no-tests-ran' };
|
|
123
|
+
const result = fromEvaluation(evaluation, run.exitedCleanly || run.data !== null, projectRoot);
|
|
124
|
+
if (result.collected) {
|
|
125
|
+
// #1027 N4/NB2: a run with failing tests still measured coverage; the
|
|
126
|
+
// failure is decided from the runner's counts, not its exit code.
|
|
127
|
+
result.runStatus = testRunStatus(run);
|
|
128
|
+
// #1027 NB1: the run's own testsPassing is recorded with its coverage.
|
|
129
|
+
if (typeof run.numPassedTests === 'number' && typeof run.numFailedTests === 'number') {
|
|
130
|
+
result.testRun = {
|
|
131
|
+
runId: randomUUID(), passed: run.numPassedTests, failed: run.numFailedTests, skipped: run.numPendingTests ?? 0,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
// No report at all: say exactly what happened to the run (not installed,
|
|
138
|
+
// timed out, crashed with stderr), then fall back to a labelled estimate.
|
|
139
|
+
const estimate = buildEstimatedCoverage(target);
|
|
140
|
+
const runNote = describeRunFailure(run, projectRoot);
|
|
141
|
+
if (estimate) {
|
|
142
|
+
estimate.provenance.notes = [
|
|
143
|
+
`${runNote} These numbers are a STATIC ESTIMATE derived from source shape — ` +
|
|
144
|
+
'not measured coverage, and must not be reported as such.',
|
|
145
|
+
...estimate.provenance.notes.filter(n => !/^No instrumentation ran/.test(n)),
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
collected: estimate, ranTests: run.exitedCleanly, projectRoot,
|
|
150
|
+
notes: estimate ? [] : [runNote],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/** Caller-facing explanation for a result with no coverage figures. */
|
|
154
|
+
function noDataWarning(reason, ranTests, targetPath, projectRoot) {
|
|
155
|
+
if (reason)
|
|
156
|
+
return describeNoData(reason, targetPath, projectRoot);
|
|
157
|
+
return ranTests
|
|
158
|
+
? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
|
|
159
|
+
: 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath);
|
|
144
160
|
}
|
|
145
161
|
/**
|
|
146
162
|
* Build the guidance string shown when a result is an estimate rather than a
|
|
@@ -169,8 +185,13 @@ export function registerCoverageHandlers(ctx) {
|
|
|
169
185
|
const analyzer = ctx.getCoverageAnalyzer();
|
|
170
186
|
const targetPath = payload.target || process.cwd();
|
|
171
187
|
const threshold = payload.threshold || 80;
|
|
172
|
-
const { collected, ranTests,
|
|
188
|
+
const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun } = await collectCoverage(targetPath);
|
|
189
|
+
// #995 review N5: say so plainly instead of "no coverage data found".
|
|
190
|
+
if (noData === 'target-missing') {
|
|
191
|
+
return err(new Error(describeNoData('target-missing', targetPath, null)));
|
|
192
|
+
}
|
|
173
193
|
if (!collected) {
|
|
194
|
+
const unmeasured = noData !== undefined && isUnmeasured(noData);
|
|
174
195
|
return ok({
|
|
175
196
|
lineCoverage: null,
|
|
176
197
|
branchCoverage: null,
|
|
@@ -182,22 +203,25 @@ export function registerCoverageHandlers(ctx) {
|
|
|
182
203
|
estimated: false,
|
|
183
204
|
measured: false,
|
|
184
205
|
coverageMethod: 'none',
|
|
206
|
+
// #995(d): "no measurement exists for this target", distinct from 0%.
|
|
207
|
+
...(unmeasured ? { unmeasured: true } : {}),
|
|
185
208
|
algorithm: 'sublinear-O(log n)',
|
|
186
|
-
warning:
|
|
187
|
-
? 'The coverage report contains only test files, so there is no production ' +
|
|
188
|
-
'coverage to report. Coverage OF a test file is not a meaningful metric. ' +
|
|
189
|
-
'Check that your coverage tool is instrumenting your source directory.'
|
|
190
|
-
: ranTests
|
|
191
|
-
? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
|
|
192
|
-
: 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath),
|
|
209
|
+
warning: notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot),
|
|
193
210
|
});
|
|
194
211
|
}
|
|
195
212
|
const { data: coverageData, provenance } = collected;
|
|
196
213
|
// Analyze coverage using the real CoverageAnalyzerService
|
|
214
|
+
// #1008: the analyzer persists only measured coverage; a static estimate
|
|
215
|
+
// is returned below, labelled, but never stored as evidence.
|
|
197
216
|
const analysisResult = await analyzer.analyze({
|
|
198
217
|
coverageData,
|
|
199
218
|
threshold,
|
|
200
219
|
includeFileDetails: payload.detectGaps,
|
|
220
|
+
measured: !provenance.estimated,
|
|
221
|
+
// #1027 N7: per-file records use absolute keys; N4: failing-suite coverage is labelled.
|
|
222
|
+
...(projectRoot ? { projectRoot } : {}),
|
|
223
|
+
...(runStatus && !provenance.estimated ? { runStatus } : {}),
|
|
224
|
+
...(testRun && !provenance.estimated ? { testRun } : {}),
|
|
201
225
|
});
|
|
202
226
|
if (!analysisResult.success) {
|
|
203
227
|
return analysisResult;
|
|
@@ -227,7 +251,7 @@ export function registerCoverageHandlers(ctx) {
|
|
|
227
251
|
}
|
|
228
252
|
const round = (n) => Math.round(n * 10) / 10;
|
|
229
253
|
const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 1000) / 10 : null;
|
|
230
|
-
const warnings = [...provenance.notes];
|
|
254
|
+
const warnings = [...provenance.notes, ...(notes ?? [])];
|
|
231
255
|
if (provenance.estimated)
|
|
232
256
|
warnings.push(estimationGuidance(targetPath));
|
|
233
257
|
// #569: the analyzer generates recommendations from the summary numbers.
|
|
@@ -236,20 +260,22 @@ export function registerCoverageHandlers(ctx) {
|
|
|
236
260
|
// significantly lower than line coverage", "Function coverage is below
|
|
237
261
|
// 70%") is a statement about a metric nobody measured. Drop it rather
|
|
238
262
|
// than send a developer to fix a number that doesn't exist.
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
263
|
+
// #995 NB5/NB-A: the verdict and the shortfall advice come from the same
|
|
264
|
+
// collected-metrics computation (shared with the CLI), so they can't disagree.
|
|
265
|
+
// #1027 N7: lcov / Cobertura carry no statement data — n/a, out of the verdict.
|
|
266
|
+
const statementCollected = provenance.estimated || collectedMetrics(coverageData.files).statement;
|
|
267
|
+
const metricsCollected = {
|
|
268
|
+
branch: provenance.branchDataCollected, function: provenance.functionDataCollected, statement: statementCollected,
|
|
269
|
+
};
|
|
270
|
+
const verdict = thresholdVerdict(report.summary, threshold, metricsCollected);
|
|
271
|
+
const recommendations = reconcileRecommendations(report.recommendations, verdict, threshold, metricsCollected);
|
|
246
272
|
return ok({
|
|
247
273
|
lineCoverage: round(report.summary.line),
|
|
248
274
|
// #569 work item 4: never report a branch percentage — least of all
|
|
249
275
|
// 100% — when no branch data was collected.
|
|
250
276
|
branchCoverage: provenance.branchDataCollected ? round(report.summary.branch) : null,
|
|
251
277
|
functionCoverage: provenance.functionDataCollected ? round(report.summary.function) : null,
|
|
252
|
-
statementCoverage: round(report.summary.statement),
|
|
278
|
+
statementCoverage: statementCollected ? round(report.summary.statement) : null,
|
|
253
279
|
totalFiles: report.summary.files,
|
|
254
280
|
coverageByFile: coverageData.files.map(f => ({
|
|
255
281
|
file: f.path,
|
|
@@ -258,7 +284,8 @@ export function registerCoverageHandlers(ctx) {
|
|
|
258
284
|
functionCoverage: provenance.functionDataCollected ? pct(f.functions.covered, f.functions.total) : null,
|
|
259
285
|
})),
|
|
260
286
|
gaps,
|
|
261
|
-
|
|
287
|
+
// NB5: judged only on the metrics that were collected (shared with the CLI).
|
|
288
|
+
meetsThreshold: verdict.meetsThreshold,
|
|
262
289
|
delta: report.delta,
|
|
263
290
|
recommendations,
|
|
264
291
|
algorithm: 'sublinear-O(log n)',
|
|
@@ -268,6 +295,8 @@ export function registerCoverageHandlers(ctx) {
|
|
|
268
295
|
coverageMethod: provenance.method,
|
|
269
296
|
branchDataCollected: provenance.branchDataCollected,
|
|
270
297
|
functionDataCollected: provenance.functionDataCollected,
|
|
298
|
+
statementDataCollected: statementCollected,
|
|
299
|
+
...(runStatus && !provenance.estimated ? { runStatus } : {}),
|
|
271
300
|
...(warnings.length > 0 ? { warning: warnings.join(' ') } : {}),
|
|
272
301
|
});
|
|
273
302
|
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run a JS/TS project's test runner with coverage — safely (issue #995).
|
|
3
|
+
*
|
|
4
|
+
* Properties, each learned the hard way:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Run from the project root, write to a private temp dir.** The coverage
|
|
7
|
+
* report and the runner's JSON result go to `reportDir`, never into the
|
|
8
|
+
* project tree (#995 wrote `src/coverage/`). The result file is set with
|
|
9
|
+
* plain `--outputFile=` — vitest ignores `--outputFile.json=` when the
|
|
10
|
+
* user's config sets `outputFile` as a string.
|
|
11
|
+
* 2. **No shell, no download.** The runner's own JS entry point is resolved
|
|
12
|
+
* from the project's `node_modules` and started with `process.execPath`.
|
|
13
|
+
* Arguments are an array, so `$(…)`, spaces, `& ^ %` in a path are data on
|
|
14
|
+
* every platform. A runner that isn't installed is reported, never fetched
|
|
15
|
+
* (`npx` would silently download one).
|
|
16
|
+
* 3. **Kill the whole process tree.** Runner → workers is several levels deep.
|
|
17
|
+
* The child is started in its own process group (POSIX) and the group is
|
|
18
|
+
* killed on timeout (`taskkill /T /F` on Windows).
|
|
19
|
+
* 4. **Die with the host.** Every live run is registered; a synchronous
|
|
20
|
+
* `process.on('exit')` hook kills each group and removes its temp dir. That
|
|
21
|
+
* covers every path that ends in `process.exit()` or a natural exit — the
|
|
22
|
+
* MCP server's shutdown on SIGTERM/SIGINT/stdin EOF routes there. It cannot
|
|
23
|
+
* cover SIGKILL of the host (or a signal with no handler installed): no
|
|
24
|
+
* code runs in that case, and the group is left to its own timeout-less
|
|
25
|
+
* fate. Hosts should shut down via a handled signal.
|
|
26
|
+
*/
|
|
27
|
+
import type { CoverageData } from '../../domains/coverage-analysis/interfaces';
|
|
28
|
+
export type JsRunnerName = 'vitest' | 'jest' | 'nyc';
|
|
29
|
+
export interface JsCoverageInvocation {
|
|
30
|
+
runner: JsRunnerName;
|
|
31
|
+
/** `process.execPath`, or null when the runner is not installed. */
|
|
32
|
+
command: string | null;
|
|
33
|
+
/** `[<runner JS entry>, ...runner args]`. */
|
|
34
|
+
args: string[];
|
|
35
|
+
/** Where the runner writes its own JSON result (tests run / passed), if supported. */
|
|
36
|
+
resultsFile: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface JsCoverageRun {
|
|
39
|
+
runner: JsRunnerName;
|
|
40
|
+
/** The runner package was not found in the project's node_modules. Nothing ran. */
|
|
41
|
+
missing: boolean;
|
|
42
|
+
exitCode: number | null;
|
|
43
|
+
exitedCleanly: boolean;
|
|
44
|
+
timedOut: boolean;
|
|
45
|
+
timeoutMs: number;
|
|
46
|
+
/**
|
|
47
|
+
* Parsed istanbul report, or null when none was written. A report that was
|
|
48
|
+
* written but lists no files is `{ files: [] }` — NOT null: "the run covered
|
|
49
|
+
* nothing" is different from "the run produced no report".
|
|
50
|
+
*/
|
|
51
|
+
data: CoverageData | null;
|
|
52
|
+
/**
|
|
53
|
+
* Number of tests the runner reports having run, from its own JSON result.
|
|
54
|
+
* `null` when the runner gives no machine-readable result (nyc) or it could
|
|
55
|
+
* not be read — "unknown", which callers must not treat as 0.
|
|
56
|
+
*/
|
|
57
|
+
numTotalTests: number | null;
|
|
58
|
+
/**
|
|
59
|
+
* Per-outcome counts from the runner's JSON result (#1027 NB1/NB2), null
|
|
60
|
+
* when unknown. A failing suite is decided from these, not the exit code:
|
|
61
|
+
* vitest also exits non-zero for a coverage-threshold failure.
|
|
62
|
+
*/
|
|
63
|
+
numPassedTests?: number | null;
|
|
64
|
+
numFailedTests?: number | null;
|
|
65
|
+
numPendingTests?: number | null;
|
|
66
|
+
numFailedTestSuites?: number | null;
|
|
67
|
+
/** The runner's first error line plus the last ~2 KB of its stderr, for diagnosing a crash. */
|
|
68
|
+
stderrTail: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
|
|
72
|
+
* own result reports a failed test or test suite, 'passed' when it reports
|
|
73
|
+
* none — whatever the exit code (a coverage-threshold failure exits 1 with
|
|
74
|
+
* every test passing). Without counts (nyc), the exit code decides.
|
|
75
|
+
*/
|
|
76
|
+
export declare function testRunStatus(run: JsCoverageRun): 'passed' | 'failed';
|
|
77
|
+
/**
|
|
78
|
+
* Summarise a runner's stderr for a caller: the FIRST error-looking line (or
|
|
79
|
+
* the first ~512 bytes) plus the last ~2 KB (#995 review NB-C). A tail alone
|
|
80
|
+
* loses the cause when a long stack follows it — a vitest config syntax error
|
|
81
|
+
* prints `[PARSE_ERROR] …` first and then kilobytes of frames.
|
|
82
|
+
*/
|
|
83
|
+
export declare function summarizeStderr(head: string, tail: string, totalBytes: number): string;
|
|
84
|
+
/**
|
|
85
|
+
* Find an installed package's bin script, walking up `node_modules` from the
|
|
86
|
+
* project root (hoisted monorepo installs live above the package).
|
|
87
|
+
*/
|
|
88
|
+
export declare function findPackageBin(projectRoot: string, pkg: string, binName?: string, maxDepth?: number): string | null;
|
|
89
|
+
/**
|
|
90
|
+
* Every `node_modules/.bin` from the project up to the workspace root,
|
|
91
|
+
* nearest first. Runners that shell out to sibling tools (nyc → mocha) need
|
|
92
|
+
* the hoisted ones too (#1012).
|
|
93
|
+
*/
|
|
94
|
+
export declare function runnerBinDirs(projectRoot: string): string[];
|
|
95
|
+
/**
|
|
96
|
+
* Pick the runner and its argv. No shell is involved: `command` is the Node
|
|
97
|
+
* binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
|
|
98
|
+
*/
|
|
99
|
+
export declare function buildJsCoverageInvocation(projectRoot: string, reportDir: string): JsCoverageInvocation;
|
|
100
|
+
/**
|
|
101
|
+
* Synchronously kill every live coverage run and remove its temp dir. Runs from
|
|
102
|
+
* `process.on('exit')`, where only synchronous work is possible.
|
|
103
|
+
*/
|
|
104
|
+
export declare function killAllLiveRunsSync(): void;
|
|
105
|
+
/** Number of runs currently registered (for tests and diagnostics). */
|
|
106
|
+
export declare function liveRunCount(): number;
|
|
107
|
+
export interface ProcessTreeResult {
|
|
108
|
+
exitCode: number | null;
|
|
109
|
+
timedOut: boolean;
|
|
110
|
+
spawnError: boolean;
|
|
111
|
+
pid: number | undefined;
|
|
112
|
+
stderrTail: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Spawn `command args` in `cwd` (no shell) as the leader of a new process
|
|
116
|
+
* group, wait for it, and on timeout kill the entire group. Resolves only once
|
|
117
|
+
* no process of the group remains (bounded), so the caller can safely delete
|
|
118
|
+
* its temp dir. While running, the group and `cleanupDir` are registered with
|
|
119
|
+
* the exit hook so they never outlive the host process.
|
|
120
|
+
*/
|
|
121
|
+
export declare function runProcessTree(command: string, args: string[], options: {
|
|
122
|
+
cwd: string;
|
|
123
|
+
timeoutMs: number;
|
|
124
|
+
graceMs?: number;
|
|
125
|
+
cleanupDir?: string;
|
|
126
|
+
env?: NodeJS.ProcessEnv;
|
|
127
|
+
}): Promise<ProcessTreeResult>;
|
|
128
|
+
/**
|
|
129
|
+
* Run the project's test runner with coverage from `projectRoot`.
|
|
130
|
+
*
|
|
131
|
+
* Everything the runner writes goes to a fresh temp dir that is removed before
|
|
132
|
+
* this returns — after the whole process group is gone — or by the exit hook if
|
|
133
|
+
* the host exits first.
|
|
134
|
+
*/
|
|
135
|
+
export declare function runJsCoverage(projectRoot: string, options?: {
|
|
136
|
+
timeoutMs?: number;
|
|
137
|
+
}): Promise<JsCoverageRun>;
|
|
138
|
+
/**
|
|
139
|
+
* One-line, caller-facing explanation of why a run produced no usable report.
|
|
140
|
+
* Never "No instrumentation ran" when the runner did run and failed.
|
|
141
|
+
*/
|
|
142
|
+
export declare function describeRunFailure(run: JsCoverageRun, projectRoot: string): string;
|
|
143
|
+
//# sourceMappingURL=coverage-runner.d.ts.map
|