agentic-qe 3.15.4 → 3.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/.claude/skills/qe-court/evals/qe-court.yaml +3 -2
- package/.claude/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +191 -0
- package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
- package/assets/skills/qe-court/evals/qe-court.yaml +3 -2
- package/assets/skills/qe-quality-assessment/schemas/output.json +12 -2
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/bridge/captured-experience-bridge.js +7 -9
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-MHJBRXMK.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G64SD7J2.js → agent-handler-KAMYBU3S.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-G4UXFPKH.js → agent-memory-branch-2CAW3KUM.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
- package/dist/cli/chunks/{arena-63M3M6EW.js → arena-4OFLJ3R2.js} +2 -2
- package/dist/cli/chunks/{arena-QJMKYPHS.js → arena-QCCVIOAH.js} +4 -4
- package/dist/cli/chunks/{audit-UDFVTWSX.js → audit-RBDQJQJB.js} +3 -3
- package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-JLX2G56I.js → better-sqlite3-5JRACCDQ.js} +2 -2
- package/dist/cli/chunks/{brain-handler-PWF32LLW.js → brain-handler-W4QIIRT4.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-PB7QWXDP.js → branch-enumerator-IBNGI572.js} +2 -2
- package/dist/cli/chunks/{browser-CYNV2F3U.js → browser-GMSCVAOI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
- package/dist/cli/chunks/{chunk-S5D3HCGN.js → chunk-22OZIJAD.js} +2 -2
- package/dist/cli/chunks/{chunk-NBMQOP2R.js → chunk-24ZSGYC6.js} +1 -1
- package/dist/cli/chunks/{chunk-HFSBONCS.js → chunk-2CIDFR2H.js} +3 -3
- package/dist/cli/chunks/{chunk-A4OPQJ4A.js → chunk-2IWPJUVV.js} +5 -5
- package/dist/cli/chunks/{chunk-RI4JPBZD.js → chunk-2ZTWPMTK.js} +2 -2
- package/dist/cli/chunks/{chunk-ZURYZEHX.js → chunk-34MDMFET.js} +2 -2
- package/dist/cli/chunks/chunk-3DJNKNBR.js +742 -0
- package/dist/cli/chunks/{chunk-GJVRQBLI.js → chunk-3NJ7O3OH.js} +2 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +2 -0
- package/dist/cli/chunks/chunk-46HBVDMU.js +2 -0
- package/dist/cli/chunks/{chunk-SCL2OYN7.js → chunk-47Q7JL3V.js} +2 -2
- package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
- package/dist/cli/chunks/{chunk-3ZIVBTX6.js → chunk-4KOVHQXK.js} +2 -2
- package/dist/cli/chunks/{chunk-BBKLVHDQ.js → chunk-4POOJYXA.js} +1 -1
- package/dist/cli/chunks/{chunk-DAYMT7TH.js → chunk-5DH5QI7G.js} +26 -26
- package/dist/cli/chunks/{chunk-2534PXIV.js → chunk-5GIJU2ZY.js} +2 -2
- package/dist/cli/chunks/{chunk-MBV57LKC.js → chunk-5HAPS6VD.js} +2 -2
- package/dist/cli/chunks/{chunk-NIJMLEAX.js → chunk-5LST62QR.js} +2 -2
- package/dist/cli/chunks/{chunk-33IUCP34.js → chunk-5MT7DMD7.js} +2 -2
- package/dist/cli/chunks/{chunk-LRTF5RMG.js → chunk-5NC7QEJ6.js} +4 -4
- package/dist/cli/chunks/{chunk-SJB4KMZS.js → chunk-5UPIL62W.js} +3 -3
- package/dist/cli/chunks/{chunk-76PRW2KY.js → chunk-5VUIXDY2.js} +2 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
- package/dist/cli/chunks/{chunk-J3RNVHDH.js → chunk-624QRKQX.js} +1 -1
- package/dist/cli/chunks/{chunk-N6CRIUTO.js → chunk-66NW3ZB4.js} +2 -2
- package/dist/cli/chunks/{chunk-PCWZCXBD.js → chunk-6HWARQWV.js} +2 -2
- package/dist/cli/chunks/{chunk-VAXQUD5G.js → chunk-6MXAJBEA.js} +1 -1
- package/dist/cli/chunks/{chunk-LOLAEDZD.js → chunk-6R3FBFCJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ASKPTGUU.js → chunk-6RDVY26I.js} +2 -2
- package/dist/cli/chunks/{chunk-35A22AUL.js → chunk-6T6AHVLF.js} +1 -1
- package/dist/cli/chunks/{chunk-IKWAPHJA.js → chunk-6WOZUSSN.js} +2 -2
- package/dist/cli/chunks/chunk-72MQCZSM.js +2 -0
- package/dist/cli/chunks/chunk-7QVPMH25.js +3 -0
- package/dist/cli/chunks/{chunk-5H7MR6HP.js → chunk-7SAMMQVS.js} +1 -1
- package/dist/cli/chunks/{chunk-B7J3O2WM.js → chunk-7TJZDRDU.js} +1 -1
- package/dist/cli/chunks/{chunk-OFQDM73J.js → chunk-7TVIX4WL.js} +2 -2
- package/dist/cli/chunks/{chunk-SZWXUG36.js → chunk-7VTKR44N.js} +2 -2
- package/dist/cli/chunks/{chunk-5B5D5KCV.js → chunk-7XTANLTN.js} +1 -1
- package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
- package/dist/cli/chunks/{chunk-GAXTPQCZ.js → chunk-A74J23QB.js} +2 -2
- package/dist/cli/chunks/{chunk-K2VUYRMG.js → chunk-A7ANPS4E.js} +2 -2
- package/dist/cli/chunks/{chunk-WO4NSPLX.js → chunk-AJT3XDRD.js} +2 -2
- package/dist/cli/chunks/{chunk-LPSE6DOQ.js → chunk-ALCIUWFC.js} +1 -1
- package/dist/cli/chunks/{chunk-UK5HY6LC.js → chunk-AUN4FG7V.js} +1 -1
- package/dist/cli/chunks/{chunk-MGH4XIHH.js → chunk-AUOSHM63.js} +2 -2
- package/dist/cli/chunks/{chunk-HX5KQK7I.js → chunk-AX26QJ6T.js} +2 -2
- package/dist/cli/chunks/{chunk-BZWZTGMF.js → chunk-B7RHBKHL.js} +2 -2
- package/dist/cli/chunks/{chunk-I5A3HGO6.js → chunk-BAYGQRNP.js} +2 -2
- package/dist/cli/chunks/{chunk-3C2BFLYC.js → chunk-BIXRTOH3.js} +18 -18
- package/dist/cli/chunks/{chunk-EWUFVWRT.js → chunk-BO7UFNYV.js} +2 -2
- package/dist/cli/chunks/{chunk-6TMUZGM2.js → chunk-BUTGIVKW.js} +1 -1
- package/dist/cli/chunks/{chunk-2MU4WCMQ.js → chunk-BXATKI5S.js} +2 -2
- package/dist/cli/chunks/{chunk-HEDLZWPM.js → chunk-CCL436IU.js} +44 -33
- package/dist/cli/chunks/{chunk-6EHVPFHW.js → chunk-CEXNW5TR.js} +1 -1
- package/dist/cli/chunks/{chunk-2ICC4H6K.js → chunk-CLAMMGY3.js} +2 -2
- package/dist/cli/chunks/{chunk-BPGFCUDO.js → chunk-CR66HNAE.js} +1 -1
- package/dist/cli/chunks/{chunk-CFXFGQEN.js → chunk-CZBIREL5.js} +2 -2
- package/dist/cli/chunks/{chunk-Z56QTRRB.js → chunk-D5N2O5EH.js} +2 -2
- package/dist/cli/chunks/{chunk-M6SJALLA.js → chunk-DA7DGDTI.js} +2 -2
- package/dist/cli/chunks/{chunk-R47LNH5W.js → chunk-DLSFT6PO.js} +2 -2
- package/dist/cli/chunks/{chunk-6HTO4BLV.js → chunk-DQNUPEY5.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ5Z56OP.js → chunk-EECF4CMA.js} +1 -1
- package/dist/cli/chunks/{chunk-DFJGXXCL.js → chunk-EF5UHDCG.js} +1 -1
- package/dist/cli/chunks/{chunk-PJAXWCFC.js → chunk-EJ4KZFZN.js} +1 -1
- package/dist/cli/chunks/{chunk-RA3MI5WK.js → chunk-ELI4GDQO.js} +2 -2
- package/dist/cli/chunks/{chunk-BND6M2JX.js → chunk-F3KS3TAB.js} +2 -2
- package/dist/cli/chunks/{chunk-RB2SL5GD.js → chunk-F7A2UBZO.js} +2 -2
- package/dist/cli/chunks/{chunk-X5S5UEM6.js → chunk-FOJRPEIP.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP6ANUP7.js → chunk-FQ5N666N.js} +1 -1
- package/dist/cli/chunks/{chunk-LZSLJJII.js → chunk-FU7LNUD7.js} +2 -2
- package/dist/cli/chunks/{chunk-FDK2GF4G.js → chunk-GFB6BZWU.js} +2 -2
- package/dist/cli/chunks/{chunk-C5EN5WB6.js → chunk-GI5HWS4H.js} +1 -1
- package/dist/cli/chunks/{chunk-SIUUAKCE.js → chunk-GNYOHZVV.js} +1 -1
- package/dist/cli/chunks/{chunk-OOK6GPJR.js → chunk-GVRFSXY6.js} +2 -2
- package/dist/cli/chunks/{chunk-6QPW4OVH.js → chunk-GWM4M5NF.js} +1 -1
- package/dist/cli/chunks/{chunk-PMXWDTDK.js → chunk-HAN4MS5T.js} +2 -2
- package/dist/cli/chunks/{chunk-WW6WUMS7.js → chunk-HEGGV2PT.js} +2 -2
- package/dist/cli/chunks/{chunk-4GLR2S2M.js → chunk-HOEWMEF2.js} +2 -2
- package/dist/cli/chunks/{chunk-BY3IL56R.js → chunk-HZFK2Z2Z.js} +1 -1
- package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
- package/dist/cli/chunks/{chunk-LXYTC62V.js → chunk-IEPWO4XP.js} +2 -2
- package/dist/cli/chunks/{chunk-3MSBVOYW.js → chunk-ITIJ23K2.js} +2 -2
- package/dist/cli/chunks/{chunk-PEA4DVXW.js → chunk-IVJIHZSM.js} +1 -1
- package/dist/cli/chunks/{chunk-P7GM3EE7.js → chunk-JAPBSSFY.js} +1 -1
- package/dist/cli/chunks/{chunk-SOSJFEFB.js → chunk-JCE76MPP.js} +2 -2
- package/dist/cli/chunks/{chunk-YZ2AGC7O.js → chunk-JPJEAK4G.js} +1 -1
- package/dist/cli/chunks/{chunk-RG67RZIX.js → chunk-JYKQVYX2.js} +2 -2
- package/dist/cli/chunks/{chunk-W6TJXK5Y.js → chunk-K55EAWZ5.js} +2 -2
- package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
- package/dist/cli/chunks/{chunk-W3PPYNHF.js → chunk-KIDOBLUO.js} +2 -2
- package/dist/cli/chunks/{chunk-JL3TI43V.js → chunk-KYVIOC3C.js} +2 -2
- package/dist/cli/chunks/{chunk-WEDVLKRB.js → chunk-L2TDHJR3.js} +2 -2
- package/dist/cli/chunks/{chunk-5GWTJJEO.js → chunk-L4D3TPFP.js} +1 -1
- package/dist/cli/chunks/{chunk-PB2WSCBW.js → chunk-LAY7NCQK.js} +3 -3
- package/dist/cli/chunks/{chunk-T3BMCEQR.js → chunk-LCCTJ2PC.js} +2 -2
- package/dist/cli/chunks/{chunk-7INP6HZH.js → chunk-LJCEDTUM.js} +3 -3
- package/dist/cli/chunks/{chunk-DEJM2P5K.js → chunk-LMAEMVPA.js} +1 -1
- package/dist/cli/chunks/{chunk-HCDTLV5J.js → chunk-LZWJ5BMP.js} +2 -2
- package/dist/cli/chunks/{chunk-D7RVZ5C2.js → chunk-MP3FSUNB.js} +2 -2
- package/dist/cli/chunks/{chunk-ADF6LGHZ.js → chunk-MQCTLTGE.js} +2 -2
- package/dist/cli/chunks/{chunk-OHH6BUZK.js → chunk-MQTA6KIO.js} +1 -1
- package/dist/cli/chunks/{chunk-ISASRHZP.js → chunk-NBUXM5X6.js} +10 -6
- package/dist/cli/chunks/{chunk-KOLHZSEC.js → chunk-NHRF3V4B.js} +2 -2
- package/dist/cli/chunks/chunk-NMY4KTWA.js +16 -0
- package/dist/cli/chunks/chunk-NYS2GUNO.js +2 -0
- package/dist/cli/chunks/{chunk-EGHK6NMH.js → chunk-ONPPBLRB.js} +2 -2
- package/dist/cli/chunks/{chunk-YQ6BK7QC.js → chunk-OPDZBRIL.js} +2 -2
- package/dist/cli/chunks/{chunk-DPL4ZXTE.js → chunk-OQ4S6B7P.js} +1 -1
- package/dist/cli/chunks/{chunk-6HO3XRXE.js → chunk-ORBODZSO.js} +2 -2
- package/dist/cli/chunks/{chunk-GLKLEHK3.js → chunk-ORFL3YXB.js} +2 -2
- package/dist/cli/chunks/{chunk-I43QRLLB.js → chunk-P7DXVL2S.js} +2 -2
- package/dist/cli/chunks/chunk-PEMSXSP2.js +4 -0
- package/dist/cli/chunks/chunk-PS6WFCA4.js +6 -0
- package/dist/cli/chunks/{chunk-HEKCN5XQ.js → chunk-Q2RBOC7V.js} +2 -2
- package/dist/cli/chunks/{chunk-54XTJBHV.js → chunk-QLKUCMZC.js} +1 -1
- package/dist/cli/chunks/{chunk-3BDDOFYW.js → chunk-QLYO3H7E.js} +9 -9
- package/dist/cli/chunks/{chunk-VMSO6DMF.js → chunk-QS5KZYUZ.js} +2 -2
- package/dist/cli/chunks/{chunk-JFQDWAU3.js → chunk-R363XXGH.js} +2 -2
- package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
- package/dist/cli/chunks/{chunk-73PCVMGA.js → chunk-RFDFET3O.js} +2 -2
- package/dist/cli/chunks/{chunk-LJRZAALA.js → chunk-RHIQ6QO5.js} +357 -351
- package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
- package/dist/cli/chunks/{chunk-RJ5CZ7B6.js → chunk-RUTO67PT.js} +2 -2
- package/dist/cli/chunks/{chunk-DF4Y3HPO.js → chunk-RV6HSMKJ.js} +1 -1
- package/dist/cli/chunks/{chunk-54ITMOFM.js → chunk-SOSJWM3E.js} +4 -4
- package/dist/cli/chunks/{chunk-5SS2Z7JC.js → chunk-SV5BUYHH.js} +2 -2
- package/dist/cli/chunks/{chunk-XHCCH7UC.js → chunk-TL5GV3PR.js} +8 -8
- package/dist/cli/chunks/{chunk-ZKXZTIVF.js → chunk-TLUIO37P.js} +2 -2
- package/dist/cli/chunks/{chunk-2LL35V3A.js → chunk-TUDENMAE.js} +2 -2
- package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
- package/dist/cli/chunks/{chunk-2DRMTRBM.js → chunk-UB6DQGWM.js} +2 -2
- package/dist/cli/chunks/chunk-UHHMAKPE.js +3 -0
- package/dist/cli/chunks/{chunk-DBIK4OFX.js → chunk-ULCHPPW2.js} +1 -1
- package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
- package/dist/cli/chunks/{chunk-I6E4X3L3.js → chunk-VAYZ5QIE.js} +1 -1
- package/dist/cli/chunks/{chunk-G3ZUB3HD.js → chunk-VCONCVSY.js} +3 -3
- package/dist/cli/chunks/{chunk-7X2IVMXN.js → chunk-VVF337SV.js} +2 -2
- package/dist/cli/chunks/{chunk-EY5IUF7U.js → chunk-WKDWRRDT.js} +2 -2
- package/dist/cli/chunks/{chunk-FRBCX46J.js → chunk-X2DR27AY.js} +2 -2
- package/dist/cli/chunks/{chunk-I53365HG.js → chunk-X33F7NXH.js} +3 -3
- package/dist/cli/chunks/{chunk-MVTUFPM2.js → chunk-XBEI2JBA.js} +2 -2
- package/dist/cli/chunks/{chunk-OG4KHX7S.js → chunk-XBFQJZWX.js} +2 -2
- package/dist/cli/chunks/{chunk-DVE5SM5G.js → chunk-XFPQIWEH.js} +3 -3
- package/dist/cli/chunks/{chunk-RWZ4F44Y.js → chunk-XPB5BVU6.js} +2 -2
- package/dist/cli/chunks/{chunk-TVQPYP2Z.js → chunk-XQ53PZEF.js} +3 -3
- package/dist/cli/chunks/{chunk-73MTUM6F.js → chunk-XZ46CI35.js} +2 -2
- package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
- package/dist/cli/chunks/{chunk-BY5PLEPZ.js → chunk-YNG7E26C.js} +2 -2
- package/dist/cli/chunks/{chunk-YUWUFYHK.js → chunk-YXU35GGD.js} +1 -1
- package/dist/cli/chunks/{chunk-B7GJXQD2.js → chunk-ZCP4P6O2.js} +2 -2
- package/dist/cli/chunks/{chunk-LGA6J4I4.js → chunk-ZL5LJT7D.js} +2 -2
- package/dist/cli/chunks/{chunk-TB22Y3WW.js → chunk-ZOUEQ6DL.js} +1 -1
- package/dist/cli/chunks/{chunk-U2E5F3VZ.js → chunk-ZSBD4FUX.js} +2 -2
- package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
- package/dist/cli/chunks/{chunk-WYO5VN2L.js → chunk-ZUTFHGEO.js} +1 -1
- package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
- package/dist/cli/chunks/ci-config-2ZVV4OXL.js +2 -0
- package/dist/cli/chunks/{ci-output-BMJABAEX.js → ci-output-E45OGVPR.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-GYD5CMJQ.js → circuit-breaker-X73ITYZC.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-MMOYVBVD.js → claude-flow-setup-W4PPH46C.js} +2 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
- package/dist/cli/chunks/{cline-installer-B2SOZ44R.js → cline-installer-NUEPMWDE.js} +2 -2
- package/dist/cli/chunks/{code-V3FIRAXD.js → code-6WQHBS7G.js} +4 -4
- package/dist/cli/chunks/{code-index-extractor-CV6A756Z.js → code-index-extractor-BXQIFIFT.js} +2 -2
- package/dist/cli/chunks/{codex-installer-EUC6J47Y.js → codex-installer-Z337R2KH.js} +2 -2
- package/dist/cli/chunks/{completions-DQQIBAHR.js → completions-F5DMYFHV.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-HPXMXP5I.js → complexity-analyzer-W2SYPZDI.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RCIYXH6V.js → continuedev-installer-ZCHUIFTN.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-VUH32SHF.js → copilot-installer-M5JNODXF.js} +2 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
- package/dist/cli/chunks/{cost-tracker-YLCKLOAL.js → cost-tracker-LSYTHBHV.js} +2 -2
- package/dist/cli/chunks/coverage-PGMRS5SS.js +49 -0
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +2 -0
- package/dist/cli/chunks/{cursor-installer-B42FN62K.js → cursor-installer-XPUA73UW.js} +2 -2
- package/dist/cli/chunks/{daemon-DECQRQII.js → daemon-ITKDIYMW.js} +5 -5
- package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
- package/dist/cli/chunks/{dag-attention-scheduler-RY7CDYSC.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
- package/dist/cli/chunks/{detect-NW53BMJN.js → detect-DR7J6K4O.js} +2 -2
- package/dist/cli/chunks/{dist-node-LE6KHXAB.js → dist-node-LAJJBOUT.js} +2 -2
- package/dist/cli/chunks/{domain-handler-JGXFT4LW.js → domain-handler-OMSHCRMK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GY3RYKKK.js → domain-plugins-EQXSKC5K.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-CGBRXNTC.js → domain-transfer-FKRAGVSW.js} +2 -2
- package/dist/cli/chunks/dream-3UABDRZJ.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-JZFPCNL3.js +3 -0
- package/dist/cli/chunks/{eval-YPYIZQUR.js → eval-JSNNASBW.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
- package/dist/cli/chunks/{fast-paths-HYQTAF2S.js → fast-paths-YNMIBS2E.js} +2 -2
- package/dist/cli/chunks/{feature-flags-HNSAFFX2.js → feature-flags-SRLXDKBI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-YACUH6OW.js → feature-flags-VIR7O4L7.js} +2 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
- package/dist/cli/chunks/{fleet-6M3BP4OO.js → fleet-K2ED46EL.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QLD7KHXV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EZP333X4.js → heartbeat-handler-YYQI4WZM.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +2 -0
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-47CUCSAU.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SVNYDJZH.js → hnswlib-node-SE3MJJYS.js} +2 -2
- package/dist/cli/chunks/{hooks-6V5LMWP6.js → hooks-C572SRDH.js} +43 -43
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-L2FOBIFF.js → hypergraph-engine-35A6G3M5.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DU6Z57EE.js → hypergraph-handler-U2756CWI.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +2 -0
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +88 -0
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +2 -0
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-NHKYGJ7Q.js → kilocode-installer-32PX5YH7.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-24UK6GGR.js → kiro-installer-C4ROMMUS.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +2 -0
- package/dist/cli/chunks/learning-GEPVZGJQ.js +122 -0
- package/dist/cli/chunks/{llm-router-XRMI2VMG.js → llm-router-XRKTTJTX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
- package/dist/cli/chunks/{load-W5UWL5C7.js → load-XVH6HW7E.js} +2 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
- package/dist/cli/chunks/{mcp-N7ALQ4BL.js → mcp-IULSTM4Z.js} +2 -2
- package/dist/cli/chunks/{memory-WV52DLSA.js → memory-6K7IAU4T.js} +5 -5
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +2 -0
- package/dist/cli/chunks/memory-handlers-CG6DRLAW.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3FVTZCSO.js → multi-model-executor-VZDUYPLX.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-NTPWGHUW.js → opencode-installer-QUTXKNH4.js} +2 -2
- package/dist/cli/chunks/orchestrator-PCKKUWOP.js +452 -0
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-WWXHUH5U.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
- package/dist/cli/chunks/{pipeline-ZOKZFXTH.js → pipeline-O562GTOG.js} +2 -2
- package/dist/cli/chunks/{platform-CDNL322F.js → platform-PM7Q2AZS.js} +2 -2
- package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-FVJDU2JY.js → prime-radiant-advanced-wasm-6CFXTHC2.js} +2 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +2 -0
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +2 -0
- package/dist/cli/chunks/{protocol-handler-4YBN5R23.js → protocol-handler-PPGNSAOS.js} +2 -2
- package/dist/cli/chunks/{prove-BHDHY664.js → prove-WQ3BKRZG.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
- package/dist/cli/chunks/quality-C5WUU3AA.js +8 -0
- package/dist/cli/chunks/{quality-gate-WANE7TCN.js → quality-gate-WSSRKD5U.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +2 -0
- package/dist/cli/chunks/real-embeddings-CFQE7IRQ.js +2 -0
- package/dist/cli/chunks/{ref-validation-S7UWXQIP.js → ref-validation-DHKHXVZT.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-TEYOQYL6.js → roocode-installer-3PPODABV.js} +2 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +2 -0
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +2 -0
- package/dist/cli/chunks/{routing-handler-KDTLMRWD.js → routing-handler-JNXTGT6T.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-AOUDXCYE.js → ruvector-commands-6YLROPVP.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-4DWB4WRK.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-QI47Y354.js → rvf-store-integrity-YKR2ZNBF.js} +2 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +2 -0
- package/dist/cli/chunks/schedule-KD2VN6GB.js +2 -0
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +2 -0
- package/dist/cli/chunks/{security-SN6MWOJT.js → security-PWQTGDRU.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-LNRLFP5I.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-WU7PFKQM.js → shared-rvf-dual-writer-GWU6YQNS.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +2 -0
- package/dist/cli/chunks/{standalone-memory-F6FSRFWC.js → standalone-memory-46KKBSSV.js} +2 -2
- package/dist/cli/chunks/{status-handler-DHD5MS4G.js → status-handler-35T5FTDQ.js} +2 -2
- package/dist/cli/chunks/{structural-health-P6HPSQMR.js → structural-health-P7QPQWLO.js} +2 -2
- package/dist/cli/chunks/{sync-LISJGDSE.js → sync-W6Z4R4PL.js} +2 -2
- package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
- package/dist/cli/chunks/{task-handler-ZT44NT5Z.js → task-handler-5CX3ZYT7.js} +2 -2
- package/dist/cli/chunks/{task-handlers-R6DQ5324.js → task-handlers-DQZGOJNE.js} +3 -3
- package/dist/cli/chunks/{test-MUFHR4JQ.js → test-TPP53VVV.js} +12 -12
- package/dist/cli/chunks/{test-scheduling-TAUSLZJP.js → test-scheduling-WBV4UMQH.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
- package/dist/cli/chunks/{token-usage-IX65ECBR.js → token-usage-AKK37RB7.js} +2 -2
- package/dist/cli/chunks/{transformers-QKPSVW2W.js → transformers-7MASPELS.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-Z7PPA2JO.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
- package/dist/cli/chunks/{types-ULNNGGGH.js → types-AZ3BTXDP.js} +2 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +2 -0
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +2 -0
- package/dist/cli/chunks/{upgrade-ECI3YUYA.js → upgrade-L7OTDKEK.js} +2 -2
- package/dist/cli/chunks/{validate-3JKRUW2S.js → validate-O3QVFIGP.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-LZWANCIE.js → validate-swarm-2UGBGLTX.js} +2 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-N5V4A6XG.js → web-tree-sitter-J75IYPRO.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-5TBM5B3C.js → windsurf-installer-FQ5DBFCG.js} +2 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
- package/dist/cli/chunks/{witness-chain-MFP3HBWQ.js → witness-chain-I7TN4MXZ.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-D3NE3NQK.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-SRAT7LVY.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
- package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
- package/dist/cli/chunks/{workflow-M7TUYYXY.js → workflow-6BWTNVV6.js} +28 -28
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +2 -0
- package/dist/cli/chunks/wrappers-URVP25VU.js +2 -0
- package/dist/cli/commands/ci.js +53 -23
- package/dist/cli/commands/code.js +1 -0
- package/dist/cli/commands/coverage.d.ts +1 -0
- package/dist/cli/commands/coverage.js +182 -138
- package/dist/cli/commands/daemon.js +7 -1
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
- package/dist/cli/commands/learning.js +47 -7
- package/dist/cli/commands/quality.d.ts +12 -1
- package/dist/cli/commands/quality.js +51 -3
- package/dist/cli/commands/test.js +6 -7
- package/dist/cli/commands/workflow.js +9 -5
- package/dist/cli/handlers/init-guard.d.ts +13 -0
- package/dist/cli/handlers/init-guard.js +23 -0
- package/dist/cli/handlers/init-handler.d.ts +3 -0
- package/dist/cli/handlers/init-handler.js +9 -0
- package/dist/cli/handlers/interfaces.js +5 -1
- package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
- package/dist/cli/scheduler/persistent-scheduler.js +107 -41
- package/dist/cli/utils/ci-output.d.ts +22 -5
- package/dist/cli/utils/ci-output.js +33 -5
- package/dist/cli/utils/coverage-data.d.ts +10 -0
- package/dist/cli/utils/coverage-data.js +34 -65
- package/dist/cli/utils/coverage-verdict.d.ts +130 -0
- package/dist/cli/utils/coverage-verdict.js +193 -0
- package/dist/cli/utils/file-discovery.js +5 -0
- package/dist/contracts/verdicts.d.ts +14 -0
- package/dist/contracts/verdicts.js +44 -3
- package/dist/coordination/deterministic-actions.js +24 -13
- package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
- package/dist/coordination/handlers/coverage-handlers.js +150 -121
- package/dist/coordination/handlers/coverage-runner.d.ts +143 -0
- package/dist/coordination/handlers/coverage-runner.js +462 -0
- package/dist/coordination/handlers/coverage-target.d.ts +145 -0
- package/dist/coordination/handlers/coverage-target.js +314 -0
- package/dist/coordination/handlers/handler-types.d.ts +9 -0
- package/dist/coordination/handlers/handler-utils.d.ts +23 -1
- package/dist/coordination/handlers/handler-utils.js +90 -23
- package/dist/coordination/handlers/quality-handlers.js +209 -33
- package/dist/coordination/handlers/test-execution-handlers.js +4 -1
- package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
- package/dist/coordination/protocols/defect-investigation.js +6 -3
- package/dist/coordination/protocols/quality-gate.js +10 -6
- package/dist/coordination/result-saver.d.ts +22 -0
- package/dist/coordination/result-saver.js +130 -46
- package/dist/coordination/task-executor.d.ts +12 -0
- package/dist/coordination/task-executor.js +37 -1
- package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
- package/dist/domains/code-intelligence/coordinator.js +10 -32
- package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
- package/dist/domains/code-intelligence/plugin.js +5 -0
- package/dist/domains/code-intelligence/project-root-resolver.d.ts +50 -0
- package/dist/domains/code-intelligence/project-root-resolver.js +121 -0
- package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
- package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +33 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +36 -0
- package/dist/domains/coverage-analysis/coordinator.js +22 -7
- package/dist/domains/coverage-analysis/interfaces.d.ts +59 -0
- package/dist/domains/coverage-analysis/interfaces.js +6 -1
- package/dist/domains/coverage-analysis/plugin.js +7 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +7 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +85 -38
- package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
- package/dist/domains/defect-intelligence/plugin.js +4 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +6 -4
- package/dist/domains/learning-optimization/coordinator.js +4 -0
- package/dist/domains/learning-optimization/plugin.js +4 -0
- package/dist/domains/quality-assessment/coordinator-claim-verifier.js +2 -1
- package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
- package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
- package/dist/domains/quality-assessment/coordinator.js +18 -14
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +49 -0
- package/dist/domains/quality-assessment/coverage-report-event.js +58 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.d.ts +57 -0
- package/dist/domains/quality-assessment/evidence-sufficiency.js +97 -0
- package/dist/domains/quality-assessment/index.d.ts +2 -2
- package/dist/domains/quality-assessment/index.js +1 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
- package/dist/domains/quality-assessment/plugin.js +8 -8
- package/dist/domains/quality-assessment/quality-evidence.d.ts +98 -4
- package/dist/domains/quality-assessment/quality-evidence.js +152 -8
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
- package/dist/domains/quality-assessment/services/quality-analyzer.js +203 -116
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +22 -16
- package/dist/domains/test-execution/interfaces.d.ts +10 -6
- package/dist/domains/test-execution/plugin.js +4 -0
- package/dist/domains/test-execution/services/test-executor.js +152 -102
- package/dist/domains/test-generation/coordinator.js +4 -0
- package/dist/domains/test-generation/plugin.js +4 -0
- package/dist/feedback/coverage-learner.js +4 -1
- package/dist/feedback/coverage-session-provenance.d.ts +29 -0
- package/dist/feedback/coverage-session-provenance.js +39 -0
- package/dist/init/orchestrator.js +2 -0
- package/dist/init/phases/09-assets.d.ts +4 -0
- package/dist/init/phases/09-assets.js +35 -0
- package/dist/init/retired-assets.d.ts +86 -0
- package/dist/init/retired-assets.js +230 -0
- package/dist/init/skills-installer.d.ts +2 -0
- package/dist/init/skills-installer.js +4 -0
- package/dist/init/types.d.ts +3 -0
- package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
- package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
- package/dist/integrations/ruvector/server-client.js +4 -12
- package/dist/kernel/project-root.d.ts +17 -0
- package/dist/kernel/project-root.js +54 -2
- package/dist/kernel/shared-dirs.d.ts +66 -0
- package/dist/kernel/shared-dirs.js +168 -0
- package/dist/learning/daily-log.js +2 -1
- package/dist/learning/experience-capture-middleware.d.ts +22 -0
- package/dist/learning/experience-capture-middleware.js +35 -0
- package/dist/learning/learnable-result.d.ts +16 -0
- package/dist/learning/learnable-result.js +24 -0
- package/dist/learning/pattern-mutation-error.d.ts +8 -0
- package/dist/learning/pattern-mutation-error.js +12 -0
- package/dist/learning/qe-reasoning-bank.d.ts +10 -0
- package/dist/learning/qe-reasoning-bank.js +50 -1
- package/dist/learning/rvf-reconcile.d.ts +39 -0
- package/dist/learning/rvf-reconcile.js +40 -0
- package/dist/learning/sqlite-persistence.d.ts +14 -0
- package/dist/learning/sqlite-persistence.js +36 -0
- package/dist/mcp/bundle.js +524 -507
- package/dist/mcp/handlers/domain-handler-configs.d.ts +49 -2
- package/dist/mcp/handlers/domain-handler-configs.js +79 -7
- package/dist/mcp/handlers/handler-factory.js +43 -14
- package/dist/mcp/handlers/wrapped-domain-handlers.js +7 -1
- package/dist/mcp/protocol-server.js +30 -4
- package/dist/mcp/tool-cache-scope.d.ts +31 -0
- package/dist/mcp/tool-cache-scope.js +71 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
- package/dist/mcp/tools/coverage-analysis/index.js +1 -0
- package/dist/mcp/types.d.ts +10 -0
- package/dist/optimization/session-cache.d.ts +19 -1
- package/dist/optimization/session-cache.js +36 -2
- package/dist/plugins/cache.js +2 -1
- package/dist/plugins/sources/github.js +2 -1
- package/dist/plugins/sources/npm.js +2 -1
- package/dist/shared/aqe-managed-dirs.d.ts +24 -0
- package/dist/shared/aqe-managed-dirs.js +56 -0
- package/dist/shared/events/domain-events.d.ts +20 -3
- package/dist/shared/events/domain-events.js +4 -0
- package/dist/shared/http/http-client.d.ts +6 -0
- package/dist/shared/http/http-client.js +13 -15
- package/dist/shared/io/file-reader.d.ts +26 -0
- package/dist/shared/io/file-reader.js +111 -17
- package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
- package/dist/shared/llm/providers/response-deadline.js +17 -5
- package/dist/shared/metrics/code-metrics.d.ts +24 -0
- package/dist/shared/metrics/code-metrics.js +93 -6
- package/dist/shared/metrics/index.d.ts +1 -1
- package/dist/workers/interfaces.d.ts +9 -1
- package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
- package/dist/workers/quality-daemon/coverage-delta.js +13 -6
- package/dist/workers/quality-daemon/index.js +6 -5
- package/dist/workers/quality-daemon/notification-service.js +3 -3
- package/dist/workers/quality-daemon/persistent-memory.d.ts +2 -2
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-manager.js +5 -1
- package/dist/workers/workers/coverage-tracker.js +69 -33
- package/dist/workers/workers/regression-monitor.d.ts +18 -1
- package/dist/workers/workers/regression-monitor.js +276 -117
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-T54G3TBK.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-HLCJJ3JM.js +0 -2
- package/dist/cli/chunks/base-VLD755UU.js +0 -2
- package/dist/cli/chunks/browser-workflow-6M6VLWRF.js +0 -2
- package/dist/cli/chunks/chunk-5XXLWJU7.js +0 -2
- package/dist/cli/chunks/chunk-AHVN3UQZ.js +0 -4
- package/dist/cli/chunks/chunk-AOKSLWON.js +0 -742
- package/dist/cli/chunks/chunk-CQ3WSTJ2.js +0 -16
- package/dist/cli/chunks/chunk-LY53L6NH.js +0 -2
- package/dist/cli/chunks/chunk-O7TMY4GS.js +0 -2
- package/dist/cli/chunks/chunk-QIAX3JJB.js +0 -3
- package/dist/cli/chunks/chunk-RJMBHZYL.js +0 -2
- package/dist/cli/chunks/chunk-UORI2CZ4.js +0 -2
- package/dist/cli/chunks/chunk-V3NZ23X6.js +0 -2
- package/dist/cli/chunks/chunk-WI5AEB7Q.js +0 -2
- package/dist/cli/chunks/chunk-XKIFNKHV.js +0 -2
- package/dist/cli/chunks/chunk-ZAOQIVHG.js +0 -5
- package/dist/cli/chunks/chunk-ZF5JTQEE.js +0 -4
- package/dist/cli/chunks/ci-NGMGB43T.js +0 -82
- package/dist/cli/chunks/client-FUHNNK5O.js +0 -2
- package/dist/cli/chunks/core-handlers-F7TLX4LM.js +0 -2
- package/dist/cli/chunks/coverage-IVKDV236.js +0 -27
- package/dist/cli/chunks/cross-domain-router-EGWPY67O.js +0 -2
- package/dist/cli/chunks/daemon-IPTOSCHM.js +0 -10
- package/dist/cli/chunks/dream-V4QN6OF5.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-65H4XHWR.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-4JXVF5PL.js +0 -40
- package/dist/cli/chunks/file-discovery-R73BYEXB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-3N3L6CRM.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-2BXJYDXI.js +0 -2
- package/dist/cli/chunks/hnsw-index-2DLI5OVO.js +0 -2
- package/dist/cli/chunks/hybrid-backend-OW4J65YH.js +0 -2
- package/dist/cli/chunks/impact-analyzer-ZH5I2RG6.js +0 -2
- package/dist/cli/chunks/init-handler-HETPWU67.js +0 -86
- package/dist/cli/chunks/init-wizard-NIKM3ZOK.js +0 -2
- package/dist/cli/chunks/kernel-2EOSVM6X.js +0 -2
- package/dist/cli/chunks/knowledge-graph-D3BPWNNO.js +0 -2
- package/dist/cli/chunks/learning-QLVRZNHT.js +0 -122
- package/dist/cli/chunks/llm-router-service-TJPPZFUN.js +0 -2
- package/dist/cli/chunks/load-test-RFT7IDOL.js +0 -2
- package/dist/cli/chunks/memory-backend-O2O4CFKZ.js +0 -2
- package/dist/cli/chunks/memory-handlers-DAEGUDBD.js +0 -2
- package/dist/cli/chunks/orchestrator-ORGJ6VAA.js +0 -452
- package/dist/cli/chunks/pattern-null-store-TUBNXS34.js +0 -2
- package/dist/cli/chunks/plugin-ZVLFNZZ4.js +0 -27
- package/dist/cli/chunks/project-root-UCHQH3QL.js +0 -2
- package/dist/cli/chunks/protocol-executor-6FQTTO3Y.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-TKPND56C.js +0 -2
- package/dist/cli/chunks/quality-46AK277P.js +0 -7
- package/dist/cli/chunks/queen-coordinator-DWMXLPJG.js +0 -2
- package/dist/cli/chunks/real-embeddings-56MNGJGJ.js +0 -2
- package/dist/cli/chunks/router-QIMUYRCC.js +0 -2
- package/dist/cli/chunks/routing-feedback-4OH5ZNF4.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-S6JBZL54.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TSGMLMYR.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-V74MVBHS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-Z7QOW47S.js +0 -2
- package/dist/cli/chunks/safe-db-JLOVBJNC.js +0 -2
- package/dist/cli/chunks/schedule-IM6XOBGR.js +0 -2
- package/dist/cli/chunks/scheduler-XL2SVVK5.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-2LB56LP4.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-LWMIIC4U.js +0 -2
- package/dist/cli/chunks/sync-SNAXAVCN.js +0 -2
- package/dist/cli/chunks/token-bootstrap-UGRH7OPU.js +0 -2
- package/dist/cli/chunks/unified-memory-F5IJY7W7.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-C3WAMAQL.js +0 -2
- package/dist/cli/chunks/unified-persistence-EWXXOTCB.js +0 -2
- package/dist/cli/chunks/visual-security-CKLTAIAB.js +0 -2
- package/dist/cli/chunks/witness-chain-Z6LWFEZS.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-5QWRFVUK.js +0 -2
- package/dist/cli/chunks/witness-key-manager-FYZXQTLJ.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-OFTAR2NA.js +0 -2
- package/dist/cli/chunks/wrappers-COU73OQ6.js +0 -2
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
- /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
- /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence sufficiency for static quality analysis (#996).
|
|
3
|
+
*
|
|
4
|
+
* The static analyzer marks metrics it could not measure with the `-1`
|
|
5
|
+
* sentinel (or omits them). Such metrics must never be read as numbers that
|
|
6
|
+
* support a verdict: a pass computed without them is a pass on missing data.
|
|
7
|
+
*/
|
|
8
|
+
import { INSUFFICIENT_EVIDENCE, type QualityThresholdOverrides } from './quality-evidence.js';
|
|
9
|
+
/** `measured`: every requested metric has data. Otherwise no verdict may approve. */
|
|
10
|
+
export type StaticEvidenceStatus = 'measured' | typeof INSUFFICIENT_EVIDENCE;
|
|
11
|
+
/** Metric names the static quality analysis understands. */
|
|
12
|
+
export declare const STATIC_QUALITY_METRICS: readonly ["coverage", "complexity", "maintainability", "duplication", "testability", "security"];
|
|
13
|
+
/**
|
|
14
|
+
* #996: the coverage threshold that applies to a static assessment — the
|
|
15
|
+
* request's threshold, else the user-configured gate threshold, else the
|
|
16
|
+
* canonical default (undefined = use the default).
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveCoverageOverride(requested: number | undefined, configured: number | undefined): number | undefined;
|
|
19
|
+
export interface MeasuredFailure {
|
|
20
|
+
metric: string;
|
|
21
|
+
value: number;
|
|
22
|
+
threshold: number;
|
|
23
|
+
direction: 'min' | 'max';
|
|
24
|
+
}
|
|
25
|
+
export interface EvidenceSufficiency {
|
|
26
|
+
evidenceStatus: StaticEvidenceStatus;
|
|
27
|
+
/** Requested metrics backed by measured data. */
|
|
28
|
+
measured: string[];
|
|
29
|
+
/** Requested metrics with no measured data (missing, `-1`, or non-finite). */
|
|
30
|
+
unmeasured: string[];
|
|
31
|
+
/** Share of requested metrics that were measured, in [0, 1], two decimals. */
|
|
32
|
+
confidence: number;
|
|
33
|
+
}
|
|
34
|
+
/** A metric value is measured only if it is a finite, non-negative number. */
|
|
35
|
+
export declare function isMeasuredMetricValue(value: unknown): value is number;
|
|
36
|
+
/**
|
|
37
|
+
* #996 (N3): `metrics` must be a non-empty string[] of known names. A bare
|
|
38
|
+
* string would otherwise be spread into characters. Returns the de-duplicated
|
|
39
|
+
* list, or throws a caller-facing validation error.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateRequestedMetrics(metrics: unknown): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Decide whether static analysis measured every requested metric.
|
|
44
|
+
*
|
|
45
|
+
* @param requested - metric names the caller asked to assess; when empty,
|
|
46
|
+
* the measured values themselves define the scope.
|
|
47
|
+
* @param values - metric values produced by the analyzer (`-1` = unmeasured).
|
|
48
|
+
*/
|
|
49
|
+
export declare function assessEvidenceSufficiency(requested: readonly string[], values: Readonly<Record<string, number | undefined>>): EvidenceSufficiency;
|
|
50
|
+
/**
|
|
51
|
+
* #996 (N2): measured metrics that already fail their own limit. Such a
|
|
52
|
+
* failure is conclusive — no unmeasured metric can turn it into a pass.
|
|
53
|
+
*/
|
|
54
|
+
export declare function findMeasuredFailures(measured: readonly string[], values: Readonly<Record<string, number | undefined>>, overrides?: QualityThresholdOverrides): MeasuredFailure[];
|
|
55
|
+
/** Plain-language recommendation for one measured failure. */
|
|
56
|
+
export declare function describeMeasuredFailure(failure: MeasuredFailure): string;
|
|
57
|
+
//# sourceMappingURL=evidence-sufficiency.d.ts.map
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence sufficiency for static quality analysis (#996).
|
|
3
|
+
*
|
|
4
|
+
* The static analyzer marks metrics it could not measure with the `-1`
|
|
5
|
+
* sentinel (or omits them). Such metrics must never be read as numbers that
|
|
6
|
+
* support a verdict: a pass computed without them is a pass on missing data.
|
|
7
|
+
*/
|
|
8
|
+
import { INSUFFICIENT_EVIDENCE, resolveQualityThresholds, } from './quality-evidence.js';
|
|
9
|
+
/** Metric names the static quality analysis understands. */
|
|
10
|
+
export const STATIC_QUALITY_METRICS = [
|
|
11
|
+
'coverage', 'complexity', 'maintainability', 'duplication', 'testability', 'security',
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Static metrics that a measured value can fail on its own, mapped to the
|
|
15
|
+
* canonical gate metric whose effective threshold applies (by default
|
|
16
|
+
* coverage >= 80, duplication <= 5; see resolveQualityThresholds).
|
|
17
|
+
*/
|
|
18
|
+
const STATIC_TO_GATE_METRIC = {
|
|
19
|
+
coverage: 'coverage',
|
|
20
|
+
duplication: 'duplications',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* #996: the coverage threshold that applies to a static assessment — the
|
|
24
|
+
* request's threshold, else the user-configured gate threshold, else the
|
|
25
|
+
* canonical default (undefined = use the default).
|
|
26
|
+
*/
|
|
27
|
+
export function resolveCoverageOverride(requested, configured) {
|
|
28
|
+
return requested ?? configured;
|
|
29
|
+
}
|
|
30
|
+
/** A metric value is measured only if it is a finite, non-negative number. */
|
|
31
|
+
export function isMeasuredMetricValue(value) {
|
|
32
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* #996 (N3): `metrics` must be a non-empty string[] of known names. A bare
|
|
36
|
+
* string would otherwise be spread into characters. Returns the de-duplicated
|
|
37
|
+
* list, or throws a caller-facing validation error.
|
|
38
|
+
*/
|
|
39
|
+
export function validateRequestedMetrics(metrics) {
|
|
40
|
+
const known = STATIC_QUALITY_METRICS;
|
|
41
|
+
const message = `metrics must be a non-empty array of metric names (${known.join(', ')}).`;
|
|
42
|
+
if (!Array.isArray(metrics) || metrics.length === 0)
|
|
43
|
+
throw new Error(message);
|
|
44
|
+
const unknown = metrics.filter((m) => typeof m !== 'string' || !known.includes(m));
|
|
45
|
+
if (unknown.length > 0) {
|
|
46
|
+
throw new Error(`${message} Unknown: ${unknown.map((m) => JSON.stringify(m)).join(', ')}.`);
|
|
47
|
+
}
|
|
48
|
+
return [...new Set(metrics)];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Decide whether static analysis measured every requested metric.
|
|
52
|
+
*
|
|
53
|
+
* @param requested - metric names the caller asked to assess; when empty,
|
|
54
|
+
* the measured values themselves define the scope.
|
|
55
|
+
* @param values - metric values produced by the analyzer (`-1` = unmeasured).
|
|
56
|
+
*/
|
|
57
|
+
export function assessEvidenceSufficiency(requested, values) {
|
|
58
|
+
const scope = requested.length > 0
|
|
59
|
+
? [...new Set(requested)]
|
|
60
|
+
: Object.keys(values).filter((name) => isMeasuredMetricValue(values[name]));
|
|
61
|
+
const measured = scope.filter((name) => isMeasuredMetricValue(values[name]));
|
|
62
|
+
const unmeasured = scope.filter((name) => !isMeasuredMetricValue(values[name]));
|
|
63
|
+
const confidence = scope.length === 0
|
|
64
|
+
? 0
|
|
65
|
+
: Math.round((measured.length / scope.length) * 100) / 100;
|
|
66
|
+
return {
|
|
67
|
+
evidenceStatus: unmeasured.length === 0 && measured.length > 0 ? 'measured' : INSUFFICIENT_EVIDENCE,
|
|
68
|
+
measured,
|
|
69
|
+
unmeasured,
|
|
70
|
+
confidence,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* #996 (N2): measured metrics that already fail their own limit. Such a
|
|
75
|
+
* failure is conclusive — no unmeasured metric can turn it into a pass.
|
|
76
|
+
*/
|
|
77
|
+
export function findMeasuredFailures(measured, values, overrides = {}) {
|
|
78
|
+
const thresholds = resolveQualityThresholds(overrides);
|
|
79
|
+
const failures = [];
|
|
80
|
+
for (const metric of measured) {
|
|
81
|
+
const gateMetric = STATIC_TO_GATE_METRIC[metric];
|
|
82
|
+
const limit = gateMetric ? thresholds[gateMetric] : undefined;
|
|
83
|
+
const value = values[metric];
|
|
84
|
+
if (!limit || !isMeasuredMetricValue(value))
|
|
85
|
+
continue;
|
|
86
|
+
const fails = limit.direction === 'min' ? value < limit.value : value > limit.value;
|
|
87
|
+
if (fails)
|
|
88
|
+
failures.push({ metric, value, threshold: limit.value, direction: limit.direction });
|
|
89
|
+
}
|
|
90
|
+
return failures;
|
|
91
|
+
}
|
|
92
|
+
/** Plain-language recommendation for one measured failure. */
|
|
93
|
+
export function describeMeasuredFailure(failure) {
|
|
94
|
+
const bound = failure.direction === 'min' ? 'at least' : 'at most';
|
|
95
|
+
return `${failure.metric} measured at ${failure.value} fails its threshold (${bound} ${failure.threshold}).`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=evidence-sufficiency.js.map
|
|
@@ -9,8 +9,8 @@ export { QualityAssessmentCoordinator, type IQualityAssessmentCoordinator, type
|
|
|
9
9
|
export { QualityGateService, type IQualityGateService, type QualityGateConfig, } from './services/quality-gate';
|
|
10
10
|
export { QualityAnalyzerService, type IQualityAnalyzerService, type QualityAnalyzerConfig, } from './services/quality-analyzer';
|
|
11
11
|
export { DeploymentAdvisorService, type IDeploymentAdvisorService, type DeploymentAdvisorConfig, type DeploymentAccuracy, } from './services/deployment-advisor';
|
|
12
|
-
export { DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS, DEFAULT_QUALITY_THRESHOLDS, QUALITY_EVIDENCE_NAMESPACE, QUALITY_METRICS, evaluateQualityEvidence, loadQualityEvidence, writeQualityEvidence, type EvaluatedQualityCheck, type QualityEvidenceRecord, type QualityEvidenceValues, type QualityMetricName, type QualityThreshold, } from './quality-evidence.js';
|
|
12
|
+
export { DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS, DEFAULT_QUALITY_THRESHOLDS, QUALITY_EVIDENCE_NAMESPACE, QUALITY_METRICS, INSUFFICIENT_EVIDENCE, InsufficientQualityEvidenceError, evaluateQualityEvidence, inspectQualityEvidence, loadQualityEvidence, writeQualityEvidence, type EvaluatedQualityCheck, type QualityEvidenceRecord, type QualityEvidenceValues, type QualityMetricName, type QualityThreshold, } from './quality-evidence.js';
|
|
13
13
|
export { CoherenceGateService, createCoherenceGateService, type CoherenceGateResult, type CoherenceGateServiceConfig, } from './services/coherence-gate';
|
|
14
14
|
export * from './coherence';
|
|
15
|
-
export type { QualityAssessmentAPI, GateEvaluationRequest, QualityAnalysisRequest, DeploymentRequest, ComplexityRequest, GateResult, GateCheck, QualityReport, QualityMetricDetail, QualityTrend, Recommendation, DeploymentAdvice, ComplexityReport, FileComplexity, ComplexitySummary, ComplexityHotspot, QualityMetrics, GateThresholds, } from './interfaces';
|
|
15
|
+
export type { QualityAssessmentAPI, GateEvaluationRequest, QualityAnalysisRequest, DeploymentRequest, ComplexityRequest, GateResult, GateCheck, QualityReport, UnmeasuredQualityMetric, ExcludedQualityFile, PartialQualityMetric, QualityMetricDetail, QualityTrend, Recommendation, DeploymentAdvice, ComplexityReport, FileComplexity, ComplexitySummary, ComplexityHotspot, QualityMetrics, GateThresholds, } from './interfaces';
|
|
16
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -18,7 +18,7 @@ export { QualityAssessmentCoordinator, } from './coordinator.js';
|
|
|
18
18
|
export { QualityGateService, } from './services/quality-gate.js';
|
|
19
19
|
export { QualityAnalyzerService, } from './services/quality-analyzer.js';
|
|
20
20
|
export { DeploymentAdvisorService, } from './services/deployment-advisor.js';
|
|
21
|
-
export { DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS, DEFAULT_QUALITY_THRESHOLDS, QUALITY_EVIDENCE_NAMESPACE, QUALITY_METRICS, evaluateQualityEvidence, loadQualityEvidence, writeQualityEvidence, } from './quality-evidence.js';
|
|
21
|
+
export { DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS, DEFAULT_QUALITY_THRESHOLDS, QUALITY_EVIDENCE_NAMESPACE, QUALITY_METRICS, INSUFFICIENT_EVIDENCE, InsufficientQualityEvidenceError, evaluateQualityEvidence, inspectQualityEvidence, loadQualityEvidence, writeQualityEvidence, } from './quality-evidence.js';
|
|
22
22
|
// ============================================================================
|
|
23
23
|
// Coherence-Gated Quality Gates (ADR-030)
|
|
24
24
|
// ============================================================================
|
|
@@ -68,6 +68,11 @@ export interface QualityAnalysisRequest {
|
|
|
68
68
|
sourceFiles: string[];
|
|
69
69
|
includeMetrics: string[];
|
|
70
70
|
compareBaseline?: string;
|
|
71
|
+
/**
|
|
72
|
+
* #1021: files the caller named explicitly. If one of them fails to read or
|
|
73
|
+
* parse, the affected metrics are unmeasured regardless of coverage of scope.
|
|
74
|
+
*/
|
|
75
|
+
explicitFiles?: string[];
|
|
71
76
|
}
|
|
72
77
|
export interface QualityReport {
|
|
73
78
|
score: QualityScore;
|
|
@@ -76,6 +81,43 @@ export interface QualityReport {
|
|
|
76
81
|
recommendations: Recommendation[];
|
|
77
82
|
/** ADR-051: Optional LLM-generated insights (when enableLLMInsights is true) */
|
|
78
83
|
llmInsights?: LLMQualityInsights;
|
|
84
|
+
/**
|
|
85
|
+
* #1011: requested metrics that were NOT measured, with the reason. They are
|
|
86
|
+
* absent from `metrics` and -1 in `score`; never a fixed fallback value.
|
|
87
|
+
*/
|
|
88
|
+
unmeasured?: UnmeasuredQualityMetric[];
|
|
89
|
+
/**
|
|
90
|
+
* #1021: files left out of the scope (binary, generated, minified, type
|
|
91
|
+
* declarations, refused by the reader's path policy). Metrics stay measured
|
|
92
|
+
* over the remaining files.
|
|
93
|
+
*/
|
|
94
|
+
excluded?: ExcludedQualityFile[];
|
|
95
|
+
/**
|
|
96
|
+
* #1021: metrics measured over most, but not all, analysable files. Their
|
|
97
|
+
* value covers `analysedFiles` of `totalFiles`; `failed` lists the gaps.
|
|
98
|
+
*/
|
|
99
|
+
partial?: PartialQualityMetric[];
|
|
100
|
+
}
|
|
101
|
+
/** #1021: a file excluded from static analysis, with the reason. */
|
|
102
|
+
export interface ExcludedQualityFile {
|
|
103
|
+
file: string;
|
|
104
|
+
reason: string;
|
|
105
|
+
}
|
|
106
|
+
/** #1021: a metric measured over part of its scope. */
|
|
107
|
+
export interface PartialQualityMetric {
|
|
108
|
+
metric: string;
|
|
109
|
+
analysedFiles: number;
|
|
110
|
+
totalFiles: number;
|
|
111
|
+
/** analysedFiles / totalFiles, three decimals, rounded down (never 1 while a file failed). */
|
|
112
|
+
coverageOfScope: number;
|
|
113
|
+
failed: ExcludedQualityFile[];
|
|
114
|
+
}
|
|
115
|
+
/** #1011: a requested metric the static analysis could not measure. */
|
|
116
|
+
export interface UnmeasuredQualityMetric {
|
|
117
|
+
metric: string;
|
|
118
|
+
reason: string;
|
|
119
|
+
/** Files that could not be analysed, when the cause is file-specific. */
|
|
120
|
+
files?: string[];
|
|
79
121
|
}
|
|
80
122
|
/**
|
|
81
123
|
* ADR-051: LLM-generated quality insights
|
|
@@ -140,13 +182,17 @@ export interface ComplexityReport {
|
|
|
140
182
|
summary: ComplexitySummary;
|
|
141
183
|
hotspots: ComplexityHotspot[];
|
|
142
184
|
}
|
|
185
|
+
/** Values are -1 when not measured (not requested, or the file could not be analysed). */
|
|
143
186
|
export interface FileComplexity {
|
|
144
187
|
path: string;
|
|
145
188
|
cyclomatic: number;
|
|
146
189
|
cognitive: number;
|
|
147
190
|
maintainability: number;
|
|
148
191
|
linesOfCode: number;
|
|
192
|
+
/** #1011: why this file's metrics are unmeasured (unreadable, binary, unparseable). */
|
|
193
|
+
unmeasuredReason?: string;
|
|
149
194
|
}
|
|
195
|
+
/** Averages over measured files only; -1 when no file was measured for that metric. */
|
|
150
196
|
export interface ComplexitySummary {
|
|
151
197
|
averageCyclomatic: number;
|
|
152
198
|
averageCognitive: number;
|
|
@@ -8,6 +8,7 @@ import { QualityAssessmentCoordinator, } from './coordinator.js';
|
|
|
8
8
|
import { QualityGateService, } from './services/quality-gate.js';
|
|
9
9
|
import { QualityAnalyzerService, } from './services/quality-analyzer.js';
|
|
10
10
|
import { toError } from '../../shared/error-utils.js';
|
|
11
|
+
import { measuredCoverageSummary } from './coverage-report-event.js';
|
|
11
12
|
import { DeploymentAdvisorService, } from './services/deployment-advisor.js';
|
|
12
13
|
/**
|
|
13
14
|
* Quality Assessment Domain Plugin
|
|
@@ -285,15 +286,14 @@ export class QualityAssessmentPlugin extends BaseDomainPlugin {
|
|
|
285
286
|
}
|
|
286
287
|
}
|
|
287
288
|
async handleCoverageReport(event) {
|
|
288
|
-
|
|
289
|
+
// #1008: only a report explicitly marked measured is coverage evidence.
|
|
290
|
+
// Estimates and look-alike events with no coverage figures (e.g. bridged
|
|
291
|
+
// captured experiences) must never touch `coverage:latest`.
|
|
292
|
+
const summary = measuredCoverageSummary(event.payload);
|
|
293
|
+
if (!summary)
|
|
294
|
+
return;
|
|
289
295
|
// Store under the canonical coverage key so quality-analyzer can read it
|
|
290
|
-
await this.memory.set('coverage:latest', {
|
|
291
|
-
line: payload.line,
|
|
292
|
-
branch: payload.branch,
|
|
293
|
-
function: payload.function,
|
|
294
|
-
statement: payload.statement,
|
|
295
|
-
files: 0,
|
|
296
|
-
}, { persist: true });
|
|
296
|
+
await this.memory.set('coverage:latest', summary, { persist: true });
|
|
297
297
|
}
|
|
298
298
|
async handleDefectPrediction(event) {
|
|
299
299
|
const payload = event.payload;
|
|
@@ -10,6 +10,20 @@ export interface QualityEvidenceRecord {
|
|
|
10
10
|
value: number;
|
|
11
11
|
measuredAt: string;
|
|
12
12
|
source: string;
|
|
13
|
+
/**
|
|
14
|
+
* The test run this figure came from, when it came from one (#1027 NB1).
|
|
15
|
+
* Coverage and testsPassing written from one run share the runId.
|
|
16
|
+
*/
|
|
17
|
+
runId?: string;
|
|
18
|
+
/** Whether that run's tests passed (#1027 NB1). */
|
|
19
|
+
runStatus?: 'passed' | 'failed';
|
|
20
|
+
}
|
|
21
|
+
/** Metadata of an evidence write; `runId`/`runStatus` scope it to one test run. */
|
|
22
|
+
export interface QualityEvidenceMetadata {
|
|
23
|
+
measuredAt: string;
|
|
24
|
+
source: string;
|
|
25
|
+
runId?: string;
|
|
26
|
+
runStatus?: 'passed' | 'failed';
|
|
13
27
|
}
|
|
14
28
|
export interface QualityThreshold {
|
|
15
29
|
direction: 'min' | 'max';
|
|
@@ -25,17 +39,97 @@ export interface EvaluatedQualityCheck {
|
|
|
25
39
|
direction: 'min' | 'max';
|
|
26
40
|
severity: QualityThreshold['severity'];
|
|
27
41
|
}
|
|
28
|
-
export declare function writeQualityEvidence(memory: MemoryBackend, values: Partial<QualityEvidenceValues>, metadata:
|
|
29
|
-
|
|
42
|
+
export declare function writeQualityEvidence(memory: MemoryBackend, values: Partial<QualityEvidenceValues>, metadata: QualityEvidenceMetadata): Promise<void>;
|
|
43
|
+
/** Test counts of one run. */
|
|
44
|
+
export interface TestRunCounts {
|
|
45
|
+
passed: number;
|
|
46
|
+
failed: number;
|
|
47
|
+
skipped?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* testsPassing as `aqe test execute` has always computed it: passed over all
|
|
51
|
+
* tests, skipped included; a run with no tests is 0 (#1027 NB1: one formula).
|
|
52
|
+
*/
|
|
53
|
+
export declare function testsPassingPercent(run: TestRunCounts): number;
|
|
54
|
+
/**
|
|
55
|
+
* Record the evidence of ONE test run (#1027 NB1): its testsPassing and, when
|
|
56
|
+
* it measured coverage, its coverage — both stamped with the same runId and
|
|
57
|
+
* runStatus. The single writer for `aqe test execute`, test_execute_parallel
|
|
58
|
+
* (TestExecutorService) and the coverage auto-run, so coverage from a failing
|
|
59
|
+
* run can never sit next to a stale testsPassing from an earlier run.
|
|
60
|
+
*/
|
|
61
|
+
export declare function writeTestRunEvidence(memory: MemoryBackend, run: TestRunCounts & {
|
|
62
|
+
runId: string;
|
|
63
|
+
}, options: {
|
|
30
64
|
source: string;
|
|
65
|
+
coverage?: number;
|
|
66
|
+
measuredAt?: string;
|
|
31
67
|
}): Promise<void>;
|
|
68
|
+
/** #996: the single status word for "a verdict cannot be reached on this evidence". */
|
|
69
|
+
export declare const INSUFFICIENT_EVIDENCE: "insufficient-evidence";
|
|
70
|
+
/** #996: one recommendation per unmeasured metric, naming what to run. */
|
|
71
|
+
export declare function describeMissingMetrics(unmeasured: readonly string[]): string[];
|
|
72
|
+
/** Why a canonical metric has no usable evidence. */
|
|
73
|
+
export interface UnusableQualityEvidence {
|
|
74
|
+
metric: QualityMetricName;
|
|
75
|
+
reason: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* #996: thrown when the measured gate cannot be evaluated. The message is the
|
|
79
|
+
* first problem found (unchanged wording); `unmeasured` names every metric
|
|
80
|
+
* whose record is absent, stale, future-dated or malformed.
|
|
81
|
+
*/
|
|
82
|
+
export declare class InsufficientQualityEvidenceError extends Error {
|
|
83
|
+
readonly status: "insufficient-evidence";
|
|
84
|
+
readonly unmeasured: QualityMetricName[];
|
|
85
|
+
readonly problems: UnusableQualityEvidence[];
|
|
86
|
+
constructor(problems: UnusableQualityEvidence[]);
|
|
87
|
+
/** Structured, non-passing description of the gate that could not run. */
|
|
88
|
+
toDetails(): {
|
|
89
|
+
passed: false;
|
|
90
|
+
status: typeof INSUFFICIENT_EVIDENCE;
|
|
91
|
+
evidenceStatus: typeof INSUFFICIENT_EVIDENCE;
|
|
92
|
+
unmeasured: QualityMetricName[];
|
|
93
|
+
gateEvaluated: false;
|
|
94
|
+
recommendations: string[];
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Inspect every canonical metric with the same validation, collecting each
|
|
99
|
+
* absent, stale, future-dated or malformed record instead of stopping at the first.
|
|
100
|
+
*/
|
|
101
|
+
export declare function inspectQualityEvidence(memory: MemoryBackend, options?: {
|
|
102
|
+
now?: number;
|
|
103
|
+
maxAgeMs?: number;
|
|
104
|
+
}): Promise<{
|
|
105
|
+
values: Partial<QualityEvidenceValues>;
|
|
106
|
+
problems: UnusableQualityEvidence[];
|
|
107
|
+
}>;
|
|
108
|
+
/**
|
|
109
|
+
* #1028: the latest record of ONE metric when it is usable evidence — the same
|
|
110
|
+
* validation (schema, metric, finite value, source, fresh measuredAt) the gate
|
|
111
|
+
* applies — or `null`. Unlike {@link inspectQualityEvidence} it returns the
|
|
112
|
+
* record, so a reader can follow its `runId` to the run it came from.
|
|
113
|
+
*/
|
|
114
|
+
export declare function readQualityEvidenceRecord(memory: Pick<MemoryBackend, 'get'>, metric: QualityMetricName, options?: {
|
|
115
|
+
now?: number;
|
|
116
|
+
maxAgeMs?: number;
|
|
117
|
+
}): Promise<QualityEvidenceRecord | null>;
|
|
32
118
|
export declare function loadQualityEvidence(memory: MemoryBackend, options?: {
|
|
33
119
|
now?: number;
|
|
34
120
|
maxAgeMs?: number;
|
|
35
121
|
}): Promise<QualityEvidenceValues>;
|
|
36
|
-
|
|
122
|
+
/** Threshold overrides a caller or user configuration may apply to the canonical defaults. */
|
|
123
|
+
export interface QualityThresholdOverrides {
|
|
37
124
|
coverage?: number;
|
|
38
|
-
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The single source of effective quality thresholds: canonical defaults with
|
|
128
|
+
* any override applied. Used by the measured gate and by static analysis
|
|
129
|
+
* (#996) so the two never disagree.
|
|
130
|
+
*/
|
|
131
|
+
export declare function resolveQualityThresholds(overrides?: QualityThresholdOverrides): Record<QualityMetricName, QualityThreshold>;
|
|
132
|
+
export declare function evaluateQualityEvidence(values: QualityEvidenceValues, thresholds?: QualityThresholdOverrides): {
|
|
39
133
|
passed: boolean;
|
|
40
134
|
checks: EvaluatedQualityCheck[];
|
|
41
135
|
recommendations: string[];
|
|
@@ -71,6 +71,8 @@ export async function writeQualityEvidence(memory, values, metadata) {
|
|
|
71
71
|
value,
|
|
72
72
|
measuredAt: metadata.measuredAt,
|
|
73
73
|
source: metadata.source,
|
|
74
|
+
...(metadata.runId ? { runId: metadata.runId } : {}),
|
|
75
|
+
...(metadata.runStatus ? { runStatus: metadata.runStatus } : {}),
|
|
74
76
|
};
|
|
75
77
|
await memory.set(evidenceKey(metric), record, {
|
|
76
78
|
namespace: QUALITY_EVIDENCE_NAMESPACE,
|
|
@@ -78,27 +80,169 @@ export async function writeQualityEvidence(memory, values, metadata) {
|
|
|
78
80
|
});
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
|
-
|
|
83
|
+
/**
|
|
84
|
+
* testsPassing as `aqe test execute` has always computed it: passed over all
|
|
85
|
+
* tests, skipped included; a run with no tests is 0 (#1027 NB1: one formula).
|
|
86
|
+
*/
|
|
87
|
+
export function testsPassingPercent(run) {
|
|
88
|
+
const total = run.passed + run.failed + (run.skipped ?? 0);
|
|
89
|
+
return total > 0 ? (run.passed / total) * 100 : 0;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Record the evidence of ONE test run (#1027 NB1): its testsPassing and, when
|
|
93
|
+
* it measured coverage, its coverage — both stamped with the same runId and
|
|
94
|
+
* runStatus. The single writer for `aqe test execute`, test_execute_parallel
|
|
95
|
+
* (TestExecutorService) and the coverage auto-run, so coverage from a failing
|
|
96
|
+
* run can never sit next to a stale testsPassing from an earlier run.
|
|
97
|
+
*/
|
|
98
|
+
export async function writeTestRunEvidence(memory, run, options) {
|
|
99
|
+
const runStatus = run.failed > 0 ? 'failed' : 'passed';
|
|
100
|
+
const metadata = {
|
|
101
|
+
measuredAt: options.measuredAt ?? new Date().toISOString(),
|
|
102
|
+
source: options.source,
|
|
103
|
+
runId: run.runId,
|
|
104
|
+
runStatus,
|
|
105
|
+
};
|
|
106
|
+
await writeQualityEvidence(memory, {
|
|
107
|
+
testsPassing: testsPassingPercent(run),
|
|
108
|
+
...(typeof options.coverage === 'number' && Number.isFinite(options.coverage) ? { coverage: options.coverage } : {}),
|
|
109
|
+
}, metadata);
|
|
110
|
+
}
|
|
111
|
+
/** #996: the single status word for "a verdict cannot be reached on this evidence". */
|
|
112
|
+
export const INSUFFICIENT_EVIDENCE = 'insufficient-evidence';
|
|
113
|
+
/** #996: what to run to measure a metric that has no usable evidence. */
|
|
114
|
+
// Advice names only producers a user can actually run. Metrics with no
|
|
115
|
+
// exposed producer say so instead of pointing at an unreachable tool.
|
|
116
|
+
const NO_EXPOSED_PRODUCER = 'no MCP tool or CLI command records it yet, so supply it from your own measurement';
|
|
117
|
+
const MISSING_METRIC_ADVICE = {
|
|
118
|
+
coverage: 'run the tests with coverage instrumentation enabled so measured line coverage is recorded '
|
|
119
|
+
+ '(a static estimate is not measured coverage)',
|
|
120
|
+
testsPassing: 'run the test suite (test_execute_parallel, or `aqe test execute`)',
|
|
121
|
+
// The static analyzer has no security measurement; a scan reports findings separately.
|
|
122
|
+
security: 'static analysis never measures security; drop it from metrics and use '
|
|
123
|
+
+ 'security_scan_comprehensive (or `aqe security`) for findings',
|
|
124
|
+
securityVulnerabilities: `a measured vulnerability count is required; ${NO_EXPOSED_PRODUCER}`,
|
|
125
|
+
criticalBugs: `a measured critical-bug count is required; ${NO_EXPOSED_PRODUCER}`,
|
|
126
|
+
codeSmells: `a measured code-smell count is required; ${NO_EXPOSED_PRODUCER}`,
|
|
127
|
+
technicalDebt: `a measured technical-debt ratio is required; ${NO_EXPOSED_PRODUCER}`,
|
|
128
|
+
duplications: `a measured duplication percentage is required; ${NO_EXPOSED_PRODUCER}`,
|
|
129
|
+
complexity: 'make sure the target contains readable TypeScript/JavaScript source the analyzer can parse',
|
|
130
|
+
maintainability: 'make sure the target contains readable TypeScript/JavaScript source the analyzer can parse',
|
|
131
|
+
testability: 'make sure the target contains readable TypeScript/JavaScript source the analyzer can parse',
|
|
132
|
+
duplication: 'make sure the target contains readable TypeScript/JavaScript source the analyzer can parse',
|
|
133
|
+
};
|
|
134
|
+
/** #996: one recommendation per unmeasured metric, naming what to run. */
|
|
135
|
+
export function describeMissingMetrics(unmeasured) {
|
|
136
|
+
return unmeasured.map((metric) => `Insufficient evidence: ${metric} not measured — ${MISSING_METRIC_ADVICE[metric] ?? 'measure it'}.`);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* #996: thrown when the measured gate cannot be evaluated. The message is the
|
|
140
|
+
* first problem found (unchanged wording); `unmeasured` names every metric
|
|
141
|
+
* whose record is absent, stale, future-dated or malformed.
|
|
142
|
+
*/
|
|
143
|
+
export class InsufficientQualityEvidenceError extends Error {
|
|
144
|
+
status = INSUFFICIENT_EVIDENCE;
|
|
145
|
+
unmeasured;
|
|
146
|
+
problems;
|
|
147
|
+
constructor(problems) {
|
|
148
|
+
super(problems[0]?.reason ?? 'Measured quality evidence is unavailable.');
|
|
149
|
+
this.name = 'InsufficientQualityEvidenceError';
|
|
150
|
+
this.problems = problems;
|
|
151
|
+
this.unmeasured = problems.map((p) => p.metric);
|
|
152
|
+
}
|
|
153
|
+
/** Structured, non-passing description of the gate that could not run. */
|
|
154
|
+
toDetails() {
|
|
155
|
+
return {
|
|
156
|
+
passed: false,
|
|
157
|
+
status: INSUFFICIENT_EVIDENCE,
|
|
158
|
+
evidenceStatus: INSUFFICIENT_EVIDENCE,
|
|
159
|
+
unmeasured: this.unmeasured,
|
|
160
|
+
gateEvaluated: false,
|
|
161
|
+
recommendations: describeMissingMetrics(this.unmeasured),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Inspect every canonical metric with the same validation, collecting each
|
|
167
|
+
* absent, stale, future-dated or malformed record instead of stopping at the first.
|
|
168
|
+
*/
|
|
169
|
+
export async function inspectQualityEvidence(memory, options = {}) {
|
|
82
170
|
const now = options.now ?? Date.now();
|
|
83
171
|
const maxAgeMs = options.maxAgeMs ?? DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS;
|
|
84
172
|
const values = {};
|
|
173
|
+
const problems = [];
|
|
174
|
+
const valid = {};
|
|
85
175
|
for (const metric of QUALITY_METRICS) {
|
|
86
176
|
const record = await memory.get(evidenceKey(metric), {
|
|
87
177
|
namespace: QUALITY_EVIDENCE_NAMESPACE,
|
|
88
178
|
});
|
|
89
|
-
|
|
90
|
-
|
|
179
|
+
try {
|
|
180
|
+
validateRecord(record, metric, now, maxAgeMs);
|
|
181
|
+
values[metric] = record.value;
|
|
182
|
+
valid[metric] = record;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
problems.push({ metric, reason: error instanceof Error ? error.message : String(error) });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// #1027 NB1: coverage measured in a run whose tests FAILED is evidence only
|
|
189
|
+
// next to the testsPassing of that same run — never next to a stale figure
|
|
190
|
+
// from an earlier (passing) run, which would let the gate pass.
|
|
191
|
+
const coverage = valid.coverage;
|
|
192
|
+
if (coverage?.runStatus === 'failed' && (!coverage.runId || valid.testsPassing?.runId !== coverage.runId)) {
|
|
193
|
+
delete values.coverage;
|
|
194
|
+
problems.push({
|
|
195
|
+
metric: 'coverage',
|
|
196
|
+
reason: 'Measured coverage comes from a run with failing tests, but no testsPassing evidence '
|
|
197
|
+
+ 'from that same run was recorded. Re-run the test suite.',
|
|
198
|
+
});
|
|
91
199
|
}
|
|
200
|
+
return { values, problems };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* #1028: the latest record of ONE metric when it is usable evidence — the same
|
|
204
|
+
* validation (schema, metric, finite value, source, fresh measuredAt) the gate
|
|
205
|
+
* applies — or `null`. Unlike {@link inspectQualityEvidence} it returns the
|
|
206
|
+
* record, so a reader can follow its `runId` to the run it came from.
|
|
207
|
+
*/
|
|
208
|
+
export async function readQualityEvidenceRecord(memory, metric, options = {}) {
|
|
209
|
+
const record = await memory.get(evidenceKey(metric), {
|
|
210
|
+
namespace: QUALITY_EVIDENCE_NAMESPACE,
|
|
211
|
+
});
|
|
212
|
+
try {
|
|
213
|
+
validateRecord(record, metric, options.now ?? Date.now(), options.maxAgeMs ?? DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS);
|
|
214
|
+
return record;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export async function loadQualityEvidence(memory, options = {}) {
|
|
221
|
+
const { values, problems } = await inspectQualityEvidence(memory, options);
|
|
222
|
+
if (problems.length > 0)
|
|
223
|
+
throw new InsufficientQualityEvidenceError(problems);
|
|
92
224
|
return values;
|
|
93
225
|
}
|
|
94
|
-
|
|
95
|
-
|
|
226
|
+
/**
|
|
227
|
+
* The single source of effective quality thresholds: canonical defaults with
|
|
228
|
+
* any override applied. Used by the measured gate and by static analysis
|
|
229
|
+
* (#996) so the two never disagree.
|
|
230
|
+
*/
|
|
231
|
+
export function resolveQualityThresholds(overrides = {}) {
|
|
232
|
+
if (overrides.coverage !== undefined && (!Number.isFinite(overrides.coverage) || overrides.coverage < 0 || overrides.coverage > 100)) {
|
|
96
233
|
throw new Error('Coverage quality threshold must be a finite number between 0 and 100.');
|
|
97
234
|
}
|
|
235
|
+
return {
|
|
236
|
+
...DEFAULT_QUALITY_THRESHOLDS,
|
|
237
|
+
...(overrides.coverage !== undefined
|
|
238
|
+
? { coverage: { ...DEFAULT_QUALITY_THRESHOLDS.coverage, value: overrides.coverage } }
|
|
239
|
+
: {}),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
export function evaluateQualityEvidence(values, thresholds = {}) {
|
|
243
|
+
const effective = resolveQualityThresholds(thresholds);
|
|
98
244
|
const checks = QUALITY_METRICS.map((name) => {
|
|
99
|
-
const threshold = name
|
|
100
|
-
? { ...DEFAULT_QUALITY_THRESHOLDS[name], value: thresholds.coverage }
|
|
101
|
-
: DEFAULT_QUALITY_THRESHOLDS[name];
|
|
245
|
+
const threshold = effective[name];
|
|
102
246
|
const value = values[name];
|
|
103
247
|
return {
|
|
104
248
|
name,
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* Comprehensive quality metrics analysis with trends and recommendations
|
|
4
4
|
*/
|
|
5
5
|
import { Result, QualityScore } from '../../../shared/types';
|
|
6
|
+
import { CodeMetricsAnalyzer } from '../../../shared/metrics';
|
|
6
7
|
import { MemoryBackend } from '../../../kernel/interfaces';
|
|
7
|
-
import { QualityAnalysisRequest, QualityReport, QualityMetricDetail, QualityTrend, ComplexityRequest, ComplexityReport, LLMQualityInsights } from '../interfaces';
|
|
8
|
+
import { QualityAnalysisRequest, QualityReport, QualityMetricDetail, QualityTrend, ComplexityRequest, ComplexityReport, LLMQualityInsights, UnmeasuredQualityMetric } from '../interfaces';
|
|
8
9
|
import type { HybridRouter } from '../../../shared/llm';
|
|
9
10
|
/**
|
|
10
11
|
* Interface for the quality analyzer service
|
|
@@ -49,7 +50,17 @@ export interface QualityAnalyzerDependencies {
|
|
|
49
50
|
memory: MemoryBackend;
|
|
50
51
|
/** ADR-051: Optional LLM router for AI-enhanced quality insights */
|
|
51
52
|
llmRouter?: HybridRouter;
|
|
53
|
+
/** Code metrics analyzer (defaults to the shared instance). */
|
|
54
|
+
metricsAnalyzer?: CodeMetricsAnalyzer;
|
|
52
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* #1021: a parsed metric with read/parse failures is still evidence when at
|
|
58
|
+
* least this share of the analysable files (in-scope minus excluded) was
|
|
59
|
+
* analysed. Below it, the unseen files are too large a blind spot for an
|
|
60
|
+
* average to describe the target, so the metric is unmeasured. 95% keeps one
|
|
61
|
+
* failure in a 20-file scope acceptable but not one in 10.
|
|
62
|
+
*/
|
|
63
|
+
export declare const MIN_ANALYSED_SHARE = 0.95;
|
|
53
64
|
export declare class QualityAnalyzerService implements IQualityAnalyzerService {
|
|
54
65
|
private readonly config;
|
|
55
66
|
private readonly metricsAnalyzer;
|
|
@@ -75,7 +86,7 @@ export declare class QualityAnalyzerService implements IQualityAnalyzerService {
|
|
|
75
86
|
* Generate quality insights using LLM
|
|
76
87
|
* Provides AI-powered explanation and prioritized recommendations
|
|
77
88
|
*/
|
|
78
|
-
generateQualityInsightsWithLLM(metrics: QualityMetricDetail[], score: QualityScore, codeContext?: string): Promise<LLMQualityInsights | null>;
|
|
89
|
+
generateQualityInsightsWithLLM(metrics: QualityMetricDetail[], score: QualityScore, codeContext?: string, unmeasured?: UnmeasuredQualityMetric[]): Promise<LLMQualityInsights | null>;
|
|
79
90
|
/**
|
|
80
91
|
* Build prompt for quality insights generation
|
|
81
92
|
*/
|
|
@@ -104,6 +115,16 @@ export declare class QualityAnalyzerService implements IQualityAnalyzerService {
|
|
|
104
115
|
* Get quality trend for a specific metric
|
|
105
116
|
*/
|
|
106
117
|
getQualityTrend(metric: string, days: number): Promise<Result<QualityTrend, Error>>;
|
|
118
|
+
/**
|
|
119
|
+
* Collect per-file metric values. #1011 / #1021:
|
|
120
|
+
* - excluded files (binary, generated, minified, declarations, refused by
|
|
121
|
+
* reader policy) leave the scope with a reason;
|
|
122
|
+
* - failed files (unreadable, unparseable) make a parsed metric partial, or
|
|
123
|
+
* unmeasured below MIN_ANALYSED_SHARE or when a failed file was named
|
|
124
|
+
* explicitly;
|
|
125
|
+
* - failed duplication detection and missing coverage are unmeasured.
|
|
126
|
+
* Never a fixed fallback value.
|
|
127
|
+
*/
|
|
107
128
|
private collectFileMetrics;
|
|
108
129
|
private getStoredCoverage;
|
|
109
130
|
private aggregateMetrics;
|