agentic-qe 3.15.10 → 3.15.12
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/hooks/aqe-hook.cjs +38 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +263 -0
- package/README.md +8 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/agent-cards/generator.js +6 -3
- package/dist/adapters/a2a/tasks/task-router.js +3 -1
- package/dist/adapters/trajectory-adapter.js +1 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts +3 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.js +31 -2
- package/dist/agents/overlay-loader.js +26 -21
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-HL7MOCQN.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-H7ANGXW4.js → agent-booster-wasm-5VZCKTIJ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-SVXSHEET.js → agent-handler-K3C6CQCD.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WKQH36XL.js → agent-memory-branch-NVFQ25WS.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +2 -0
- package/dist/cli/chunks/{arena-EKOOFVST.js → arena-QGWIJADQ.js} +2 -2
- package/dist/cli/chunks/{arena-OPS36NFZ.js → arena-TSZVDSXS.js} +4 -4
- package/dist/cli/chunks/{audit-AO5NDZRI.js → audit-KIEE2SHJ.js} +3 -3
- package/dist/cli/chunks/base-WIM7G3HC.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-TFLVEMMY.js → better-sqlite3-BNB32NW3.js} +2 -2
- package/dist/cli/chunks/{brain-handler-ADBBJPYW.js → brain-handler-MPC5SPYI.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-HGHUYYL5.js → branch-enumerator-LZ7UXKAY.js} +2 -2
- package/dist/cli/chunks/{browser-5LU6P4SZ.js → browser-VDHAW4RK.js} +2 -2
- package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +2 -0
- package/dist/cli/chunks/{chunk-5LPYV3TK.js → chunk-23PQF7NN.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZMF4NCF.js → chunk-26672ISV.js} +2 -2
- package/dist/cli/chunks/{chunk-U53ZB4IX.js → chunk-2ASQRBK2.js} +2 -2
- package/dist/cli/chunks/{chunk-7PJIR4ST.js → chunk-2E2QO44T.js} +2 -2
- package/dist/cli/chunks/{chunk-2T7RRL6G.js → chunk-2IVE5AR3.js} +1 -1
- package/dist/cli/chunks/{chunk-B6LTH6YV.js → chunk-2JYUA27M.js} +1 -1
- package/dist/cli/chunks/{chunk-PFG6VQ5Z.js → chunk-2PPSS4JD.js} +2 -2
- package/dist/cli/chunks/{chunk-NZYLNXT6.js → chunk-32UTHIY5.js} +5 -5
- package/dist/cli/chunks/{chunk-5E6GHSTY.js → chunk-33I2ZP6E.js} +2 -2
- package/dist/cli/chunks/{chunk-XLZYRTNO.js → chunk-35MIUSXQ.js} +2 -2
- package/dist/cli/chunks/{chunk-7LFZ4CHM.js → chunk-35NW676P.js} +2 -2
- package/dist/cli/chunks/{chunk-4G63WT4F.js → chunk-3EWQN37E.js} +2 -2
- package/dist/cli/chunks/{chunk-GZLZCZ42.js → chunk-3IU4LDZR.js} +2 -2
- package/dist/cli/chunks/{chunk-CESIR27V.js → chunk-47RMGDG4.js} +2 -2
- package/dist/cli/chunks/chunk-4A76VPU4.js +3 -0
- package/dist/cli/chunks/{chunk-DT7SIJOA.js → chunk-4CB3QPZM.js} +2 -2
- package/dist/cli/chunks/{chunk-ERQKYIP7.js → chunk-4HWUECVD.js} +5 -5
- package/dist/cli/chunks/{chunk-MA7JIQ6U.js → chunk-4KUOYDY2.js} +5 -5
- package/dist/cli/chunks/{chunk-VWNFAW2M.js → chunk-4LWMAAWK.js} +2 -2
- package/dist/cli/chunks/{chunk-IKISCIGH.js → chunk-4PU5GTZW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXPY654C.js → chunk-4SA7M34P.js} +1 -1
- package/dist/cli/chunks/{chunk-NGKNYIQZ.js → chunk-4Y6OEBJZ.js} +1 -1
- package/dist/cli/chunks/{chunk-KOBVYY6H.js → chunk-5A66EGEW.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2O2YJAF.js → chunk-5ADXFUMO.js} +2 -2
- package/dist/cli/chunks/{chunk-YKMU4LBV.js → chunk-5S4UIDFK.js} +1 -1
- package/dist/cli/chunks/{chunk-Z7IYW5U7.js → chunk-5TAEW5OV.js} +1 -1
- package/dist/cli/chunks/chunk-5Z23ZMXZ.js +742 -0
- package/dist/cli/chunks/{chunk-6TB6YOCZ.js → chunk-65TH6RPD.js} +1 -1
- package/dist/cli/chunks/{chunk-3Y7SPD72.js → chunk-66PXR3NI.js} +2 -2
- package/dist/cli/chunks/{chunk-3P34JFQH.js → chunk-6E6HB4N4.js} +14 -14
- package/dist/cli/chunks/{chunk-6PX4OXQO.js → chunk-6QRI3JVE.js} +2 -2
- package/dist/cli/chunks/{chunk-WBM6N6IM.js → chunk-7DNR4KKR.js} +1 -1
- package/dist/cli/chunks/{chunk-6XCMKIZN.js → chunk-7JFDLL2F.js} +1 -1
- package/dist/cli/chunks/chunk-7OEFBWAG.js +5 -0
- package/dist/cli/chunks/{chunk-Y76IAYQD.js → chunk-7QEUHNKO.js} +1 -1
- package/dist/cli/chunks/{chunk-WQ4PYWSW.js → chunk-7TA5MUPW.js} +1 -1
- package/dist/cli/chunks/{chunk-2XGVTYVX.js → chunk-A2JCRXTK.js} +2 -2
- package/dist/cli/chunks/{chunk-ESUO3GTJ.js → chunk-A5Y7DAVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-ATHWDAXB.js → chunk-ADUAJIAU.js} +2 -2
- package/dist/cli/chunks/{chunk-IU2IV4NE.js → chunk-AJEXPFAB.js} +1 -1
- package/dist/cli/chunks/{chunk-YK7JN5N7.js → chunk-BC4T6SCV.js} +4 -4
- package/dist/cli/chunks/{chunk-KSIWGGJI.js → chunk-BMG2JLSQ.js} +2 -2
- package/dist/cli/chunks/chunk-BOSMELJX.js +180 -0
- package/dist/cli/chunks/{chunk-7OZVZIBE.js → chunk-BYRCB5JT.js} +2 -2
- package/dist/cli/chunks/{chunk-FAUCT5KR.js → chunk-C3YOVASQ.js} +6 -5
- package/dist/cli/chunks/{chunk-DMFTELBS.js → chunk-C74M4WUI.js} +2 -2
- package/dist/cli/chunks/{chunk-2SXBBUM6.js → chunk-CA5UNWQF.js} +2 -2
- package/dist/cli/chunks/{chunk-UCJMVXO4.js → chunk-CDA5Z74H.js} +2 -2
- package/dist/cli/chunks/{chunk-NVYIZCSR.js → chunk-CPIBIR3X.js} +2 -2
- package/dist/cli/chunks/{chunk-YK3BVZY6.js → chunk-CU36D7TN.js} +2 -2
- package/dist/cli/chunks/{chunk-H32EPIR2.js → chunk-DAUEK66C.js} +1 -1
- package/dist/cli/chunks/{chunk-6KIL6CMD.js → chunk-DRCBRUGN.js} +2 -2
- package/dist/cli/chunks/{chunk-EWFECZ2U.js → chunk-DZGPUGUG.js} +2 -2
- package/dist/cli/chunks/{chunk-YDAQK5UF.js → chunk-EF6OERRR.js} +1 -1
- package/dist/cli/chunks/{chunk-KG336OV3.js → chunk-EN7GRVEQ.js} +2 -2
- package/dist/cli/chunks/{chunk-DBMNJSBV.js → chunk-ENGL7FIJ.js} +1 -1
- package/dist/cli/chunks/{chunk-FKL3R5JQ.js → chunk-FAGKBOX2.js} +2 -2
- package/dist/cli/chunks/{chunk-NAXGWDVM.js → chunk-FNUFTWEO.js} +3 -3
- package/dist/cli/chunks/{chunk-RWWOHCMG.js → chunk-FZJCBSN4.js} +2 -2
- package/dist/cli/chunks/{chunk-ABFFWZPC.js → chunk-G24SWTAX.js} +151 -149
- package/dist/cli/chunks/{chunk-ODJNUMV3.js → chunk-G3AABG4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-FBXTQNRH.js → chunk-GJKZ7UQO.js} +2 -2
- package/dist/cli/chunks/{chunk-DEF34AFL.js → chunk-GKFV6CUD.js} +2 -2
- package/dist/cli/chunks/{chunk-SY2IB442.js → chunk-HLGFHHWV.js} +2 -2
- package/dist/cli/chunks/{chunk-CZGOSJQ4.js → chunk-HM3LSFTY.js} +2 -2
- package/dist/cli/chunks/chunk-HSA5IGGW.js +2 -0
- package/dist/cli/chunks/{chunk-GJHWY3ZX.js → chunk-HZBXJFGN.js} +2 -2
- package/dist/cli/chunks/chunk-IA55PFLG.js +7 -0
- package/dist/cli/chunks/{chunk-MNN5J4GU.js → chunk-ICKUINKD.js} +2 -2
- package/dist/cli/chunks/{chunk-XEB3NLJR.js → chunk-IETBWYHW.js} +2 -2
- package/dist/cli/chunks/{chunk-A55QKKT2.js → chunk-IL7GQNNE.js} +2 -2
- package/dist/cli/chunks/{chunk-LRZY4KS2.js → chunk-INZARYUD.js} +2 -2
- package/dist/cli/chunks/{chunk-OBAREPDC.js → chunk-IPA7K556.js} +2 -2
- package/dist/cli/chunks/{chunk-CFBEBXLO.js → chunk-IVTQF55W.js} +3 -3
- package/dist/cli/chunks/{chunk-FFTPAWM6.js → chunk-J7Y7ZBIT.js} +8 -8
- package/dist/cli/chunks/{chunk-I33O4BRQ.js → chunk-JGIJPDGD.js} +2 -2
- package/dist/cli/chunks/chunk-JNXK47OL.js +2 -0
- package/dist/cli/chunks/{chunk-PCEW6Q2C.js → chunk-JOWUS2X5.js} +1 -1
- package/dist/cli/chunks/{chunk-KI73QCR5.js → chunk-JR6CUKAI.js} +2 -2
- package/dist/cli/chunks/chunk-JRYWLOBD.js +21 -0
- package/dist/cli/chunks/{chunk-SO45NA4D.js → chunk-JW5PDJ5O.js} +11 -11
- package/dist/cli/chunks/{chunk-APSRPR4W.js → chunk-K3A3NWT3.js} +2 -2
- package/dist/cli/chunks/{chunk-FESZBPUB.js → chunk-KA5SHLMW.js} +2 -2
- package/dist/cli/chunks/{chunk-OPFGRS5S.js → chunk-KGA7VAI4.js} +2 -2
- package/dist/cli/chunks/chunk-KJDI5CHX.js +2 -0
- package/dist/cli/chunks/{chunk-V2RSNVMW.js → chunk-L3PV7VXK.js} +1 -1
- package/dist/cli/chunks/{chunk-C522H7XR.js → chunk-L7NGKANW.js} +32 -32
- package/dist/cli/chunks/{chunk-DNRWGATA.js → chunk-LFBA735S.js} +7 -7
- package/dist/cli/chunks/{chunk-V2M2XCR5.js → chunk-MAJXZYGK.js} +1 -1
- package/dist/cli/chunks/{chunk-FZOWULMH.js → chunk-MCPEC6OO.js} +1 -1
- package/dist/cli/chunks/{chunk-LMS3Y7JD.js → chunk-MCPXNUDK.js} +2 -2
- package/dist/cli/chunks/{chunk-GWZZ7DAO.js → chunk-MMEALJ4D.js} +2 -2
- package/dist/cli/chunks/{chunk-G3CZCUPM.js → chunk-MYF5CNGV.js} +2 -2
- package/dist/cli/chunks/{chunk-NNFZUTDH.js → chunk-MYUMJ2ZI.js} +1 -1
- package/dist/cli/chunks/{chunk-WDQ7IEZY.js → chunk-N7O3PF6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-YAKGBHO4.js → chunk-NA3F6FEO.js} +2 -2
- package/dist/cli/chunks/chunk-NNBQZR73.js +6 -0
- package/dist/cli/chunks/{chunk-6C3II5OM.js → chunk-NV74SICL.js} +2 -2
- package/dist/cli/chunks/chunk-NVRYELCY.js +13 -0
- package/dist/cli/chunks/{chunk-UHTTW3IT.js → chunk-NX4BCSOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-EN2QSKFF.js → chunk-O3IM4WRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-S75EYIJG.js → chunk-O4QJMANM.js} +1 -1
- package/dist/cli/chunks/{chunk-NPPHWFA2.js → chunk-OHVYINGM.js} +18 -18
- package/dist/cli/chunks/{chunk-DE4YJQJF.js → chunk-P5E26N2X.js} +2 -2
- package/dist/cli/chunks/chunk-P7UFJ6DO.js +14 -0
- package/dist/cli/chunks/{chunk-XFVTGAAJ.js → chunk-PGSJBXTD.js} +2 -2
- package/dist/cli/chunks/{chunk-CZ2IF6MC.js → chunk-PT2NXS43.js} +1 -1
- package/dist/cli/chunks/{chunk-RK73HB2F.js → chunk-PTBOLBM4.js} +2 -2
- package/dist/cli/chunks/{chunk-EAU5KDFO.js → chunk-PX5OPXY6.js} +1 -1
- package/dist/cli/chunks/chunk-QCPVUNN3.js +2 -0
- package/dist/cli/chunks/{chunk-VKRTTFB6.js → chunk-QSGEBCDB.js} +2 -2
- package/dist/cli/chunks/{chunk-SKQUUE4F.js → chunk-QUJJYTJH.js} +2 -2
- package/dist/cli/chunks/chunk-QWG3SILX.js +59 -0
- package/dist/cli/chunks/{chunk-D6DA2KFD.js → chunk-RCOLPF3B.js} +2 -2
- package/dist/cli/chunks/{chunk-SU5H66SD.js → chunk-RYHG3I7J.js} +2 -2
- package/dist/cli/chunks/chunk-SBHM5X2S.js +4 -0
- package/dist/cli/chunks/{chunk-62OAY5KJ.js → chunk-SDRJJUPO.js} +1 -1
- package/dist/cli/chunks/{chunk-FB6TI3BH.js → chunk-SG2TX72G.js} +2 -2
- package/dist/cli/chunks/{chunk-H2PYU7MN.js → chunk-SITL5YZV.js} +4 -4
- package/dist/cli/chunks/{chunk-AI4VYSFS.js → chunk-SPC4RBLF.js} +2 -2
- package/dist/cli/chunks/{chunk-BQUAE3CP.js → chunk-SQVZ3TRU.js} +2 -2
- package/dist/cli/chunks/{chunk-TBLI254A.js → chunk-SUX5XB2Z.js} +2 -2
- package/dist/cli/chunks/{chunk-VFSYMOAL.js → chunk-T4EN5VVK.js} +2 -2
- package/dist/cli/chunks/{chunk-KNQ2ERFX.js → chunk-TGMXUZZC.js} +2 -2
- package/dist/cli/chunks/{chunk-7TB6FK4B.js → chunk-TLRHAMX5.js} +1 -1
- package/dist/cli/chunks/{chunk-V6JBOIMX.js → chunk-TOWOJGEI.js} +1 -1
- package/dist/cli/chunks/{chunk-JHIY4VCC.js → chunk-TSOQ2QLT.js} +3 -3
- package/dist/cli/chunks/{chunk-YYTGXD3R.js → chunk-TVA5GRIU.js} +2 -2
- package/dist/cli/chunks/{chunk-6MVVSSID.js → chunk-TXEUVUMO.js} +1 -1
- package/dist/cli/chunks/{chunk-7ZCDZHDB.js → chunk-U6IXYQO4.js} +2 -2
- package/dist/cli/chunks/{chunk-NW5JUCCG.js → chunk-U7ZHDGXG.js} +1 -1
- package/dist/cli/chunks/{chunk-UARKIZAS.js → chunk-UCSK2RMI.js} +2 -2
- package/dist/cli/chunks/{chunk-RPHY2DU6.js → chunk-UIKQPO4Y.js} +2 -2
- package/dist/cli/chunks/chunk-UJNGGFGX.js +2 -0
- package/dist/cli/chunks/{chunk-EDLFX4ZB.js → chunk-ULCW6IVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-M2QV7PT7.js → chunk-UREDS662.js} +2 -2
- package/dist/cli/chunks/{chunk-MG27QY4D.js → chunk-URSTP3WI.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZI5FKSF.js → chunk-UUZZXHUF.js} +2 -2
- package/dist/cli/chunks/{chunk-IPJ7Q3AJ.js → chunk-UZED4YZ5.js} +1 -1
- package/dist/cli/chunks/{chunk-VFKF2XO7.js → chunk-VF7FTD64.js} +1 -1
- package/dist/cli/chunks/{chunk-YCGP5VFP.js → chunk-VUR5THML.js} +2 -2
- package/dist/cli/chunks/{chunk-WDVRE6GN.js → chunk-VXVTFKRA.js} +2 -2
- package/dist/cli/chunks/chunk-VZBC6DP7.js +2 -0
- package/dist/cli/chunks/{chunk-GHBNRMSJ.js → chunk-W4II6SIH.js} +2 -2
- package/dist/cli/chunks/{chunk-TNMBRDCA.js → chunk-W5HQIYQU.js} +3 -3
- package/dist/cli/chunks/{chunk-H74Q7TJN.js → chunk-W7H55PY4.js} +1 -1
- package/dist/cli/chunks/{chunk-OY2AHLSF.js → chunk-WDEXOLK2.js} +1 -1
- package/dist/cli/chunks/{chunk-VJQYDYAJ.js → chunk-WGTEZT7G.js} +2 -2
- package/dist/cli/chunks/{chunk-GRCIBCJ2.js → chunk-WLRU6ESI.js} +2 -2
- package/dist/cli/chunks/{chunk-ACWFKES2.js → chunk-WTAUF6O4.js} +2 -2
- package/dist/cli/chunks/chunk-XCNSGSKV.js +3 -0
- package/dist/cli/chunks/{chunk-6S3WJGUV.js → chunk-XZOYKB22.js} +2 -2
- package/dist/cli/chunks/chunk-YIDAXOUX.js +8 -0
- package/dist/cli/chunks/{chunk-LQEURY7C.js → chunk-YLKIXEPP.js} +1 -1
- package/dist/cli/chunks/chunk-YNVEDFPQ.js +2 -0
- package/dist/cli/chunks/{chunk-PGYMKGOE.js → chunk-YUA6ZKKY.js} +2 -2
- package/dist/cli/chunks/{chunk-GJMLK5UT.js → chunk-YVJEUX3I.js} +2 -2
- package/dist/cli/chunks/{chunk-AH3ZD3NJ.js → chunk-YWWMNTBF.js} +2 -2
- package/dist/cli/chunks/{chunk-37OWRCUN.js → chunk-ZGROHCOW.js} +2 -2
- package/dist/cli/chunks/{chunk-OEKP73MC.js → chunk-ZPVGX4DI.js} +2 -2
- package/dist/cli/chunks/{chunk-6GP6W46M.js → chunk-ZROAMFX2.js} +2 -2
- package/dist/cli/chunks/{chunk-OY3NJNP2.js → chunk-ZYOYR3UR.js} +1 -1
- package/dist/cli/chunks/ci-BZNWW3I3.js +81 -0
- package/dist/cli/chunks/{ci-config-7ODMNAUM.js → ci-config-LOHNXOKV.js} +2 -2
- package/dist/cli/chunks/{ci-output-FXZ7ZZW3.js → ci-output-LCOQBSJL.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-4VOUEPOX.js → circuit-breaker-7LRXTLFE.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-7D4SGLM4.js → claude-flow-setup-HBU4VWC3.js} +2 -2
- package/dist/cli/chunks/client-4PNYDFYS.js +2 -0
- package/dist/cli/chunks/{cline-installer-WRRT7BGQ.js → cline-installer-CO6MLH6X.js} +2 -2
- package/dist/cli/chunks/{code-ZDJRIL3S.js → code-SIXBS6JM.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-4S4SHM56.js → code-index-extractor-GWJKZ2IQ.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YTRHNDWR.js → codex-installer-6NINVWXJ.js} +2 -2
- package/dist/cli/chunks/{completions-6N64JUXJ.js → completions-7VIX3GML.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-I4A26VCJ.js → complexity-analyzer-FBQR6ZP2.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-IIDR66LB.js → continuedev-installer-VA7RIXW5.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-SVVFY3S2.js → copilot-installer-4QEBC4MU.js} +2 -2
- package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VGFS6IBX.js → cost-tracker-GRYKHPWL.js} +2 -2
- package/dist/cli/chunks/coverage-USPMNKOU.js +50 -0
- package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +2 -0
- package/dist/cli/chunks/{cursor-installer-UPETT57E.js → cursor-installer-ZXIPSZVH.js} +2 -2
- package/dist/cli/chunks/{daemon-CQFNZLXU.js → daemon-D7F3RGI5.js} +3 -3
- package/dist/cli/chunks/{daemon-7BDJHEIJ.js → daemon-N2VRHPSJ.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-PJVABHON.js → dag-attention-scheduler-NL6BA7BY.js} +2 -2
- package/dist/cli/chunks/{detect-56SKAGWX.js → detect-XC2HCIIT.js} +2 -2
- package/dist/cli/chunks/{dist-node-UYTYUMLN.js → dist-node-A3Y26MEI.js} +2 -2
- package/dist/cli/chunks/{domain-handler-YOYLBYJE.js → domain-handler-WV6SFXRB.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-7TARX2XF.js → domain-plugins-KJIF6Z2B.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-AKVSBD6E.js → domain-transfer-L3F6AES2.js} +2 -2
- package/dist/cli/chunks/dream-QOB3JCOM.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-IS6HSR66.js → embed-and-insert-pattern-PA3Y4KGO.js} +2 -2
- package/dist/cli/chunks/{eval-GNB574IM.js → eval-YGEZNUVE.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-RCAOCKM7.js → experience-capture-middleware-D4T7NW6B.js} +3 -3
- package/dist/cli/chunks/{fast-paths-KTZ5SF54.js → fast-paths-6JYK7RYQ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KFHSR5YF.js → feature-flags-DKXMDVPE.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ITX5LQ57.js → feature-flags-RBH2GDSR.js} +2 -2
- package/dist/cli/chunks/file-discovery-BN76S2PR.js +2 -0
- package/dist/cli/chunks/fleet-43YMXACN.js +46 -0
- package/dist/cli/chunks/{gnn-wrapper-RLFW3GSX.js → gnn-wrapper-MV54UC4C.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EM2URCYZ.js → heartbeat-handler-7DKMVQQH.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +2 -0
- package/dist/cli/chunks/hnsw-index-HE4AX22U.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-JMHEOIBH.js → hnsw-legacy-bridge-6IWREDQC.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-CBP73QHY.js → hnswlib-node-5BIESSCK.js} +2 -2
- package/dist/cli/chunks/{hooks-IP7XE34Z.js → hooks-3EETRM62.js} +30 -30
- package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ONAYHU25.js → hypergraph-engine-RSWCB2D3.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VINJRAID.js → hypergraph-handler-552LXKL3.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +2 -0
- package/dist/cli/chunks/{init-guard-RYVV5R3Z.js → init-guard-OTDBJ5HD.js} +2 -2
- package/dist/cli/chunks/{init-handler-MPRGWMOE.js → init-handler-3FK3TKEA.js} +26 -25
- package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +2 -0
- package/dist/cli/chunks/kernel-2WZOQEZS.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-OPD7JBRL.js → kilocode-installer-KZ2O4LF3.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-M4OPUNK2.js → kiro-installer-MLCCXRF7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +2 -0
- package/dist/cli/chunks/{learning-4UWTQLMF.js → learning-QUCMBD77.js} +3 -3
- package/dist/cli/chunks/{llm-router-SQ56FF6Z.js → llm-router-PDEV3UP2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +2 -0
- package/dist/cli/chunks/{load-HPHKDGGL.js → load-XFVVLO7E.js} +2 -2
- package/dist/cli/chunks/load-test-BEWEE44J.js +2 -0
- package/dist/cli/chunks/{mcp-TELMAC7Z.js → mcp-74G3CL2S.js} +2 -2
- package/dist/cli/chunks/{memory-PFQ3KPVJ.js → memory-XIFM6JNX.js} +5 -5
- package/dist/cli/chunks/memory-backend-NYKBBKZR.js +2 -0
- package/dist/cli/chunks/memory-handlers-ZCKURV6S.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3VDRX6TZ.js → multi-model-executor-7L4W3O2Q.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-PJ576R63.js → opencode-installer-BPG422LF.js} +2 -2
- package/dist/cli/chunks/{orchestrator-72QP4UU7.js → orchestrator-OEAFLAEV.js} +61 -23
- package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-754YQW7C.js → pattern-usage-recorder-LOPNCULT.js} +2 -2
- package/dist/cli/chunks/{pipeline-AVXY4MVB.js → pipeline-VWTYUZB7.js} +2 -2
- package/dist/cli/chunks/{platform-3E3DXLYB.js → platform-WFJJ3X2E.js} +2 -2
- package/dist/cli/chunks/{plugin-7FUQAKRE.js → plugin-744TPUSG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIB4F5NV.js → prime-radiant-advanced-wasm-BD5BLNDR.js} +2 -2
- package/dist/cli/chunks/project-root-C7ELXZRK.js +2 -0
- package/dist/cli/chunks/protocol-executor-SUVE33BM.js +2 -0
- package/dist/cli/chunks/{protocol-handler-BQRYMUTG.js → protocol-handler-JIBILI74.js} +2 -2
- package/dist/cli/chunks/{prove-H52QGC6B.js → prove-MNOL5FYW.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +2 -0
- package/dist/cli/chunks/{quality-QO4XPAUM.js → quality-JEGBDGGX.js} +2 -2
- package/dist/cli/chunks/{quality-gate-FBKE5E6F.js → quality-gate-SYJ6ROMI.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +2 -0
- package/dist/cli/chunks/real-embeddings-ZWXS5ZFV.js +2 -0
- package/dist/cli/chunks/{ref-validation-LF76ZOBD.js → ref-validation-RRHUFW2N.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3BYEBTQ7.js → roocode-installer-XFO6JSVN.js} +2 -2
- package/dist/cli/chunks/router-4FTAVYLJ.js +2 -0
- package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +2 -0
- package/dist/cli/chunks/{routing-handler-DST7BVCU.js → routing-handler-L2K3JASE.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-XE32PGKC.js → ruvector-commands-A6CINHGM.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-VP32XC75.js → rvf-migration-coordinator-T4RY7L53.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-SH2AMVI7.js → rvf-store-integrity-IR33TGQS.js} +2 -2
- package/dist/cli/chunks/safe-db-QXDZ6QY3.js +2 -0
- package/dist/cli/chunks/schedule-CZKD6RIY.js +2 -0
- package/dist/cli/chunks/scheduler-BLA3Q4CH.js +2 -0
- package/dist/cli/chunks/{security-VSPNKCDS.js → security-Z5GDE2IH.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-HX6AHL3P.js → shared-rvf-adapter-SIZMEHPM.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-MX4FC2JE.js → shared-rvf-dual-writer-HLM65RDS.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +2 -0
- package/dist/cli/chunks/{standalone-memory-O4QUTK6L.js → standalone-memory-SKSZG7P5.js} +2 -2
- package/dist/cli/chunks/{status-handler-Z2BP6EOG.js → status-handler-766YOOMJ.js} +2 -2
- package/dist/cli/chunks/{structural-health-R36WNLQG.js → structural-health-M45FNOLT.js} +2 -2
- package/dist/cli/chunks/{sync-QF5Y3EMZ.js → sync-6CJ24B5T.js} +2 -2
- package/dist/cli/chunks/{sync-2ELWUFQU.js → sync-B2U366I3.js} +2 -2
- package/dist/cli/chunks/{task-handler-43PYE75J.js → task-handler-P6IFLCKP.js} +17 -15
- package/dist/cli/chunks/task-handlers-DPWMUKFC.js +9 -0
- package/dist/cli/chunks/{test-UWA377D4.js → test-TODH7KRF.js} +11 -11
- package/dist/cli/chunks/test-runner-process-46IPK3GH.js +2 -0
- package/dist/cli/chunks/{test-scheduling-YQZPJRRN.js → test-scheduling-VMVMVRHT.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-F7C6UKTC.js → token-bootstrap-XQW7BMCK.js} +2 -2
- package/dist/cli/chunks/{token-usage-DO6WLMXP.js → token-usage-JCZEIRKO.js} +2 -2
- package/dist/cli/chunks/{transformers-H5RGFKVO.js → transformers-U2ML3OHE.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +2 -0
- package/dist/cli/chunks/{types-PJS2FGPF.js → types-GGEPCHP6.js} +2 -2
- package/dist/cli/chunks/unified-memory-FL26RTV3.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +2 -0
- package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +2 -0
- package/dist/cli/chunks/{upgrade-4IC4F6AB.js → upgrade-T5GRM7HS.js} +2 -2
- package/dist/cli/chunks/{validate-DHUWW7PF.js → validate-XMUJPLP3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-OERQNOX5.js → validate-swarm-KJLF7JEH.js} +2 -2
- package/dist/cli/chunks/visual-security-IJVPO5FA.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-TV7DMKES.js → web-tree-sitter-LOHVZ7G5.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-QZPWSH37.js → windsurf-installer-33FBTXJU.js} +2 -2
- package/dist/cli/chunks/witness-chain-5FAFCQKP.js +2 -0
- package/dist/cli/chunks/witness-chain-V2M32W5D.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-RUXIOE7F.js → witness-chain-repair-VWBO4NXE.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-YXENHB42.js → witness-chain-verifier-BHJ3ZAEK.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-HL26AGFO.js → witness-key-manager-WNVPH2Z3.js} +2 -2
- package/dist/cli/chunks/{workflow-EOVVCN2E.js → workflow-6QR5MQTO.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +2 -0
- package/dist/cli/chunks/{wrappers-AGODHBOO.js → wrappers-EHOL62TS.js} +2 -2
- package/dist/cli/commands/ci.js +7 -0
- package/dist/cli/commands/coverage.js +7 -1
- package/dist/cli/commands/fleet.js +5 -2
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.js +11 -6
- package/dist/cli/commands/test.js +5 -2
- package/dist/cli/handlers/init-handler.d.ts +12 -0
- package/dist/cli/handlers/init-handler.js +27 -12
- package/dist/cli/handlers/task-handler.js +6 -0
- package/dist/cli/utils/ci-output.d.ts +2 -0
- package/dist/cli/utils/ci-output.js +2 -0
- package/dist/cli/utils/coverage-verdict.d.ts +11 -2
- package/dist/cli/utils/coverage-verdict.js +26 -6
- package/dist/cli/utils/fleet-operation.d.ts +5 -0
- package/dist/cli/utils/fleet-operation.js +7 -1
- package/dist/cli/utils/fleet-result.d.ts +5 -3
- package/dist/cli/utils/fleet-result.js +9 -3
- package/dist/cli/utils/progress.d.ts +16 -2
- package/dist/cli/utils/progress.js +31 -14
- package/dist/coordination/consensus/consensus-engine.js +3 -1
- package/dist/coordination/handlers/code-intelligence-handlers.js +3 -2
- package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
- package/dist/coordination/handlers/coverage-collection.js +5 -2
- package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
- package/dist/coordination/handlers/coverage-evidence.js +159 -0
- package/dist/coordination/handlers/coverage-handlers.js +16 -3
- package/dist/coordination/handlers/coverage-runner.d.ts +3 -8
- package/dist/coordination/handlers/coverage-runner.js +6 -22
- package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
- package/dist/coordination/handlers/coverage-scope.js +321 -0
- package/dist/coordination/handlers/coverage-stderr.d.ts +23 -0
- package/dist/coordination/handlers/coverage-stderr.js +39 -0
- package/dist/coordination/handlers/coverage-target.d.ts +9 -0
- package/dist/coordination/handlers/coverage-target.js +21 -8
- package/dist/coordination/handlers/handler-utils.d.ts +5 -0
- package/dist/coordination/handlers/handler-utils.js +11 -5
- package/dist/coordination/handlers/requirements-handlers.js +3 -2
- package/dist/coordination/handlers/security-handlers.js +34 -20
- package/dist/coordination/queen-coordinator.js +8 -3
- package/dist/coordination/task-executability.d.ts +12 -0
- package/dist/coordination/task-executability.js +27 -0
- package/dist/coordination/workflow-orchestrator.d.ts +6 -0
- package/dist/coordination/workflow-orchestrator.js +22 -8
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
- package/dist/domains/code-intelligence/services/product-factors-bridge.js +7 -4
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -0
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +10 -7
- package/dist/domains/coverage-analysis/services/coverage-parser.js +19 -10
- package/dist/domains/learning-optimization/interfaces.d.ts +2 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +2 -1
- package/dist/domains/learning-optimization/services/metrics-optimizer.js +14 -4
- package/dist/domains/learning-optimization/services/production-intel.js +3 -1
- package/dist/domains/security-compliance/generic-finding-dedup.d.ts +40 -0
- package/dist/domains/security-compliance/generic-finding-dedup.js +63 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +14 -6
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -2
- package/dist/domains/security-compliance/services/security-auditor-sast.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor-secrets.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor.js +3 -2
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +5 -14
- package/dist/domains/test-execution/interfaces.d.ts +11 -1
- package/dist/domains/test-execution/services/retry-outcome.d.ts +18 -0
- package/dist/domains/test-execution/services/retry-outcome.js +53 -0
- package/dist/domains/test-generation/coordinator.js +2 -2
- package/dist/domains/test-generation/services/pattern-matcher.js +4 -4
- package/dist/domains/test-generation/services/test-generator.js +2 -2
- package/dist/governance/evolution-pipeline-integration.js +3 -1
- package/dist/hooks/cross-phase-hooks.js +3 -1
- package/dist/init/init-wizard-steps.js +5 -1
- package/dist/init/phases/04-database.js +7 -0
- package/dist/init/phases/10-workers.js +42 -4
- package/dist/init/phases/12-verification.js +14 -4
- package/dist/init/settings-merge.js +7 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +29 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +70 -6
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +10 -3
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +13 -0
- package/dist/integrations/ruvector/filter-adapter.js +2 -1
- package/dist/learning/dream/insight-generator.js +5 -4
- package/dist/learning/embedder-endpoint-client.d.ts +8 -0
- package/dist/learning/embedder-endpoint-client.js +20 -0
- package/dist/learning/embedder-recovery.d.ts +63 -0
- package/dist/learning/embedder-recovery.js +94 -0
- package/dist/learning/memory-auditor.js +3 -1
- package/dist/learning/qe-patterns.js +2 -1
- package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
- package/dist/learning/qe-reasoning-bank.d.ts +21 -0
- package/dist/learning/qe-reasoning-bank.js +54 -8
- package/dist/learning/real-embeddings.d.ts +23 -0
- package/dist/learning/real-embeddings.js +69 -2
- package/dist/learning/real-qe-reasoning-bank.d.ts +39 -0
- package/dist/learning/real-qe-reasoning-bank.js +108 -38
- package/dist/logging/redaction.js +142 -12
- package/dist/mcp/bundle.js +520 -503
- package/dist/mcp/daemon-mode.d.ts +126 -0
- package/dist/mcp/daemon-mode.js +257 -0
- package/dist/mcp/entry.d.ts +4 -0
- package/dist/mcp/entry.js +50 -2
- package/dist/mcp/handlers/domain-handler-configs.d.ts +2 -0
- package/dist/mcp/handlers/domain-handler-configs.js +13 -2
- package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
- package/dist/mcp/handlers/orchestrate-routes.js +53 -0
- package/dist/mcp/handlers/task-handlers.d.ts +23 -1
- package/dist/mcp/handlers/task-handlers.js +90 -19
- package/dist/mcp/handlers/validation-pipeline-handler.js +9 -9
- package/dist/mcp/protocol-server.js +11 -8
- package/dist/mcp/qe-tool-bridge.js +3 -0
- package/dist/mcp/services/reasoning-bank-service.d.ts +9 -2
- package/dist/mcp/services/reasoning-bank-service.js +13 -0
- package/dist/mcp/tool-annotations.js +4 -1
- package/dist/mcp/tools/coherence/check.js +1 -0
- package/dist/mcp/tools/coherence/consensus.js +4 -2
- package/dist/mcp/tools/learning-optimization/optimize.js +1 -2
- package/dist/mcp/tools/mincut/index.js +3 -0
- package/dist/mcp/tools/quality-assessment/gate.js +7 -0
- package/dist/mcp/tools/qx-analysis/analyze.js +1 -0
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +10 -3
- package/dist/mcp/tools/security-compliance/scan.js +4 -2
- package/dist/mcp/tools/test-execution/e2e-execute.js +2 -2
- package/dist/mcp/tools/test-execution/execute.js +3 -2
- package/dist/mcp/types.d.ts +14 -0
- package/dist/memory/crdt/crdt-store.js +5 -0
- package/dist/memory/crdt/lww-register.js +12 -2
- package/dist/optimization/early-exit-token-optimizer.js +3 -1
- package/dist/planning/goap-planner.js +5 -0
- package/dist/planning/plan-executor.js +5 -0
- package/dist/routing/advisor/redaction.js +22 -2
- package/dist/shared/io/confined-read.d.ts +74 -0
- package/dist/shared/io/confined-read.js +256 -0
- package/dist/shared/io/file-reader.d.ts +6 -6
- package/dist/shared/io/file-reader.js +16 -42
- package/dist/shared/llm/providers/claude-code.js +4 -1
- package/dist/shared/llm/providers/response-deadline.js +16 -2
- package/dist/shared/native-module-errors.d.ts +51 -0
- package/dist/shared/native-module-errors.js +129 -0
- package/dist/shared/safe-db.js +14 -4
- package/dist/shared/security/osv-client.js +4 -1
- package/dist/shared/types/index.js +3 -1
- package/dist/shared/types/test-frameworks.js +2 -2
- package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
- package/dist/sync/readers/json-reader.js +2 -1
- package/dist/validation/anchor-set.d.ts +6 -0
- package/dist/validation/anchor-set.js +9 -1
- package/dist/validation/quality-gate-runner.d.ts +7 -1
- package/dist/validation/quality-gate-runner.js +3 -3
- package/package.json +3 -3
- package/dist/cli/chunks/adapter-TR5SLAZC.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +0 -2
- package/dist/cli/chunks/base-GTB6POYE.js +0 -2
- package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +0 -2
- package/dist/cli/chunks/chunk-4SJYIX54.js +0 -3
- package/dist/cli/chunks/chunk-6P7424AO.js +0 -21
- package/dist/cli/chunks/chunk-6X5DHU6Q.js +0 -14
- package/dist/cli/chunks/chunk-CMBLM26R.js +0 -2
- package/dist/cli/chunks/chunk-DKAC3E3B.js +0 -3
- package/dist/cli/chunks/chunk-DURHK377.js +0 -742
- package/dist/cli/chunks/chunk-FPUDRSFJ.js +0 -180
- package/dist/cli/chunks/chunk-G5I6KGMW.js +0 -59
- package/dist/cli/chunks/chunk-HOZUDE4C.js +0 -2
- package/dist/cli/chunks/chunk-N6PIIK6G.js +0 -3
- package/dist/cli/chunks/chunk-NSHU347M.js +0 -2
- package/dist/cli/chunks/chunk-PPSAMXYN.js +0 -13
- package/dist/cli/chunks/chunk-TYFZXDGZ.js +0 -4
- package/dist/cli/chunks/chunk-U4OICXV2.js +0 -6
- package/dist/cli/chunks/chunk-WSF24I3D.js +0 -2
- package/dist/cli/chunks/chunk-XBVUVFJK.js +0 -4
- package/dist/cli/chunks/chunk-XUZDBQ5X.js +0 -6
- package/dist/cli/chunks/chunk-YBSBABOS.js +0 -2
- package/dist/cli/chunks/chunk-ZG5666GJ.js +0 -2
- package/dist/cli/chunks/ci-MSKMVH5X.js +0 -81
- package/dist/cli/chunks/client-POSVREVS.js +0 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +0 -2
- package/dist/cli/chunks/coverage-B7MCGNTE.js +0 -49
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +0 -2
- package/dist/cli/chunks/dream-UA7MKOPQ.js +0 -2
- package/dist/cli/chunks/file-discovery-YCMNKZAK.js +0 -2
- package/dist/cli/chunks/fleet-2Y3ZE6CE.js +0 -46
- package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +0 -2
- package/dist/cli/chunks/hnsw-index-DFUNARVD.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +0 -2
- package/dist/cli/chunks/init-wizard-NIMZ4J55.js +0 -2
- package/dist/cli/chunks/kernel-JQK7PRAI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +0 -2
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +0 -2
- package/dist/cli/chunks/load-test-UKNV5MWW.js +0 -2
- package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +0 -2
- package/dist/cli/chunks/memory-handlers-FCXN437E.js +0 -2
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +0 -2
- package/dist/cli/chunks/project-root-JCAUNL6O.js +0 -2
- package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +0 -2
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +0 -2
- package/dist/cli/chunks/real-embeddings-RWGOVOXO.js +0 -2
- package/dist/cli/chunks/router-3DIS5X4R.js +0 -2
- package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +0 -2
- package/dist/cli/chunks/safe-db-EVB4ZC7T.js +0 -2
- package/dist/cli/chunks/schedule-ORDDXXY4.js +0 -2
- package/dist/cli/chunks/scheduler-XFLJSFIU.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +0 -2
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +0 -9
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +0 -2
- package/dist/cli/chunks/unified-memory-EHD4VNFW.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +0 -2
- package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +0 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +0 -2
- package/dist/cli/chunks/witness-chain-LC6Q2W27.js +0 -2
- package/dist/cli/chunks/witness-chain-QUIBAF3W.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +0 -2
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage evidence: is a report complete and current for its target? (#1154)
|
|
3
|
+
*
|
|
4
|
+
* A report judged over only the files it happens to contain says nothing
|
|
5
|
+
* about the target's other files. `aqe fleet run analyze --target src` printed
|
|
6
|
+
* "100% over 1 files" and "Verdict: PASSED" from a report that listed
|
|
7
|
+
* `src/math.js` while `src/unsafe.js` had no measurement at all, and a report
|
|
8
|
+
* written before the sources last changed was judged as if it were current.
|
|
9
|
+
*
|
|
10
|
+
* This module answers two questions for every caller of the shared resolver
|
|
11
|
+
* (MCP `coverage_analyze_sublinear` / `task_orchestrate`, `aqe coverage`,
|
|
12
|
+
* `aqe ci`, `aqe fleet run analyze`):
|
|
13
|
+
* 1. Which production source files under the target are not in the report?
|
|
14
|
+
* They are UNMEASURED: not 0%, and not left out silently.
|
|
15
|
+
* 2. Is the report older than source files it is judged against? (stale)
|
|
16
|
+
* Either one makes the evidence insufficient: no verdict may pass on it.
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'fs';
|
|
19
|
+
import * as path from 'path';
|
|
20
|
+
import { walkSourceFiles } from './coverage-collection.js';
|
|
21
|
+
import { inCoverageScope, readCoverageScope } from './coverage-scope.js';
|
|
22
|
+
/** Source files that share a coverage tool with each other (one report covers one family). */
|
|
23
|
+
const LANGUAGE_FAMILIES = [
|
|
24
|
+
['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
|
|
25
|
+
['.py'], ['.go'], ['.rs'], ['.java'], ['.rb'],
|
|
26
|
+
];
|
|
27
|
+
function familyOf(file) {
|
|
28
|
+
const ext = path.extname(file).toLowerCase();
|
|
29
|
+
return LANGUAGE_FAMILIES.find(family => family.includes(ext));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Files no coverage tool instruments by default: type declarations and tool
|
|
33
|
+
* configuration (`vitest.config.ts`, `eslint.config.js`, `.prettierrc.js`).
|
|
34
|
+
*/
|
|
35
|
+
function isNeverInstrumented(file) {
|
|
36
|
+
const base = path.basename(file);
|
|
37
|
+
return base.endsWith('.d.ts') || base.startsWith('.') || /\.config\.[cm]?[jt]sx?$/.test(base);
|
|
38
|
+
}
|
|
39
|
+
function canonical(p) {
|
|
40
|
+
try {
|
|
41
|
+
return fs.realpathSync(p);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return path.resolve(p);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Absolute, canonical paths of the report's entries (relative entries resolve against `projectRoot`). */
|
|
48
|
+
function reportPaths(files, projectRoot) {
|
|
49
|
+
const rootAbs = canonical(projectRoot);
|
|
50
|
+
return new Set(files.map(f => path.isAbsolute(f.path) ? canonical(f.path) : canonical(path.resolve(rootAbs, f.path))));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Production source files under a directory `target` that the report has no
|
|
54
|
+
* entry for. Only files in a language the report covers count: a JS report
|
|
55
|
+
* does not make a Python helper script unmeasured. Files the project's coverage
|
|
56
|
+
* config leaves out (include/exclude) were never meant to be measured and do
|
|
57
|
+
* not count either.
|
|
58
|
+
*/
|
|
59
|
+
export function findUnmeasuredSourceFiles(reportFiles, projectRoot, target) {
|
|
60
|
+
let isDir = false;
|
|
61
|
+
try {
|
|
62
|
+
isDir = fs.statSync(target).isDirectory();
|
|
63
|
+
}
|
|
64
|
+
catch { /* missing: nothing to compare */ }
|
|
65
|
+
if (!isDir)
|
|
66
|
+
return { targetFiles: [], unmeasured: [] };
|
|
67
|
+
const rootAbs = canonical(projectRoot);
|
|
68
|
+
const scope = readCoverageScope(rootAbs);
|
|
69
|
+
const families = new Set(reportFiles.map(f => familyOf(f.path)).filter(Boolean));
|
|
70
|
+
const inReport = reportPaths(reportFiles, projectRoot);
|
|
71
|
+
const targetFiles = walkSourceFiles(target)
|
|
72
|
+
.filter(file => families.has(familyOf(file)) && !isNeverInstrumented(file))
|
|
73
|
+
.map(canonical)
|
|
74
|
+
.filter(file => inCoverageScope(scope, file, rootAbs));
|
|
75
|
+
return {
|
|
76
|
+
targetFiles,
|
|
77
|
+
unmeasured: targetFiles.filter(file => !inReport.has(file)).sort(),
|
|
78
|
+
...(scope ? { coverageScope: { source: scope.source, readable: scope.readable } } : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Source files modified after the report was written; `undefined` when the report is current. */
|
|
82
|
+
export function findStaleness(reportPath, sourceFiles) {
|
|
83
|
+
let reportMtime;
|
|
84
|
+
try {
|
|
85
|
+
reportMtime = fs.statSync(reportPath).mtimeMs;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const newerFiles = sourceFiles.filter(file => {
|
|
91
|
+
try {
|
|
92
|
+
return fs.statSync(file).mtimeMs > reportMtime;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}).sort();
|
|
98
|
+
return newerFiles.length > 0
|
|
99
|
+
? { reportPath, reportModified: new Date(reportMtime).toISOString(), newerFiles }
|
|
100
|
+
: undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The evidence a report gives for `target`.
|
|
104
|
+
*
|
|
105
|
+
* `measuredFiles` are the report entries already scoped to the target.
|
|
106
|
+
* Completeness is checked only when `checkCompleteness` is set (a directory
|
|
107
|
+
* target, not a report file given as the target), staleness only when the
|
|
108
|
+
* report's path is known (not for a report the run just wrote).
|
|
109
|
+
*/
|
|
110
|
+
export function assessCoverageEvidence(report, measuredFiles, projectRoot, target, options = {}) {
|
|
111
|
+
const { targetFiles, unmeasured, coverageScope } = options.checkCompleteness === false
|
|
112
|
+
? { targetFiles: [], unmeasured: [], coverageScope: undefined }
|
|
113
|
+
: findUnmeasuredSourceFiles(report.files, projectRoot, target);
|
|
114
|
+
const sources = new Set([...targetFiles, ...reportPaths(measuredFiles, projectRoot)]);
|
|
115
|
+
const stale = options.reportPath
|
|
116
|
+
? findStaleness(options.reportPath, [...sources].filter(file => fs.existsSync(file)))
|
|
117
|
+
: undefined;
|
|
118
|
+
return {
|
|
119
|
+
status: unmeasured.length > 0 || stale ? 'insufficient-evidence' : 'complete',
|
|
120
|
+
unmeasuredFiles: unmeasured,
|
|
121
|
+
targetFiles: sources.size,
|
|
122
|
+
...(stale ? { stale } : {}),
|
|
123
|
+
...(coverageScope ? { coverageScope } : {}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const MAX_LISTED = 5;
|
|
127
|
+
function listFiles(files, root) {
|
|
128
|
+
const shown = files.slice(0, MAX_LISTED).map(f => path.relative(root, f) || f);
|
|
129
|
+
return shown.join(', ') + (files.length > MAX_LISTED ? `, … ${files.length - MAX_LISTED} more` : '');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Why the evidence is insufficient, one sentence per problem; empty when it is
|
|
133
|
+
* complete. Shared by MCP and CLI so the wording cannot drift.
|
|
134
|
+
*/
|
|
135
|
+
export function describeEvidence(evidence, projectRoot) {
|
|
136
|
+
if (!evidence)
|
|
137
|
+
return [];
|
|
138
|
+
const reasons = [];
|
|
139
|
+
const n = evidence.unmeasuredFiles.length;
|
|
140
|
+
if (n > 0) {
|
|
141
|
+
const scope = evidence.coverageScope;
|
|
142
|
+
const scopeNote = scope && !scope.readable
|
|
143
|
+
? ` The coverage include/exclude in ${scope.source} could not be read statically, so files it leaves out ` +
|
|
144
|
+
'may be listed here; write them as literal string arrays to have them honoured.'
|
|
145
|
+
: '';
|
|
146
|
+
reasons.push(`${n} of ${evidence.targetFiles} source files under the target are not in the coverage report ` +
|
|
147
|
+
`(UNMEASURED, not counted as covered): ${listFiles(evidence.unmeasuredFiles, projectRoot)}. Regenerate ` +
|
|
148
|
+
'the report with coverage for the whole target, or exclude files that are not meant to be measured in the ' +
|
|
149
|
+
`coverage tool's include/exclude config.${scopeNote}`);
|
|
150
|
+
}
|
|
151
|
+
if (evidence.stale) {
|
|
152
|
+
const m = evidence.stale.newerFiles.length;
|
|
153
|
+
reasons.push(`the coverage report ${path.relative(projectRoot, evidence.stale.reportPath) || evidence.stale.reportPath} ` +
|
|
154
|
+
`is STALE: ${m} source file${m === 1 ? ' was' : 's were'} modified after it was written ` +
|
|
155
|
+
`(${evidence.stale.reportModified}): ${listFiles(evidence.stale.newerFiles, projectRoot)}`);
|
|
156
|
+
}
|
|
157
|
+
return reasons;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=coverage-evidence.js.map
|
|
@@ -9,6 +9,7 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
9
9
|
import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
|
|
10
10
|
import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
|
|
11
11
|
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
12
|
+
import { describeEvidence } from './coverage-evidence.js';
|
|
12
13
|
import { randomUUID } from 'crypto';
|
|
13
14
|
import * as path from 'path';
|
|
14
15
|
import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
|
|
@@ -54,7 +55,7 @@ function instrumented(files) {
|
|
|
54
55
|
}
|
|
55
56
|
function fromEvaluation(evaluation, ranTests, projectRoot) {
|
|
56
57
|
return evaluation.status === 'measured'
|
|
57
|
-
? { collected: instrumented(evaluation.files), ranTests, projectRoot }
|
|
58
|
+
? { collected: instrumented(evaluation.files), ranTests, projectRoot, evidence: evaluation.evidence }
|
|
58
59
|
: { collected: null, ranTests, noData: evaluation.reason, projectRoot };
|
|
59
60
|
}
|
|
60
61
|
/**
|
|
@@ -212,7 +213,7 @@ export function registerCoverageHandlers(ctx) {
|
|
|
212
213
|
}
|
|
213
214
|
const analyzer = ctx.getCoverageAnalyzer();
|
|
214
215
|
const threshold = payload.threshold || 80;
|
|
215
|
-
const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun } = await collectCoverage(targetPath);
|
|
216
|
+
const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence } = await collectCoverage(targetPath);
|
|
216
217
|
// #995 review N5: say so plainly instead of "no coverage data found".
|
|
217
218
|
if (noData === 'target-missing') {
|
|
218
219
|
return err(new Error(describeNoData('target-missing', targetPath, null)));
|
|
@@ -278,9 +279,16 @@ export function registerCoverageHandlers(ctx) {
|
|
|
278
279
|
}
|
|
279
280
|
const round = (n) => Math.round(n * 10) / 10;
|
|
280
281
|
const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 1000) / 10 : null;
|
|
282
|
+
// #1154: target files missing from the report, or a report older than the
|
|
283
|
+
// sources, leave the evidence insufficient: the figures stand for the
|
|
284
|
+
// measured files only, and the threshold is not met on them.
|
|
285
|
+
const evidenceReasons = describeEvidence(evidence, projectRoot ?? targetPath);
|
|
281
286
|
const warnings = [...provenance.notes, ...(notes ?? [])];
|
|
282
287
|
if (provenance.estimated)
|
|
283
288
|
warnings.push(estimationGuidance(targetPath));
|
|
289
|
+
if (evidenceReasons.length > 0) {
|
|
290
|
+
warnings.push(`INSUFFICIENT EVIDENCE — the threshold is not met on this report: ${evidenceReasons.join('; ').replace(/\.?$/, '.')}`);
|
|
291
|
+
}
|
|
284
292
|
// #569: the analyzer generates recommendations from the summary numbers.
|
|
285
293
|
// When branch or function data was never collected, those numbers are 0
|
|
286
294
|
// by construction, and the resulting advice ("Branch coverage is
|
|
@@ -312,7 +320,12 @@ export function registerCoverageHandlers(ctx) {
|
|
|
312
320
|
})),
|
|
313
321
|
gaps,
|
|
314
322
|
// NB5: judged only on the metrics that were collected (shared with the CLI).
|
|
315
|
-
meetsThreshold: verdict.meetsThreshold,
|
|
323
|
+
meetsThreshold: verdict.meetsThreshold && evidenceReasons.length === 0,
|
|
324
|
+
...(evidence ? {
|
|
325
|
+
evidenceStatus: evidence.status,
|
|
326
|
+
unmeasuredFiles: evidence.unmeasuredFiles,
|
|
327
|
+
...(evidence.stale ? { staleReport: evidence.stale } : {}),
|
|
328
|
+
} : {}),
|
|
316
329
|
delta: report.delta,
|
|
317
330
|
recommendations,
|
|
318
331
|
algorithm: 'sublinear-O(log n)',
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
* fate. Hosts should shut down via a handled signal.
|
|
26
26
|
*/
|
|
27
27
|
import type { CoverageData } from '../../domains/coverage-analysis/interfaces';
|
|
28
|
+
import { summarizeStderr } from './coverage-stderr';
|
|
29
|
+
export { summarizeStderr };
|
|
28
30
|
export type JsRunnerName = 'vitest' | 'jest' | 'nyc';
|
|
29
31
|
export interface JsCoverageInvocation {
|
|
30
32
|
runner: JsRunnerName;
|
|
@@ -64,7 +66,7 @@ export interface JsCoverageRun {
|
|
|
64
66
|
numFailedTests?: number | null;
|
|
65
67
|
numPendingTests?: number | null;
|
|
66
68
|
numFailedTestSuites?: number | null;
|
|
67
|
-
/** The runner's first error line plus the last ~2 KB of its stderr, for diagnosing a crash. */
|
|
69
|
+
/** The runner's first error line plus the last ~2 KB of its stderr, redacted (#1150), for diagnosing a crash. */
|
|
68
70
|
stderrTail: string;
|
|
69
71
|
}
|
|
70
72
|
/**
|
|
@@ -74,13 +76,6 @@ export interface JsCoverageRun {
|
|
|
74
76
|
* every test passing). Without counts (nyc), the exit code decides.
|
|
75
77
|
*/
|
|
76
78
|
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
79
|
/**
|
|
85
80
|
* Find an installed package's bin script, walking up `node_modules` from the
|
|
86
81
|
* project root (hoisted monorepo installs live above the package).
|
|
@@ -30,6 +30,8 @@ import * as os from 'os';
|
|
|
30
30
|
import * as path from 'path';
|
|
31
31
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
32
32
|
import { loadCoverageReportFile } from './coverage-target.js';
|
|
33
|
+
import { STDERR_WINDOW_BYTES, summarizeStderr } from './coverage-stderr.js';
|
|
34
|
+
export { summarizeStderr };
|
|
33
35
|
/**
|
|
34
36
|
* Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
|
|
35
37
|
* own result reports a failed test or test suite, 'passed' when it reports
|
|
@@ -43,25 +45,6 @@ export function testRunStatus(run) {
|
|
|
43
45
|
return run.exitedCleanly ? 'passed' : 'failed';
|
|
44
46
|
}
|
|
45
47
|
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
48
|
// ============================================================================
|
|
66
49
|
// Locating the runner
|
|
67
50
|
// ============================================================================
|
|
@@ -348,9 +331,10 @@ export async function runProcessTree(command, args, options) {
|
|
|
348
331
|
child.stderr?.on('data', (chunk) => {
|
|
349
332
|
const text = chunk.toString('utf-8');
|
|
350
333
|
stderrBytes += chunk.length;
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
334
|
+
// #1150: raw windows only; summarizeStderr redacts them before slicing.
|
|
335
|
+
if (stderrHead.length < STDERR_WINDOW_BYTES)
|
|
336
|
+
stderrHead = (stderrHead + text).slice(0, STDERR_WINDOW_BYTES);
|
|
337
|
+
stderrTail = (stderrTail + text).slice(-STDERR_WINDOW_BYTES);
|
|
354
338
|
});
|
|
355
339
|
// A grandchild holding the pipe open must not keep the host alive.
|
|
356
340
|
child.stderr?.on('error', () => { });
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project's own coverage scope (#1154 review).
|
|
3
|
+
*
|
|
4
|
+
* A file the coverage tool is configured to leave out (vitest
|
|
5
|
+
* `coverage.exclude: ['src/**\/index.ts']`, jest `'!src/**\/index.ts'` in
|
|
6
|
+
* `collectCoverageFrom`) is not "unmeasured": it was never meant to be
|
|
7
|
+
* measured. Counting it would fail every verdict on a normal project.
|
|
8
|
+
*
|
|
9
|
+
* The scope is read STATICALLY from literal string arrays. Config files are
|
|
10
|
+
* never executed (they are code from the analyzed repository). When a config
|
|
11
|
+
* declares a coverage scope that is not a literal, the scope is reported as
|
|
12
|
+
* unreadable rather than guessed.
|
|
13
|
+
*
|
|
14
|
+
* Sources, first match wins:
|
|
15
|
+
* - vitest.config.* / vite.config.* `coverage: { include, exclude }`
|
|
16
|
+
* - jest.config.* / package.json "jest" `collectCoverageFrom` (`!` = exclude),
|
|
17
|
+
* `coveragePathIgnorePatterns` (regular expressions)
|
|
18
|
+
* - .nycrc / .nycrc.json / package.json "nyc", .c8rc / .c8rc.json /
|
|
19
|
+
* package.json "c8" `include`, `exclude`
|
|
20
|
+
*/
|
|
21
|
+
export interface CoverageScope {
|
|
22
|
+
/** The config the scope was read from, relative to the project root. */
|
|
23
|
+
source: string;
|
|
24
|
+
/** False when the config declares a scope that is not a literal string array. */
|
|
25
|
+
readable: boolean;
|
|
26
|
+
include: string[];
|
|
27
|
+
exclude: string[];
|
|
28
|
+
/** jest `coveragePathIgnorePatterns`, matched against the absolute path. */
|
|
29
|
+
ignorePatterns: RegExp[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A pattern matches a project-relative POSIX path, or any path under it when it
|
|
33
|
+
* names a directory (nyc/test-exclude treat `src` as `src/**`).
|
|
34
|
+
*/
|
|
35
|
+
export declare function globToRegExp(pattern: string): RegExp;
|
|
36
|
+
/** The coverage scope configured for the project at `projectRoot`; `null` when none is configured. */
|
|
37
|
+
export declare function readCoverageScope(projectRoot: string): CoverageScope | null;
|
|
38
|
+
/** Is `file` inside the configured coverage scope? Everything is, with no scope. */
|
|
39
|
+
export declare function inCoverageScope(scope: CoverageScope | null, file: string, projectRoot: string): boolean;
|
|
40
|
+
//# sourceMappingURL=coverage-scope.d.ts.map
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project's own coverage scope (#1154 review).
|
|
3
|
+
*
|
|
4
|
+
* A file the coverage tool is configured to leave out (vitest
|
|
5
|
+
* `coverage.exclude: ['src/**\/index.ts']`, jest `'!src/**\/index.ts'` in
|
|
6
|
+
* `collectCoverageFrom`) is not "unmeasured": it was never meant to be
|
|
7
|
+
* measured. Counting it would fail every verdict on a normal project.
|
|
8
|
+
*
|
|
9
|
+
* The scope is read STATICALLY from literal string arrays. Config files are
|
|
10
|
+
* never executed (they are code from the analyzed repository). When a config
|
|
11
|
+
* declares a coverage scope that is not a literal, the scope is reported as
|
|
12
|
+
* unreadable rather than guessed.
|
|
13
|
+
*
|
|
14
|
+
* Sources, first match wins:
|
|
15
|
+
* - vitest.config.* / vite.config.* `coverage: { include, exclude }`
|
|
16
|
+
* - jest.config.* / package.json "jest" `collectCoverageFrom` (`!` = exclude),
|
|
17
|
+
* `coveragePathIgnorePatterns` (regular expressions)
|
|
18
|
+
* - .nycrc / .nycrc.json / package.json "nyc", .c8rc / .c8rc.json /
|
|
19
|
+
* package.json "c8" `include`, `exclude`
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'fs';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import { readConfinedTextSync } from '../../shared/io/confined-read.js';
|
|
24
|
+
const JS_EXTS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
|
|
25
|
+
const VITEST_CONFIGS = [...JS_EXTS.map(e => `vitest.config.${e}`), ...JS_EXTS.map(e => `vite.config.${e}`)];
|
|
26
|
+
const JEST_CONFIGS = [...JS_EXTS.map(e => `jest.config.${e}`), 'jest.config.json'];
|
|
27
|
+
const NYC_CONFIGS = ['.nycrc', '.nycrc.json'];
|
|
28
|
+
const C8_CONFIGS = ['.c8rc', '.c8rc.json'];
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Glob matching (no glob library is a runtime dependency)
|
|
31
|
+
// ============================================================================
|
|
32
|
+
function escapeRe(s) {
|
|
33
|
+
return s.replace(/[.+^$()|[\]\\]/g, '\\$&');
|
|
34
|
+
}
|
|
35
|
+
/** Glob body → regex source: `**`, `*`, `?` and non-nested `{a,b}`. */
|
|
36
|
+
function globSource(glob) {
|
|
37
|
+
let re = '';
|
|
38
|
+
for (let i = 0; i < glob.length; i++) {
|
|
39
|
+
const c = glob[i];
|
|
40
|
+
if (c === '*' && glob[i + 1] === '*') {
|
|
41
|
+
if (glob[i + 2] === '/') {
|
|
42
|
+
re += '(?:.*/)?';
|
|
43
|
+
i += 2;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
re += '.*';
|
|
47
|
+
i += 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (c === '*') {
|
|
51
|
+
re += '[^/]*';
|
|
52
|
+
}
|
|
53
|
+
else if (c === '?') {
|
|
54
|
+
re += '[^/]';
|
|
55
|
+
}
|
|
56
|
+
else if (c === '{') {
|
|
57
|
+
const end = glob.indexOf('}', i);
|
|
58
|
+
if (end === -1) {
|
|
59
|
+
re += '\\{';
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
re += `(?:${glob.slice(i + 1, end).split(',').map(globSource).join('|')})`;
|
|
63
|
+
i = end;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
re += escapeRe(c);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return re;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A pattern matches a project-relative POSIX path, or any path under it when it
|
|
73
|
+
* names a directory (nyc/test-exclude treat `src` as `src/**`).
|
|
74
|
+
*/
|
|
75
|
+
export function globToRegExp(pattern) {
|
|
76
|
+
const body = pattern.replace(/^<rootDir>\//, '').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
77
|
+
return new RegExp(`^${globSource(body)}(?:/.*)?$`);
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Static extraction of literal arrays from config source
|
|
81
|
+
// ============================================================================
|
|
82
|
+
/** Remove comments, leaving string literals (which may contain `/*`) intact. */
|
|
83
|
+
function stripComments(src) {
|
|
84
|
+
let out = '';
|
|
85
|
+
for (let i = 0; i < src.length; i++) {
|
|
86
|
+
const c = src[i];
|
|
87
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
88
|
+
const start = i;
|
|
89
|
+
for (i++; i < src.length && src[i] !== c; i++)
|
|
90
|
+
if (src[i] === '\\')
|
|
91
|
+
i++;
|
|
92
|
+
out += src.slice(start, i + 1);
|
|
93
|
+
}
|
|
94
|
+
else if (c === '/' && src[i + 1] === '/') {
|
|
95
|
+
while (i < src.length && src[i] !== '\n')
|
|
96
|
+
i++;
|
|
97
|
+
out += '\n';
|
|
98
|
+
}
|
|
99
|
+
else if (c === '/' && src[i + 1] === '*') {
|
|
100
|
+
const end = src.indexOf('*/', i + 2);
|
|
101
|
+
i = end === -1 ? src.length : end + 1;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
out += c;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
/** Index just past the bracket matching the one at `open`, skipping strings. */
|
|
110
|
+
function matchingClose(src, open) {
|
|
111
|
+
const pairs = { '[': ']', '{': '}', '(': ')' };
|
|
112
|
+
const stack = [];
|
|
113
|
+
for (let i = open; i < src.length; i++) {
|
|
114
|
+
const c = src[i];
|
|
115
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
116
|
+
for (i++; i < src.length && src[i] !== c; i++)
|
|
117
|
+
if (src[i] === '\\')
|
|
118
|
+
i++;
|
|
119
|
+
}
|
|
120
|
+
else if (pairs[c]) {
|
|
121
|
+
stack.push(pairs[c]);
|
|
122
|
+
}
|
|
123
|
+
else if (c === stack[stack.length - 1]) {
|
|
124
|
+
stack.pop();
|
|
125
|
+
if (stack.length === 0)
|
|
126
|
+
return i + 1;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return -1;
|
|
130
|
+
}
|
|
131
|
+
/** Split a bracket body on top-level commas. */
|
|
132
|
+
function splitTopLevel(body) {
|
|
133
|
+
const parts = [];
|
|
134
|
+
let depth = 0;
|
|
135
|
+
let start = 0;
|
|
136
|
+
for (let i = 0; i < body.length; i++) {
|
|
137
|
+
const c = body[i];
|
|
138
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
139
|
+
for (i++; i < body.length && body[i] !== c; i++)
|
|
140
|
+
if (body[i] === '\\')
|
|
141
|
+
i++;
|
|
142
|
+
}
|
|
143
|
+
else if ('[{('.includes(c))
|
|
144
|
+
depth++;
|
|
145
|
+
else if (']})'.includes(c))
|
|
146
|
+
depth--;
|
|
147
|
+
else if (c === ',' && depth === 0) {
|
|
148
|
+
parts.push(body.slice(start, i));
|
|
149
|
+
start = i + 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
parts.push(body.slice(start));
|
|
153
|
+
return parts.map(p => p.trim()).filter(p => p.length > 0);
|
|
154
|
+
}
|
|
155
|
+
const STRING_LITERAL = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$|^`([^`$\\]*)`$/;
|
|
156
|
+
/**
|
|
157
|
+
* The value of `key:` in `src` as a literal string array. `undefined` when the
|
|
158
|
+
* key is absent, `null` when it is present but not a literal. A spread of the
|
|
159
|
+
* tool's own defaults (`...coverageConfigDefaults.exclude`) is skipped: those
|
|
160
|
+
* are tests and config files, which are never counted anyway.
|
|
161
|
+
*/
|
|
162
|
+
function literalArray(src, key) {
|
|
163
|
+
const m = new RegExp(`(?:^|[\\s,{])['"]?${key}['"]?\\s*:\\s*`).exec(src);
|
|
164
|
+
if (!m)
|
|
165
|
+
return undefined;
|
|
166
|
+
const at = m.index + m[0].length;
|
|
167
|
+
if (src[at] === "'" || src[at] === '"') {
|
|
168
|
+
const single = STRING_LITERAL.exec(src.slice(at, matchingStringEnd(src, at)));
|
|
169
|
+
return single ? [single[2] ?? single[3]] : null;
|
|
170
|
+
}
|
|
171
|
+
if (src[at] !== '[')
|
|
172
|
+
return null;
|
|
173
|
+
const end = matchingClose(src, at);
|
|
174
|
+
if (end === -1)
|
|
175
|
+
return null;
|
|
176
|
+
const values = [];
|
|
177
|
+
for (const el of splitTopLevel(src.slice(at + 1, end - 1))) {
|
|
178
|
+
if (/^\.\.\.[\w$.]*defaults?\b/i.test(el))
|
|
179
|
+
continue;
|
|
180
|
+
const lit = STRING_LITERAL.exec(el);
|
|
181
|
+
if (!lit)
|
|
182
|
+
return null;
|
|
183
|
+
values.push(lit[2] ?? lit[3]);
|
|
184
|
+
}
|
|
185
|
+
return values;
|
|
186
|
+
}
|
|
187
|
+
function matchingStringEnd(src, at) {
|
|
188
|
+
let i = at + 1;
|
|
189
|
+
for (; i < src.length && src[i] !== src[at]; i++)
|
|
190
|
+
if (src[i] === '\\')
|
|
191
|
+
i++;
|
|
192
|
+
return i + 1;
|
|
193
|
+
}
|
|
194
|
+
// ============================================================================
|
|
195
|
+
// Readers
|
|
196
|
+
// ============================================================================
|
|
197
|
+
function readText(file) {
|
|
198
|
+
try {
|
|
199
|
+
return readConfinedTextSync(file, { outsideRoot: 'allow' });
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function readJson(file) {
|
|
206
|
+
const text = readText(file);
|
|
207
|
+
if (text === null)
|
|
208
|
+
return null;
|
|
209
|
+
try {
|
|
210
|
+
const parsed = JSON.parse(text);
|
|
211
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : null;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const strings = (v) => v === undefined ? undefined
|
|
218
|
+
: typeof v === 'string' ? [v]
|
|
219
|
+
: Array.isArray(v) && v.every(e => typeof e === 'string') ? v : null;
|
|
220
|
+
function scope(source, parts) {
|
|
221
|
+
const readable = [parts.include, parts.exclude, parts.collectFrom, parts.ignore].every(p => p !== null);
|
|
222
|
+
const collect = parts.collectFrom ?? [];
|
|
223
|
+
const ignorePatterns = [];
|
|
224
|
+
for (const p of parts.ignore ?? []) {
|
|
225
|
+
try {
|
|
226
|
+
ignorePatterns.push(new RegExp(p));
|
|
227
|
+
}
|
|
228
|
+
catch { /* jest would reject it too */ }
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
source, readable, ignorePatterns,
|
|
232
|
+
include: [...(parts.include ?? []), ...collect.filter(g => !g.startsWith('!'))],
|
|
233
|
+
exclude: [...(parts.exclude ?? []), ...collect.filter(g => g.startsWith('!')).map(g => g.slice(1))],
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function fromVitest(name, text) {
|
|
237
|
+
const src = stripComments(text);
|
|
238
|
+
const m = /(?:^|[\s,{])['"]?coverage['"]?\s*(?::\s*|(?=[,}]))/.exec(src);
|
|
239
|
+
if (!m)
|
|
240
|
+
return null;
|
|
241
|
+
const at = m.index + m[0].length;
|
|
242
|
+
// `coverage,` shorthand or `coverage: options`: declared, not readable.
|
|
243
|
+
if (!m[0].includes(':') || src[at] !== '{')
|
|
244
|
+
return scope(name, { include: null });
|
|
245
|
+
const end = matchingClose(src, at);
|
|
246
|
+
const block = end === -1 ? '' : src.slice(at, end);
|
|
247
|
+
return scope(name, { include: literalArray(block, 'include'), exclude: literalArray(block, 'exclude') });
|
|
248
|
+
}
|
|
249
|
+
function fromJestText(name, text) {
|
|
250
|
+
const src = stripComments(text);
|
|
251
|
+
const collectFrom = literalArray(src, 'collectCoverageFrom');
|
|
252
|
+
const ignore = literalArray(src, 'coveragePathIgnorePatterns');
|
|
253
|
+
if (collectFrom === undefined && ignore === undefined)
|
|
254
|
+
return null;
|
|
255
|
+
return scope(name, { collectFrom, ignore });
|
|
256
|
+
}
|
|
257
|
+
function fromJsonKeys(name, obj) {
|
|
258
|
+
if (!obj || typeof obj !== 'object')
|
|
259
|
+
return null;
|
|
260
|
+
if ('collectCoverageFrom' in obj || 'coveragePathIgnorePatterns' in obj) {
|
|
261
|
+
return scope(name, { collectFrom: strings(obj.collectCoverageFrom), ignore: strings(obj.coveragePathIgnorePatterns) });
|
|
262
|
+
}
|
|
263
|
+
if ('include' in obj || 'exclude' in obj) {
|
|
264
|
+
return scope(name, { include: strings(obj.include), exclude: strings(obj.exclude) });
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
/** The coverage scope configured for the project at `projectRoot`; `null` when none is configured. */
|
|
269
|
+
export function readCoverageScope(projectRoot) {
|
|
270
|
+
for (const name of VITEST_CONFIGS) {
|
|
271
|
+
const text = readText(path.join(projectRoot, name));
|
|
272
|
+
if (text !== null) {
|
|
273
|
+
const found = fromVitest(name, text);
|
|
274
|
+
if (found)
|
|
275
|
+
return found;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
for (const name of JEST_CONFIGS) {
|
|
279
|
+
const file = path.join(projectRoot, name);
|
|
280
|
+
if (!fs.existsSync(file))
|
|
281
|
+
continue;
|
|
282
|
+
const found = name.endsWith('.json')
|
|
283
|
+
? fromJsonKeys(name, readJson(file) ?? undefined)
|
|
284
|
+
: fromJestText(name, readText(file) ?? '');
|
|
285
|
+
if (found)
|
|
286
|
+
return found;
|
|
287
|
+
}
|
|
288
|
+
const pkg = readJson(path.join(projectRoot, 'package.json'));
|
|
289
|
+
const fromPkg = fromJsonKeys('package.json "jest"', pkg?.jest);
|
|
290
|
+
if (fromPkg)
|
|
291
|
+
return fromPkg;
|
|
292
|
+
for (const [names, key] of [[NYC_CONFIGS, 'nyc'], [C8_CONFIGS, 'c8']]) {
|
|
293
|
+
for (const name of names) {
|
|
294
|
+
const obj = readJson(path.join(projectRoot, name));
|
|
295
|
+
const found = fromJsonKeys(name, obj ?? undefined);
|
|
296
|
+
if (found)
|
|
297
|
+
return found;
|
|
298
|
+
// A config that exists but is not JSON (e.g. YAML) cannot be read.
|
|
299
|
+
if (!obj && fs.existsSync(path.join(projectRoot, name)))
|
|
300
|
+
return scope(name, { include: null });
|
|
301
|
+
}
|
|
302
|
+
const found = fromJsonKeys(`package.json "${key}"`, pkg?.[key]);
|
|
303
|
+
if (found)
|
|
304
|
+
return found;
|
|
305
|
+
}
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
/** Is `file` inside the configured coverage scope? Everything is, with no scope. */
|
|
309
|
+
export function inCoverageScope(scope, file, projectRoot) {
|
|
310
|
+
if (!scope)
|
|
311
|
+
return true;
|
|
312
|
+
const rel = path.relative(projectRoot, file).split(path.sep).join('/');
|
|
313
|
+
if (scope.include.length > 0 && !scope.include.some(g => globToRegExp(g).test(rel)))
|
|
314
|
+
return false;
|
|
315
|
+
if (scope.exclude.some(g => globToRegExp(g).test(rel)))
|
|
316
|
+
return false;
|
|
317
|
+
const posixAbs = file.split(path.sep).join('/');
|
|
318
|
+
const rootPosix = projectRoot.split(path.sep).join('/');
|
|
319
|
+
return !scope.ignorePatterns.some(re => re.test(posixAbs) || re.test(posixAbs.replace(rootPosix, '<rootDir>')));
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=coverage-scope.js.map
|