agentic-qe 3.15.5 → 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 +121 -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/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-CCTTGCQS.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
- package/dist/cli/chunks/{agent-handler-DHYUF3NX.js → agent-handler-KAMYBU3S.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-642W7CYX.js → agent-memory-branch-2CAW3KUM.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
- package/dist/cli/chunks/{arena-NW2JVAFY.js → arena-4OFLJ3R2.js} +2 -2
- package/dist/cli/chunks/{arena-MUCC7UUN.js → arena-QCCVIOAH.js} +4 -4
- package/dist/cli/chunks/{audit-VKQTZJAA.js → audit-RBDQJQJB.js} +3 -3
- package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-7ZUFVWLQ.js → better-sqlite3-5JRACCDQ.js} +2 -2
- package/dist/cli/chunks/{brain-handler-7LKAWSBI.js → brain-handler-W4QIIRT4.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-HUNXJKM4.js → branch-enumerator-IBNGI572.js} +2 -2
- package/dist/cli/chunks/{browser-ZSZEYUDP.js → browser-GMSCVAOI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
- package/dist/cli/chunks/{chunk-RUSLEOMC.js → chunk-22OZIJAD.js} +2 -2
- package/dist/cli/chunks/{chunk-WR64BKUE.js → chunk-24ZSGYC6.js} +1 -1
- package/dist/cli/chunks/{chunk-CR2JUANW.js → chunk-2CIDFR2H.js} +3 -3
- package/dist/cli/chunks/{chunk-SDWMLT7B.js → chunk-2IWPJUVV.js} +5 -5
- package/dist/cli/chunks/{chunk-VYDNLQJN.js → chunk-2ZTWPMTK.js} +2 -2
- package/dist/cli/chunks/{chunk-WN55MNZ2.js → chunk-34MDMFET.js} +2 -2
- package/dist/cli/chunks/{chunk-D3G2NN7F.js → chunk-3DJNKNBR.js} +66 -65
- package/dist/cli/chunks/{chunk-XQRE2HWM.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-MNQ36MAF.js → chunk-47Q7JL3V.js} +2 -2
- package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
- package/dist/cli/chunks/{chunk-ORTBRO7F.js → chunk-4KOVHQXK.js} +2 -2
- package/dist/cli/chunks/{chunk-B2UHTA4Q.js → chunk-4POOJYXA.js} +1 -1
- package/dist/cli/chunks/{chunk-QXY3IRBW.js → chunk-5DH5QI7G.js} +26 -26
- package/dist/cli/chunks/{chunk-7BIYJRQJ.js → chunk-5GIJU2ZY.js} +2 -2
- package/dist/cli/chunks/{chunk-6LG5UEQE.js → chunk-5HAPS6VD.js} +2 -2
- package/dist/cli/chunks/{chunk-OU4ZAWCC.js → chunk-5LST62QR.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2E3IJ53.js → chunk-5MT7DMD7.js} +2 -2
- package/dist/cli/chunks/{chunk-6UYN5PHA.js → chunk-5NC7QEJ6.js} +4 -4
- package/dist/cli/chunks/{chunk-3DTEQHFB.js → chunk-5UPIL62W.js} +3 -3
- package/dist/cli/chunks/{chunk-YINFES3E.js → chunk-5VUIXDY2.js} +2 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
- package/dist/cli/chunks/{chunk-JCC7QEKZ.js → chunk-624QRKQX.js} +1 -1
- package/dist/cli/chunks/{chunk-HIUNCO2W.js → chunk-66NW3ZB4.js} +2 -2
- package/dist/cli/chunks/{chunk-4AZP7ZCW.js → chunk-6HWARQWV.js} +2 -2
- package/dist/cli/chunks/{chunk-LNO5IWGH.js → chunk-6MXAJBEA.js} +1 -1
- package/dist/cli/chunks/{chunk-XNEEYXR2.js → chunk-6R3FBFCJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZT3GUYM5.js → chunk-6RDVY26I.js} +2 -2
- package/dist/cli/chunks/{chunk-W3ZGNNDV.js → chunk-6T6AHVLF.js} +1 -1
- package/dist/cli/chunks/{chunk-JANLATHN.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-HLFDC4SF.js → chunk-7SAMMQVS.js} +1 -1
- package/dist/cli/chunks/{chunk-644DFAGS.js → chunk-7TJZDRDU.js} +1 -1
- package/dist/cli/chunks/{chunk-BYXNHGQC.js → chunk-7TVIX4WL.js} +2 -2
- package/dist/cli/chunks/{chunk-FBEXG4HD.js → chunk-7VTKR44N.js} +2 -2
- package/dist/cli/chunks/{chunk-UE22ODHN.js → chunk-7XTANLTN.js} +1 -1
- package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
- package/dist/cli/chunks/{chunk-HPLMX62I.js → chunk-A74J23QB.js} +2 -2
- package/dist/cli/chunks/{chunk-VRJPH3LG.js → chunk-A7ANPS4E.js} +2 -2
- package/dist/cli/chunks/{chunk-IHFUEPZH.js → chunk-AJT3XDRD.js} +2 -2
- package/dist/cli/chunks/{chunk-EUEHBERE.js → chunk-ALCIUWFC.js} +1 -1
- package/dist/cli/chunks/{chunk-NMJVG22Z.js → chunk-AUN4FG7V.js} +1 -1
- package/dist/cli/chunks/{chunk-DWZI3IVB.js → chunk-AUOSHM63.js} +2 -2
- package/dist/cli/chunks/{chunk-7EZLOC4K.js → chunk-AX26QJ6T.js} +2 -2
- package/dist/cli/chunks/{chunk-PDPEMBFV.js → chunk-B7RHBKHL.js} +2 -2
- package/dist/cli/chunks/{chunk-DEGWCUMY.js → chunk-BAYGQRNP.js} +2 -2
- package/dist/cli/chunks/{chunk-ONCH5AXU.js → chunk-BIXRTOH3.js} +18 -18
- package/dist/cli/chunks/{chunk-U4TV75AC.js → chunk-BO7UFNYV.js} +2 -2
- package/dist/cli/chunks/{chunk-FNAYDITO.js → chunk-BUTGIVKW.js} +1 -1
- package/dist/cli/chunks/{chunk-HBYQYGXP.js → chunk-BXATKI5S.js} +2 -2
- package/dist/cli/chunks/{chunk-BO4PKNYP.js → chunk-CCL436IU.js} +32 -27
- package/dist/cli/chunks/{chunk-XIE7OHML.js → chunk-CEXNW5TR.js} +1 -1
- package/dist/cli/chunks/{chunk-663ZFPUL.js → chunk-CLAMMGY3.js} +2 -2
- package/dist/cli/chunks/{chunk-PVAE65B4.js → chunk-CR66HNAE.js} +1 -1
- package/dist/cli/chunks/{chunk-LRASYSGV.js → chunk-CZBIREL5.js} +2 -2
- package/dist/cli/chunks/{chunk-WLIYWBQR.js → chunk-D5N2O5EH.js} +2 -2
- package/dist/cli/chunks/{chunk-A337MD3C.js → chunk-DA7DGDTI.js} +2 -2
- package/dist/cli/chunks/{chunk-WC47GICZ.js → chunk-DLSFT6PO.js} +2 -2
- package/dist/cli/chunks/{chunk-KHCALIFP.js → chunk-DQNUPEY5.js} +2 -2
- package/dist/cli/chunks/{chunk-GTSOFCMQ.js → chunk-EECF4CMA.js} +1 -1
- package/dist/cli/chunks/{chunk-5BOZCMXZ.js → chunk-EF5UHDCG.js} +1 -1
- package/dist/cli/chunks/{chunk-L6SVCNXK.js → chunk-EJ4KZFZN.js} +1 -1
- package/dist/cli/chunks/{chunk-CFPR24YK.js → chunk-ELI4GDQO.js} +2 -2
- package/dist/cli/chunks/{chunk-KJ3KBP24.js → chunk-F3KS3TAB.js} +2 -2
- package/dist/cli/chunks/{chunk-RMJ7PJOS.js → chunk-F7A2UBZO.js} +2 -2
- package/dist/cli/chunks/{chunk-U6OVPMQX.js → chunk-FOJRPEIP.js} +2 -2
- package/dist/cli/chunks/{chunk-JYY7AYGA.js → chunk-FQ5N666N.js} +1 -1
- package/dist/cli/chunks/{chunk-4XSCZVON.js → chunk-FU7LNUD7.js} +2 -2
- package/dist/cli/chunks/{chunk-OW42F2TX.js → chunk-GFB6BZWU.js} +2 -2
- package/dist/cli/chunks/{chunk-JI77KJP7.js → chunk-GI5HWS4H.js} +1 -1
- package/dist/cli/chunks/{chunk-4UXPDV7E.js → chunk-GNYOHZVV.js} +1 -1
- package/dist/cli/chunks/{chunk-VCKDVOPD.js → chunk-GVRFSXY6.js} +2 -2
- package/dist/cli/chunks/{chunk-PURHGLEC.js → chunk-GWM4M5NF.js} +1 -1
- package/dist/cli/chunks/{chunk-BY646JOM.js → chunk-HAN4MS5T.js} +2 -2
- package/dist/cli/chunks/{chunk-OGYWWZU7.js → chunk-HEGGV2PT.js} +2 -2
- package/dist/cli/chunks/{chunk-FHUJCVT3.js → chunk-HOEWMEF2.js} +2 -2
- package/dist/cli/chunks/{chunk-CXOXUBYU.js → chunk-HZFK2Z2Z.js} +1 -1
- package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
- package/dist/cli/chunks/{chunk-E4VIVMDL.js → chunk-IEPWO4XP.js} +2 -2
- package/dist/cli/chunks/{chunk-DTJODGCE.js → chunk-ITIJ23K2.js} +2 -2
- package/dist/cli/chunks/{chunk-AQN5EDBM.js → chunk-IVJIHZSM.js} +1 -1
- package/dist/cli/chunks/{chunk-PHP4UJYP.js → chunk-JAPBSSFY.js} +1 -1
- package/dist/cli/chunks/{chunk-A2WOQO2N.js → chunk-JCE76MPP.js} +2 -2
- package/dist/cli/chunks/{chunk-A5J4XJS6.js → chunk-JPJEAK4G.js} +1 -1
- package/dist/cli/chunks/{chunk-3OAQPN2N.js → chunk-JYKQVYX2.js} +2 -2
- package/dist/cli/chunks/{chunk-MQGEZA2A.js → chunk-K55EAWZ5.js} +2 -2
- package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
- package/dist/cli/chunks/{chunk-L375O3CZ.js → chunk-KIDOBLUO.js} +2 -2
- package/dist/cli/chunks/{chunk-NLDFNAOS.js → chunk-KYVIOC3C.js} +2 -2
- package/dist/cli/chunks/{chunk-CQMHDAJS.js → chunk-L2TDHJR3.js} +2 -2
- package/dist/cli/chunks/{chunk-FE3AIZI6.js → chunk-L4D3TPFP.js} +1 -1
- package/dist/cli/chunks/{chunk-VLOIEVER.js → chunk-LAY7NCQK.js} +3 -3
- package/dist/cli/chunks/{chunk-WT3JC4A6.js → chunk-LCCTJ2PC.js} +2 -2
- package/dist/cli/chunks/{chunk-VML4SG3X.js → chunk-LJCEDTUM.js} +3 -3
- package/dist/cli/chunks/{chunk-NF6AFIAX.js → chunk-LMAEMVPA.js} +1 -1
- package/dist/cli/chunks/{chunk-2XYTS2WY.js → chunk-LZWJ5BMP.js} +2 -2
- package/dist/cli/chunks/{chunk-PHAQWAEV.js → chunk-MP3FSUNB.js} +2 -2
- package/dist/cli/chunks/{chunk-IJ2EXSMO.js → chunk-MQCTLTGE.js} +2 -2
- package/dist/cli/chunks/{chunk-GRIPCYW5.js → chunk-MQTA6KIO.js} +1 -1
- package/dist/cli/chunks/{chunk-GGDKOJVF.js → chunk-NBUXM5X6.js} +10 -6
- package/dist/cli/chunks/{chunk-DPYDUKVZ.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-AUZXRFOX.js → chunk-ONPPBLRB.js} +2 -2
- package/dist/cli/chunks/{chunk-HGBJ2QQ4.js → chunk-OPDZBRIL.js} +2 -2
- package/dist/cli/chunks/{chunk-DXVZBJE4.js → chunk-OQ4S6B7P.js} +1 -1
- package/dist/cli/chunks/{chunk-Y2WMPEUP.js → chunk-ORBODZSO.js} +2 -2
- package/dist/cli/chunks/{chunk-IJOFZBXD.js → chunk-ORFL3YXB.js} +2 -2
- package/dist/cli/chunks/{chunk-BMWAWZAN.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-DPV33C77.js → chunk-Q2RBOC7V.js} +2 -2
- package/dist/cli/chunks/{chunk-3AYYGR6W.js → chunk-QLKUCMZC.js} +1 -1
- package/dist/cli/chunks/{chunk-EVCFUYYK.js → chunk-QLYO3H7E.js} +9 -9
- package/dist/cli/chunks/{chunk-3SH23PS3.js → chunk-QS5KZYUZ.js} +2 -2
- package/dist/cli/chunks/{chunk-3YNP33GB.js → chunk-R363XXGH.js} +2 -2
- package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
- package/dist/cli/chunks/{chunk-MS3Z2CP5.js → chunk-RFDFET3O.js} +2 -2
- package/dist/cli/chunks/{chunk-ZLBBX24Q.js → chunk-RHIQ6QO5.js} +357 -351
- package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
- package/dist/cli/chunks/{chunk-3YASZPLO.js → chunk-RUTO67PT.js} +2 -2
- package/dist/cli/chunks/{chunk-V7GNUVYI.js → chunk-RV6HSMKJ.js} +1 -1
- package/dist/cli/chunks/{chunk-4PT5KNXL.js → chunk-SOSJWM3E.js} +4 -4
- package/dist/cli/chunks/{chunk-6ZIDZ4TJ.js → chunk-SV5BUYHH.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTC5FBL6.js → chunk-TL5GV3PR.js} +8 -8
- package/dist/cli/chunks/{chunk-GKPRECLL.js → chunk-TLUIO37P.js} +2 -2
- package/dist/cli/chunks/{chunk-FWYJ6UDX.js → chunk-TUDENMAE.js} +2 -2
- package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
- package/dist/cli/chunks/{chunk-3QD7U3FY.js → chunk-UB6DQGWM.js} +2 -2
- package/dist/cli/chunks/{chunk-SAPIRK2G.js → chunk-UHHMAKPE.js} +1 -1
- package/dist/cli/chunks/{chunk-35MDATQE.js → chunk-ULCHPPW2.js} +1 -1
- package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
- package/dist/cli/chunks/{chunk-UXZEVIFX.js → chunk-VAYZ5QIE.js} +1 -1
- package/dist/cli/chunks/{chunk-VH3EB6ZG.js → chunk-VCONCVSY.js} +3 -3
- package/dist/cli/chunks/{chunk-QPV3OKX2.js → chunk-VVF337SV.js} +2 -2
- package/dist/cli/chunks/{chunk-XNHB6TLC.js → chunk-WKDWRRDT.js} +2 -2
- package/dist/cli/chunks/{chunk-RUJLVJDE.js → chunk-X2DR27AY.js} +2 -2
- package/dist/cli/chunks/{chunk-47GEI2LT.js → chunk-X33F7NXH.js} +3 -3
- package/dist/cli/chunks/{chunk-MB4VFAJC.js → chunk-XBEI2JBA.js} +2 -2
- package/dist/cli/chunks/{chunk-OQDC7GCM.js → chunk-XBFQJZWX.js} +2 -2
- package/dist/cli/chunks/{chunk-EAYQCBXL.js → chunk-XFPQIWEH.js} +3 -3
- package/dist/cli/chunks/{chunk-2KWI3MT3.js → chunk-XPB5BVU6.js} +2 -2
- package/dist/cli/chunks/{chunk-DL5JENWD.js → chunk-XQ53PZEF.js} +3 -3
- package/dist/cli/chunks/{chunk-BZFT4QDQ.js → chunk-XZ46CI35.js} +2 -2
- package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
- package/dist/cli/chunks/{chunk-EOR3RECZ.js → chunk-YNG7E26C.js} +2 -2
- package/dist/cli/chunks/{chunk-6JFGB2JB.js → chunk-YXU35GGD.js} +1 -1
- package/dist/cli/chunks/{chunk-JNMUVBAJ.js → chunk-ZCP4P6O2.js} +2 -2
- package/dist/cli/chunks/{chunk-Y7GPLOXB.js → chunk-ZL5LJT7D.js} +2 -2
- package/dist/cli/chunks/{chunk-PCCIZFD7.js → chunk-ZOUEQ6DL.js} +1 -1
- package/dist/cli/chunks/{chunk-FQKEZVN6.js → chunk-ZSBD4FUX.js} +2 -2
- package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
- package/dist/cli/chunks/{chunk-X52TMBHU.js → chunk-ZUTFHGEO.js} +1 -1
- package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
- package/dist/cli/chunks/{ci-config-XDDZOOEI.js → ci-config-2ZVV4OXL.js} +2 -2
- package/dist/cli/chunks/{ci-output-7ZUQI4U6.js → ci-output-E45OGVPR.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ALXKCFAL.js → circuit-breaker-X73ITYZC.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-RL7K2NI2.js → claude-flow-setup-W4PPH46C.js} +2 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
- package/dist/cli/chunks/{cline-installer-2Z2QQKC3.js → cline-installer-NUEPMWDE.js} +2 -2
- package/dist/cli/chunks/{code-QSZTDINQ.js → code-6WQHBS7G.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-5CGR5D3Y.js → code-index-extractor-BXQIFIFT.js} +2 -2
- package/dist/cli/chunks/{codex-installer-7JLSEDE5.js → codex-installer-Z337R2KH.js} +2 -2
- package/dist/cli/chunks/{completions-U4NBSXEB.js → completions-F5DMYFHV.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-WYZD2YSY.js → complexity-analyzer-W2SYPZDI.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-UPXINJFT.js → continuedev-installer-ZCHUIFTN.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-WIVYQRIF.js → copilot-installer-M5JNODXF.js} +2 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
- package/dist/cli/chunks/{cost-tracker-RIN4JDDM.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-POM7NGCC.js → cursor-installer-XPUA73UW.js} +2 -2
- package/dist/cli/chunks/{daemon-HFGKQ6LB.js → daemon-ITKDIYMW.js} +5 -5
- package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
- package/dist/cli/chunks/{dag-attention-scheduler-HJXM7Q5P.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
- package/dist/cli/chunks/{detect-XKQGLZYN.js → detect-DR7J6K4O.js} +2 -2
- package/dist/cli/chunks/{dist-node-SSKB53QL.js → dist-node-LAJJBOUT.js} +2 -2
- package/dist/cli/chunks/{domain-handler-6BNDHATU.js → domain-handler-OMSHCRMK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-DOX54YE3.js → domain-plugins-EQXSKC5K.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FW4ZX3Z7.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-K7E4XXBS.js → eval-JSNNASBW.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
- package/dist/cli/chunks/{fast-paths-5JXXTYAG.js → fast-paths-YNMIBS2E.js} +2 -2
- package/dist/cli/chunks/{feature-flags-2CR3CO23.js → feature-flags-SRLXDKBI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-RB72LHOJ.js → feature-flags-VIR7O4L7.js} +2 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
- package/dist/cli/chunks/{fleet-SDU7QEOA.js → fleet-K2ED46EL.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-AWCFODUV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-A4PJ3NFP.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-KRS7SSFM.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-OGGCPKPO.js → hnswlib-node-SE3MJJYS.js} +2 -2
- package/dist/cli/chunks/{hooks-XNRNMUBW.js → hooks-C572SRDH.js} +43 -43
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-X35LTXYT.js → hypergraph-engine-35A6G3M5.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-M6THKAG6.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-TEPR2ZJD.js → kilocode-installer-32PX5YH7.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-RUKHGDEE.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-7GECMDCP.js → llm-router-XRKTTJTX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
- package/dist/cli/chunks/{load-NTJ4Y4ZR.js → load-XVH6HW7E.js} +2 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
- package/dist/cli/chunks/{mcp-4335GTTG.js → mcp-IULSTM4Z.js} +2 -2
- package/dist/cli/chunks/{memory-HYC4M4XS.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-T7FYKM6T.js → multi-model-executor-VZDUYPLX.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-3USXVT5M.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-CMZLPX2K.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
- package/dist/cli/chunks/{pipeline-BTRZOVSL.js → pipeline-O562GTOG.js} +2 -2
- package/dist/cli/chunks/{platform-2MCRKC25.js → platform-PM7Q2AZS.js} +2 -2
- package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-TXFEMBP6.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-DZ26OYVZ.js → protocol-handler-PPGNSAOS.js} +2 -2
- package/dist/cli/chunks/{prove-QWONEJWX.js → prove-WQ3BKRZG.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
- package/dist/cli/chunks/{quality-WFH54FY7.js → quality-C5WUU3AA.js} +2 -2
- package/dist/cli/chunks/{quality-gate-ONJB7XU7.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-HW5Y55ZC.js → ref-validation-DHKHXVZT.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-5OABDNZT.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-CVHVOQTC.js → routing-handler-JNXTGT6T.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-KKDKFGIQ.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-UGUXKIFX.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-7723AZZ4.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-ZSHYG5IA.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-MHZEEYMK.js → standalone-memory-46KKBSSV.js} +2 -2
- package/dist/cli/chunks/{status-handler-JKXPJ22K.js → status-handler-35T5FTDQ.js} +2 -2
- package/dist/cli/chunks/{structural-health-J4RKCYWF.js → structural-health-P7QPQWLO.js} +2 -2
- package/dist/cli/chunks/{sync-PDPORHVN.js → sync-W6Z4R4PL.js} +2 -2
- package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
- package/dist/cli/chunks/{task-handler-VERADM44.js → task-handler-5CX3ZYT7.js} +2 -2
- package/dist/cli/chunks/{task-handlers-4RUCWUR2.js → task-handlers-DQZGOJNE.js} +3 -3
- package/dist/cli/chunks/{test-DMBJFQNL.js → test-TPP53VVV.js} +12 -12
- package/dist/cli/chunks/{test-scheduling-LUPTVGCD.js → test-scheduling-WBV4UMQH.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
- package/dist/cli/chunks/{token-usage-VOA34IKM.js → token-usage-AKK37RB7.js} +2 -2
- package/dist/cli/chunks/{transformers-GU4TYAN5.js → transformers-7MASPELS.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-MZPXAH7C.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
- package/dist/cli/chunks/{types-K4FLXR2K.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-M3ATDRMK.js → upgrade-L7OTDKEK.js} +2 -2
- package/dist/cli/chunks/{validate-AAP773B3.js → validate-O3QVFIGP.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-7RGAZX5F.js → validate-swarm-2UGBGLTX.js} +2 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-GQMRHGGI.js → web-tree-sitter-J75IYPRO.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-HG6HF2GF.js → windsurf-installer-FQ5DBFCG.js} +2 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
- package/dist/cli/chunks/{witness-chain-WKU3ZIBQ.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-Q2KW3QEQ.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
- package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
- package/dist/cli/chunks/{workflow-CX6SHFBW.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 +47 -25
- package/dist/cli/commands/coverage.d.ts +1 -28
- package/dist/cli/commands/coverage.js +63 -134
- 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/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 +8 -1
- package/dist/cli/utils/ci-output.js +13 -2
- package/dist/cli/utils/coverage-data.d.ts +3 -0
- package/dist/cli/utils/coverage-data.js +14 -39
- 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/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 +34 -6
- package/dist/coordination/handlers/coverage-runner.d.ts +22 -0
- package/dist/coordination/handlers/coverage-runner.js +105 -10
- package/dist/coordination/handlers/coverage-target.d.ts +1 -0
- package/dist/coordination/handlers/coverage-target.js +4 -1
- package/dist/coordination/handlers/handler-types.d.ts +9 -0
- package/dist/coordination/handlers/handler-utils.d.ts +14 -1
- package/dist/coordination/handlers/handler-utils.js +46 -22
- package/dist/coordination/handlers/quality-handlers.js +108 -18
- 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 +113 -43
- package/dist/coordination/task-executor.d.ts +7 -0
- package/dist/coordination/task-executor.js +32 -3
- package/dist/domains/code-intelligence/plugin.js +4 -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 +18 -6
- package/dist/domains/coverage-analysis/interfaces.d.ts +44 -0
- package/dist/domains/coverage-analysis/interfaces.js +6 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +61 -34
- 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-rl-integration.d.ts +14 -0
- package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
- package/dist/domains/quality-assessment/coordinator.js +10 -6
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +32 -8
- package/dist/domains/quality-assessment/coverage-report-event.js +28 -6
- package/dist/domains/quality-assessment/index.d.ts +1 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +48 -2
- package/dist/domains/quality-assessment/quality-evidence.js +62 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
- package/dist/domains/quality-assessment/services/quality-analyzer.js +192 -109
- 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 +516 -504
- package/dist/mcp/handlers/domain-handler-configs.d.ts +31 -1
- package/dist/mcp/handlers/domain-handler-configs.js +37 -3
- package/dist/mcp/handlers/handler-factory.js +40 -14
- package/dist/mcp/protocol-server.js +27 -2
- 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/types.d.ts +4 -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 +18 -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-EGIPTX5H.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-WP4GCBDT.js +0 -2
- package/dist/cli/chunks/base-6ORFD62I.js +0 -2
- package/dist/cli/chunks/browser-workflow-PIXGERWP.js +0 -2
- package/dist/cli/chunks/chunk-2WFTZSRT.js +0 -2
- package/dist/cli/chunks/chunk-7YB2KELI.js +0 -5
- package/dist/cli/chunks/chunk-BBL6YXD3.js +0 -2
- package/dist/cli/chunks/chunk-BJ5P4IV2.js +0 -2
- package/dist/cli/chunks/chunk-DFPL5N3Q.js +0 -16
- package/dist/cli/chunks/chunk-DLY4YEN3.js +0 -2
- package/dist/cli/chunks/chunk-ERGWWI4Y.js +0 -3
- package/dist/cli/chunks/chunk-KZVJW2SD.js +0 -2
- package/dist/cli/chunks/chunk-L336HFFE.js +0 -2
- package/dist/cli/chunks/chunk-N2TJNIHA.js +0 -2
- package/dist/cli/chunks/chunk-RCXMUEZN.js +0 -3
- package/dist/cli/chunks/chunk-SEZLYRCS.js +0 -2
- package/dist/cli/chunks/chunk-TDLKXLJC.js +0 -4
- package/dist/cli/chunks/chunk-WOZIXXY5.js +0 -7
- package/dist/cli/chunks/ci-KP4GZKJ7.js +0 -81
- package/dist/cli/chunks/client-C3KHVRM6.js +0 -2
- package/dist/cli/chunks/core-handlers-KSQM6Q6S.js +0 -2
- package/dist/cli/chunks/coverage-SPFVHRRU.js +0 -43
- package/dist/cli/chunks/coverage-target-GSRBNHXE.js +0 -2
- package/dist/cli/chunks/cross-domain-router-CTGNOVCF.js +0 -2
- package/dist/cli/chunks/daemon-M5TD5Y6T.js +0 -10
- package/dist/cli/chunks/dream-MIK2E4UL.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-QST77T2B.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-X66IYSRV.js +0 -40
- package/dist/cli/chunks/file-discovery-3NHRUQQB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-OCKRACUW.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-X67XG73C.js +0 -2
- package/dist/cli/chunks/hnsw-index-I7KCQBQR.js +0 -2
- package/dist/cli/chunks/hybrid-backend-FOUHTKAK.js +0 -2
- package/dist/cli/chunks/impact-analyzer-GXYVX46O.js +0 -2
- package/dist/cli/chunks/init-handler-2AXMXHYF.js +0 -86
- package/dist/cli/chunks/init-wizard-C2MRX2QG.js +0 -2
- package/dist/cli/chunks/kernel-Q2IUDIDC.js +0 -2
- package/dist/cli/chunks/knowledge-graph-E2Z6K5EE.js +0 -2
- package/dist/cli/chunks/learning-BEA26RNA.js +0 -122
- package/dist/cli/chunks/llm-router-service-YATYFEDD.js +0 -2
- package/dist/cli/chunks/load-test-LV77JXWA.js +0 -2
- package/dist/cli/chunks/memory-backend-XME3X3QX.js +0 -2
- package/dist/cli/chunks/memory-handlers-VG47X5DX.js +0 -2
- package/dist/cli/chunks/orchestrator-VHUXUYIM.js +0 -452
- package/dist/cli/chunks/pattern-null-store-TAXMLENP.js +0 -2
- package/dist/cli/chunks/plugin-2VAYWAO3.js +0 -27
- package/dist/cli/chunks/project-root-CFFPBGPX.js +0 -2
- package/dist/cli/chunks/protocol-executor-ML76QAVQ.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-LUZH6RYV.js +0 -2
- package/dist/cli/chunks/queen-coordinator-EWXNIXB6.js +0 -2
- package/dist/cli/chunks/real-embeddings-GZV4VKK4.js +0 -2
- package/dist/cli/chunks/router-MXOBVEBF.js +0 -2
- package/dist/cli/chunks/routing-feedback-T6CCRUEK.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-WHXVT3V3.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-JFPWIRCG.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-D4KUBNRZ.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-KOXR7TJL.js +0 -2
- package/dist/cli/chunks/safe-db-CI6IPSIN.js +0 -2
- package/dist/cli/chunks/schedule-X4HW6TVJ.js +0 -2
- package/dist/cli/chunks/scheduler-KCNJ2ON3.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-KEQ5CLNI.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-PGHU6VUR.js +0 -2
- package/dist/cli/chunks/sync-EFWXMA2H.js +0 -2
- package/dist/cli/chunks/token-bootstrap-S346YBVO.js +0 -2
- package/dist/cli/chunks/unified-memory-6CK3TUNQ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-A7BWBGYN.js +0 -2
- package/dist/cli/chunks/unified-persistence-GEPMDBQZ.js +0 -2
- package/dist/cli/chunks/visual-security-L4J7LQWT.js +0 -2
- package/dist/cli/chunks/witness-chain-CDUMX623.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-WNYH6O4L.js +0 -2
- package/dist/cli/chunks/witness-key-manager-NQ5DAAC4.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-USJDWVDR.js +0 -2
- package/dist/cli/chunks/wrappers-CZDI6Z3X.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
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { spawnSync } from 'child_process';
|
|
15
15
|
import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
|
|
16
16
|
import { join, extname } from 'path';
|
|
17
|
+
import { AQE_CLAUDE_DIR, AQE_STATE_DIR, findAqeClaudeDirs } from '../../../../shared/aqe-managed-dirs.js';
|
|
17
18
|
import { DEFAULT_METRIC_CONFIG, } from './interfaces.js';
|
|
18
19
|
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
19
20
|
// ============================================================================
|
|
@@ -77,6 +78,43 @@ export function checkLOCTools() {
|
|
|
77
78
|
}
|
|
78
79
|
return tools;
|
|
79
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* cloc `--not-match-f` regex matching any of `names` exactly (basename), or
|
|
83
|
+
* null when there is nothing to exclude.
|
|
84
|
+
*/
|
|
85
|
+
export function excludedFileNamesRegex(names) {
|
|
86
|
+
if (!names || names.length === 0)
|
|
87
|
+
return null;
|
|
88
|
+
// Matches a bare name and, under cloc --fullpath, a full path ending in it
|
|
89
|
+
// (either separator, so Windows paths match too).
|
|
90
|
+
return `(^|[\\\\/])(${names.map(escapeRegex).join('|')})$`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* cloc `--not-match-d` regex (with --fullpath) matching the given
|
|
94
|
+
* project-relative directories ('/'-separated) and everything below them, but
|
|
95
|
+
* no other directory of the same name (#999 review N4 / round 2b). Either
|
|
96
|
+
* path separator matches. Null when there are none.
|
|
97
|
+
*/
|
|
98
|
+
export function rootAnchoredDirsRegex(projectPath, relDirs) {
|
|
99
|
+
if (!relDirs || relDirs.length === 0)
|
|
100
|
+
return null;
|
|
101
|
+
const SEP = '[\\\\/]';
|
|
102
|
+
const toPattern = (path) => path.split(/[\\/]+/).filter(Boolean).map(escapeRegex).join(SEP);
|
|
103
|
+
const root = toPattern(projectPath);
|
|
104
|
+
const rootPrefix = /^[\\/]/.test(projectPath) ? SEP : '';
|
|
105
|
+
return `^${rootPrefix}${root}${SEP}(${relDirs.map(toPattern).join('|')})(${SEP}|$)`;
|
|
106
|
+
}
|
|
107
|
+
/** Project-relative AQE-managed `.claude` dirs to exclude, if `.claude` is a root exclude. */
|
|
108
|
+
function aqeClaudeDirsToExclude(projectPath, config) {
|
|
109
|
+
const rootDirs = config.excludeRootDirs ?? [];
|
|
110
|
+
if (!rootDirs.includes(AQE_CLAUDE_DIR))
|
|
111
|
+
return rootDirs.filter((d) => existsSync(join(projectPath, d)));
|
|
112
|
+
const others = rootDirs.filter((d) => d !== AQE_CLAUDE_DIR && existsSync(join(projectPath, d)));
|
|
113
|
+
return [...findAqeClaudeDirs(projectPath, config.excludeDirs), ...others];
|
|
114
|
+
}
|
|
115
|
+
function escapeRegex(value) {
|
|
116
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
117
|
+
}
|
|
80
118
|
// ============================================================================
|
|
81
119
|
// Tool-Specific Implementations
|
|
82
120
|
// ============================================================================
|
|
@@ -85,7 +123,17 @@ export function checkLOCTools() {
|
|
|
85
123
|
*/
|
|
86
124
|
async function tryClocCount(projectPath, config) {
|
|
87
125
|
try {
|
|
88
|
-
const args = ['--json', `--exclude-dir=${config.excludeDirs.join(',')}
|
|
126
|
+
const args = ['--json', `--exclude-dir=${config.excludeDirs.join(',')}`];
|
|
127
|
+
const notMatchDir = rootAnchoredDirsRegex(projectPath, aqeClaudeDirsToExclude(projectPath, config));
|
|
128
|
+
// --fullpath makes --not-match-d/-f see full paths, so the AQE-managed
|
|
129
|
+
// .claude dirs (root, or next to a nested .agentic-qe) are excluded
|
|
130
|
+
// without dropping other same-named dirs (#999 review N4 / round 2b).
|
|
131
|
+
if (notMatchDir)
|
|
132
|
+
args.push('--fullpath', `--not-match-d=${notMatchDir}`);
|
|
133
|
+
const notMatch = excludedFileNamesRegex(config.excludeFiles);
|
|
134
|
+
if (notMatch)
|
|
135
|
+
args.push(`--not-match-f=${notMatch}`);
|
|
136
|
+
args.push(projectPath);
|
|
89
137
|
const result = spawnSync('cloc', args, {
|
|
90
138
|
encoding: 'utf-8',
|
|
91
139
|
timeout: config.timeout,
|
|
@@ -134,8 +182,19 @@ async function tryTokeiCount(projectPath, config) {
|
|
|
134
182
|
for (const dir of config.excludeDirs) {
|
|
135
183
|
args.push('-e', dir);
|
|
136
184
|
}
|
|
137
|
-
|
|
185
|
+
// #999: lockfiles are generated, not code (tokei -e takes gitignore-style names)
|
|
186
|
+
for (const file of config.excludeFiles ?? []) {
|
|
187
|
+
args.push('-e', file);
|
|
188
|
+
}
|
|
189
|
+
// A leading '/' anchors a tokei (gitignore-style) exclude at the directory
|
|
190
|
+
// tokei walks, so run it IN the project on '.' (round 2b: with an absolute
|
|
191
|
+
// path argument the anchored patterns matched nothing).
|
|
192
|
+
for (const rel of aqeClaudeDirsToExclude(projectPath, config)) {
|
|
193
|
+
args.push('-e', `/${rel}`);
|
|
194
|
+
}
|
|
195
|
+
args.push('.');
|
|
138
196
|
const result = spawnSync('tokei', args, {
|
|
197
|
+
cwd: projectPath,
|
|
139
198
|
encoding: 'utf-8',
|
|
140
199
|
timeout: config.timeout,
|
|
141
200
|
maxBuffer: 10 * 1024 * 1024, // 10MB buffer (reduced for memory safety)
|
|
@@ -237,6 +296,8 @@ function manualLOCCount(projectPath, config) {
|
|
|
237
296
|
const byLanguage = {};
|
|
238
297
|
let total = 0;
|
|
239
298
|
const excludeSet = new Set(config.excludeDirs);
|
|
299
|
+
const excludeFileSet = new Set(config.excludeFiles ?? []);
|
|
300
|
+
const rootExcludeSet = new Set(config.excludeRootDirs ?? []);
|
|
240
301
|
// Max file size to read (2MB) — skip minified bundles, generated files
|
|
241
302
|
const MAX_FILE_SIZE = 2 * 1024 * 1024;
|
|
242
303
|
function walkDirectory(dirPath, depth) {
|
|
@@ -255,12 +316,17 @@ function manualLOCCount(projectPath, config) {
|
|
|
255
316
|
const fullPath = join(dirPath, entry.name);
|
|
256
317
|
if (entry.isDirectory()) {
|
|
257
318
|
// Skip excluded directories (exact match or glob-like suffix match)
|
|
258
|
-
if (excludeSet.has(entry.name) || entry.name.startsWith('.')
|
|
319
|
+
if (excludeSet.has(entry.name) || entry.name.startsWith('.') ||
|
|
320
|
+
(rootExcludeSet.has(entry.name) &&
|
|
321
|
+
(dirPath === projectPath || existsSync(join(dirPath, AQE_STATE_DIR))))) {
|
|
259
322
|
continue;
|
|
260
323
|
}
|
|
261
324
|
walkDirectory(fullPath, depth + 1);
|
|
262
325
|
}
|
|
263
326
|
else if (entry.isFile()) {
|
|
327
|
+
// #999: skip lockfiles and other generated files by exact name
|
|
328
|
+
if (excludeFileSet.has(entry.name))
|
|
329
|
+
continue;
|
|
264
330
|
const ext = extname(entry.name);
|
|
265
331
|
const language = getLanguageForExtension(ext);
|
|
266
332
|
if (language) {
|
|
@@ -17,6 +17,7 @@ import { createRequire } from 'module';
|
|
|
17
17
|
import { existsSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync } from 'fs';
|
|
18
18
|
import { tmpdir } from 'os';
|
|
19
19
|
import { join, extname, resolve } from 'path';
|
|
20
|
+
import { AQE_STATE_DIR } from '../../../../shared/aqe-managed-dirs.js';
|
|
20
21
|
import { DEFAULT_METRIC_CONFIG, } from './interfaces.js';
|
|
21
22
|
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
22
23
|
import { ownListingProcess } from './listing-process-owner.js';
|
|
@@ -478,7 +479,9 @@ function countTestsByFilePattern(projectPath, config) {
|
|
|
478
479
|
const fullPath = join(dirPath, entry.name);
|
|
479
480
|
if (entry.isDirectory()) {
|
|
480
481
|
// Skip excluded directories
|
|
481
|
-
if (config.excludeDirs.includes(entry.name)
|
|
482
|
+
if (config.excludeDirs.includes(entry.name) ||
|
|
483
|
+
((config.excludeRootDirs ?? []).includes(entry.name) &&
|
|
484
|
+
(dirPath === projectPath || existsSync(join(dirPath, AQE_STATE_DIR))))) {
|
|
482
485
|
continue;
|
|
483
486
|
}
|
|
484
487
|
walkDirectory(fullPath);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which coverage metrics a report actually collected (#995, #1015, #1027).
|
|
3
|
+
*
|
|
4
|
+
* A metric with no data in the report (no branch entries, no functions, no
|
|
5
|
+
* statement detail — lcov and Cobertura carry none) is "not collected". Its
|
|
6
|
+
* summary figure is 0 by construction, and must be reported AND persisted as
|
|
7
|
+
* null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
|
|
8
|
+
*/
|
|
9
|
+
import type { CoverageSummary, FileCoverage } from './interfaces';
|
|
10
|
+
/**
|
|
11
|
+
* The ONE key form for per-file coverage records (#1027 N7): the absolute
|
|
12
|
+
* path. Reports write absolute (istanbul) or project-relative (lcov
|
|
13
|
+
* `SF:src/a.ts`) paths; a relative one is resolved against the project root
|
|
14
|
+
* (or the cwd when none is known), so one file never has two records.
|
|
15
|
+
*/
|
|
16
|
+
export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
|
|
17
|
+
export interface CollectedMetrics {
|
|
18
|
+
branch: boolean;
|
|
19
|
+
function: boolean;
|
|
20
|
+
statement: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Which optional metrics the files carry. Line coverage is always collected. */
|
|
23
|
+
export declare function collectedMetrics(files: readonly FileCoverage[]): CollectedMetrics;
|
|
24
|
+
/** A summary as it is reported and persisted: uncollected metrics are null. */
|
|
25
|
+
export interface CollectedSummary {
|
|
26
|
+
line: number;
|
|
27
|
+
branch: number | null;
|
|
28
|
+
function: number | null;
|
|
29
|
+
statement: number | null;
|
|
30
|
+
files: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function collectedSummary(summary: CoverageSummary, collected: CollectedMetrics): CollectedSummary;
|
|
33
|
+
//# sourceMappingURL=collected-metrics.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which coverage metrics a report actually collected (#995, #1015, #1027).
|
|
3
|
+
*
|
|
4
|
+
* A metric with no data in the report (no branch entries, no functions, no
|
|
5
|
+
* statement detail — lcov and Cobertura carry none) is "not collected". Its
|
|
6
|
+
* summary figure is 0 by construction, and must be reported AND persisted as
|
|
7
|
+
* null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
|
|
8
|
+
*/
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* The ONE key form for per-file coverage records (#1027 N7): the absolute
|
|
12
|
+
* path. Reports write absolute (istanbul) or project-relative (lcov
|
|
13
|
+
* `SF:src/a.ts`) paths; a relative one is resolved against the project root
|
|
14
|
+
* (or the cwd when none is known), so one file never has two records.
|
|
15
|
+
*/
|
|
16
|
+
export function fileCoverageKey(filePath, projectRoot) {
|
|
17
|
+
return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? process.cwd(), filePath);
|
|
18
|
+
}
|
|
19
|
+
/** Which optional metrics the files carry. Line coverage is always collected. */
|
|
20
|
+
export function collectedMetrics(files) {
|
|
21
|
+
return {
|
|
22
|
+
branch: files.some(f => f.branches.total > 0),
|
|
23
|
+
function: files.some(f => f.functions.total > 0),
|
|
24
|
+
statement: files.some(f => f.statements.total > 0),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function collectedSummary(summary, collected) {
|
|
28
|
+
return {
|
|
29
|
+
line: summary.line,
|
|
30
|
+
branch: collected.branch ? summary.branch : null,
|
|
31
|
+
function: collected.function ? summary.function : null,
|
|
32
|
+
statement: collected.statement ? summary.statement : null,
|
|
33
|
+
files: summary.files,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=collected-metrics.js.map
|
|
@@ -7,6 +7,7 @@ import { LoggerFactory } from '../../logging/index.js';
|
|
|
7
7
|
import { ok, err } from '../../shared/types/index.js';
|
|
8
8
|
import { toError } from '../../shared/error-utils.js';
|
|
9
9
|
import { createEvent, CoverageAnalysisEvents, } from '../../shared/events/index.js';
|
|
10
|
+
import { isMeasuredGapRequest, } from './interfaces.js';
|
|
10
11
|
import { CoverageAnalyzerService, GapDetectorService, RiskScorerService, } from './services/index.js';
|
|
11
12
|
import { GhostCoverageAnalyzerService } from './services/ghost-coverage-analyzer.js';
|
|
12
13
|
import { createHNSWIndex } from './services/hnsw-index.js';
|
|
@@ -404,8 +405,12 @@ export class CoverageAnalysisCoordinator extends BaseDomainCoordinator {
|
|
|
404
405
|
}
|
|
405
406
|
verifiedGaps.push(gap);
|
|
406
407
|
}
|
|
407
|
-
// Publish gap detection events for verified high-risk gaps
|
|
408
|
-
|
|
408
|
+
// Publish gap detection events for verified high-risk gaps — only for
|
|
409
|
+
// MEASURED coverage (#1014). Consumers learn from these events
|
|
410
|
+
// (learning-optimization experiences, code/defect-intel KV).
|
|
411
|
+
if (isMeasuredGapRequest(request)) {
|
|
412
|
+
await this.publishGapEvents(verifiedGaps);
|
|
413
|
+
}
|
|
409
414
|
// Return result with verified gaps
|
|
410
415
|
return ok({
|
|
411
416
|
...result.value,
|
|
@@ -479,7 +484,9 @@ export class CoverageAnalysisCoordinator extends BaseDomainCoordinator {
|
|
|
479
484
|
const date = new Date(timestamp);
|
|
480
485
|
if (date >= timeRange.start && date <= timeRange.end) {
|
|
481
486
|
const summary = await this.memory.get(key);
|
|
482
|
-
|
|
487
|
+
// #1014: only measured snapshots are trend points. Unstamped legacy
|
|
488
|
+
// snapshots (estimates were written here up to 3.15.4) are skipped.
|
|
489
|
+
if (summary && summary.measured === true && Number.isFinite(summary.line)) {
|
|
483
490
|
dataPoints.push({ date, coverage: summary });
|
|
484
491
|
}
|
|
485
492
|
}
|
|
@@ -611,11 +618,13 @@ export class CoverageAnalysisCoordinator extends BaseDomainCoordinator {
|
|
|
611
618
|
const payload = {
|
|
612
619
|
reportId: crypto.randomUUID(),
|
|
613
620
|
line: report.summary.line,
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
621
|
+
// #1027 B2: an uncollected metric travels as null, never as its 0.
|
|
622
|
+
branch: report.collected && !report.collected.branch ? null : report.summary.branch,
|
|
623
|
+
function: report.collected && !report.collected.function ? null : report.summary.function,
|
|
624
|
+
statement: report.collected && !report.collected.statement ? null : report.summary.statement,
|
|
617
625
|
files: report.summary.files,
|
|
618
626
|
measured: true,
|
|
627
|
+
...(report.runStatus ? { runStatus: report.runStatus } : {}),
|
|
619
628
|
};
|
|
620
629
|
const event = createEvent(CoverageAnalysisEvents.CoverageReportCreated, 'coverage-analysis', payload);
|
|
621
630
|
await this.eventBus.publish(event);
|
|
@@ -630,6 +639,9 @@ export class CoverageAnalysisCoordinator extends BaseDomainCoordinator {
|
|
|
630
639
|
uncoveredLines: gap.lines,
|
|
631
640
|
uncoveredBranches: gap.branches,
|
|
632
641
|
riskScore: gap.riskScore,
|
|
642
|
+
// #1014: provenance — only measured gaps are ever published.
|
|
643
|
+
measured: true,
|
|
644
|
+
coverageMethod: 'instrumented-report',
|
|
633
645
|
};
|
|
634
646
|
const event = createEvent(CoverageAnalysisEvents.CoverageGapDetected, 'coverage-analysis', payload);
|
|
635
647
|
await this.eventBus.publish(event);
|
|
@@ -27,6 +27,29 @@ export interface AnalyzeCoverageRequest {
|
|
|
27
27
|
* are absent the data is treated as UNMEASURED and nothing is persisted.
|
|
28
28
|
*/
|
|
29
29
|
measured?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Outcome of the test run that produced `coverageData`, when one ran
|
|
32
|
+
* (#1027 N4). Coverage from a run whose tests failed is still a
|
|
33
|
+
* measurement: it is persisted, stamped `runStatus: 'failed'`; the failure
|
|
34
|
+
* itself is carried by testsPassing.
|
|
35
|
+
*/
|
|
36
|
+
runStatus?: 'passed' | 'failed';
|
|
37
|
+
/**
|
|
38
|
+
* Counts of the test run behind `coverageData`, when one ran (#1027 NB1).
|
|
39
|
+
* Its testsPassing is recorded together with the coverage, under one runId,
|
|
40
|
+
* so failing-run coverage never pairs with a stale testsPassing.
|
|
41
|
+
*/
|
|
42
|
+
testRun?: {
|
|
43
|
+
runId: string;
|
|
44
|
+
passed: number;
|
|
45
|
+
failed: number;
|
|
46
|
+
skipped?: number;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Project root that relative report paths (lcov `SF:src/a.ts`) resolve
|
|
50
|
+
* against, so per-file records use ONE key form: the absolute path (#1027 N7).
|
|
51
|
+
*/
|
|
52
|
+
projectRoot?: string;
|
|
30
53
|
}
|
|
31
54
|
export interface CoverageData {
|
|
32
55
|
files: FileCoverage[];
|
|
@@ -72,6 +95,18 @@ export interface CoverageReport {
|
|
|
72
95
|
* report was not persisted and must not be published or stored as evidence.
|
|
73
96
|
*/
|
|
74
97
|
measured?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Which optional metrics the report collected (#1027 B2). `summary` holds 0
|
|
100
|
+
* for an uncollected metric by construction; consumers must report and
|
|
101
|
+
* persist it as null.
|
|
102
|
+
*/
|
|
103
|
+
collected?: {
|
|
104
|
+
branch: boolean;
|
|
105
|
+
function: boolean;
|
|
106
|
+
statement: boolean;
|
|
107
|
+
};
|
|
108
|
+
/** Outcome of the test run behind the report, when known (#1027 N4). */
|
|
109
|
+
runStatus?: 'passed' | 'failed';
|
|
75
110
|
}
|
|
76
111
|
export interface CoverageDelta {
|
|
77
112
|
line: number;
|
|
@@ -84,7 +119,16 @@ export interface GapDetectionRequest {
|
|
|
84
119
|
coverageData: CoverageData;
|
|
85
120
|
minCoverage?: number;
|
|
86
121
|
prioritize?: 'risk' | 'size' | 'recent-changes';
|
|
122
|
+
/**
|
|
123
|
+
* Provenance of `coverageData` (#1014), as for AnalyzeCoverageRequest.
|
|
124
|
+
* Takes precedence over `coverageData.instrumented`. Fail-closed: gaps from
|
|
125
|
+
* data that is not explicitly measured are returned but never learned from
|
|
126
|
+
* (no gap-pattern vectors) nor published as CoverageGapDetected.
|
|
127
|
+
*/
|
|
128
|
+
measured?: boolean;
|
|
87
129
|
}
|
|
130
|
+
/** Whether a gap-detection request carries measured coverage (#1014, fail-closed). */
|
|
131
|
+
export declare function isMeasuredGapRequest(request: GapDetectionRequest): boolean;
|
|
88
132
|
export interface CoverageGaps {
|
|
89
133
|
gaps: CoverageGap[];
|
|
90
134
|
totalUncoveredLines: number;
|
|
@@ -2,5 +2,10 @@
|
|
|
2
2
|
* Agentic QE v3 - Coverage Analysis Domain Interface
|
|
3
3
|
* O(log n) coverage gap detection with HNSW
|
|
4
4
|
*/
|
|
5
|
-
|
|
5
|
+
/** Whether a gap-detection request carries measured coverage (#1014, fail-closed). */
|
|
6
|
+
export function isMeasuredGapRequest(request) {
|
|
7
|
+
if (typeof request.measured === 'boolean')
|
|
8
|
+
return request.measured;
|
|
9
|
+
return request.coverageData.instrumented === true;
|
|
10
|
+
}
|
|
6
11
|
//# sourceMappingURL=interfaces.js.map
|
|
@@ -8,8 +8,10 @@ import { LoggerFactory } from '../../../logging/index.js';
|
|
|
8
8
|
import { ok, err } from '../../../shared/types/index.js';
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
|
-
import { writeQualityEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
11
|
+
import { writeQualityEvidence, writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
12
|
+
import { measuredCoverageSummary } from '../../quality-assessment/coverage-report-event.js';
|
|
12
13
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
14
|
+
import { collectedMetrics, collectedSummary, fileCoverageKey } from '../collected-metrics.js';
|
|
13
15
|
/**
|
|
14
16
|
* Whether an analyze request carries instrumented (measured) coverage (#1008).
|
|
15
17
|
* Fail-closed: an explicit `request.measured` wins; otherwise only data a
|
|
@@ -82,17 +84,21 @@ export class CoverageAnalyzerService {
|
|
|
82
84
|
// written over a measurement, and never stored where a quality gate,
|
|
83
85
|
// quality_assess or another reader would take it as measured.
|
|
84
86
|
const measured = isMeasuredCoverage(request);
|
|
87
|
+
// #1027 B2: a metric the report never collected is null wherever it is
|
|
88
|
+
// persisted or compared — never the 0 calculateMetrics yields for it.
|
|
89
|
+
const collected = collectedMetrics(coverageData.files);
|
|
90
|
+
const stored = collectedSummary(summary, collected);
|
|
85
91
|
// Calculate delta from previous coverage (if stored)
|
|
86
|
-
const delta = measured ? await this.calculateDelta(
|
|
92
|
+
const delta = measured ? await this.calculateDelta(stored) : undefined;
|
|
87
93
|
// Generate recommendations based on analysis
|
|
88
94
|
const recommendations = this.generateRecommendations(coverageData, summary, threshold);
|
|
89
95
|
if (measured) {
|
|
90
96
|
// Store current coverage for future delta calculations
|
|
91
|
-
await this.storeCoverageSnapshot(
|
|
97
|
+
await this.storeCoverageSnapshot(stored, request.runStatus, request.testRun);
|
|
92
98
|
// Store coverage vectors for similarity search + KV for quality-analyzer
|
|
93
99
|
if (request.includeFileDetails) {
|
|
94
|
-
await this.indexFileCoverageVectors(coverageData.files);
|
|
95
|
-
await this.storeFileCoverageKV(coverageData.files);
|
|
100
|
+
await this.indexFileCoverageVectors(coverageData.files, request.projectRoot);
|
|
101
|
+
await this.storeFileCoverageKV(coverageData.files, request.projectRoot, request.runStatus);
|
|
96
102
|
}
|
|
97
103
|
}
|
|
98
104
|
return ok({
|
|
@@ -101,6 +107,8 @@ export class CoverageAnalyzerService {
|
|
|
101
107
|
delta,
|
|
102
108
|
recommendations,
|
|
103
109
|
measured,
|
|
110
|
+
collected,
|
|
111
|
+
...(request.runStatus ? { runStatus: request.runStatus } : {}),
|
|
104
112
|
});
|
|
105
113
|
}
|
|
106
114
|
catch (error) {
|
|
@@ -421,14 +429,20 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
421
429
|
}
|
|
422
430
|
async calculateDelta(current) {
|
|
423
431
|
try {
|
|
424
|
-
|
|
432
|
+
// #1015: only a measured baseline with finite figures is a baseline. A
|
|
433
|
+
// legacy unstamped record (e.g. the `{"files":0}` bridge echo removed in
|
|
434
|
+
// #1013) gave a NaN delta that was reported as "stable".
|
|
435
|
+
const previous = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
425
436
|
if (!previous) {
|
|
426
437
|
return undefined;
|
|
427
438
|
}
|
|
439
|
+
// A metric not collected on EITHER side has no delta (0 — never NaN,
|
|
440
|
+
// never a fake swing against an uncollected 0, #1027 B2).
|
|
441
|
+
const diff = (now, before) => (now === null || before === null ? 0 : now - before);
|
|
428
442
|
const lineDelta = current.line - previous.line;
|
|
429
|
-
const branchDelta = current.branch
|
|
430
|
-
const functionDelta = current.function
|
|
431
|
-
const statementDelta = current.statement
|
|
443
|
+
const branchDelta = diff(current.branch, previous.branch);
|
|
444
|
+
const functionDelta = diff(current.function, previous.function);
|
|
445
|
+
const statementDelta = diff(current.statement, previous.statement);
|
|
432
446
|
const avgDelta = (lineDelta + branchDelta + functionDelta + statementDelta) / 4;
|
|
433
447
|
let trend;
|
|
434
448
|
if (avgDelta > 0.5) {
|
|
@@ -452,23 +466,36 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
452
466
|
return undefined;
|
|
453
467
|
}
|
|
454
468
|
}
|
|
455
|
-
async storeCoverageSnapshot(summary) {
|
|
469
|
+
async storeCoverageSnapshot(summary, runStatus, testRun) {
|
|
456
470
|
try {
|
|
457
|
-
// Rotate: copy current coverage:latest → coverage:previous before
|
|
458
|
-
|
|
471
|
+
// Rotate: copy current coverage:latest → coverage:previous before
|
|
472
|
+
// overwriting — only a measured record (#1015): legacy junk is dropped,
|
|
473
|
+
// never promoted to the baseline.
|
|
474
|
+
const existing = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
459
475
|
if (existing) {
|
|
460
476
|
await this.memory.set('coverage:previous', existing, { persist: true });
|
|
461
477
|
}
|
|
462
478
|
// Store latest snapshot, stamped with its provenance (#1008). Only
|
|
463
479
|
// measured coverage reaches this method.
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
480
|
+
// #1027: uncollected metrics are null; runStatus says if tests failed (N4).
|
|
481
|
+
const record = { ...summary, measured: true, ...(runStatus ? { runStatus } : {}) };
|
|
482
|
+
await this.memory.set('coverage:latest', record, { persist: true });
|
|
483
|
+
if (testRun) {
|
|
484
|
+
// #1027 NB1: the run's testsPassing and coverage, under one runId.
|
|
485
|
+
await writeTestRunEvidence(this.memory, testRun, { source: 'coverage-analysis', coverage: summary.line });
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
// No counts: a failing run's coverage carries runStatus but no runId,
|
|
489
|
+
// so the gate will not pair it with any testsPassing (fail-closed).
|
|
490
|
+
await writeQualityEvidence(this.memory, { coverage: summary.line }, {
|
|
491
|
+
measuredAt: new Date().toISOString(),
|
|
492
|
+
source: 'coverage-analysis',
|
|
493
|
+
...(runStatus ? { runStatus } : {}),
|
|
494
|
+
});
|
|
495
|
+
}
|
|
469
496
|
// Store historical snapshot
|
|
470
497
|
const timestamp = Date.now();
|
|
471
|
-
await this.memory.set(`coverage:history:${timestamp}`,
|
|
498
|
+
await this.memory.set(`coverage:history:${timestamp}`, record, {
|
|
472
499
|
persist: true,
|
|
473
500
|
namespace: 'coverage-history',
|
|
474
501
|
});
|
|
@@ -482,22 +509,22 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
482
509
|
* and defect-predictor can read it with memory.get().
|
|
483
510
|
* (The vector index via storeVector is kept for similarity search.)
|
|
484
511
|
*/
|
|
485
|
-
async storeFileCoverageKV(files) {
|
|
512
|
+
async storeFileCoverageKV(files, projectRoot, runStatus) {
|
|
486
513
|
for (const file of files) {
|
|
487
514
|
try {
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
515
|
+
// #1014: a metric with no data is null (not collected), never 0%.
|
|
516
|
+
const pct = (m) => m.total > 0 ? Math.round((m.covered / m.total) * 10000) / 100 : null;
|
|
517
|
+
if (file.lines.total === 0)
|
|
518
|
+
continue;
|
|
519
|
+
// #1014: stamped, so readers can tell it from legacy unstamped
|
|
520
|
+
// estimate records written by <= 3.15.4.
|
|
521
|
+
await this.memory.set(`coverage:file:${fileCoverageKey(file.path, projectRoot)}`, {
|
|
522
|
+
line: pct(file.lines),
|
|
523
|
+
branch: pct(file.branches),
|
|
524
|
+
function: pct(file.functions),
|
|
525
|
+
statement: pct(file.statements),
|
|
526
|
+
measured: true,
|
|
527
|
+
...(runStatus ? { runStatus } : {}),
|
|
501
528
|
}, { persist: true });
|
|
502
529
|
}
|
|
503
530
|
catch {
|
|
@@ -505,12 +532,12 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
505
532
|
}
|
|
506
533
|
}
|
|
507
534
|
}
|
|
508
|
-
async indexFileCoverageVectors(files) {
|
|
535
|
+
async indexFileCoverageVectors(files, projectRoot) {
|
|
509
536
|
for (const file of files) {
|
|
510
537
|
try {
|
|
511
538
|
// Create a vector representation of the file coverage
|
|
512
539
|
const embedding = this.createCoverageEmbedding(file);
|
|
513
|
-
await this.memory.storeVector(`coverage:file:${file.path}`, embedding, {
|
|
540
|
+
await this.memory.storeVector(`coverage:file:${fileCoverageKey(file.path, projectRoot)}`, embedding, {
|
|
514
541
|
path: file.path,
|
|
515
542
|
lineCoverage: file.lines.covered / (file.lines.total || 1),
|
|
516
543
|
branchCoverage: file.branches.covered / (file.branches.total || 1),
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
8
8
|
import { ok, err } from '../../../shared/types/index.js';
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
|
+
import { isMeasuredGapRequest, } from '../interfaces.js';
|
|
10
11
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
12
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
13
|
import { createSafeRecord } from '../../../shared/utils/safe-record.js';
|
|
@@ -238,8 +239,12 @@ Return JSON in this exact format:
|
|
|
238
239
|
const prioritizedGaps = this.prioritizeGaps(gaps, prioritize);
|
|
239
240
|
// Calculate estimated effort
|
|
240
241
|
const estimatedEffort = this.calculateTotalEffort(prioritizedGaps);
|
|
241
|
-
// Store gap patterns for learning
|
|
242
|
-
|
|
242
|
+
// Store gap patterns for learning — only gaps in MEASURED coverage
|
|
243
|
+
// (#1014). A gap from a static estimate is a hypothesis: returned to the
|
|
244
|
+
// caller, never persisted as a gap-pattern vector.
|
|
245
|
+
if (isMeasuredGapRequest(request)) {
|
|
246
|
+
await this.storeGapPatterns(prioritizedGaps);
|
|
247
|
+
}
|
|
243
248
|
return ok({
|
|
244
249
|
gaps: prioritizedGaps,
|
|
245
250
|
totalUncoveredLines,
|
|
@@ -9,6 +9,7 @@ import { DefectPredictorService, } from './services/defect-predictor.js';
|
|
|
9
9
|
import { PatternLearnerService, } from './services/pattern-learner.js';
|
|
10
10
|
import { toError } from '../../shared/error-utils.js';
|
|
11
11
|
import { RootCauseAnalyzerService, } from './services/root-cause-analyzer.js';
|
|
12
|
+
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
12
13
|
/**
|
|
13
14
|
* Defect Intelligence Domain Plugin
|
|
14
15
|
* Provides ML-based defect prediction and analysis capabilities
|
|
@@ -307,6 +308,9 @@ export class DefectIntelligencePlugin extends BaseDomainPlugin {
|
|
|
307
308
|
}
|
|
308
309
|
}
|
|
309
310
|
async handleCoverageGap(event) {
|
|
311
|
+
// #1014: only a gap found in MEASURED coverage is acted on / learned from.
|
|
312
|
+
if (!isMeasuredGapPayload(event.payload))
|
|
313
|
+
return;
|
|
310
314
|
// Coverage gap detected - assess defect risk
|
|
311
315
|
const payload = event.payload;
|
|
312
316
|
// High risk coverage gaps indicate defect-prone areas
|
|
@@ -14,6 +14,7 @@ import { TypeScriptParser } from '../../../shared/parsers/index.js';
|
|
|
14
14
|
import { toError } from '../../../shared/error-utils.js';
|
|
15
15
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
16
16
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
17
|
+
import { measuredCoverageSummary, measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
|
|
17
18
|
// LLMDefectAnalysis is imported from ../interfaces
|
|
18
19
|
const DEFAULT_CONFIG = {
|
|
19
20
|
defaultThreshold: 0.5,
|
|
@@ -590,14 +591,15 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
590
591
|
async getTestCoverage(file) {
|
|
591
592
|
try {
|
|
592
593
|
// Try per-file coverage (written by coverage-analyzer and test-executor)
|
|
593
|
-
|
|
594
|
-
|
|
594
|
+
// #1014: only measured records; legacy unstamped estimates are ignored.
|
|
595
|
+
const fileCoverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
|
|
596
|
+
if (fileCoverage) {
|
|
595
597
|
// Invert: low coverage = high defect risk
|
|
596
598
|
return 1 - fileCoverage.line / 100;
|
|
597
599
|
}
|
|
598
600
|
// Fall back to project-wide coverage
|
|
599
|
-
const summary = await this.memory.get('coverage:latest');
|
|
600
|
-
if (summary
|
|
601
|
+
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
602
|
+
if (summary) {
|
|
601
603
|
return 1 - summary.line / 100;
|
|
602
604
|
}
|
|
603
605
|
}
|
|
@@ -18,6 +18,7 @@ import { BaseDomainCoordinator, } from '../base-domain-coordinator.js';
|
|
|
18
18
|
// CQ-004: Extracted modules
|
|
19
19
|
import * as LearningHelpers from './coordinator-helpers.js';
|
|
20
20
|
import * as ConsensusHelpers from './coordinator-consensus.js';
|
|
21
|
+
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
21
22
|
const DEFAULT_CONFIG = {
|
|
22
23
|
maxConcurrentWorkflows: 3,
|
|
23
24
|
defaultTimeout: 120000, // 2 minutes
|
|
@@ -958,6 +959,9 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
958
959
|
});
|
|
959
960
|
}
|
|
960
961
|
async handleCoverageGap(event) {
|
|
962
|
+
// #1014: only a gap found in MEASURED coverage is acted on / learned from.
|
|
963
|
+
if (!isMeasuredGapPayload(event.payload))
|
|
964
|
+
return;
|
|
961
965
|
// Record as experience for learning
|
|
962
966
|
const { gapId, file, riskScore } = event.payload;
|
|
963
967
|
await this.learningService.recordExperience({
|
|
@@ -7,6 +7,7 @@ import { BaseDomainPlugin } from '../domain-interface.js';
|
|
|
7
7
|
import { LearningOptimizationCoordinator, } from './coordinator.js';
|
|
8
8
|
import { toError } from '../../shared/error-utils.js';
|
|
9
9
|
import { LearningCoordinatorService, TransferSpecialistService, MetricsOptimizerService, ProductionIntelService, } from './services/index.js';
|
|
10
|
+
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
10
11
|
/**
|
|
11
12
|
* Learning & Optimization Domain Plugin
|
|
12
13
|
* Provides cross-domain learning, pattern extraction, and strategy optimization
|
|
@@ -439,6 +440,9 @@ export class LearningOptimizationPlugin extends BaseDomainPlugin {
|
|
|
439
440
|
await this.productionIntel.recordMetric('test_success_rate', successRate, 'ratio', 'test-execution', ['automated']);
|
|
440
441
|
}
|
|
441
442
|
async handleCoverageGap(event) {
|
|
443
|
+
// #1014: only a gap found in MEASURED coverage is acted on / learned from.
|
|
444
|
+
if (!isMeasuredGapPayload(event.payload))
|
|
445
|
+
return;
|
|
442
446
|
const payload = event.payload;
|
|
443
447
|
await this.learningService.recordExperience({
|
|
444
448
|
agentId: {
|