agentic-qe 3.15.4 → 3.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/.claude/skills/qe-court/evals/qe-court.yaml +3 -2
- package/.claude/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +191 -0
- package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/assets/skills/qe-court/evals/qe-court.yaml +3 -2
- package/assets/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/bridge/captured-experience-bridge.js +7 -9
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-MHJBRXMK.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G64SD7J2.js → agent-handler-KAMYBU3S.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-G4UXFPKH.js → agent-memory-branch-2CAW3KUM.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
- package/dist/cli/chunks/{arena-63M3M6EW.js → arena-4OFLJ3R2.js} +2 -2
- package/dist/cli/chunks/{arena-QJMKYPHS.js → arena-QCCVIOAH.js} +4 -4
- package/dist/cli/chunks/{audit-UDFVTWSX.js → audit-RBDQJQJB.js} +3 -3
- package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-JLX2G56I.js → better-sqlite3-5JRACCDQ.js} +2 -2
- package/dist/cli/chunks/{brain-handler-PWF32LLW.js → brain-handler-W4QIIRT4.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-PB7QWXDP.js → branch-enumerator-IBNGI572.js} +2 -2
- package/dist/cli/chunks/{browser-CYNV2F3U.js → browser-GMSCVAOI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
- package/dist/cli/chunks/{chunk-S5D3HCGN.js → chunk-22OZIJAD.js} +2 -2
- package/dist/cli/chunks/{chunk-NBMQOP2R.js → chunk-24ZSGYC6.js} +1 -1
- package/dist/cli/chunks/{chunk-HFSBONCS.js → chunk-2CIDFR2H.js} +3 -3
- package/dist/cli/chunks/{chunk-A4OPQJ4A.js → chunk-2IWPJUVV.js} +5 -5
- package/dist/cli/chunks/{chunk-RI4JPBZD.js → chunk-2ZTWPMTK.js} +2 -2
- package/dist/cli/chunks/{chunk-ZURYZEHX.js → chunk-34MDMFET.js} +2 -2
- package/dist/cli/chunks/chunk-3DJNKNBR.js +742 -0
- package/dist/cli/chunks/{chunk-GJVRQBLI.js → chunk-3NJ7O3OH.js} +2 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +2 -0
- package/dist/cli/chunks/chunk-46HBVDMU.js +2 -0
- package/dist/cli/chunks/{chunk-SCL2OYN7.js → chunk-47Q7JL3V.js} +2 -2
- package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
- package/dist/cli/chunks/{chunk-3ZIVBTX6.js → chunk-4KOVHQXK.js} +2 -2
- package/dist/cli/chunks/{chunk-BBKLVHDQ.js → chunk-4POOJYXA.js} +1 -1
- package/dist/cli/chunks/{chunk-DAYMT7TH.js → chunk-5DH5QI7G.js} +26 -26
- package/dist/cli/chunks/{chunk-2534PXIV.js → chunk-5GIJU2ZY.js} +2 -2
- package/dist/cli/chunks/{chunk-MBV57LKC.js → chunk-5HAPS6VD.js} +2 -2
- package/dist/cli/chunks/{chunk-NIJMLEAX.js → chunk-5LST62QR.js} +2 -2
- package/dist/cli/chunks/{chunk-33IUCP34.js → chunk-5MT7DMD7.js} +2 -2
- package/dist/cli/chunks/{chunk-LRTF5RMG.js → chunk-5NC7QEJ6.js} +4 -4
- package/dist/cli/chunks/{chunk-SJB4KMZS.js → chunk-5UPIL62W.js} +3 -3
- package/dist/cli/chunks/{chunk-76PRW2KY.js → chunk-5VUIXDY2.js} +2 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
- package/dist/cli/chunks/{chunk-J3RNVHDH.js → chunk-624QRKQX.js} +1 -1
- package/dist/cli/chunks/{chunk-N6CRIUTO.js → chunk-66NW3ZB4.js} +2 -2
- package/dist/cli/chunks/{chunk-PCWZCXBD.js → chunk-6HWARQWV.js} +2 -2
- package/dist/cli/chunks/{chunk-VAXQUD5G.js → chunk-6MXAJBEA.js} +1 -1
- package/dist/cli/chunks/{chunk-LOLAEDZD.js → chunk-6R3FBFCJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ASKPTGUU.js → chunk-6RDVY26I.js} +2 -2
- package/dist/cli/chunks/{chunk-35A22AUL.js → chunk-6T6AHVLF.js} +1 -1
- package/dist/cli/chunks/{chunk-IKWAPHJA.js → chunk-6WOZUSSN.js} +2 -2
- package/dist/cli/chunks/chunk-72MQCZSM.js +2 -0
- package/dist/cli/chunks/chunk-7QVPMH25.js +3 -0
- package/dist/cli/chunks/{chunk-5H7MR6HP.js → chunk-7SAMMQVS.js} +1 -1
- package/dist/cli/chunks/{chunk-B7J3O2WM.js → chunk-7TJZDRDU.js} +1 -1
- package/dist/cli/chunks/{chunk-OFQDM73J.js → chunk-7TVIX4WL.js} +2 -2
- package/dist/cli/chunks/{chunk-SZWXUG36.js → chunk-7VTKR44N.js} +2 -2
- package/dist/cli/chunks/{chunk-5B5D5KCV.js → chunk-7XTANLTN.js} +1 -1
- package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
- package/dist/cli/chunks/{chunk-GAXTPQCZ.js → chunk-A74J23QB.js} +2 -2
- package/dist/cli/chunks/{chunk-K2VUYRMG.js → chunk-A7ANPS4E.js} +2 -2
- package/dist/cli/chunks/{chunk-WO4NSPLX.js → chunk-AJT3XDRD.js} +2 -2
- package/dist/cli/chunks/{chunk-LPSE6DOQ.js → chunk-ALCIUWFC.js} +1 -1
- package/dist/cli/chunks/{chunk-UK5HY6LC.js → chunk-AUN4FG7V.js} +1 -1
- package/dist/cli/chunks/{chunk-MGH4XIHH.js → chunk-AUOSHM63.js} +2 -2
- package/dist/cli/chunks/{chunk-HX5KQK7I.js → chunk-AX26QJ6T.js} +2 -2
- package/dist/cli/chunks/{chunk-BZWZTGMF.js → chunk-B7RHBKHL.js} +2 -2
- package/dist/cli/chunks/{chunk-I5A3HGO6.js → chunk-BAYGQRNP.js} +2 -2
- package/dist/cli/chunks/{chunk-3C2BFLYC.js → chunk-BIXRTOH3.js} +18 -18
- package/dist/cli/chunks/{chunk-EWUFVWRT.js → chunk-BO7UFNYV.js} +2 -2
- package/dist/cli/chunks/{chunk-6TMUZGM2.js → chunk-BUTGIVKW.js} +1 -1
- package/dist/cli/chunks/{chunk-2MU4WCMQ.js → chunk-BXATKI5S.js} +2 -2
- package/dist/cli/chunks/{chunk-HEDLZWPM.js → chunk-CCL436IU.js} +44 -33
- package/dist/cli/chunks/{chunk-6EHVPFHW.js → chunk-CEXNW5TR.js} +1 -1
- package/dist/cli/chunks/{chunk-2ICC4H6K.js → chunk-CLAMMGY3.js} +2 -2
- package/dist/cli/chunks/{chunk-BPGFCUDO.js → chunk-CR66HNAE.js} +1 -1
- package/dist/cli/chunks/{chunk-CFXFGQEN.js → chunk-CZBIREL5.js} +2 -2
- package/dist/cli/chunks/{chunk-Z56QTRRB.js → chunk-D5N2O5EH.js} +2 -2
- package/dist/cli/chunks/{chunk-M6SJALLA.js → chunk-DA7DGDTI.js} +2 -2
- package/dist/cli/chunks/{chunk-R47LNH5W.js → chunk-DLSFT6PO.js} +2 -2
- package/dist/cli/chunks/{chunk-6HTO4BLV.js → chunk-DQNUPEY5.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ5Z56OP.js → chunk-EECF4CMA.js} +1 -1
- package/dist/cli/chunks/{chunk-DFJGXXCL.js → chunk-EF5UHDCG.js} +1 -1
- package/dist/cli/chunks/{chunk-PJAXWCFC.js → chunk-EJ4KZFZN.js} +1 -1
- package/dist/cli/chunks/{chunk-RA3MI5WK.js → chunk-ELI4GDQO.js} +2 -2
- package/dist/cli/chunks/{chunk-BND6M2JX.js → chunk-F3KS3TAB.js} +2 -2
- package/dist/cli/chunks/{chunk-RB2SL5GD.js → chunk-F7A2UBZO.js} +2 -2
- package/dist/cli/chunks/{chunk-X5S5UEM6.js → chunk-FOJRPEIP.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP6ANUP7.js → chunk-FQ5N666N.js} +1 -1
- package/dist/cli/chunks/{chunk-LZSLJJII.js → chunk-FU7LNUD7.js} +2 -2
- package/dist/cli/chunks/{chunk-FDK2GF4G.js → chunk-GFB6BZWU.js} +2 -2
- package/dist/cli/chunks/{chunk-C5EN5WB6.js → chunk-GI5HWS4H.js} +1 -1
- package/dist/cli/chunks/{chunk-SIUUAKCE.js → chunk-GNYOHZVV.js} +1 -1
- package/dist/cli/chunks/{chunk-OOK6GPJR.js → chunk-GVRFSXY6.js} +2 -2
- package/dist/cli/chunks/{chunk-6QPW4OVH.js → chunk-GWM4M5NF.js} +1 -1
- package/dist/cli/chunks/{chunk-PMXWDTDK.js → chunk-HAN4MS5T.js} +2 -2
- package/dist/cli/chunks/{chunk-WW6WUMS7.js → chunk-HEGGV2PT.js} +2 -2
- package/dist/cli/chunks/{chunk-4GLR2S2M.js → chunk-HOEWMEF2.js} +2 -2
- package/dist/cli/chunks/{chunk-BY3IL56R.js → chunk-HZFK2Z2Z.js} +1 -1
- package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
- package/dist/cli/chunks/{chunk-LXYTC62V.js → chunk-IEPWO4XP.js} +2 -2
- package/dist/cli/chunks/{chunk-3MSBVOYW.js → chunk-ITIJ23K2.js} +2 -2
- package/dist/cli/chunks/{chunk-PEA4DVXW.js → chunk-IVJIHZSM.js} +1 -1
- package/dist/cli/chunks/{chunk-P7GM3EE7.js → chunk-JAPBSSFY.js} +1 -1
- package/dist/cli/chunks/{chunk-SOSJFEFB.js → chunk-JCE76MPP.js} +2 -2
- package/dist/cli/chunks/{chunk-YZ2AGC7O.js → chunk-JPJEAK4G.js} +1 -1
- package/dist/cli/chunks/{chunk-RG67RZIX.js → chunk-JYKQVYX2.js} +2 -2
- package/dist/cli/chunks/{chunk-W6TJXK5Y.js → chunk-K55EAWZ5.js} +2 -2
- package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
- package/dist/cli/chunks/{chunk-W3PPYNHF.js → chunk-KIDOBLUO.js} +2 -2
- package/dist/cli/chunks/{chunk-JL3TI43V.js → chunk-KYVIOC3C.js} +2 -2
- package/dist/cli/chunks/{chunk-WEDVLKRB.js → chunk-L2TDHJR3.js} +2 -2
- package/dist/cli/chunks/{chunk-5GWTJJEO.js → chunk-L4D3TPFP.js} +1 -1
- package/dist/cli/chunks/{chunk-PB2WSCBW.js → chunk-LAY7NCQK.js} +3 -3
- package/dist/cli/chunks/{chunk-T3BMCEQR.js → chunk-LCCTJ2PC.js} +2 -2
- package/dist/cli/chunks/{chunk-7INP6HZH.js → chunk-LJCEDTUM.js} +3 -3
- package/dist/cli/chunks/{chunk-DEJM2P5K.js → chunk-LMAEMVPA.js} +1 -1
- package/dist/cli/chunks/{chunk-HCDTLV5J.js → chunk-LZWJ5BMP.js} +2 -2
- package/dist/cli/chunks/{chunk-D7RVZ5C2.js → chunk-MP3FSUNB.js} +2 -2
- package/dist/cli/chunks/{chunk-ADF6LGHZ.js → chunk-MQCTLTGE.js} +2 -2
- package/dist/cli/chunks/{chunk-OHH6BUZK.js → chunk-MQTA6KIO.js} +1 -1
- package/dist/cli/chunks/{chunk-ISASRHZP.js → chunk-NBUXM5X6.js} +10 -6
- package/dist/cli/chunks/{chunk-KOLHZSEC.js → chunk-NHRF3V4B.js} +2 -2
- package/dist/cli/chunks/chunk-NMY4KTWA.js +16 -0
- package/dist/cli/chunks/chunk-NYS2GUNO.js +2 -0
- package/dist/cli/chunks/{chunk-EGHK6NMH.js → chunk-ONPPBLRB.js} +2 -2
- package/dist/cli/chunks/{chunk-YQ6BK7QC.js → chunk-OPDZBRIL.js} +2 -2
- package/dist/cli/chunks/{chunk-DPL4ZXTE.js → chunk-OQ4S6B7P.js} +1 -1
- package/dist/cli/chunks/{chunk-6HO3XRXE.js → chunk-ORBODZSO.js} +2 -2
- package/dist/cli/chunks/{chunk-GLKLEHK3.js → chunk-ORFL3YXB.js} +2 -2
- package/dist/cli/chunks/{chunk-I43QRLLB.js → chunk-P7DXVL2S.js} +2 -2
- package/dist/cli/chunks/chunk-PEMSXSP2.js +4 -0
- package/dist/cli/chunks/chunk-PS6WFCA4.js +6 -0
- package/dist/cli/chunks/{chunk-HEKCN5XQ.js → chunk-Q2RBOC7V.js} +2 -2
- package/dist/cli/chunks/{chunk-54XTJBHV.js → chunk-QLKUCMZC.js} +1 -1
- package/dist/cli/chunks/{chunk-3BDDOFYW.js → chunk-QLYO3H7E.js} +9 -9
- package/dist/cli/chunks/{chunk-VMSO6DMF.js → chunk-QS5KZYUZ.js} +2 -2
- package/dist/cli/chunks/{chunk-JFQDWAU3.js → chunk-R363XXGH.js} +2 -2
- package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
- package/dist/cli/chunks/{chunk-73PCVMGA.js → chunk-RFDFET3O.js} +2 -2
- package/dist/cli/chunks/{chunk-LJRZAALA.js → chunk-RHIQ6QO5.js} +357 -351
- package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
- package/dist/cli/chunks/{chunk-RJ5CZ7B6.js → chunk-RUTO67PT.js} +2 -2
- package/dist/cli/chunks/{chunk-DF4Y3HPO.js → chunk-RV6HSMKJ.js} +1 -1
- package/dist/cli/chunks/{chunk-54ITMOFM.js → chunk-SOSJWM3E.js} +4 -4
- package/dist/cli/chunks/{chunk-5SS2Z7JC.js → chunk-SV5BUYHH.js} +2 -2
- package/dist/cli/chunks/{chunk-XHCCH7UC.js → chunk-TL5GV3PR.js} +8 -8
- package/dist/cli/chunks/{chunk-ZKXZTIVF.js → chunk-TLUIO37P.js} +2 -2
- package/dist/cli/chunks/{chunk-2LL35V3A.js → chunk-TUDENMAE.js} +2 -2
- package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
- package/dist/cli/chunks/{chunk-2DRMTRBM.js → chunk-UB6DQGWM.js} +2 -2
- package/dist/cli/chunks/chunk-UHHMAKPE.js +3 -0
- package/dist/cli/chunks/{chunk-DBIK4OFX.js → chunk-ULCHPPW2.js} +1 -1
- package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
- package/dist/cli/chunks/{chunk-I6E4X3L3.js → chunk-VAYZ5QIE.js} +1 -1
- package/dist/cli/chunks/{chunk-G3ZUB3HD.js → chunk-VCONCVSY.js} +3 -3
- package/dist/cli/chunks/{chunk-7X2IVMXN.js → chunk-VVF337SV.js} +2 -2
- package/dist/cli/chunks/{chunk-EY5IUF7U.js → chunk-WKDWRRDT.js} +2 -2
- package/dist/cli/chunks/{chunk-FRBCX46J.js → chunk-X2DR27AY.js} +2 -2
- package/dist/cli/chunks/{chunk-I53365HG.js → chunk-X33F7NXH.js} +3 -3
- package/dist/cli/chunks/{chunk-MVTUFPM2.js → chunk-XBEI2JBA.js} +2 -2
- package/dist/cli/chunks/{chunk-OG4KHX7S.js → chunk-XBFQJZWX.js} +2 -2
- package/dist/cli/chunks/{chunk-DVE5SM5G.js → chunk-XFPQIWEH.js} +3 -3
- package/dist/cli/chunks/{chunk-RWZ4F44Y.js → chunk-XPB5BVU6.js} +2 -2
- package/dist/cli/chunks/{chunk-TVQPYP2Z.js → chunk-XQ53PZEF.js} +3 -3
- package/dist/cli/chunks/{chunk-73MTUM6F.js → chunk-XZ46CI35.js} +2 -2
- package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
- package/dist/cli/chunks/{chunk-BY5PLEPZ.js → chunk-YNG7E26C.js} +2 -2
- package/dist/cli/chunks/{chunk-YUWUFYHK.js → chunk-YXU35GGD.js} +1 -1
- package/dist/cli/chunks/{chunk-B7GJXQD2.js → chunk-ZCP4P6O2.js} +2 -2
- package/dist/cli/chunks/{chunk-LGA6J4I4.js → chunk-ZL5LJT7D.js} +2 -2
- package/dist/cli/chunks/{chunk-TB22Y3WW.js → chunk-ZOUEQ6DL.js} +1 -1
- package/dist/cli/chunks/{chunk-U2E5F3VZ.js → chunk-ZSBD4FUX.js} +2 -2
- package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
- package/dist/cli/chunks/{chunk-WYO5VN2L.js → chunk-ZUTFHGEO.js} +1 -1
- package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
- package/dist/cli/chunks/ci-config-2ZVV4OXL.js +2 -0
- package/dist/cli/chunks/{ci-output-BMJABAEX.js → ci-output-E45OGVPR.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-GYD5CMJQ.js → circuit-breaker-X73ITYZC.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-MMOYVBVD.js → claude-flow-setup-W4PPH46C.js} +2 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
- package/dist/cli/chunks/{cline-installer-B2SOZ44R.js → cline-installer-NUEPMWDE.js} +2 -2
- package/dist/cli/chunks/{code-V3FIRAXD.js → code-6WQHBS7G.js} +4 -4
- package/dist/cli/chunks/{code-index-extractor-CV6A756Z.js → code-index-extractor-BXQIFIFT.js} +2 -2
- package/dist/cli/chunks/{codex-installer-EUC6J47Y.js → codex-installer-Z337R2KH.js} +2 -2
- package/dist/cli/chunks/{completions-DQQIBAHR.js → completions-F5DMYFHV.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-HPXMXP5I.js → complexity-analyzer-W2SYPZDI.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RCIYXH6V.js → continuedev-installer-ZCHUIFTN.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-VUH32SHF.js → copilot-installer-M5JNODXF.js} +2 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
- package/dist/cli/chunks/{cost-tracker-YLCKLOAL.js → cost-tracker-LSYTHBHV.js} +2 -2
- package/dist/cli/chunks/coverage-PGMRS5SS.js +49 -0
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +2 -0
- package/dist/cli/chunks/{cursor-installer-B42FN62K.js → cursor-installer-XPUA73UW.js} +2 -2
- package/dist/cli/chunks/{daemon-DECQRQII.js → daemon-ITKDIYMW.js} +5 -5
- package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
- package/dist/cli/chunks/{dag-attention-scheduler-RY7CDYSC.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
- package/dist/cli/chunks/{detect-NW53BMJN.js → detect-DR7J6K4O.js} +2 -2
- package/dist/cli/chunks/{dist-node-LE6KHXAB.js → dist-node-LAJJBOUT.js} +2 -2
- package/dist/cli/chunks/{domain-handler-JGXFT4LW.js → domain-handler-OMSHCRMK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GY3RYKKK.js → domain-plugins-EQXSKC5K.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-CGBRXNTC.js → domain-transfer-FKRAGVSW.js} +2 -2
- package/dist/cli/chunks/dream-3UABDRZJ.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-JZFPCNL3.js +3 -0
- package/dist/cli/chunks/{eval-YPYIZQUR.js → eval-JSNNASBW.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
- package/dist/cli/chunks/{fast-paths-HYQTAF2S.js → fast-paths-YNMIBS2E.js} +2 -2
- package/dist/cli/chunks/{feature-flags-HNSAFFX2.js → feature-flags-SRLXDKBI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-YACUH6OW.js → feature-flags-VIR7O4L7.js} +2 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
- package/dist/cli/chunks/{fleet-6M3BP4OO.js → fleet-K2ED46EL.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QLD7KHXV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EZP333X4.js → heartbeat-handler-YYQI4WZM.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +2 -0
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-47CUCSAU.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SVNYDJZH.js → hnswlib-node-SE3MJJYS.js} +2 -2
- package/dist/cli/chunks/{hooks-6V5LMWP6.js → hooks-C572SRDH.js} +43 -43
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-L2FOBIFF.js → hypergraph-engine-35A6G3M5.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DU6Z57EE.js → hypergraph-handler-U2756CWI.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +2 -0
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +88 -0
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +2 -0
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-NHKYGJ7Q.js → kilocode-installer-32PX5YH7.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-24UK6GGR.js → kiro-installer-C4ROMMUS.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +2 -0
- package/dist/cli/chunks/learning-GEPVZGJQ.js +122 -0
- package/dist/cli/chunks/{llm-router-XRMI2VMG.js → llm-router-XRKTTJTX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
- package/dist/cli/chunks/{load-W5UWL5C7.js → load-XVH6HW7E.js} +2 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
- package/dist/cli/chunks/{mcp-N7ALQ4BL.js → mcp-IULSTM4Z.js} +2 -2
- package/dist/cli/chunks/{memory-WV52DLSA.js → memory-6K7IAU4T.js} +5 -5
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +2 -0
- package/dist/cli/chunks/memory-handlers-CG6DRLAW.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3FVTZCSO.js → multi-model-executor-VZDUYPLX.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-NTPWGHUW.js → opencode-installer-QUTXKNH4.js} +2 -2
- package/dist/cli/chunks/orchestrator-PCKKUWOP.js +452 -0
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-WWXHUH5U.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
- package/dist/cli/chunks/{pipeline-ZOKZFXTH.js → pipeline-O562GTOG.js} +2 -2
- package/dist/cli/chunks/{platform-CDNL322F.js → platform-PM7Q2AZS.js} +2 -2
- package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-FVJDU2JY.js → prime-radiant-advanced-wasm-6CFXTHC2.js} +2 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +2 -0
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +2 -0
- package/dist/cli/chunks/{protocol-handler-4YBN5R23.js → protocol-handler-PPGNSAOS.js} +2 -2
- package/dist/cli/chunks/{prove-BHDHY664.js → prove-WQ3BKRZG.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
- package/dist/cli/chunks/quality-C5WUU3AA.js +8 -0
- package/dist/cli/chunks/{quality-gate-WANE7TCN.js → quality-gate-WSSRKD5U.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +2 -0
- package/dist/cli/chunks/real-embeddings-CFQE7IRQ.js +2 -0
- package/dist/cli/chunks/{ref-validation-S7UWXQIP.js → ref-validation-DHKHXVZT.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-TEYOQYL6.js → roocode-installer-3PPODABV.js} +2 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +2 -0
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +2 -0
- package/dist/cli/chunks/{routing-handler-KDTLMRWD.js → routing-handler-JNXTGT6T.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-AOUDXCYE.js → ruvector-commands-6YLROPVP.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-4DWB4WRK.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-QI47Y354.js → rvf-store-integrity-YKR2ZNBF.js} +2 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +2 -0
- package/dist/cli/chunks/schedule-KD2VN6GB.js +2 -0
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +2 -0
- package/dist/cli/chunks/{security-SN6MWOJT.js → security-PWQTGDRU.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-LNRLFP5I.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-WU7PFKQM.js → shared-rvf-dual-writer-GWU6YQNS.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +2 -0
- package/dist/cli/chunks/{standalone-memory-F6FSRFWC.js → standalone-memory-46KKBSSV.js} +2 -2
- package/dist/cli/chunks/{status-handler-DHD5MS4G.js → status-handler-35T5FTDQ.js} +2 -2
- package/dist/cli/chunks/{structural-health-P6HPSQMR.js → structural-health-P7QPQWLO.js} +2 -2
- package/dist/cli/chunks/{sync-LISJGDSE.js → sync-W6Z4R4PL.js} +2 -2
- package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
- package/dist/cli/chunks/{task-handler-ZT44NT5Z.js → task-handler-5CX3ZYT7.js} +2 -2
- package/dist/cli/chunks/{task-handlers-R6DQ5324.js → task-handlers-DQZGOJNE.js} +3 -3
- package/dist/cli/chunks/{test-MUFHR4JQ.js → test-TPP53VVV.js} +12 -12
- package/dist/cli/chunks/{test-scheduling-TAUSLZJP.js → test-scheduling-WBV4UMQH.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
- package/dist/cli/chunks/{token-usage-IX65ECBR.js → token-usage-AKK37RB7.js} +2 -2
- package/dist/cli/chunks/{transformers-QKPSVW2W.js → transformers-7MASPELS.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-Z7PPA2JO.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
- package/dist/cli/chunks/{types-ULNNGGGH.js → types-AZ3BTXDP.js} +2 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +2 -0
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +2 -0
- package/dist/cli/chunks/{upgrade-ECI3YUYA.js → upgrade-L7OTDKEK.js} +2 -2
- package/dist/cli/chunks/{validate-3JKRUW2S.js → validate-O3QVFIGP.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-LZWANCIE.js → validate-swarm-2UGBGLTX.js} +2 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-N5V4A6XG.js → web-tree-sitter-J75IYPRO.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-5TBM5B3C.js → windsurf-installer-FQ5DBFCG.js} +2 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
- package/dist/cli/chunks/{witness-chain-MFP3HBWQ.js → witness-chain-I7TN4MXZ.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-D3NE3NQK.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-SRAT7LVY.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
- package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
- package/dist/cli/chunks/{workflow-M7TUYYXY.js → workflow-6BWTNVV6.js} +28 -28
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +2 -0
- package/dist/cli/chunks/wrappers-URVP25VU.js +2 -0
- package/dist/cli/commands/ci.js +53 -23
- package/dist/cli/commands/code.js +1 -0
- package/dist/cli/commands/coverage.d.ts +1 -0
- package/dist/cli/commands/coverage.js +182 -138
- package/dist/cli/commands/daemon.js +7 -1
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
- package/dist/cli/commands/learning.js +47 -7
- package/dist/cli/commands/quality.d.ts +12 -1
- package/dist/cli/commands/quality.js +51 -3
- package/dist/cli/commands/test.js +6 -7
- package/dist/cli/commands/workflow.js +9 -5
- package/dist/cli/handlers/init-guard.d.ts +13 -0
- package/dist/cli/handlers/init-guard.js +23 -0
- package/dist/cli/handlers/init-handler.d.ts +3 -0
- package/dist/cli/handlers/init-handler.js +9 -0
- package/dist/cli/handlers/interfaces.js +5 -1
- package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
- package/dist/cli/scheduler/persistent-scheduler.js +107 -41
- package/dist/cli/utils/ci-output.d.ts +22 -5
- package/dist/cli/utils/ci-output.js +33 -5
- package/dist/cli/utils/coverage-data.d.ts +10 -0
- package/dist/cli/utils/coverage-data.js +34 -65
- package/dist/cli/utils/coverage-verdict.d.ts +130 -0
- package/dist/cli/utils/coverage-verdict.js +193 -0
- package/dist/cli/utils/file-discovery.js +5 -0
- package/dist/contracts/verdicts.d.ts +14 -0
- package/dist/contracts/verdicts.js +44 -3
- package/dist/coordination/deterministic-actions.js +24 -13
- package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
- package/dist/coordination/handlers/coverage-handlers.js +150 -121
- package/dist/coordination/handlers/coverage-runner.d.ts +143 -0
- package/dist/coordination/handlers/coverage-runner.js +462 -0
- package/dist/coordination/handlers/coverage-target.d.ts +145 -0
- package/dist/coordination/handlers/coverage-target.js +314 -0
- package/dist/coordination/handlers/handler-types.d.ts +9 -0
- package/dist/coordination/handlers/handler-utils.d.ts +23 -1
- package/dist/coordination/handlers/handler-utils.js +90 -23
- package/dist/coordination/handlers/quality-handlers.js +209 -33
- package/dist/coordination/handlers/test-execution-handlers.js +4 -1
- package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
- package/dist/coordination/protocols/defect-investigation.js +6 -3
- package/dist/coordination/protocols/quality-gate.js +10 -6
- package/dist/coordination/result-saver.d.ts +22 -0
- package/dist/coordination/result-saver.js +130 -46
- package/dist/coordination/task-executor.d.ts +12 -0
- package/dist/coordination/task-executor.js +37 -1
- package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
- package/dist/domains/code-intelligence/coordinator.js +10 -32
- package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
- package/dist/domains/code-intelligence/plugin.js +5 -0
- package/dist/domains/code-intelligence/project-root-resolver.d.ts +50 -0
- package/dist/domains/code-intelligence/project-root-resolver.js +121 -0
- package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +33 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +36 -0
- package/dist/domains/coverage-analysis/coordinator.js +22 -7
- package/dist/domains/coverage-analysis/interfaces.d.ts +59 -0
- package/dist/domains/coverage-analysis/interfaces.js +6 -1
- package/dist/domains/coverage-analysis/plugin.js +7 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +7 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +85 -38
- package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
- package/dist/domains/defect-intelligence/plugin.js +4 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +6 -4
- package/dist/domains/learning-optimization/coordinator.js +4 -0
- package/dist/domains/learning-optimization/plugin.js +4 -0
- package/dist/domains/quality-assessment/coordinator-claim-verifier.js +2 -1
- package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
- package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
- package/dist/domains/quality-assessment/coordinator.js +18 -14
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +49 -0
- package/dist/domains/quality-assessment/coverage-report-event.js +58 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.d.ts +57 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.js +97 -0
- package/dist/domains/quality-assessment/index.d.ts +2 -2
- package/dist/domains/quality-assessment/index.js +1 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
- package/dist/domains/quality-assessment/plugin.js +8 -8
- package/dist/domains/quality-assessment/quality-evidence.d.ts +98 -4
- package/dist/domains/quality-assessment/quality-evidence.js +152 -8
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
- package/dist/domains/quality-assessment/services/quality-analyzer.js +203 -116
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +22 -16
- package/dist/domains/test-execution/interfaces.d.ts +10 -6
- package/dist/domains/test-execution/plugin.js +4 -0
- package/dist/domains/test-execution/services/test-executor.js +152 -102
- package/dist/domains/test-generation/coordinator.js +4 -0
- package/dist/domains/test-generation/plugin.js +4 -0
- package/dist/feedback/coverage-learner.js +4 -1
- package/dist/feedback/coverage-session-provenance.d.ts +29 -0
- package/dist/feedback/coverage-session-provenance.js +39 -0
- package/dist/init/orchestrator.js +2 -0
- package/dist/init/phases/09-assets.d.ts +4 -0
- package/dist/init/phases/09-assets.js +35 -0
- package/dist/init/retired-assets.d.ts +86 -0
- package/dist/init/retired-assets.js +230 -0
- package/dist/init/skills-installer.d.ts +2 -0
- package/dist/init/skills-installer.js +4 -0
- package/dist/init/types.d.ts +3 -0
- package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
- package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
- package/dist/integrations/ruvector/server-client.js +4 -12
- package/dist/kernel/project-root.d.ts +17 -0
- package/dist/kernel/project-root.js +54 -2
- package/dist/kernel/shared-dirs.d.ts +66 -0
- package/dist/kernel/shared-dirs.js +168 -0
- package/dist/learning/daily-log.js +2 -1
- package/dist/learning/experience-capture-middleware.d.ts +22 -0
- package/dist/learning/experience-capture-middleware.js +35 -0
- package/dist/learning/learnable-result.d.ts +16 -0
- package/dist/learning/learnable-result.js +24 -0
- package/dist/learning/pattern-mutation-error.d.ts +8 -0
- package/dist/learning/pattern-mutation-error.js +12 -0
- package/dist/learning/qe-reasoning-bank.d.ts +10 -0
- package/dist/learning/qe-reasoning-bank.js +50 -1
- package/dist/learning/rvf-reconcile.d.ts +39 -0
- package/dist/learning/rvf-reconcile.js +40 -0
- package/dist/learning/sqlite-persistence.d.ts +14 -0
- package/dist/learning/sqlite-persistence.js +36 -0
- package/dist/mcp/bundle.js +524 -507
- package/dist/mcp/handlers/domain-handler-configs.d.ts +49 -2
- package/dist/mcp/handlers/domain-handler-configs.js +79 -7
- package/dist/mcp/handlers/handler-factory.js +43 -14
- package/dist/mcp/handlers/wrapped-domain-handlers.js +7 -1
- package/dist/mcp/protocol-server.js +30 -4
- package/dist/mcp/tool-cache-scope.d.ts +31 -0
- package/dist/mcp/tool-cache-scope.js +71 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
- package/dist/mcp/tools/coverage-analysis/index.js +1 -0
- package/dist/mcp/types.d.ts +10 -0
- package/dist/optimization/session-cache.d.ts +19 -1
- package/dist/optimization/session-cache.js +36 -2
- package/dist/plugins/cache.js +2 -1
- package/dist/plugins/sources/github.js +2 -1
- package/dist/plugins/sources/npm.js +2 -1
- package/dist/shared/aqe-managed-dirs.d.ts +24 -0
- package/dist/shared/aqe-managed-dirs.js +56 -0
- package/dist/shared/events/domain-events.d.ts +20 -3
- package/dist/shared/events/domain-events.js +4 -0
- package/dist/shared/http/http-client.d.ts +6 -0
- package/dist/shared/http/http-client.js +13 -15
- package/dist/shared/io/file-reader.d.ts +26 -0
- package/dist/shared/io/file-reader.js +111 -17
- package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
- package/dist/shared/llm/providers/response-deadline.js +17 -5
- package/dist/shared/metrics/code-metrics.d.ts +24 -0
- package/dist/shared/metrics/code-metrics.js +93 -6
- package/dist/shared/metrics/index.d.ts +1 -1
- package/dist/workers/interfaces.d.ts +9 -1
- package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
- package/dist/workers/quality-daemon/coverage-delta.js +13 -6
- package/dist/workers/quality-daemon/index.js +6 -5
- package/dist/workers/quality-daemon/notification-service.js +3 -3
- package/dist/workers/quality-daemon/persistent-memory.d.ts +2 -2
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-manager.js +5 -1
- package/dist/workers/workers/coverage-tracker.js +69 -33
- package/dist/workers/workers/regression-monitor.d.ts +18 -1
- package/dist/workers/workers/regression-monitor.js +276 -117
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-T54G3TBK.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-HLCJJ3JM.js +0 -2
- package/dist/cli/chunks/base-VLD755UU.js +0 -2
- package/dist/cli/chunks/browser-workflow-6M6VLWRF.js +0 -2
- package/dist/cli/chunks/chunk-5XXLWJU7.js +0 -2
- package/dist/cli/chunks/chunk-AHVN3UQZ.js +0 -4
- package/dist/cli/chunks/chunk-AOKSLWON.js +0 -742
- package/dist/cli/chunks/chunk-CQ3WSTJ2.js +0 -16
- package/dist/cli/chunks/chunk-LY53L6NH.js +0 -2
- package/dist/cli/chunks/chunk-O7TMY4GS.js +0 -2
- package/dist/cli/chunks/chunk-QIAX3JJB.js +0 -3
- package/dist/cli/chunks/chunk-RJMBHZYL.js +0 -2
- package/dist/cli/chunks/chunk-UORI2CZ4.js +0 -2
- package/dist/cli/chunks/chunk-V3NZ23X6.js +0 -2
- package/dist/cli/chunks/chunk-WI5AEB7Q.js +0 -2
- package/dist/cli/chunks/chunk-XKIFNKHV.js +0 -2
- package/dist/cli/chunks/chunk-ZAOQIVHG.js +0 -5
- package/dist/cli/chunks/chunk-ZF5JTQEE.js +0 -4
- package/dist/cli/chunks/ci-NGMGB43T.js +0 -82
- package/dist/cli/chunks/client-FUHNNK5O.js +0 -2
- package/dist/cli/chunks/core-handlers-F7TLX4LM.js +0 -2
- package/dist/cli/chunks/coverage-IVKDV236.js +0 -27
- package/dist/cli/chunks/cross-domain-router-EGWPY67O.js +0 -2
- package/dist/cli/chunks/daemon-IPTOSCHM.js +0 -10
- package/dist/cli/chunks/dream-V4QN6OF5.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-65H4XHWR.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-4JXVF5PL.js +0 -40
- package/dist/cli/chunks/file-discovery-R73BYEXB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-3N3L6CRM.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-2BXJYDXI.js +0 -2
- package/dist/cli/chunks/hnsw-index-2DLI5OVO.js +0 -2
- package/dist/cli/chunks/hybrid-backend-OW4J65YH.js +0 -2
- package/dist/cli/chunks/impact-analyzer-ZH5I2RG6.js +0 -2
- package/dist/cli/chunks/init-handler-HETPWU67.js +0 -86
- package/dist/cli/chunks/init-wizard-NIKM3ZOK.js +0 -2
- package/dist/cli/chunks/kernel-2EOSVM6X.js +0 -2
- package/dist/cli/chunks/knowledge-graph-D3BPWNNO.js +0 -2
- package/dist/cli/chunks/learning-QLVRZNHT.js +0 -122
- package/dist/cli/chunks/llm-router-service-TJPPZFUN.js +0 -2
- package/dist/cli/chunks/load-test-RFT7IDOL.js +0 -2
- package/dist/cli/chunks/memory-backend-O2O4CFKZ.js +0 -2
- package/dist/cli/chunks/memory-handlers-DAEGUDBD.js +0 -2
- package/dist/cli/chunks/orchestrator-ORGJ6VAA.js +0 -452
- package/dist/cli/chunks/pattern-null-store-TUBNXS34.js +0 -2
- package/dist/cli/chunks/plugin-ZVLFNZZ4.js +0 -27
- package/dist/cli/chunks/project-root-UCHQH3QL.js +0 -2
- package/dist/cli/chunks/protocol-executor-6FQTTO3Y.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-TKPND56C.js +0 -2
- package/dist/cli/chunks/quality-46AK277P.js +0 -7
- package/dist/cli/chunks/queen-coordinator-DWMXLPJG.js +0 -2
- package/dist/cli/chunks/real-embeddings-56MNGJGJ.js +0 -2
- package/dist/cli/chunks/router-QIMUYRCC.js +0 -2
- package/dist/cli/chunks/routing-feedback-4OH5ZNF4.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-S6JBZL54.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TSGMLMYR.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-V74MVBHS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-Z7QOW47S.js +0 -2
- package/dist/cli/chunks/safe-db-JLOVBJNC.js +0 -2
- package/dist/cli/chunks/schedule-IM6XOBGR.js +0 -2
- package/dist/cli/chunks/scheduler-XL2SVVK5.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-2LB56LP4.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-LWMIIC4U.js +0 -2
- package/dist/cli/chunks/sync-SNAXAVCN.js +0 -2
- package/dist/cli/chunks/token-bootstrap-UGRH7OPU.js +0 -2
- package/dist/cli/chunks/unified-memory-F5IJY7W7.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-C3WAMAQL.js +0 -2
- package/dist/cli/chunks/unified-persistence-EWXXOTCB.js +0 -2
- package/dist/cli/chunks/visual-security-CKLTAIAB.js +0 -2
- package/dist/cli/chunks/witness-chain-Z6LWFEZS.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-5QWRFVUK.js +0 -2
- package/dist/cli/chunks/witness-key-manager-FYZXQTLJ.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-OFTAR2NA.js +0 -2
- package/dist/cli/chunks/wrappers-COU73OQ6.js +0 -2
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
|
@@ -3,10 +3,53 @@
|
|
|
3
3
|
* Real code analysis for complexity, maintainability, and quality metrics
|
|
4
4
|
*/
|
|
5
5
|
import { TypeScriptParser } from '../parsers/index.js';
|
|
6
|
-
import { FileReader } from '../io/index.js';
|
|
6
|
+
import { FileReader, PathTraversalError } from '../io/index.js';
|
|
7
7
|
import { treeSitterRegistry } from '../parsers/multi-language-parser.js';
|
|
8
8
|
import { getLanguageFromExtension } from '../types/test-frameworks.js';
|
|
9
9
|
import { calculateCognitiveComplexity } from './cognitive-complexity.js';
|
|
10
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
11
|
+
/** git-style binary sniff: a NUL within the first 8 KB. */
|
|
12
|
+
const BINARY_SNIFF_CHARS = 8192;
|
|
13
|
+
/** How far into a file the generated-file conventions are looked for. */
|
|
14
|
+
const GENERATED_SNIFF_CHARS = 1024;
|
|
15
|
+
/** Go's convention (golang.org/s/generatedcode), one full line. */
|
|
16
|
+
const GO_GENERATED_LINE = /^\/\/ Code generated .* DO NOT EDIT\.$/m;
|
|
17
|
+
/** `@generated` used as a tag (not part of a word, e.g. not `@generatedAt`). */
|
|
18
|
+
const GENERATED_TAG = /(?:^|[\s*/])@generated(?![\w-])/;
|
|
19
|
+
/** The file's first comment block: a leading block comment or run of line comments. */
|
|
20
|
+
function firstCommentBlock(content) {
|
|
21
|
+
const text = content.replace(/^\uFEFF/, '').replace(/^#![^\n]*\n/, '').trimStart();
|
|
22
|
+
if (text.startsWith('/*')) {
|
|
23
|
+
const close = text.indexOf('*/');
|
|
24
|
+
return close >= 0 ? text.slice(0, close + 2) : text;
|
|
25
|
+
}
|
|
26
|
+
const lines = [];
|
|
27
|
+
for (const line of text.split('\n')) {
|
|
28
|
+
if (!line.trimStart().startsWith('//'))
|
|
29
|
+
break;
|
|
30
|
+
lines.push(line);
|
|
31
|
+
}
|
|
32
|
+
return lines.join('\n');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* #1021 round 2b: generated only by convention — Go's
|
|
36
|
+
* "// Code generated … DO NOT EDIT." line near the top, or an `@generated`
|
|
37
|
+
* tag in the first comment block. Prose such as "DO NOT EDIT the retry
|
|
38
|
+
* constants", or `@generated` mentioned later in the file, is handwritten.
|
|
39
|
+
*/
|
|
40
|
+
function isGeneratedSource(content) {
|
|
41
|
+
const head = content.slice(0, GENERATED_SNIFF_CHARS).replace(/\r\n/g, '\n');
|
|
42
|
+
return GO_GENERATED_LINE.test(head) || GENERATED_TAG.test(firstCommentBlock(head));
|
|
43
|
+
}
|
|
44
|
+
/** Exclusion decided from the file name alone. */
|
|
45
|
+
function excludedByName(filePath) {
|
|
46
|
+
const name = filePath.split(/[\\/]/).pop() ?? filePath;
|
|
47
|
+
if (/\.d\.(ts|mts|cts)$/i.test(name))
|
|
48
|
+
return 'type declaration file';
|
|
49
|
+
if (/\.min\.(js|mjs|cjs)$/i.test(name))
|
|
50
|
+
return 'minified bundle';
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
10
53
|
// ============================================================================
|
|
11
54
|
// Code Metrics Analyzer
|
|
12
55
|
// ============================================================================
|
|
@@ -15,17 +58,55 @@ export class CodeMetricsAnalyzer {
|
|
|
15
58
|
fileReader;
|
|
16
59
|
constructor() {
|
|
17
60
|
this.parser = new TypeScriptParser();
|
|
18
|
-
|
|
61
|
+
// #1021: reads inside the AQE project root (AQE_PROJECT_ROOT, else the
|
|
62
|
+
// detected root — not merely the process cwd) are contained by realpath,
|
|
63
|
+
// so in-root names like `[...slug].tsx`, dot-dirs and deep paths are
|
|
64
|
+
// readable; anything outside keeps the legacy path validation.
|
|
65
|
+
this.fileReader = new FileReader({ projectRoot: findProjectRoot() });
|
|
19
66
|
}
|
|
20
67
|
/**
|
|
21
68
|
* Analyze a single file for all metrics
|
|
22
69
|
*/
|
|
23
70
|
async analyzeFile(filePath) {
|
|
71
|
+
return (await this.analyzeWithDiagnostics(filePath)).metrics;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* #1011 / #1021: analyse a file and say whether its metrics are evidence.
|
|
75
|
+
* Binary, generated, minified and declaration files — and files the reader
|
|
76
|
+
* refuses by policy — are `excluded`; unreadable or unparseable source is
|
|
77
|
+
* `failed`. Callers must not treat either as a measurement.
|
|
78
|
+
*/
|
|
79
|
+
async analyzeFileDetailed(filePath) {
|
|
80
|
+
const byName = excludedByName(filePath);
|
|
81
|
+
if (byName)
|
|
82
|
+
return { status: 'excluded', metrics: null, reason: `${filePath}: ${byName}` };
|
|
83
|
+
const { metrics, content, readError, parseFailure, parsedAsSource } = await this.analyzeWithDiagnostics(filePath);
|
|
84
|
+
if (readError) {
|
|
85
|
+
return readError instanceof PathTraversalError
|
|
86
|
+
? { status: 'excluded', metrics: null, reason: `${filePath} was refused by the file reader (${readError.message})` }
|
|
87
|
+
: { status: 'failed', metrics: null, reason: `${filePath} could not be read (${readError.message})` };
|
|
88
|
+
}
|
|
89
|
+
// git-style sniff, except that TS/JS which parses cleanly is source even
|
|
90
|
+
// with a raw NUL inside a string literal (seen in real repos).
|
|
91
|
+
const sourceDespiteNul = parsedAsSource && !parseFailure;
|
|
92
|
+
if (content !== undefined && !sourceDespiteNul && content.slice(0, BINARY_SNIFF_CHARS).includes('\u0000')) {
|
|
93
|
+
return { status: 'excluded', metrics: null, reason: `${filePath} has binary content` };
|
|
94
|
+
}
|
|
95
|
+
if (content !== undefined && isGeneratedSource(content)) {
|
|
96
|
+
return { status: 'excluded', metrics: null, reason: `${filePath} is a generated file` };
|
|
97
|
+
}
|
|
98
|
+
if (parseFailure)
|
|
99
|
+
return { status: 'failed', metrics, reason: `${filePath} could not be parsed (${parseFailure})` };
|
|
100
|
+
return { status: 'measured', metrics };
|
|
101
|
+
}
|
|
102
|
+
/** Compute metrics, reporting read errors and parse failures separately. */
|
|
103
|
+
async analyzeWithDiagnostics(filePath) {
|
|
24
104
|
const contentResult = await this.fileReader.readFile(filePath);
|
|
25
105
|
if (!contentResult.success) {
|
|
26
|
-
return null;
|
|
106
|
+
return { metrics: null, readError: contentResult.error };
|
|
27
107
|
}
|
|
28
108
|
const content = contentResult.value;
|
|
109
|
+
let parseFailure;
|
|
29
110
|
const lines = content.split('\n');
|
|
30
111
|
// Count different types of lines
|
|
31
112
|
const { codeLines, commentLines, blankLines } = this.countLines(lines);
|
|
@@ -41,6 +122,10 @@ export class CodeMetricsAnalyzer {
|
|
|
41
122
|
if (['ts', 'tsx', 'js', 'jsx'].includes(ext)) {
|
|
42
123
|
try {
|
|
43
124
|
const ast = this.parser.parseFile(fileName, content);
|
|
125
|
+
const syntaxErrors = ast.parseDiagnostics?.length ?? 0;
|
|
126
|
+
if (syntaxErrors > 0) {
|
|
127
|
+
parseFailure = `${syntaxErrors} syntax error${syntaxErrors === 1 ? '' : 's'}`;
|
|
128
|
+
}
|
|
44
129
|
// Extract functions and calculate complexity
|
|
45
130
|
const functions = this.parser.extractFunctions(ast);
|
|
46
131
|
functionCount = functions.length;
|
|
@@ -62,8 +147,9 @@ export class CodeMetricsAnalyzer {
|
|
|
62
147
|
}
|
|
63
148
|
}
|
|
64
149
|
}
|
|
65
|
-
catch {
|
|
66
|
-
// If parsing fails, use heuristic analysis
|
|
150
|
+
catch (error) {
|
|
151
|
+
// If parsing fails, use heuristic analysis — an estimate, not a measurement (#1011)
|
|
152
|
+
parseFailure ??= error instanceof Error ? error.message : String(error);
|
|
67
153
|
cyclomaticComplexity = this.estimateCyclomaticComplexity(content);
|
|
68
154
|
cognitiveComplexity = this.estimateCognitiveComplexity(content);
|
|
69
155
|
}
|
|
@@ -98,7 +184,7 @@ export class CodeMetricsAnalyzer {
|
|
|
98
184
|
const halsteadMetrics = this.calculateHalsteadMetrics(content);
|
|
99
185
|
// Calculate maintainability index
|
|
100
186
|
const maintainabilityIndex = this.calculateMaintainabilityIndex(halsteadMetrics.volume, cyclomaticComplexity, codeLines);
|
|
101
|
-
|
|
187
|
+
const metrics = {
|
|
102
188
|
path: filePath,
|
|
103
189
|
linesOfCode: codeLines,
|
|
104
190
|
linesOfComments: commentLines,
|
|
@@ -111,6 +197,7 @@ export class CodeMetricsAnalyzer {
|
|
|
111
197
|
classCount,
|
|
112
198
|
maxNestingDepth,
|
|
113
199
|
};
|
|
200
|
+
return { metrics, content, parseFailure, parsedAsSource: ['ts', 'tsx', 'js', 'jsx'].includes(ext) };
|
|
114
201
|
}
|
|
115
202
|
/**
|
|
116
203
|
* Analyze function-level metrics
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Exports for code quality and system metrics analysis
|
|
4
4
|
*/
|
|
5
5
|
export { CodeMetricsAnalyzer, getCodeMetricsAnalyzer } from './code-metrics';
|
|
6
|
-
export type { FileMetrics, FunctionMetrics, HalsteadMetrics, DuplicationResult, DuplicateBlock, } from './code-metrics';
|
|
6
|
+
export type { FileMetrics, FileAnalysisOutcome, FileAnalysisStatus, FunctionMetrics, HalsteadMetrics, DuplicationResult, DuplicateBlock, } from './code-metrics';
|
|
7
7
|
export { SystemMetricsCollector, getSystemMetricsCollector } from './system-metrics';
|
|
8
8
|
export type { SystemMetrics, CpuMetrics, MemoryMetrics, ProcessMetrics, MetricSample, HttpMetrics, } from './system-metrics';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -152,8 +152,16 @@ export interface WorkerEvent {
|
|
|
152
152
|
readonly timestamp: Date;
|
|
153
153
|
readonly payload: unknown;
|
|
154
154
|
}
|
|
155
|
+
/** Read options; `namespace` reads another domain's records (e.g. quality evidence). */
|
|
156
|
+
export interface WorkerMemoryReadOptions {
|
|
157
|
+
namespace?: string;
|
|
158
|
+
}
|
|
155
159
|
export interface WorkerMemory {
|
|
156
|
-
|
|
160
|
+
/**
|
|
161
|
+
* Read a key. Without `namespace` the worker's own namespace is used; a
|
|
162
|
+
* backend without namespaces ignores it.
|
|
163
|
+
*/
|
|
164
|
+
get<T>(key: string, options?: WorkerMemoryReadOptions): Promise<T | undefined>;
|
|
157
165
|
set<T>(key: string, value: T): Promise<void>;
|
|
158
166
|
search(pattern: string): Promise<string[]>;
|
|
159
167
|
}
|
|
@@ -17,9 +17,10 @@ export interface CoverageSnapshot {
|
|
|
17
17
|
}
|
|
18
18
|
export interface CoverageMetrics {
|
|
19
19
|
readonly line: number;
|
|
20
|
-
|
|
21
|
-
readonly
|
|
22
|
-
readonly
|
|
20
|
+
/** `null` = not collected in that snapshot (#1027 B2) — never a fake 0. */
|
|
21
|
+
readonly branch: number | null;
|
|
22
|
+
readonly function: number | null;
|
|
23
|
+
readonly statement: number | null;
|
|
23
24
|
}
|
|
24
25
|
export interface FileCoverage {
|
|
25
26
|
readonly line: number;
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Enqueues test suggestion tasks when gaps exceed threshold.
|
|
10
10
|
*/
|
|
11
|
+
import { measuredCoverageSummary } from '../../domains/quality-assessment/coverage-report-event.js';
|
|
12
|
+
/** Delta of a metric; 0 when either side did not collect it (#1027 B2). */
|
|
13
|
+
function metricDelta(now, before) {
|
|
14
|
+
return now === null || before === null ? 0 : now - before;
|
|
15
|
+
}
|
|
11
16
|
const DEFAULTS = {
|
|
12
17
|
regressionThreshold: 2,
|
|
13
18
|
gapThreshold: 60,
|
|
@@ -39,12 +44,12 @@ export class CoverageDeltaAnalyzer {
|
|
|
39
44
|
const previous = previousRaw;
|
|
40
45
|
const overallDelta = {
|
|
41
46
|
line: current.overall.line - previous.overall.line,
|
|
42
|
-
branch: current.overall.branch
|
|
43
|
-
function: current.overall.function
|
|
44
|
-
statement: current.overall.statement
|
|
47
|
+
branch: metricDelta(current.overall.branch, previous.overall.branch ?? null),
|
|
48
|
+
function: metricDelta(current.overall.function, previous.overall.function ?? null),
|
|
49
|
+
statement: metricDelta(current.overall.statement, previous.overall.statement ?? null),
|
|
45
50
|
};
|
|
46
51
|
const regressionDetected = overallDelta.line < -this.options.regressionThreshold ||
|
|
47
|
-
overallDelta.branch < -this.options.regressionThreshold;
|
|
52
|
+
(overallDelta.branch ?? 0) < -this.options.regressionThreshold;
|
|
48
53
|
// Compute per-file deltas
|
|
49
54
|
const filesToCheck = changedFiles ?? Object.keys(current.files);
|
|
50
55
|
const affectedFiles = [];
|
|
@@ -90,7 +95,9 @@ export class CoverageDeltaAnalyzer {
|
|
|
90
95
|
* Build a CoverageSnapshot from raw lcov/istanbul data stored in memory.
|
|
91
96
|
*/
|
|
92
97
|
async buildSnapshot(memory) {
|
|
93
|
-
const
|
|
98
|
+
const raw = await memory.get('coverage:latest');
|
|
99
|
+
// #1014: only a measured record is a snapshot; legacy/estimated records are not.
|
|
100
|
+
const latest = measuredCoverageSummary(raw);
|
|
94
101
|
if (!latest)
|
|
95
102
|
return undefined;
|
|
96
103
|
return {
|
|
@@ -101,7 +108,7 @@ export class CoverageDeltaAnalyzer {
|
|
|
101
108
|
function: latest.function,
|
|
102
109
|
statement: latest.statement,
|
|
103
110
|
},
|
|
104
|
-
files:
|
|
111
|
+
files: raw && typeof raw.files === 'object' ? raw.files : {},
|
|
105
112
|
};
|
|
106
113
|
}
|
|
107
114
|
// ============================================================================
|
|
@@ -306,11 +306,12 @@ export class QualityDaemon {
|
|
|
306
306
|
try {
|
|
307
307
|
const snapshot = await this.coverageDelta.buildSnapshot(memory);
|
|
308
308
|
if (snapshot) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
snapshot.overall.statement
|
|
313
|
-
|
|
309
|
+
// #1027 B2: average the metrics that were collected; an uncollected
|
|
310
|
+
// one (null) is left out rather than dragging health down as 0.
|
|
311
|
+
const collected = [snapshot.overall.line, snapshot.overall.branch,
|
|
312
|
+
snapshot.overall.function, snapshot.overall.statement]
|
|
313
|
+
.filter((v) => typeof v === 'number');
|
|
314
|
+
this._coverageHealth = Math.round(collected.reduce((a, v) => a + v, 0) / collected.length);
|
|
314
315
|
this._lastCoverageCheck = now;
|
|
315
316
|
}
|
|
316
317
|
}
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* Notification types: gate_failure, coverage_drop, flaky_detected, suggestion_available
|
|
9
9
|
*/
|
|
10
10
|
import { writeFileSync, mkdirSync, readdirSync, readFileSync, unlinkSync } from 'fs';
|
|
11
|
-
import { join
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { getProjectStorePath } from '../../kernel/project-root.js';
|
|
12
13
|
const DEFAULTS = {
|
|
13
|
-
notificationsDir: resolve(process.cwd(), '.agentic-qe', 'notifications'),
|
|
14
14
|
maxNotifications: 200,
|
|
15
15
|
};
|
|
16
16
|
export class NotificationService {
|
|
@@ -20,7 +20,7 @@ export class NotificationService {
|
|
|
20
20
|
urlValidator;
|
|
21
21
|
_sentCount = 0;
|
|
22
22
|
constructor(options) {
|
|
23
|
-
this.notificationsDir = options?.notificationsDir ??
|
|
23
|
+
this.notificationsDir = options?.notificationsDir ?? getProjectStorePath('notifications');
|
|
24
24
|
this.maxNotifications = options?.maxNotifications ?? DEFAULTS.maxNotifications;
|
|
25
25
|
this.webhookUrl = options?.webhookUrl;
|
|
26
26
|
this.urlValidator = options?.urlValidator;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Resolves Finding 2: CLI daemon previously used throwaway in-memory Map.
|
|
9
9
|
*/
|
|
10
|
-
import type { WorkerMemory } from '../interfaces';
|
|
10
|
+
import type { WorkerMemory, WorkerMemoryReadOptions } from '../interfaces';
|
|
11
11
|
/**
|
|
12
12
|
* Interface matching the subset of UnifiedMemoryManager we need,
|
|
13
13
|
* to avoid circular dependency on the full kernel module.
|
|
@@ -24,7 +24,7 @@ export interface KVBackend {
|
|
|
24
24
|
export declare class PersistentWorkerMemory implements WorkerMemory {
|
|
25
25
|
private readonly backend;
|
|
26
26
|
constructor(backend: KVBackend);
|
|
27
|
-
get<T>(key: string): Promise<T | undefined>;
|
|
27
|
+
get<T>(key: string, options?: WorkerMemoryReadOptions): Promise<T | undefined>;
|
|
28
28
|
set<T>(key: string, value: T): Promise<void>;
|
|
29
29
|
search(pattern: string): Promise<string[]>;
|
|
30
30
|
}
|
|
@@ -17,8 +17,8 @@ export class PersistentWorkerMemory {
|
|
|
17
17
|
constructor(backend) {
|
|
18
18
|
this.backend = backend;
|
|
19
19
|
}
|
|
20
|
-
async get(key) {
|
|
21
|
-
return this.backend.kvGet(key, NAMESPACE);
|
|
20
|
+
async get(key, options) {
|
|
21
|
+
return this.backend.kvGet(key, options?.namespace ?? NAMESPACE);
|
|
22
22
|
}
|
|
23
23
|
async set(key, value) {
|
|
24
24
|
await this.backend.kvSet(key, value, NAMESPACE);
|
|
@@ -48,7 +48,11 @@ class InMemoryWorkerEventBus {
|
|
|
48
48
|
*/
|
|
49
49
|
class InMemoryWorkerMemory {
|
|
50
50
|
store = new Map();
|
|
51
|
-
async get(key) {
|
|
51
|
+
async get(key, options) {
|
|
52
|
+
// This process-local store holds only worker keys: no other domain's
|
|
53
|
+
// namespace (e.g. quality evidence) lives here.
|
|
54
|
+
if (options?.namespace)
|
|
55
|
+
return undefined;
|
|
52
56
|
return this.store.get(key);
|
|
53
57
|
}
|
|
54
58
|
async set(key, value) {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - Uncovered critical paths
|
|
10
10
|
*/
|
|
11
11
|
import { BaseWorker } from '../base-worker.js';
|
|
12
|
+
import { measuredCoverageSummary } from '../../domains/quality-assessment/coverage-report-event.js';
|
|
12
13
|
const CONFIG = {
|
|
13
14
|
id: 'coverage-tracker',
|
|
14
15
|
name: 'Coverage Tracker',
|
|
@@ -33,46 +34,69 @@ export class CoverageTrackerWorker extends BaseWorker {
|
|
|
33
34
|
// Collect coverage metrics
|
|
34
35
|
const trend = await this.collectCoverageTrend(context);
|
|
35
36
|
const gaps = await this.identifyCoverageGaps(context);
|
|
36
|
-
// Analyze coverage thresholds
|
|
37
|
-
this.analyzeCoverageThresholds(trend.current, findings, recommendations);
|
|
38
37
|
// Analyze coverage gaps
|
|
39
38
|
this.analyzeCoverageGaps(gaps, findings, recommendations);
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
// #1018: with no measured coverage there is nothing to compare, nothing
|
|
40
|
+
// to store, and no figure to report — never a fake 0% record.
|
|
41
|
+
const current = trend.current;
|
|
42
|
+
if (current) {
|
|
43
|
+
this.analyzeCoverageThresholds(current, findings, recommendations);
|
|
44
|
+
this.analyzeCoverageTrends({ ...trend, current }, findings, recommendations);
|
|
45
|
+
await context.memory.set('coverage:current', current);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
findings.push({
|
|
49
|
+
type: 'coverage-unmeasured',
|
|
50
|
+
severity: 'info',
|
|
51
|
+
domain: 'coverage-analysis',
|
|
52
|
+
title: 'Coverage Unmeasured',
|
|
53
|
+
description: 'No measured coverage exists yet (no instrumented coverage:latest). Nothing was ' +
|
|
54
|
+
'tracked; this is not 0% coverage. Run tests with coverage or coverage_analyze_sublinear.',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
44
57
|
await context.memory.set('coverage:gaps', gaps);
|
|
45
|
-
const healthScore = this.calculateHealthScore(
|
|
58
|
+
const healthScore = this.calculateHealthScore(current, gaps);
|
|
46
59
|
context.logger.info('Coverage tracking complete', {
|
|
47
60
|
healthScore,
|
|
61
|
+
measured: current !== null,
|
|
48
62
|
findingsCount: findings.length,
|
|
49
63
|
gapsFound: gaps.length,
|
|
50
64
|
});
|
|
65
|
+
const pct = (v) => (v === null || v === undefined ? 'n/a' : `${v}%`);
|
|
51
66
|
return this.createResult(Date.now() - startTime, {
|
|
52
|
-
itemsAnalyzed: gaps.length + 4, // 4 coverage types + gaps
|
|
53
|
-
issuesFound: findings.length,
|
|
67
|
+
itemsAnalyzed: gaps.length + (current ? 4 : 0), // 4 coverage types + gaps
|
|
68
|
+
issuesFound: findings.filter(f => f.severity !== 'info').length,
|
|
54
69
|
healthScore,
|
|
55
|
-
trend: this.determineTrend(trend),
|
|
70
|
+
trend: current ? this.determineTrend({ ...trend, current }) : 'stable',
|
|
56
71
|
domainMetrics: {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
coverageMeasured: current ? 'true' : 'false',
|
|
73
|
+
lineCoverage: current ? pct(current.line) : 'unmeasured',
|
|
74
|
+
branchCoverage: current ? pct(current.branch) : 'unmeasured',
|
|
75
|
+
functionCoverage: current ? pct(current.function) : 'unmeasured',
|
|
76
|
+
statementCoverage: current ? pct(current.statement) : 'unmeasured',
|
|
61
77
|
gapsCount: gaps.length,
|
|
62
78
|
},
|
|
63
79
|
}, findings, recommendations);
|
|
64
80
|
}
|
|
65
81
|
async collectCoverageTrend(context) {
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
const
|
|
82
|
+
// A previous record is a baseline only if it was measured (#1018): older
|
|
83
|
+
// versions wrote an all-zero coverage:current when nothing was measured.
|
|
84
|
+
const stored = await context.memory.get('coverage:current');
|
|
85
|
+
const previous = stored && stored.measured === true && Number.isFinite(stored.line) ? stored : undefined;
|
|
86
|
+
// Real coverage comes from coverage:latest (written by coverage-analyzer,
|
|
87
|
+
// test-executor and the quality-assessment listener). Only a record
|
|
88
|
+
// stamped measured:true with finite figures counts (#1008/#1018); a
|
|
89
|
+
// missing, legacy or estimated record means "unmeasured" — never zeros.
|
|
90
|
+
const latest = measuredCoverageSummary(await context.memory.get('coverage:latest'));
|
|
91
|
+
if (!latest)
|
|
92
|
+
return { current: null, previous };
|
|
70
93
|
const current = {
|
|
71
|
-
line: latest
|
|
72
|
-
branch: latest
|
|
73
|
-
function: latest
|
|
74
|
-
statement: latest
|
|
94
|
+
line: latest.line,
|
|
95
|
+
branch: latest.branch,
|
|
96
|
+
function: latest.function,
|
|
97
|
+
statement: latest.statement,
|
|
75
98
|
timestamp: new Date(),
|
|
99
|
+
measured: true,
|
|
76
100
|
};
|
|
77
101
|
return { current, previous };
|
|
78
102
|
}
|
|
@@ -112,7 +136,7 @@ export class CoverageTrackerWorker extends BaseWorker {
|
|
|
112
136
|
context: { current: coverage.line, target: thresholds.line },
|
|
113
137
|
});
|
|
114
138
|
}
|
|
115
|
-
if (coverage.branch < thresholds.branch) {
|
|
139
|
+
if (coverage.branch !== null && coverage.branch < thresholds.branch) {
|
|
116
140
|
findings.push({
|
|
117
141
|
type: 'low-branch-coverage',
|
|
118
142
|
severity: coverage.branch < 50 ? 'high' : 'medium',
|
|
@@ -131,7 +155,7 @@ export class CoverageTrackerWorker extends BaseWorker {
|
|
|
131
155
|
autoFixable: true,
|
|
132
156
|
});
|
|
133
157
|
}
|
|
134
|
-
if (coverage.function < thresholds.function) {
|
|
158
|
+
if (coverage.function !== null && coverage.function < thresholds.function) {
|
|
135
159
|
findings.push({
|
|
136
160
|
type: 'low-function-coverage',
|
|
137
161
|
severity: 'medium',
|
|
@@ -195,7 +219,8 @@ export class CoverageTrackerWorker extends BaseWorker {
|
|
|
195
219
|
if (!trend.previous)
|
|
196
220
|
return;
|
|
197
221
|
const lineChange = trend.current.line - trend.previous.line;
|
|
198
|
-
const branchChange = trend.current.branch
|
|
222
|
+
const branchChange = trend.current.branch !== null && trend.previous.branch !== null
|
|
223
|
+
? trend.current.branch - trend.previous.branch : 0;
|
|
199
224
|
if (lineChange < -2) {
|
|
200
225
|
findings.push({
|
|
201
226
|
type: 'coverage-regression',
|
|
@@ -235,21 +260,32 @@ export class CoverageTrackerWorker extends BaseWorker {
|
|
|
235
260
|
}
|
|
236
261
|
}
|
|
237
262
|
calculateHealthScore(coverage, gaps) {
|
|
238
|
-
// Weight: line 25%, branch 25%, function 20%, statement 20%, gaps 10%
|
|
239
|
-
const lineScore = (coverage.line / 100) * 25;
|
|
240
|
-
const branchScore = (coverage.branch / 100) * 25;
|
|
241
|
-
const functionScore = (coverage.function / 100) * 20;
|
|
242
|
-
const statementScore = (coverage.statement / 100) * 20;
|
|
243
263
|
// Gaps penalty
|
|
244
264
|
const highRiskGaps = gaps.filter((g) => g.riskScore > 0.8).length;
|
|
245
265
|
const gapsScore = Math.max(0, 10 - highRiskGaps * 2);
|
|
246
|
-
|
|
266
|
+
// #1018: with no measurement, only the gap component is known; it is
|
|
267
|
+
// scaled to 0-100 rather than mixed with invented 0% coverage.
|
|
268
|
+
if (!coverage)
|
|
269
|
+
return gapsScore * 10;
|
|
270
|
+
// Weight: line 25%, branch 25%, function 20%, statement 20%, gaps 10%.
|
|
271
|
+
// An uncollected metric is left out and the rest are re-weighted.
|
|
272
|
+
const parts = [
|
|
273
|
+
[coverage.line, 25], [coverage.branch, 25], [coverage.function, 20], [coverage.statement, 20],
|
|
274
|
+
];
|
|
275
|
+
const present = parts.filter((p) => p[0] !== null);
|
|
276
|
+
const weight = present.reduce((a, [, w]) => a + w, 0);
|
|
277
|
+
const coverageScore = present.reduce((a, [v, w]) => a + (v / 100) * w, 0) * (90 / weight);
|
|
278
|
+
return Math.round(coverageScore + gapsScore);
|
|
247
279
|
}
|
|
248
280
|
determineTrend(trend) {
|
|
249
281
|
if (!trend.previous)
|
|
250
282
|
return 'stable';
|
|
251
|
-
const
|
|
252
|
-
|
|
283
|
+
const avg = (c) => {
|
|
284
|
+
const values = [c.line, c.branch, c.function, c.statement].filter((v) => v !== null);
|
|
285
|
+
return values.reduce((a, v) => a + v, 0) / values.length;
|
|
286
|
+
};
|
|
287
|
+
const avgCurrent = avg(trend.current);
|
|
288
|
+
const avgPrevious = avg(trend.previous);
|
|
253
289
|
if (avgCurrent > avgPrevious + 1)
|
|
254
290
|
return 'improving';
|
|
255
291
|
if (avgCurrent < avgPrevious - 1)
|
|
@@ -6,14 +6,31 @@
|
|
|
6
6
|
* - Test result regressions
|
|
7
7
|
* - Performance regressions
|
|
8
8
|
* - Coverage regressions
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
|
+
* #1028: every figure comes from measured evidence — the stamped
|
|
11
|
+
* `coverage:latest` record and the latest testsPassing quality evidence (with
|
|
12
|
+
* its run's recorded result). Nothing measured → nothing stored or compared.
|
|
10
13
|
*/
|
|
11
14
|
import { BaseWorker } from '../base-worker';
|
|
12
15
|
import { WorkerContext, WorkerResult } from '../interfaces';
|
|
13
16
|
export declare class RegressionMonitorWorker extends BaseWorker {
|
|
14
17
|
constructor();
|
|
15
18
|
protected doExecute(context: WorkerContext): Promise<WorkerResult>;
|
|
19
|
+
/** Why a stored baseline is (not) used: absent, legacy (unstamped), stamped but malformed, or measured. */
|
|
20
|
+
private baselineStatus;
|
|
21
|
+
/**
|
|
22
|
+
* #1028: the current snapshot from measured sources only — the stamped
|
|
23
|
+
* `coverage:latest` (same validator as the coverage tracker and the quality
|
|
24
|
+
* gate) and the latest usable testsPassing evidence (same validation as the
|
|
25
|
+
* gate) with that run's recorded `test-run:<runId>` result. `null` when
|
|
26
|
+
* nothing is measured.
|
|
27
|
+
*/
|
|
16
28
|
private collectCurrentSnapshot;
|
|
29
|
+
private collectMeasuredTests;
|
|
30
|
+
/**
|
|
31
|
+
* Compare two measured snapshots. A metric is compared only when both sides
|
|
32
|
+
* measured it; an uncollected (`null`) metric is never compared (#1028).
|
|
33
|
+
*/
|
|
17
34
|
private detectRegressions;
|
|
18
35
|
private analyzeRegressions;
|
|
19
36
|
private getDomainForType;
|