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
|
@@ -30,6 +30,18 @@ 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
|
+
/**
|
|
34
|
+
* Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
|
|
35
|
+
* own result reports a failed test or test suite, 'passed' when it reports
|
|
36
|
+
* none — whatever the exit code (a coverage-threshold failure exits 1 with
|
|
37
|
+
* every test passing). Without counts (nyc), the exit code decides.
|
|
38
|
+
*/
|
|
39
|
+
export function testRunStatus(run) {
|
|
40
|
+
if (typeof run.numFailedTests === 'number' || typeof run.numFailedTestSuites === 'number') {
|
|
41
|
+
return (run.numFailedTests ?? 0) > 0 || (run.numFailedTestSuites ?? 0) > 0 ? 'failed' : 'passed';
|
|
42
|
+
}
|
|
43
|
+
return run.exitedCleanly ? 'passed' : 'failed';
|
|
44
|
+
}
|
|
33
45
|
const RESULTS_FILE = 'test-results.json';
|
|
34
46
|
const STDERR_TAIL_BYTES = 2048;
|
|
35
47
|
const STDERR_HEAD_BYTES = 4096;
|
|
@@ -92,13 +104,79 @@ function readDeps(projectRoot) {
|
|
|
92
104
|
return {};
|
|
93
105
|
}
|
|
94
106
|
}
|
|
107
|
+
const RUNNER_DEPS = ['jest', '@jest/core', 'mocha', 'nyc', 'vitest'];
|
|
108
|
+
/**
|
|
109
|
+
* The project and its ancestors up to the repository / workspace root: the
|
|
110
|
+
* project itself, then each parent, stopping after the directory holding
|
|
111
|
+
* `.git` (or a `workspaces` manifest), at $HOME, or after `maxDepth` levels.
|
|
112
|
+
*/
|
|
113
|
+
function projectAndAncestors(projectRoot, maxDepth = 10) {
|
|
114
|
+
const dirs = [];
|
|
115
|
+
let home = null;
|
|
116
|
+
try {
|
|
117
|
+
home = fs.realpathSync(os.homedir());
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
home = null;
|
|
121
|
+
}
|
|
122
|
+
let dir = path.resolve(projectRoot);
|
|
123
|
+
for (let i = 0; i <= maxDepth; i++) {
|
|
124
|
+
if (i > 0 && home !== null && dir === home)
|
|
125
|
+
break;
|
|
126
|
+
dirs.push(dir);
|
|
127
|
+
if (fs.existsSync(path.join(dir, '.git')) || isWorkspaceRoot(dir))
|
|
128
|
+
break;
|
|
129
|
+
const parent = path.dirname(dir);
|
|
130
|
+
if (parent === dir)
|
|
131
|
+
break;
|
|
132
|
+
dir = parent;
|
|
133
|
+
}
|
|
134
|
+
return dirs;
|
|
135
|
+
}
|
|
136
|
+
function isWorkspaceRoot(dir) {
|
|
137
|
+
try {
|
|
138
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
|
|
139
|
+
return pkg.workspaces !== undefined;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Dependencies that decide the runner (#1012): the package's own when it
|
|
147
|
+
* declares a test runner, otherwise those of the nearest ancestor (workspace
|
|
148
|
+
* root) that does. A package of a monorepo whose jest is declared only at the
|
|
149
|
+
* root runs jest, not the vitest default.
|
|
150
|
+
*/
|
|
151
|
+
function readRunnerDeps(projectRoot) {
|
|
152
|
+
for (const dir of projectAndAncestors(projectRoot)) {
|
|
153
|
+
const deps = readDeps(dir);
|
|
154
|
+
if (RUNNER_DEPS.some(d => deps[d]))
|
|
155
|
+
return deps;
|
|
156
|
+
}
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Every `node_modules/.bin` from the project up to the workspace root,
|
|
161
|
+
* nearest first. Runners that shell out to sibling tools (nyc → mocha) need
|
|
162
|
+
* the hoisted ones too (#1012).
|
|
163
|
+
*/
|
|
164
|
+
export function runnerBinDirs(projectRoot) {
|
|
165
|
+
return projectAndAncestors(projectRoot)
|
|
166
|
+
.map(dir => path.join(dir, 'node_modules', '.bin'))
|
|
167
|
+
.filter(dir => fs.existsSync(dir));
|
|
168
|
+
}
|
|
169
|
+
/** Is the project installed with Yarn Plug'n'Play (no node_modules to resolve from)? */
|
|
170
|
+
function usesPlugNPlay(projectRoot) {
|
|
171
|
+
return projectAndAncestors(projectRoot).some(dir => fs.existsSync(path.join(dir, '.pnp.cjs')) || fs.existsSync(path.join(dir, '.pnp.js')));
|
|
172
|
+
}
|
|
95
173
|
/**
|
|
96
174
|
* Pick the runner and its argv. No shell is involved: `command` is the Node
|
|
97
175
|
* binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
|
|
98
176
|
*/
|
|
99
177
|
export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
100
178
|
const resultsFile = path.join(reportDir, RESULTS_FILE);
|
|
101
|
-
const deps =
|
|
179
|
+
const deps = readRunnerDeps(projectRoot);
|
|
102
180
|
let runner = 'vitest';
|
|
103
181
|
let runnerArgs;
|
|
104
182
|
let results = resultsFile;
|
|
@@ -117,8 +195,10 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
|
117
195
|
// vitest is the default — covers vitest, @vitest/coverage-v8, etc.
|
|
118
196
|
// Plain `--outputFile=` (not `.json=`): it overrides a string, object, or
|
|
119
197
|
// absent `outputFile` in the user's config alike.
|
|
198
|
+
// #1027 N4: vitest writes no coverage when a test fails unless asked;
|
|
199
|
+
// coverage from a failing suite is still a measurement (runStatus 'failed').
|
|
120
200
|
runnerArgs = ['run', '--coverage', `--coverage.reportsDirectory=${reportDir}`,
|
|
121
|
-
'--coverage.reporter=json', '--reporter=json', `--outputFile=${resultsFile}`];
|
|
201
|
+
'--coverage.reporter=json', '--coverage.reportOnFailure=true', '--reporter=json', `--outputFile=${resultsFile}`];
|
|
122
202
|
}
|
|
123
203
|
const bin = findPackageBin(projectRoot, runner === 'jest' ? 'jest' : runner);
|
|
124
204
|
return {
|
|
@@ -128,15 +208,23 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
|
128
208
|
resultsFile: results,
|
|
129
209
|
};
|
|
130
210
|
}
|
|
131
|
-
|
|
211
|
+
const NO_COUNTS = {
|
|
212
|
+
numTotalTests: null, numPassedTests: null, numFailedTests: null, numPendingTests: null, numFailedTestSuites: null,
|
|
213
|
+
};
|
|
214
|
+
/** Test counts from the runner's own JSON result (vitest/jest share the shape). */
|
|
215
|
+
function readRunCounts(resultsFile) {
|
|
132
216
|
if (!resultsFile)
|
|
133
|
-
return
|
|
217
|
+
return NO_COUNTS;
|
|
134
218
|
try {
|
|
135
219
|
const parsed = JSON.parse(fs.readFileSync(resultsFile, 'utf-8'));
|
|
136
|
-
|
|
220
|
+
const n = (k) => (typeof parsed[k] === 'number' ? parsed[k] : null);
|
|
221
|
+
return {
|
|
222
|
+
numTotalTests: n('numTotalTests'), numPassedTests: n('numPassedTests'), numFailedTests: n('numFailedTests'),
|
|
223
|
+
numPendingTests: n('numPendingTests'), numFailedTestSuites: n('numFailedTestSuites'),
|
|
224
|
+
};
|
|
137
225
|
}
|
|
138
226
|
catch {
|
|
139
|
-
return
|
|
227
|
+
return NO_COUNTS;
|
|
140
228
|
}
|
|
141
229
|
}
|
|
142
230
|
/**
|
|
@@ -311,15 +399,16 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
311
399
|
timeoutMs, data: null, numTotalTests: null, stderrTail: '',
|
|
312
400
|
};
|
|
313
401
|
}
|
|
314
|
-
// Runners that shell out to sibling tools (nyc → mocha) find them here
|
|
315
|
-
|
|
402
|
+
// Runners that shell out to sibling tools (nyc → mocha) find them here,
|
|
403
|
+
// including hoisted workspace-root installs (#1012).
|
|
404
|
+
const binDirs = runnerBinDirs(projectRoot);
|
|
316
405
|
// The runner's own temp files (vite's SSR cache, etc.) go inside reportDir
|
|
317
406
|
// too, so a killed run leaves nothing behind in the system temp dir.
|
|
318
407
|
const runnerTmp = path.join(reportDir, 'tmp');
|
|
319
408
|
fs.mkdirSync(runnerTmp);
|
|
320
409
|
const env = {
|
|
321
410
|
...process.env,
|
|
322
|
-
PATH:
|
|
411
|
+
PATH: [...binDirs, process.env.PATH ?? ''].join(path.delimiter),
|
|
323
412
|
TMPDIR: runnerTmp, TMP: runnerTmp, TEMP: runnerTmp,
|
|
324
413
|
};
|
|
325
414
|
const run = await runProcessTree(inv.command, inv.args, {
|
|
@@ -334,7 +423,7 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
334
423
|
timedOut: run.timedOut,
|
|
335
424
|
timeoutMs,
|
|
336
425
|
data,
|
|
337
|
-
|
|
426
|
+
...(run.timedOut ? NO_COUNTS : readRunCounts(inv.resultsFile)),
|
|
338
427
|
stderrTail: run.stderrTail,
|
|
339
428
|
};
|
|
340
429
|
}
|
|
@@ -350,6 +439,12 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
350
439
|
* Never "No instrumentation ran" when the runner did run and failed.
|
|
351
440
|
*/
|
|
352
441
|
export function describeRunFailure(run, projectRoot) {
|
|
442
|
+
if (run.missing && usesPlugNPlay(projectRoot)) {
|
|
443
|
+
return `${run.runner} could not be resolved for ${projectRoot}: this project uses Yarn Plug'n'Play, ` +
|
|
444
|
+
'and agentic-qe resolves test runners only from node_modules. Nothing was run and nothing was downloaded. ' +
|
|
445
|
+
`Generate a coverage report (e.g. \`yarn ${run.runner} --coverage\`) and pass it as the target, ` +
|
|
446
|
+
'or use the node-modules linker.';
|
|
447
|
+
}
|
|
353
448
|
if (run.missing) {
|
|
354
449
|
return `${run.runner} is not installed in ${projectRoot} (no node_modules/${run.runner} found); ` +
|
|
355
450
|
'nothing was run and nothing was downloaded. Install it, or generate a coverage report and pass it as the target.';
|
|
@@ -254,7 +254,10 @@ export async function resolveExistingCoverage(targetPath) {
|
|
|
254
254
|
* report) is null, and a null must not drag the average down as a fake 0.
|
|
255
255
|
*/
|
|
256
256
|
export function thresholdVerdict(summary, threshold, collected) {
|
|
257
|
-
|
|
257
|
+
// #1027 N7: lcov / Cobertura carry no statement data; it is left out too.
|
|
258
|
+
const metrics = [summary.line];
|
|
259
|
+
if (collected.statement !== false)
|
|
260
|
+
metrics.push(summary.statement);
|
|
258
261
|
if (collected.branch)
|
|
259
262
|
metrics.push(summary.branch);
|
|
260
263
|
if (collected.function)
|
|
@@ -11,7 +11,10 @@ import type { CoverageAnalyzerService } from '../../domains/coverage-analysis';
|
|
|
11
11
|
import type { SecurityScannerService } from '../../domains/security-compliance';
|
|
12
12
|
import type { TestGeneratorService } from '../../domains/test-generation';
|
|
13
13
|
import type { KnowledgeGraphService } from '../../domains/code-intelligence';
|
|
14
|
+
import type { ICodeIntelligenceCoordinator } from '../../domains/code-intelligence/coordinator';
|
|
14
15
|
import type { QualityAnalyzerService } from '../../domains/quality-assessment';
|
|
16
|
+
/** The coordinator surface the MCP index-code handler needs (#999). */
|
|
17
|
+
export type ProjectMetricsCollector = Pick<ICodeIntelligenceCoordinator, 'collectProjectMetrics'>;
|
|
15
18
|
/** Signature of a single task handler */
|
|
16
19
|
export type InstanceTaskHandler = (task: QueenTask) => Promise<Result<unknown, Error>>;
|
|
17
20
|
/**
|
|
@@ -33,6 +36,12 @@ export interface TaskHandlerContext {
|
|
|
33
36
|
*/
|
|
34
37
|
getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
|
|
35
38
|
getKnowledgeGraph(): KnowledgeGraphService;
|
|
39
|
+
/**
|
|
40
|
+
* #999 MCP-CLI parity: the code-intelligence coordinator, whose
|
|
41
|
+
* collectProjectMetrics step `aqe code index` runs. Resolves to undefined when
|
|
42
|
+
* the domain is unavailable. Optional so lightweight contexts can omit it.
|
|
43
|
+
*/
|
|
44
|
+
getCodeIntelligenceCoordinator?(): Promise<ProjectMetricsCollector | undefined>;
|
|
36
45
|
getQualityAnalyzer(): QualityAnalyzerService;
|
|
37
46
|
/** Executor configuration */
|
|
38
47
|
readonly config: {
|
|
@@ -75,7 +75,20 @@ export interface IstanbulFileCoverage {
|
|
|
75
75
|
*/
|
|
76
76
|
export declare function loadCoverageData(targetPath: string): Promise<CoverageData | null>;
|
|
77
77
|
/**
|
|
78
|
-
*
|
|
78
|
+
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
79
|
+
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
80
|
+
* `lines` and lcov.info `DA:` records) does: each statement counts on its
|
|
81
|
+
* START line, and a line's count is the highest count of the statements that
|
|
82
|
+
* start on it. A line is covered when any statement on it ran (#1012).
|
|
83
|
+
*/
|
|
84
|
+
export declare function istanbulLineHits(fd: Pick<IstanbulFileCoverage, 'statementMap' | 's'>): Map<number, number>;
|
|
85
|
+
/**
|
|
86
|
+
* Parse Istanbul/nyc coverage-final.json format.
|
|
87
|
+
*
|
|
88
|
+
* #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
|
|
89
|
+
* as istanbul's own summary does), not statements. Before, statement counts
|
|
90
|
+
* were reported as "line", so one project had two different line figures
|
|
91
|
+
* depending on whether coverage-final.json or lcov.info was read.
|
|
79
92
|
*/
|
|
80
93
|
export declare function parseCoverageJson(content: string): CoverageData;
|
|
81
94
|
/**
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
8
|
import * as path from 'path';
|
|
9
|
+
import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
|
|
9
10
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Coverage Data Loaders
|
|
@@ -52,7 +53,32 @@ export async function loadCoverageData(targetPath) {
|
|
|
52
53
|
return null;
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
|
-
*
|
|
56
|
+
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
57
|
+
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
58
|
+
* `lines` and lcov.info `DA:` records) does: each statement counts on its
|
|
59
|
+
* START line, and a line's count is the highest count of the statements that
|
|
60
|
+
* start on it. A line is covered when any statement on it ran (#1012).
|
|
61
|
+
*/
|
|
62
|
+
export function istanbulLineHits(fd) {
|
|
63
|
+
const lineHits = new Map();
|
|
64
|
+
const statementMap = fd.statementMap || {};
|
|
65
|
+
for (const [id, count] of Object.entries(fd.s || {})) {
|
|
66
|
+
const line = statementMap[id]?.start?.line;
|
|
67
|
+
if (typeof line !== 'number')
|
|
68
|
+
continue;
|
|
69
|
+
const prev = lineHits.get(line);
|
|
70
|
+
if (prev === undefined || prev < count)
|
|
71
|
+
lineHits.set(line, count);
|
|
72
|
+
}
|
|
73
|
+
return lineHits;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse Istanbul/nyc coverage-final.json format.
|
|
77
|
+
*
|
|
78
|
+
* #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
|
|
79
|
+
* as istanbul's own summary does), not statements. Before, statement counts
|
|
80
|
+
* were reported as "line", so one project had two different line figures
|
|
81
|
+
* depending on whether coverage-final.json or lcov.info was read.
|
|
56
82
|
*/
|
|
57
83
|
export function parseCoverageJson(content) {
|
|
58
84
|
const data = safeJsonParse(content);
|
|
@@ -63,30 +89,21 @@ export function parseCoverageJson(content) {
|
|
|
63
89
|
let totalStatements = 0, coveredStatements = 0;
|
|
64
90
|
for (const [filePath, fileData] of Object.entries(data)) {
|
|
65
91
|
const fd = fileData;
|
|
66
|
-
|
|
67
|
-
const lineMap = fd.statementMap || {};
|
|
68
|
-
const lineCounts = fd.s || {};
|
|
92
|
+
const statementCounts = fd.s || {};
|
|
69
93
|
const branchMap = fd.branchMap || {};
|
|
70
94
|
const branchCounts = fd.b || {};
|
|
71
95
|
const fnCounts = fd.f || {};
|
|
72
|
-
const
|
|
73
|
-
const
|
|
96
|
+
const lineHits = istanbulLineHits(fd);
|
|
97
|
+
const fileLines = lineHits.size;
|
|
98
|
+
const fileCoveredLines = [...lineHits.values()].filter(v => v > 0).length;
|
|
74
99
|
const fileBranches = Object.values(branchCounts).flat().length;
|
|
75
100
|
const fileCoveredBranches = Object.values(branchCounts).flat().filter((v) => v > 0).length;
|
|
76
101
|
const fileFunctions = Object.keys(fnCounts).length;
|
|
77
102
|
const fileCoveredFunctions = Object.values(fnCounts).filter((v) => v > 0).length;
|
|
78
|
-
const fileStatements = Object.keys(
|
|
79
|
-
const fileCoveredStatements = Object.values(
|
|
80
|
-
//
|
|
81
|
-
const uncoveredLines = [];
|
|
82
|
-
for (const [key, count] of Object.entries(lineCounts)) {
|
|
83
|
-
if (count === 0) {
|
|
84
|
-
const stmtInfo = lineMap[key];
|
|
85
|
-
if (stmtInfo?.start?.line) {
|
|
86
|
-
uncoveredLines.push(stmtInfo.start.line);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
103
|
+
const fileStatements = Object.keys(statementCounts).length;
|
|
104
|
+
const fileCoveredStatements = Object.values(statementCounts).filter((v) => v > 0).length;
|
|
105
|
+
// Uncovered lines: lines no statement on which ran.
|
|
106
|
+
const uncoveredLines = [...lineHits.entries()].filter(([, hits]) => hits === 0).map(([line]) => line);
|
|
90
107
|
// Find uncovered branches
|
|
91
108
|
const uncoveredBranches = [];
|
|
92
109
|
for (const [branchId, counts] of Object.entries(branchCounts)) {
|
|
@@ -103,7 +120,7 @@ export function parseCoverageJson(content) {
|
|
|
103
120
|
branches: { covered: fileCoveredBranches, total: fileBranches },
|
|
104
121
|
functions: { covered: fileCoveredFunctions, total: fileFunctions },
|
|
105
122
|
statements: { covered: fileCoveredStatements, total: fileStatements },
|
|
106
|
-
uncoveredLines:
|
|
123
|
+
uncoveredLines: uncoveredLines.sort((a, b) => a - b),
|
|
107
124
|
uncoveredBranches: Array.from(new Set(uncoveredBranches)).sort((a, b) => a - b),
|
|
108
125
|
});
|
|
109
126
|
totalLines += fileLines;
|
|
@@ -218,7 +235,8 @@ export function parseLcovInfo(content) {
|
|
|
218
235
|
lines: { covered: linesCovered, total: linesTotal },
|
|
219
236
|
branches: { covered: branchesCovered, total: branchesTotal },
|
|
220
237
|
functions: { covered: functionsCovered, total: functionsTotal },
|
|
221
|
-
|
|
238
|
+
// #1027 N7: lcov has no statement detail — not collected, not a copy of lines.
|
|
239
|
+
statements: { covered: 0, total: 0 },
|
|
222
240
|
uncoveredLines: Array.from(new Set(uncoveredLines)),
|
|
223
241
|
uncoveredBranches: Array.from(new Set(uncoveredBranches)),
|
|
224
242
|
});
|
|
@@ -355,7 +373,8 @@ export function parseCoberturaXml(content) {
|
|
|
355
373
|
lines: { covered: linesCovered, total: linesTotal },
|
|
356
374
|
branches: { covered: branchesCovered, total: branchesTotal },
|
|
357
375
|
functions: { covered: functionsCovered, total: functionsTotal },
|
|
358
|
-
|
|
376
|
+
// #1027 N7: Cobertura has no statement detail — not collected.
|
|
377
|
+
statements: { covered: 0, total: 0 },
|
|
359
378
|
uncoveredLines,
|
|
360
379
|
uncoveredBranches,
|
|
361
380
|
});
|
|
@@ -449,11 +468,16 @@ export async function discoverSourceFiles(targetPath, options = {}) {
|
|
|
449
468
|
if (['node_modules', '.git', 'dist', 'build', 'coverage', '.nyc_output',
|
|
450
469
|
'__pycache__', '.venv', 'venv', '.tox', '.mypy_cache', 'target',
|
|
451
470
|
'.gradle', 'vendor', '.bundle',
|
|
452
|
-
'.
|
|
471
|
+
'.cache', '.npm', '.yarn',
|
|
453
472
|
'.next', '.nuxt', '.svelte-kit', 'out', '.turbo',
|
|
454
473
|
'tmp', 'temp', '.tmp'].includes(entry.name)) {
|
|
455
474
|
continue;
|
|
456
475
|
}
|
|
476
|
+
// #999: AQE state/assets are not source: .agentic-qe anywhere; .claude at
|
|
477
|
+
// the root or next to a nested .agentic-qe. A plugin's own .claude/hooks
|
|
478
|
+
// source (no AQE install beside it) is kept.
|
|
479
|
+
if (isAqeManagedDir(dir, entry.name, dir === targetPath))
|
|
480
|
+
continue;
|
|
457
481
|
if (files.length >= maxFiles)
|
|
458
482
|
return; // Cap reached
|
|
459
483
|
await walkDir(fullPath);
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* Extracted from task-executor.ts registerHandlers().
|
|
5
5
|
* Covers: assess-quality
|
|
6
6
|
*/
|
|
7
|
+
import * as nodePath from 'node:path';
|
|
8
|
+
import { existsSync, promises as fsp } from 'node:fs';
|
|
7
9
|
import { ok, err } from '../../shared/types/index.js';
|
|
8
10
|
import { CallerInputError, toError } from '../../shared/error-utils.js';
|
|
9
11
|
import { discoverSourceFiles } from './handler-utils.js';
|
|
12
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
10
13
|
import { INSUFFICIENT_EVIDENCE, describeMissingMetrics, evaluateQualityEvidence, loadQualityEvidence, } from '../../domains/quality-assessment/quality-evidence.js';
|
|
11
14
|
import { assessEvidenceSufficiency, describeMeasuredFailure, findMeasuredFailures, isMeasuredMetricValue, resolveCoverageOverride, validateRequestedMetrics, } from '../../domains/quality-assessment/evidence-sufficiency.js';
|
|
12
15
|
const DEFAULT_STATIC_METRICS = ['coverage', 'complexity', 'maintainability', 'testability'];
|
|
@@ -17,6 +20,91 @@ const STATIC_ONLY_NOTE = 'Static analysis only; no quality gate was evaluated. '
|
|
|
17
20
|
function sentinel(value) {
|
|
18
21
|
return isMeasuredMetricValue(value) ? value : UNMEASURED;
|
|
19
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* #1011: why each unmeasured metric has no value — the analyzer's reason
|
|
25
|
+
* (unreadable or unparseable file, failed detection, no stored coverage).
|
|
26
|
+
*/
|
|
27
|
+
function unmeasuredReasons(unmeasured, reported) {
|
|
28
|
+
const byMetric = new Map((reported ?? []).map((u) => [u.metric, u.reason]));
|
|
29
|
+
return Object.fromEntries(unmeasured.map((metric) => [
|
|
30
|
+
metric,
|
|
31
|
+
byMetric.get(metric) ?? (metric === 'security'
|
|
32
|
+
? 'static analysis never measures security'
|
|
33
|
+
: 'the static analyzer produced no measured value'),
|
|
34
|
+
]));
|
|
35
|
+
}
|
|
36
|
+
/** Cap on excluded files echoed back in the result (the count is always exact). */
|
|
37
|
+
const MAX_EXCLUDED_LISTED = 50;
|
|
38
|
+
/** True when `candidate` is `root` or lies beneath it. */
|
|
39
|
+
function isWithin(root, candidate) {
|
|
40
|
+
const relative = nodePath.relative(root, candidate);
|
|
41
|
+
return relative === '' || (relative !== '..' && !relative.startsWith(`..${nodePath.sep}`) && !nodePath.isAbsolute(relative));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* #1021 (B2): resolve a caller path against the project root and require it to
|
|
45
|
+
* stay inside — lexically, and by realpath when it exists (so a symlink cannot
|
|
46
|
+
* lead outside). A path that does not exist is returned as resolved; the
|
|
47
|
+
* analyzer reports it as unreadable.
|
|
48
|
+
*/
|
|
49
|
+
async function resolveContained(input, root, label) {
|
|
50
|
+
const resolved = nodePath.resolve(root, input);
|
|
51
|
+
if (input.includes('\0') || !isWithin(root, resolved)) {
|
|
52
|
+
throw new CallerInputError(`${label} ${JSON.stringify(input)} is outside the project root (${root}).`);
|
|
53
|
+
}
|
|
54
|
+
let real;
|
|
55
|
+
try {
|
|
56
|
+
real = await fsp.realpath(resolved);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return resolved;
|
|
60
|
+
}
|
|
61
|
+
const rootReal = await fsp.realpath(root).catch(() => root);
|
|
62
|
+
if (!isWithin(rootReal, real)) {
|
|
63
|
+
throw new CallerInputError(`${label} ${JSON.stringify(input)} resolves outside the project root (${root}).`);
|
|
64
|
+
}
|
|
65
|
+
return resolved;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* #1021 (B2): the files to analyse and which of them the caller named. Explicit
|
|
69
|
+
* sourceFiles win over target; with neither, src/ (else the root) is analysed.
|
|
70
|
+
*/
|
|
71
|
+
async function resolveAnalysisScope(payload) {
|
|
72
|
+
// #1021 round 2b: the AQE project root (AQE_PROJECT_ROOT, else detected),
|
|
73
|
+
// not the process cwd — an MCP server may run from another directory.
|
|
74
|
+
const root = findProjectRoot();
|
|
75
|
+
if (Array.isArray(payload.sourceFiles) && payload.sourceFiles.length > 0) {
|
|
76
|
+
const files = [];
|
|
77
|
+
for (const file of payload.sourceFiles) {
|
|
78
|
+
if (typeof file !== 'string' || file.trim() === '') {
|
|
79
|
+
throw new CallerInputError('sourceFiles must be a non-empty array of file paths.');
|
|
80
|
+
}
|
|
81
|
+
files.push(await resolveContained(file, root, 'sourceFile'));
|
|
82
|
+
}
|
|
83
|
+
return { sourceFiles: files, explicitFiles: files, scope: 'sourceFiles' };
|
|
84
|
+
}
|
|
85
|
+
if (typeof payload.target === 'string' && payload.target.trim() !== '') {
|
|
86
|
+
const target = await resolveContained(payload.target, root, 'target');
|
|
87
|
+
const stat = await fsp.stat(target).catch(() => null);
|
|
88
|
+
if (!stat)
|
|
89
|
+
throw new CallerInputError(`target ${JSON.stringify(payload.target)} does not exist.`);
|
|
90
|
+
if (stat.isFile())
|
|
91
|
+
return { sourceFiles: [target], explicitFiles: [target], scope: target };
|
|
92
|
+
return { sourceFiles: await discoverSourceFiles(target, { includeTests: false }), explicitFiles: [], scope: target };
|
|
93
|
+
}
|
|
94
|
+
// Default to src/ — scanning the entire project root is too slow
|
|
95
|
+
// (node_modules, dist, .git, etc. make it hang on large projects)
|
|
96
|
+
const srcDir = nodePath.join(root, 'src');
|
|
97
|
+
const targetDir = existsSync(srcDir) ? srcDir : root;
|
|
98
|
+
return { sourceFiles: await discoverSourceFiles(targetDir, { includeTests: false }), explicitFiles: [], scope: targetDir };
|
|
99
|
+
}
|
|
100
|
+
/** #1021: one line per partially measured metric, naming the gap. */
|
|
101
|
+
function describePartialMetrics(partial) {
|
|
102
|
+
return (partial ?? []).map((p) => `Partial evidence: ${p.metric} measured over ${p.analysedFiles} of ${p.totalFiles} `
|
|
103
|
+
// coverageOfScope is already rounded down to 3 decimals; round only float noise here.
|
|
104
|
+
+ `file(s) (${Math.round(p.coverageOfScope * 1000) / 10}%); not analysed: `
|
|
105
|
+
+ p.failed.slice(0, 3).map((f) => f.reason).join('; ')
|
|
106
|
+
+ (p.failed.length > 3 ? `; and ${p.failed.length - 3} more` : '') + '.');
|
|
107
|
+
}
|
|
20
108
|
/** #996 (N3): reject a malformed `metrics` list instead of spreading a string into characters. */
|
|
21
109
|
function requestedMetricsFrom(metrics) {
|
|
22
110
|
if (metrics === undefined)
|
|
@@ -81,27 +169,13 @@ export function registerQualityHandlers(ctx) {
|
|
|
81
169
|
const coverageOverride = await coverageOverrideFor(payload);
|
|
82
170
|
const analyzer = ctx.getQualityAnalyzer();
|
|
83
171
|
const threshold = payload.threshold || 80;
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
if (payload.sourceFiles && payload.sourceFiles.length > 0) {
|
|
87
|
-
sourceFiles = payload.sourceFiles;
|
|
88
|
-
}
|
|
89
|
-
else if (payload.target) {
|
|
90
|
-
sourceFiles = await discoverSourceFiles(payload.target, { includeTests: false });
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// Default to src/ — scanning the entire project root is too slow
|
|
94
|
-
// (node_modules, dist, .git, etc. make it hang on large projects)
|
|
95
|
-
const path = await import('path');
|
|
96
|
-
const fs = await import('fs');
|
|
97
|
-
const srcDir = path.join(process.cwd(), 'src');
|
|
98
|
-
const targetDir = fs.existsSync(srcDir) ? srcDir : process.cwd();
|
|
99
|
-
sourceFiles = await discoverSourceFiles(targetDir, { includeTests: false });
|
|
100
|
-
}
|
|
172
|
+
// #1021 (B2): analyse what the caller scoped, contained in the project root.
|
|
173
|
+
const { sourceFiles, explicitFiles, scope } = await resolveAnalysisScope(payload);
|
|
101
174
|
if (sourceFiles.length === 0) {
|
|
102
175
|
// Nothing was analyzed: every requested metric is unmeasured (#996).
|
|
103
176
|
return ok({
|
|
104
|
-
|
|
177
|
+
// #1011: nothing was analysed, so there is no score (-1), not a score of 0.
|
|
178
|
+
qualityScore: UNMEASURED,
|
|
105
179
|
passed: false,
|
|
106
180
|
threshold,
|
|
107
181
|
metrics: {
|
|
@@ -117,6 +191,7 @@ export function registerQualityHandlers(ctx) {
|
|
|
117
191
|
warning: 'No source files found',
|
|
118
192
|
evidenceStatus: INSUFFICIENT_EVIDENCE,
|
|
119
193
|
unmeasured: requestedMetrics,
|
|
194
|
+
unmeasuredReasons: Object.fromEntries(requestedMetrics.map((m) => [m, 'no source files found to analyse'])),
|
|
120
195
|
measuredFailures: [],
|
|
121
196
|
gateEvaluated: false,
|
|
122
197
|
confidence: 0,
|
|
@@ -127,6 +202,7 @@ export function registerQualityHandlers(ctx) {
|
|
|
127
202
|
const result = await analyzer.analyzeQuality({
|
|
128
203
|
sourceFiles,
|
|
129
204
|
includeMetrics: requestedMetrics,
|
|
205
|
+
explicitFiles,
|
|
130
206
|
});
|
|
131
207
|
if (!result.success) {
|
|
132
208
|
return result;
|
|
@@ -156,13 +232,27 @@ export function registerQualityHandlers(ctx) {
|
|
|
156
232
|
maintainability: sentinel(metrics.maintainability),
|
|
157
233
|
// The analyzer has no security measurement; never report a placeholder.
|
|
158
234
|
security: sentinel(metrics.security),
|
|
235
|
+
// #1011: every requested metric appears, -1 when unmeasured.
|
|
236
|
+
...Object.fromEntries(requestedMetrics.map((name) => [name, sentinel(metrics[name])])),
|
|
159
237
|
...metrics,
|
|
160
238
|
},
|
|
239
|
+
unmeasuredReasons: unmeasuredReasons(sufficiency.unmeasured, report.unmeasured),
|
|
240
|
+
// #1021 round 2b: a score over a subset of the requested metrics (or over
|
|
241
|
+
// part of the files) names what it is based on — it is not a verdict.
|
|
242
|
+
...(insufficient || (report.partial?.length ?? 0) > 0
|
|
243
|
+
? { scoreBasis: report.metrics.map((m) => m.name) }
|
|
244
|
+
: {}),
|
|
161
245
|
recommendations: [
|
|
162
246
|
...measuredFailures.map(describeMeasuredFailure),
|
|
163
247
|
...describeMissingMetrics(sufficiency.unmeasured),
|
|
248
|
+
...describePartialMetrics(report.partial),
|
|
164
249
|
...recommendations,
|
|
165
250
|
],
|
|
251
|
+
...(report.partial && report.partial.length > 0 ? { partialMetrics: report.partial } : {}),
|
|
252
|
+
...(report.excluded && report.excluded.length > 0
|
|
253
|
+
? { excludedFiles: report.excluded.slice(0, MAX_EXCLUDED_LISTED), excludedCount: report.excluded.length }
|
|
254
|
+
: {}),
|
|
255
|
+
scope,
|
|
166
256
|
evidenceStatus: sufficiency.evidenceStatus,
|
|
167
257
|
unmeasured: sufficiency.unmeasured,
|
|
168
258
|
measuredFailures,
|
|
@@ -222,7 +222,10 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
222
222
|
const executionError = getTestRunnerExecutionError(runner, testFiles.join(', '), execution.status, { passed, failed, skipped }, diagnostics, json);
|
|
223
223
|
if (executionError)
|
|
224
224
|
return err(executionError);
|
|
225
|
-
|
|
225
|
+
// #1027 N5/NB5: this handler runs the tests without --coverage, so it has no
|
|
226
|
+
// coverage figure to return (null, never 0%). For test_execute_parallel the
|
|
227
|
+
// measured coverage + testsPassing are recorded by TestExecutorService.
|
|
228
|
+
return ok({ total, passed, failed, skipped, duration: 0, coverage: null, failedTests: [] });
|
|
226
229
|
}
|
|
227
230
|
}
|
|
228
231
|
}
|
|
@@ -64,7 +64,8 @@ export interface RelatedFailure {
|
|
|
64
64
|
export interface CoverageContext {
|
|
65
65
|
file: string;
|
|
66
66
|
lineCoverage: number;
|
|
67
|
-
|
|
67
|
+
/** `null` = no branch data was collected (#1027 NB4) — never a borrowed figure. */
|
|
68
|
+
branchCoverage: number | null;
|
|
68
69
|
uncoveredLines: number[];
|
|
69
70
|
riskScore: number;
|
|
70
71
|
}
|
|
@@ -12,6 +12,7 @@ import { createEvent } from '../../shared/events/domain-events.js';
|
|
|
12
12
|
import { toError } from '../../shared/error-utils.js';
|
|
13
13
|
import { LoggerFactory } from '../../logging/index.js';
|
|
14
14
|
import { addToCount } from '../../shared/utils/safe-record.js';
|
|
15
|
+
import { measuredFileCoverage } from '../../domains/quality-assessment/coverage-report-event.js';
|
|
15
16
|
const logger = LoggerFactory.create('defect-investigation');
|
|
16
17
|
export const DefectInvestigationEvents = {
|
|
17
18
|
DefectInvestigationStarted: 'coordination.DefectInvestigationStarted',
|
|
@@ -605,12 +606,14 @@ export class DefectInvestigationProtocol {
|
|
|
605
606
|
async getCoverageContext(file) {
|
|
606
607
|
try {
|
|
607
608
|
// Try per-file coverage (written by coverage-analyzer and test-executor)
|
|
608
|
-
|
|
609
|
+
// #1014: only measured records; legacy unstamped estimates are ignored.
|
|
610
|
+
const coverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
|
|
609
611
|
if (!coverage) {
|
|
610
612
|
return null;
|
|
611
613
|
}
|
|
612
|
-
// Calculate risk based on coverage
|
|
613
|
-
|
|
614
|
+
// Calculate risk based on coverage (an uncollected branch metric is
|
|
615
|
+
// left out, not counted as 0%).
|
|
616
|
+
const avgCoverage = coverage.branch === null ? coverage.line : (coverage.line + coverage.branch) / 2;
|
|
614
617
|
const riskScore = 1 - avgCoverage / 100;
|
|
615
618
|
return {
|
|
616
619
|
file,
|
|
@@ -10,6 +10,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
10
10
|
import { ok, err, } from '../../shared/types/index.js';
|
|
11
11
|
import { createEvent } from '../../shared/events/domain-events.js';
|
|
12
12
|
import { toErrorMessage, toError } from '../../shared/error-utils.js';
|
|
13
|
+
import { measuredCoverageSummary } from '../../domains/quality-assessment/coverage-report-event.js';
|
|
13
14
|
// ============================================================================
|
|
14
15
|
// Protocol Events
|
|
15
16
|
// ============================================================================
|
|
@@ -402,12 +403,14 @@ export class QualityGateProtocol {
|
|
|
402
403
|
async getCoverageMetrics(_releaseCandidate) {
|
|
403
404
|
try {
|
|
404
405
|
// Try to get latest coverage data from memory
|
|
405
|
-
|
|
406
|
+
// #1014: only a measured record is coverage evidence; a legacy
|
|
407
|
+
// unstamped or estimated record is "no data" (the gate fails closed).
|
|
408
|
+
const latestCoverage = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
406
409
|
if (!latestCoverage) {
|
|
407
410
|
return null;
|
|
408
411
|
}
|
|
409
|
-
// Get previous coverage for trend
|
|
410
|
-
const previousCoverage = await this.memory.get('coverage:previous');
|
|
412
|
+
// Get previous coverage for trend (measured baselines only, #1015)
|
|
413
|
+
const previousCoverage = measuredCoverageSummary(await this.memory.get('coverage:previous'));
|
|
411
414
|
let trend = 'stable';
|
|
412
415
|
if (previousCoverage) {
|
|
413
416
|
const delta = latestCoverage.line - previousCoverage.line;
|
|
@@ -418,9 +421,10 @@ export class QualityGateProtocol {
|
|
|
418
421
|
}
|
|
419
422
|
return {
|
|
420
423
|
line: latestCoverage.line,
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
+
// An uncollected metric has no evidence: 0 fails its check closed.
|
|
425
|
+
branch: latestCoverage.branch ?? 0,
|
|
426
|
+
function: latestCoverage.function ?? 0,
|
|
427
|
+
statement: latestCoverage.statement ?? 0,
|
|
424
428
|
trend,
|
|
425
429
|
};
|
|
426
430
|
}
|