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,462 @@
|
|
|
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 { spawn, spawnSync } from 'child_process';
|
|
28
|
+
import * as fs from 'fs';
|
|
29
|
+
import * as os from 'os';
|
|
30
|
+
import * as path from 'path';
|
|
31
|
+
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
32
|
+
import { loadCoverageReportFile } from './coverage-target.js';
|
|
33
|
+
/**
|
|
34
|
+
* Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
|
|
35
|
+
* own result reports a failed test or test suite, 'passed' when it reports
|
|
36
|
+
* none — whatever the exit code (a coverage-threshold failure exits 1 with
|
|
37
|
+
* every test passing). Without counts (nyc), the exit code decides.
|
|
38
|
+
*/
|
|
39
|
+
export function testRunStatus(run) {
|
|
40
|
+
if (typeof run.numFailedTests === 'number' || typeof run.numFailedTestSuites === 'number') {
|
|
41
|
+
return (run.numFailedTests ?? 0) > 0 || (run.numFailedTestSuites ?? 0) > 0 ? 'failed' : 'passed';
|
|
42
|
+
}
|
|
43
|
+
return run.exitedCleanly ? 'passed' : 'failed';
|
|
44
|
+
}
|
|
45
|
+
const RESULTS_FILE = 'test-results.json';
|
|
46
|
+
const STDERR_TAIL_BYTES = 2048;
|
|
47
|
+
const STDERR_HEAD_BYTES = 4096;
|
|
48
|
+
const STDERR_PREFIX_BYTES = 512;
|
|
49
|
+
const ERROR_LINE_RE = /^.*(?:error|\[[A-Z][A-Z_]{2,}\]|ERR_[A-Z_]+).*$/im;
|
|
50
|
+
/**
|
|
51
|
+
* Summarise a runner's stderr for a caller: the FIRST error-looking line (or
|
|
52
|
+
* the first ~512 bytes) plus the last ~2 KB (#995 review NB-C). A tail alone
|
|
53
|
+
* loses the cause when a long stack follows it — a vitest config syntax error
|
|
54
|
+
* prints `[PARSE_ERROR] …` first and then kilobytes of frames.
|
|
55
|
+
*/
|
|
56
|
+
export function summarizeStderr(head, tail, totalBytes) {
|
|
57
|
+
if (totalBytes <= STDERR_TAIL_BYTES)
|
|
58
|
+
return tail.trim();
|
|
59
|
+
const errorLine = ERROR_LINE_RE.exec(head)?.[0]?.trim();
|
|
60
|
+
const prefix = (errorLine ?? head.slice(0, STDERR_PREFIX_BYTES)).trim();
|
|
61
|
+
if (prefix && tail.includes(prefix))
|
|
62
|
+
return tail.trim();
|
|
63
|
+
return `${prefix}\n…\n${tail.trim()}`;
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Locating the runner
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Find an installed package's bin script, walking up `node_modules` from the
|
|
70
|
+
* project root (hoisted monorepo installs live above the package).
|
|
71
|
+
*/
|
|
72
|
+
export function findPackageBin(projectRoot, pkg, binName = pkg, maxDepth = 10) {
|
|
73
|
+
let dir = path.resolve(projectRoot);
|
|
74
|
+
for (let i = 0; i <= maxDepth; i++) {
|
|
75
|
+
const pkgDir = path.join(dir, 'node_modules', pkg);
|
|
76
|
+
try {
|
|
77
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(pkgDir, 'package.json'), 'utf-8'));
|
|
78
|
+
const rel = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.[binName];
|
|
79
|
+
if (rel) {
|
|
80
|
+
const binPath = path.join(pkgDir, rel);
|
|
81
|
+
if (fs.existsSync(binPath))
|
|
82
|
+
return binPath;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// not installed at this level
|
|
87
|
+
}
|
|
88
|
+
const parent = path.dirname(dir);
|
|
89
|
+
if (parent === dir)
|
|
90
|
+
break;
|
|
91
|
+
dir = parent;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function readDeps(projectRoot) {
|
|
96
|
+
try {
|
|
97
|
+
const pkg = safeJsonParse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf-8'));
|
|
98
|
+
return {
|
|
99
|
+
...(pkg.devDependencies || {}),
|
|
100
|
+
...(pkg.dependencies || {}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const RUNNER_DEPS = ['jest', '@jest/core', 'mocha', 'nyc', 'vitest'];
|
|
108
|
+
/**
|
|
109
|
+
* The project and its ancestors up to the repository / workspace root: the
|
|
110
|
+
* project itself, then each parent, stopping after the directory holding
|
|
111
|
+
* `.git` (or a `workspaces` manifest), at $HOME, or after `maxDepth` levels.
|
|
112
|
+
*/
|
|
113
|
+
function projectAndAncestors(projectRoot, maxDepth = 10) {
|
|
114
|
+
const dirs = [];
|
|
115
|
+
let home = null;
|
|
116
|
+
try {
|
|
117
|
+
home = fs.realpathSync(os.homedir());
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
home = null;
|
|
121
|
+
}
|
|
122
|
+
let dir = path.resolve(projectRoot);
|
|
123
|
+
for (let i = 0; i <= maxDepth; i++) {
|
|
124
|
+
if (i > 0 && home !== null && dir === home)
|
|
125
|
+
break;
|
|
126
|
+
dirs.push(dir);
|
|
127
|
+
if (fs.existsSync(path.join(dir, '.git')) || isWorkspaceRoot(dir))
|
|
128
|
+
break;
|
|
129
|
+
const parent = path.dirname(dir);
|
|
130
|
+
if (parent === dir)
|
|
131
|
+
break;
|
|
132
|
+
dir = parent;
|
|
133
|
+
}
|
|
134
|
+
return dirs;
|
|
135
|
+
}
|
|
136
|
+
function isWorkspaceRoot(dir) {
|
|
137
|
+
try {
|
|
138
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
|
|
139
|
+
return pkg.workspaces !== undefined;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Dependencies that decide the runner (#1012): the package's own when it
|
|
147
|
+
* declares a test runner, otherwise those of the nearest ancestor (workspace
|
|
148
|
+
* root) that does. A package of a monorepo whose jest is declared only at the
|
|
149
|
+
* root runs jest, not the vitest default.
|
|
150
|
+
*/
|
|
151
|
+
function readRunnerDeps(projectRoot) {
|
|
152
|
+
for (const dir of projectAndAncestors(projectRoot)) {
|
|
153
|
+
const deps = readDeps(dir);
|
|
154
|
+
if (RUNNER_DEPS.some(d => deps[d]))
|
|
155
|
+
return deps;
|
|
156
|
+
}
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Every `node_modules/.bin` from the project up to the workspace root,
|
|
161
|
+
* nearest first. Runners that shell out to sibling tools (nyc → mocha) need
|
|
162
|
+
* the hoisted ones too (#1012).
|
|
163
|
+
*/
|
|
164
|
+
export function runnerBinDirs(projectRoot) {
|
|
165
|
+
return projectAndAncestors(projectRoot)
|
|
166
|
+
.map(dir => path.join(dir, 'node_modules', '.bin'))
|
|
167
|
+
.filter(dir => fs.existsSync(dir));
|
|
168
|
+
}
|
|
169
|
+
/** Is the project installed with Yarn Plug'n'Play (no node_modules to resolve from)? */
|
|
170
|
+
function usesPlugNPlay(projectRoot) {
|
|
171
|
+
return projectAndAncestors(projectRoot).some(dir => fs.existsSync(path.join(dir, '.pnp.cjs')) || fs.existsSync(path.join(dir, '.pnp.js')));
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Pick the runner and its argv. No shell is involved: `command` is the Node
|
|
175
|
+
* binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
|
|
176
|
+
*/
|
|
177
|
+
export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
178
|
+
const resultsFile = path.join(reportDir, RESULTS_FILE);
|
|
179
|
+
const deps = readRunnerDeps(projectRoot);
|
|
180
|
+
let runner = 'vitest';
|
|
181
|
+
let runnerArgs;
|
|
182
|
+
let results = resultsFile;
|
|
183
|
+
if (deps['jest'] || deps['@jest/core']) {
|
|
184
|
+
runner = 'jest';
|
|
185
|
+
runnerArgs = ['--coverage', `--coverageDirectory=${reportDir}`, '--coverageReporters=json',
|
|
186
|
+
'--json', `--outputFile=${resultsFile}`];
|
|
187
|
+
}
|
|
188
|
+
else if (deps['mocha'] || deps['nyc']) {
|
|
189
|
+
runner = 'nyc';
|
|
190
|
+
runnerArgs = [`--report-dir=${reportDir}`, `--temp-dir=${path.join(reportDir, '.nyc_output')}`,
|
|
191
|
+
'--reporter=json', 'mocha'];
|
|
192
|
+
results = null;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// vitest is the default — covers vitest, @vitest/coverage-v8, etc.
|
|
196
|
+
// Plain `--outputFile=` (not `.json=`): it overrides a string, object, or
|
|
197
|
+
// absent `outputFile` in the user's config alike.
|
|
198
|
+
// #1027 N4: vitest writes no coverage when a test fails unless asked;
|
|
199
|
+
// coverage from a failing suite is still a measurement (runStatus 'failed').
|
|
200
|
+
runnerArgs = ['run', '--coverage', `--coverage.reportsDirectory=${reportDir}`,
|
|
201
|
+
'--coverage.reporter=json', '--coverage.reportOnFailure=true', '--reporter=json', `--outputFile=${resultsFile}`];
|
|
202
|
+
}
|
|
203
|
+
const bin = findPackageBin(projectRoot, runner === 'jest' ? 'jest' : runner);
|
|
204
|
+
return {
|
|
205
|
+
runner,
|
|
206
|
+
command: bin ? process.execPath : null,
|
|
207
|
+
args: bin ? [bin, ...runnerArgs] : runnerArgs,
|
|
208
|
+
resultsFile: results,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const NO_COUNTS = {
|
|
212
|
+
numTotalTests: null, numPassedTests: null, numFailedTests: null, numPendingTests: null, numFailedTestSuites: null,
|
|
213
|
+
};
|
|
214
|
+
/** Test counts from the runner's own JSON result (vitest/jest share the shape). */
|
|
215
|
+
function readRunCounts(resultsFile) {
|
|
216
|
+
if (!resultsFile)
|
|
217
|
+
return NO_COUNTS;
|
|
218
|
+
try {
|
|
219
|
+
const parsed = JSON.parse(fs.readFileSync(resultsFile, 'utf-8'));
|
|
220
|
+
const n = (k) => (typeof parsed[k] === 'number' ? parsed[k] : null);
|
|
221
|
+
return {
|
|
222
|
+
numTotalTests: n('numTotalTests'), numPassedTests: n('numPassedTests'), numFailedTests: n('numFailedTests'),
|
|
223
|
+
numPendingTests: n('numPendingTests'), numFailedTestSuites: n('numFailedTestSuites'),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return NO_COUNTS;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Read the istanbul report the runner wrote. Distinguishes an EMPTY report
|
|
232
|
+
* (`{}` — the run instrumented nothing) from NO report.
|
|
233
|
+
*/
|
|
234
|
+
async function readRunReport(file) {
|
|
235
|
+
const data = await loadCoverageReportFile(file);
|
|
236
|
+
if (data)
|
|
237
|
+
return data;
|
|
238
|
+
try {
|
|
239
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
240
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && Object.keys(parsed).length === 0) {
|
|
241
|
+
return { files: [], summary: { line: 0, branch: 0, function: 0, statement: 0, files: 0 } };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// absent or unparseable
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// Process-tree lifecycle
|
|
251
|
+
// ============================================================================
|
|
252
|
+
/** Live runs: process-group leader pid → temp dir to remove. */
|
|
253
|
+
const liveRuns = new Map();
|
|
254
|
+
let exitHookInstalled = false;
|
|
255
|
+
function killTree(pid, signal) {
|
|
256
|
+
if (process.platform === 'win32') {
|
|
257
|
+
// Windows has no process groups; taskkill /T walks the tree.
|
|
258
|
+
try {
|
|
259
|
+
spawnSync('taskkill', ['/pid', String(pid), '/T', '/F'], { stdio: 'ignore' });
|
|
260
|
+
}
|
|
261
|
+
catch { /* gone */ }
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
process.kill(-pid, signal);
|
|
266
|
+
}
|
|
267
|
+
catch { /* group already gone */ }
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Synchronously kill every live coverage run and remove its temp dir. Runs from
|
|
271
|
+
* `process.on('exit')`, where only synchronous work is possible.
|
|
272
|
+
*/
|
|
273
|
+
export function killAllLiveRunsSync() {
|
|
274
|
+
for (const [pid, dir] of liveRuns) {
|
|
275
|
+
killTree(pid, 'SIGKILL');
|
|
276
|
+
if (dir) {
|
|
277
|
+
try {
|
|
278
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
279
|
+
}
|
|
280
|
+
catch { /* best-effort */ }
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
liveRuns.clear();
|
|
284
|
+
}
|
|
285
|
+
/** Number of runs currently registered (for tests and diagnostics). */
|
|
286
|
+
export function liveRunCount() {
|
|
287
|
+
return liveRuns.size;
|
|
288
|
+
}
|
|
289
|
+
function ensureExitHook() {
|
|
290
|
+
if (exitHookInstalled)
|
|
291
|
+
return;
|
|
292
|
+
process.on('exit', killAllLiveRunsSync);
|
|
293
|
+
exitHookInstalled = true;
|
|
294
|
+
}
|
|
295
|
+
/** Is any process of this group still alive? */
|
|
296
|
+
function groupAlive(pgid) {
|
|
297
|
+
try {
|
|
298
|
+
process.kill(-pgid, 0);
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async function waitForGroupExit(pid, maxMs) {
|
|
306
|
+
if (process.platform === 'win32')
|
|
307
|
+
return;
|
|
308
|
+
const deadline = Date.now() + maxMs;
|
|
309
|
+
while (groupAlive(pid) && Date.now() < deadline) {
|
|
310
|
+
await new Promise(r => setTimeout(r, 50));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Spawn `command args` in `cwd` (no shell) as the leader of a new process
|
|
315
|
+
* group, wait for it, and on timeout kill the entire group. Resolves only once
|
|
316
|
+
* no process of the group remains (bounded), so the caller can safely delete
|
|
317
|
+
* its temp dir. While running, the group and `cleanupDir` are registered with
|
|
318
|
+
* the exit hook so they never outlive the host process.
|
|
319
|
+
*/
|
|
320
|
+
export async function runProcessTree(command, args, options) {
|
|
321
|
+
const graceMs = options.graceMs ?? 3000;
|
|
322
|
+
const isWindows = process.platform === 'win32';
|
|
323
|
+
ensureExitHook();
|
|
324
|
+
return new Promise(resolve => {
|
|
325
|
+
let timedOut = false;
|
|
326
|
+
let settled = false;
|
|
327
|
+
let stderrTail = '';
|
|
328
|
+
let stderrHead = '';
|
|
329
|
+
let stderrBytes = 0;
|
|
330
|
+
const child = spawn(command, args, {
|
|
331
|
+
cwd: options.cwd,
|
|
332
|
+
env: options.env ?? process.env,
|
|
333
|
+
// Own process group (POSIX) so the whole tree can be signalled at once.
|
|
334
|
+
detached: !isWindows,
|
|
335
|
+
shell: false,
|
|
336
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
337
|
+
windowsHide: true,
|
|
338
|
+
});
|
|
339
|
+
if (child.pid !== undefined)
|
|
340
|
+
liveRuns.set(child.pid, options.cleanupDir);
|
|
341
|
+
child.stderr?.on('data', (chunk) => {
|
|
342
|
+
const text = chunk.toString('utf-8');
|
|
343
|
+
stderrBytes += chunk.length;
|
|
344
|
+
if (stderrHead.length < STDERR_HEAD_BYTES)
|
|
345
|
+
stderrHead = (stderrHead + text).slice(0, STDERR_HEAD_BYTES);
|
|
346
|
+
stderrTail = (stderrTail + text).slice(-STDERR_TAIL_BYTES);
|
|
347
|
+
});
|
|
348
|
+
// A grandchild holding the pipe open must not keep the host alive.
|
|
349
|
+
child.stderr?.on('error', () => { });
|
|
350
|
+
const finish = async (exitCode, spawnError) => {
|
|
351
|
+
if (settled)
|
|
352
|
+
return;
|
|
353
|
+
settled = true;
|
|
354
|
+
clearTimeout(timer);
|
|
355
|
+
if (child.pid !== undefined && !isWindows && groupAlive(child.pid)) {
|
|
356
|
+
// Anything left in the group after the runner exited is orphaned work
|
|
357
|
+
// (stray workers, a hung watcher). Sweep it before the caller cleans up.
|
|
358
|
+
killTree(child.pid, 'SIGTERM');
|
|
359
|
+
await waitForGroupExit(child.pid, graceMs);
|
|
360
|
+
if (groupAlive(child.pid))
|
|
361
|
+
killTree(child.pid, 'SIGKILL');
|
|
362
|
+
await waitForGroupExit(child.pid, graceMs);
|
|
363
|
+
}
|
|
364
|
+
child.stderr?.destroy();
|
|
365
|
+
if (child.pid !== undefined)
|
|
366
|
+
liveRuns.delete(child.pid);
|
|
367
|
+
resolve({
|
|
368
|
+
exitCode, timedOut, spawnError, pid: child.pid,
|
|
369
|
+
stderrTail: summarizeStderr(stderrHead, stderrTail, stderrBytes),
|
|
370
|
+
});
|
|
371
|
+
};
|
|
372
|
+
const timer = setTimeout(() => {
|
|
373
|
+
timedOut = true;
|
|
374
|
+
if (child.pid === undefined)
|
|
375
|
+
return;
|
|
376
|
+
killTree(child.pid, 'SIGTERM');
|
|
377
|
+
setTimeout(() => { if (!settled && child.pid !== undefined)
|
|
378
|
+
killTree(child.pid, 'SIGKILL'); }, graceMs).unref();
|
|
379
|
+
}, options.timeoutMs);
|
|
380
|
+
child.on('error', () => { void finish(null, true); });
|
|
381
|
+
child.on('exit', code => { void finish(code, false); });
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Run the project's test runner with coverage from `projectRoot`.
|
|
386
|
+
*
|
|
387
|
+
* Everything the runner writes goes to a fresh temp dir that is removed before
|
|
388
|
+
* this returns — after the whole process group is gone — or by the exit hook if
|
|
389
|
+
* the host exits first.
|
|
390
|
+
*/
|
|
391
|
+
export async function runJsCoverage(projectRoot, options = {}) {
|
|
392
|
+
const timeoutMs = options.timeoutMs ?? 120000;
|
|
393
|
+
const reportDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aqe-js-cov-'));
|
|
394
|
+
try {
|
|
395
|
+
const inv = buildJsCoverageInvocation(projectRoot, reportDir);
|
|
396
|
+
if (!inv.command) {
|
|
397
|
+
return {
|
|
398
|
+
runner: inv.runner, missing: true, exitCode: null, exitedCleanly: false, timedOut: false,
|
|
399
|
+
timeoutMs, data: null, numTotalTests: null, stderrTail: '',
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
// Runners that shell out to sibling tools (nyc → mocha) find them here,
|
|
403
|
+
// including hoisted workspace-root installs (#1012).
|
|
404
|
+
const binDirs = runnerBinDirs(projectRoot);
|
|
405
|
+
// The runner's own temp files (vite's SSR cache, etc.) go inside reportDir
|
|
406
|
+
// too, so a killed run leaves nothing behind in the system temp dir.
|
|
407
|
+
const runnerTmp = path.join(reportDir, 'tmp');
|
|
408
|
+
fs.mkdirSync(runnerTmp);
|
|
409
|
+
const env = {
|
|
410
|
+
...process.env,
|
|
411
|
+
PATH: [...binDirs, process.env.PATH ?? ''].join(path.delimiter),
|
|
412
|
+
TMPDIR: runnerTmp, TMP: runnerTmp, TEMP: runnerTmp,
|
|
413
|
+
};
|
|
414
|
+
const run = await runProcessTree(inv.command, inv.args, {
|
|
415
|
+
cwd: projectRoot, timeoutMs, cleanupDir: reportDir, env,
|
|
416
|
+
});
|
|
417
|
+
const data = run.timedOut ? null : await readRunReport(path.join(reportDir, 'coverage-final.json'));
|
|
418
|
+
return {
|
|
419
|
+
runner: inv.runner,
|
|
420
|
+
missing: false,
|
|
421
|
+
exitCode: run.exitCode,
|
|
422
|
+
exitedCleanly: run.exitCode === 0 && !run.timedOut,
|
|
423
|
+
timedOut: run.timedOut,
|
|
424
|
+
timeoutMs,
|
|
425
|
+
data,
|
|
426
|
+
...(run.timedOut ? NO_COUNTS : readRunCounts(inv.resultsFile)),
|
|
427
|
+
stderrTail: run.stderrTail,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
try {
|
|
432
|
+
fs.rmSync(reportDir, { recursive: true, force: true });
|
|
433
|
+
}
|
|
434
|
+
catch { /* best-effort */ }
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* One-line, caller-facing explanation of why a run produced no usable report.
|
|
439
|
+
* Never "No instrumentation ran" when the runner did run and failed.
|
|
440
|
+
*/
|
|
441
|
+
export function describeRunFailure(run, projectRoot) {
|
|
442
|
+
if (run.missing && usesPlugNPlay(projectRoot)) {
|
|
443
|
+
return `${run.runner} could not be resolved for ${projectRoot}: this project uses Yarn Plug'n'Play, ` +
|
|
444
|
+
'and agentic-qe resolves test runners only from node_modules. Nothing was run and nothing was downloaded. ' +
|
|
445
|
+
`Generate a coverage report (e.g. \`yarn ${run.runner} --coverage\`) and pass it as the target, ` +
|
|
446
|
+
'or use the node-modules linker.';
|
|
447
|
+
}
|
|
448
|
+
if (run.missing) {
|
|
449
|
+
return `${run.runner} is not installed in ${projectRoot} (no node_modules/${run.runner} found); ` +
|
|
450
|
+
'nothing was run and nothing was downloaded. Install it, or generate a coverage report and pass it as the target.';
|
|
451
|
+
}
|
|
452
|
+
if (run.timedOut) {
|
|
453
|
+
return `The coverage run timed out after ${Math.round(run.timeoutMs / 1000)}s and was stopped.`;
|
|
454
|
+
}
|
|
455
|
+
if (run.exitCode !== 0) {
|
|
456
|
+
const tail = run.stderrTail ? `: ${run.stderrTail}` : '';
|
|
457
|
+
return `Test runner (${run.runner}) exited with code ${run.exitCode ?? 'unknown'} without a coverage report${tail}`;
|
|
458
|
+
}
|
|
459
|
+
return `Test runner (${run.runner}) exited cleanly but wrote no coverage report. ` +
|
|
460
|
+
'Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).';
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=coverage-runner.js.map
|
|
@@ -0,0 +1,145 @@
|
|
|
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 type { CoverageData, FileCoverage } from '../../domains/coverage-analysis/interfaces';
|
|
22
|
+
/**
|
|
23
|
+
* Walk up from a target to the nearest directory that holds a project marker.
|
|
24
|
+
*
|
|
25
|
+
* NEAREST rather than topmost: in a monorepo, `packages/core/src` belongs to
|
|
26
|
+
* `packages/core` (its own package.json and test config), not the workspace
|
|
27
|
+
* root. This intentionally differs from `kernel/findProjectRoot`, which locates
|
|
28
|
+
* the AQE data root (honouring AQE_PROJECT_ROOT and `.agentic-qe`).
|
|
29
|
+
*
|
|
30
|
+
* Returns `null` when the target does not exist (a typo must not silently
|
|
31
|
+
* resolve to — and run tests for — an ancestor project) or when no marker is
|
|
32
|
+
* found below the home directory / filesystem root within `maxDepth` levels.
|
|
33
|
+
*/
|
|
34
|
+
export declare function findCoverageProjectRoot(target: string, maxDepth?: number): string | null;
|
|
35
|
+
/** Is this path (by name) a coverage report rather than source code? */
|
|
36
|
+
export declare function isCoverageReportFile(filePath: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Parse a coverage report file of any supported format.
|
|
39
|
+
*
|
|
40
|
+
* Returns `null` — never an empty "0%" report — when the file can't be read,
|
|
41
|
+
* can't be parsed, or lists no files.
|
|
42
|
+
*/
|
|
43
|
+
export declare function loadCoverageReportFile(filePath: string): Promise<CoverageData | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Keep only the report entries that lie under `target`.
|
|
46
|
+
*
|
|
47
|
+
* Report paths come in two shapes: absolute (istanbul `coverage-final.json`)
|
|
48
|
+
* and project-root-relative (vitest/jest `lcov.info` writes `SF:src/math.ts`).
|
|
49
|
+
* Relative entries are resolved against `root` before comparing. Entry paths are
|
|
50
|
+
* returned unchanged.
|
|
51
|
+
*/
|
|
52
|
+
export declare function scopeCoverageToTarget(data: CoverageData, root: string, target: string): FileCoverage[];
|
|
53
|
+
/** Why there are no coverage figures for a target. */
|
|
54
|
+
export type NoDataReason =
|
|
55
|
+
/** The target path does not exist. */
|
|
56
|
+
'target-missing'
|
|
57
|
+
/** A coverage report was given but cannot be parsed (malformed, raw V8, empty). */
|
|
58
|
+
| 'unreadable-report'
|
|
59
|
+
/** The report lists only test files. */
|
|
60
|
+
| 'test-only-report'
|
|
61
|
+
/** The report has no entries under the target — it did not measure it. */
|
|
62
|
+
| 'target-not-covered'
|
|
63
|
+
/** The test runner itself reports running zero tests. */
|
|
64
|
+
| 'no-tests-ran';
|
|
65
|
+
export type CoverageEvaluation = {
|
|
66
|
+
status: 'measured';
|
|
67
|
+
files: FileCoverage[];
|
|
68
|
+
} | {
|
|
69
|
+
status: 'no-data';
|
|
70
|
+
reason: NoDataReason;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Decide what a report says about `target`. Shared by the MCP handler and the
|
|
74
|
+
* CLI so the two cannot disagree (#995 review B2).
|
|
75
|
+
*
|
|
76
|
+
* "Unmeasured" is decided ONLY from evidence that nothing was measured:
|
|
77
|
+
* - the runner's own result says it ran 0 tests (`numTotalTests === 0`), or
|
|
78
|
+
* - the report has no entry under the target.
|
|
79
|
+
* Hit counts are never used: a file listed with 0 hits is a measured 0%,
|
|
80
|
+
* whether the report came from our run or from the user (#995 review B3).
|
|
81
|
+
*/
|
|
82
|
+
export declare function evaluateCoverageForTarget(report: CoverageData, projectRoot: string, target: string, options?: {
|
|
83
|
+
numTotalTests?: number | null;
|
|
84
|
+
}): CoverageEvaluation;
|
|
85
|
+
export type ExistingCoverage = {
|
|
86
|
+
status: 'target-missing';
|
|
87
|
+
target: string;
|
|
88
|
+
} | {
|
|
89
|
+
status: 'no-report';
|
|
90
|
+
target: string;
|
|
91
|
+
projectRoot: string;
|
|
92
|
+
} | {
|
|
93
|
+
status: 'evaluated';
|
|
94
|
+
target: string;
|
|
95
|
+
projectRoot: string;
|
|
96
|
+
source: 'report-file' | 'project-report';
|
|
97
|
+
evaluation: CoverageEvaluation;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Resolve a target to coverage that already exists on disk, without running
|
|
101
|
+
* anything:
|
|
102
|
+
* - a coverage report passed as the target is parsed and analysed whole;
|
|
103
|
+
* - otherwise the PROJECT ROOT's report (not the cwd's, not the subfolder's)
|
|
104
|
+
* is scoped to the target;
|
|
105
|
+
* - `no-report` tells the caller it may run tooling from `projectRoot`.
|
|
106
|
+
*/
|
|
107
|
+
export declare function resolveExistingCoverage(targetPath: string): Promise<ExistingCoverage>;
|
|
108
|
+
/**
|
|
109
|
+
* Threshold verdict over the metrics that were actually collected. Shared by
|
|
110
|
+
* MCP and CLI (#995 review NB5): an uncollected metric (no branch data in the
|
|
111
|
+
* report) is null, and a null must not drag the average down as a fake 0.
|
|
112
|
+
*/
|
|
113
|
+
export declare function thresholdVerdict(summary: {
|
|
114
|
+
line: number;
|
|
115
|
+
branch: number;
|
|
116
|
+
function: number;
|
|
117
|
+
statement: number;
|
|
118
|
+
}, threshold: number, collected: {
|
|
119
|
+
branch: boolean;
|
|
120
|
+
function: boolean;
|
|
121
|
+
statement?: boolean;
|
|
122
|
+
}): {
|
|
123
|
+
overall: number;
|
|
124
|
+
meetsThreshold: boolean;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Make the analyzer's recommendations agree with `thresholdVerdict`
|
|
128
|
+
* (#995 review NB-A). The analyzer computes its "Coverage is X% below
|
|
129
|
+
* threshold" line from a 4-metric average that counts an uncollected metric as
|
|
130
|
+
* 0 — so a line-only report at 90% got "Met" next to "35.0% below threshold".
|
|
131
|
+
* Here the shortfall line is recomputed from the collected-metrics verdict,
|
|
132
|
+
* and advice about a metric that was never collected is dropped.
|
|
133
|
+
*/
|
|
134
|
+
export declare function reconcileRecommendations(recommendations: string[], verdict: {
|
|
135
|
+
overall: number;
|
|
136
|
+
meetsThreshold: boolean;
|
|
137
|
+
}, threshold: number, collected: {
|
|
138
|
+
branch: boolean;
|
|
139
|
+
function: boolean;
|
|
140
|
+
}): string[];
|
|
141
|
+
/** Is this verdict "no measurement exists" (as opposed to an error or test-only report)? */
|
|
142
|
+
export declare function isUnmeasured(reason: NoDataReason): boolean;
|
|
143
|
+
/** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
|
|
144
|
+
export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null): string;
|
|
145
|
+
//# sourceMappingURL=coverage-target.d.ts.map
|