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
|
@@ -9,6 +9,26 @@ import { getCodeMetricsAnalyzer } from '../../../shared/metrics/index.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
|
+
import { measuredCoverageSummary, measuredFileCoverage } from '../coverage-report-event.js';
|
|
13
|
+
/** Metrics the static analyzer produces when the caller asks for all of them. */
|
|
14
|
+
const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
|
|
15
|
+
/** Metrics computed from parsing each source file. */
|
|
16
|
+
const PARSED_METRICS = new Set(['complexity', 'maintainability', 'testability']);
|
|
17
|
+
/**
|
|
18
|
+
* #1021: a parsed metric with read/parse failures is still evidence when at
|
|
19
|
+
* least this share of the analysable files (in-scope minus excluded) was
|
|
20
|
+
* analysed. Below it, the unseen files are too large a blind spot for an
|
|
21
|
+
* average to describe the target, so the metric is unmeasured. 95% keeps one
|
|
22
|
+
* failure in a 20-file scope acceptable but not one in 10.
|
|
23
|
+
*/
|
|
24
|
+
export const MIN_ANALYSED_SHARE = 0.95;
|
|
25
|
+
/** #1011: the sentinel for "not measured" in score and complexity fields. */
|
|
26
|
+
const UNMEASURED = -1;
|
|
27
|
+
/** First reasons of a failure list, for a one-line explanation. */
|
|
28
|
+
function summariseFailures(failures) {
|
|
29
|
+
return failures.slice(0, 3).map((f) => f.reason).join('; ')
|
|
30
|
+
+ (failures.length > 3 ? `; and ${failures.length - 3} more` : '');
|
|
31
|
+
}
|
|
12
32
|
const DEFAULT_CONFIG = {
|
|
13
33
|
enableTrendAnalysis: true,
|
|
14
34
|
trendDataPointsMin: 3,
|
|
@@ -52,14 +72,15 @@ export class QualityAnalyzerService {
|
|
|
52
72
|
*/
|
|
53
73
|
constructor(memoryOrDependencies, config = {}) {
|
|
54
74
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
55
|
-
this.metricsAnalyzer = getCodeMetricsAnalyzer();
|
|
56
75
|
// Support both old and new constructor signatures
|
|
57
76
|
if ('memory' in memoryOrDependencies) {
|
|
58
77
|
// New signature: dependencies object
|
|
59
78
|
this.memory = memoryOrDependencies.memory;
|
|
60
79
|
this.llmRouter = memoryOrDependencies.llmRouter;
|
|
80
|
+
this.metricsAnalyzer = memoryOrDependencies.metricsAnalyzer ?? getCodeMetricsAnalyzer();
|
|
61
81
|
}
|
|
62
82
|
else {
|
|
83
|
+
this.metricsAnalyzer = getCodeMetricsAnalyzer();
|
|
63
84
|
// Old signature: direct MemoryBackend
|
|
64
85
|
this.memory = memoryOrDependencies;
|
|
65
86
|
this.llmRouter = undefined;
|
|
@@ -84,11 +105,11 @@ export class QualityAnalyzerService {
|
|
|
84
105
|
* Generate quality insights using LLM
|
|
85
106
|
* Provides AI-powered explanation and prioritized recommendations
|
|
86
107
|
*/
|
|
87
|
-
async generateQualityInsightsWithLLM(metrics, score, codeContext) {
|
|
108
|
+
async generateQualityInsightsWithLLM(metrics, score, codeContext, unmeasured = []) {
|
|
88
109
|
if (!this.llmRouter)
|
|
89
110
|
return null;
|
|
90
111
|
try {
|
|
91
|
-
const prompt = this.buildQualityInsightsPrompt(metrics, score, codeContext);
|
|
112
|
+
const prompt = this.buildQualityInsightsPrompt(metrics, score, codeContext, unmeasured);
|
|
92
113
|
const modelId = this.getModelForTier(this.config.llmModelTier ?? 2);
|
|
93
114
|
const response = await this.llmRouter.chat({
|
|
94
115
|
messages: [
|
|
@@ -144,19 +165,26 @@ Focus on:
|
|
|
144
165
|
/**
|
|
145
166
|
* Build prompt for quality insights generation
|
|
146
167
|
*/
|
|
147
|
-
buildQualityInsightsPrompt(metrics, score, codeContext) {
|
|
168
|
+
buildQualityInsightsPrompt(metrics, score, codeContext, unmeasured = []) {
|
|
148
169
|
let prompt = `## Quality Analysis Results\n\n`;
|
|
149
|
-
prompt +=
|
|
170
|
+
prompt += score.overall >= 0
|
|
171
|
+
? `### Overall Score: ${score.overall}/100\n\n`
|
|
172
|
+
: `### Overall Score: not measured\n\n`;
|
|
150
173
|
prompt += `### Detailed Metrics:\n`;
|
|
151
174
|
for (const metric of metrics) {
|
|
152
175
|
prompt += `- **${metric.name}**: ${metric.value} (Rating: ${metric.rating}, Trend: ${metric.trend})\n`;
|
|
153
176
|
}
|
|
177
|
+
for (const missing of unmeasured) {
|
|
178
|
+
prompt += `- **${missing.metric}**: not measured (${missing.reason})\n`;
|
|
179
|
+
}
|
|
154
180
|
prompt += `\n`;
|
|
181
|
+
// #996: -1 means "not measured"; never present it to the model as a value.
|
|
182
|
+
const show = (value, unit = '') => (value >= 0 ? `${value}${unit}` : 'not measured');
|
|
155
183
|
prompt += `### Score Breakdown:\n`;
|
|
156
|
-
prompt += `- Coverage: ${score.coverage}
|
|
157
|
-
prompt += `- Complexity: ${score.complexity}\n`;
|
|
158
|
-
prompt += `- Maintainability: ${score.maintainability}\n`;
|
|
159
|
-
prompt += `- Security: ${score.security}\n\n`;
|
|
184
|
+
prompt += `- Coverage: ${show(score.coverage, '%')}\n`;
|
|
185
|
+
prompt += `- Complexity: ${show(score.complexity)}\n`;
|
|
186
|
+
prompt += `- Maintainability: ${show(score.maintainability)}\n`;
|
|
187
|
+
prompt += `- Security: ${show(score.security)}\n\n`;
|
|
160
188
|
if (codeContext) {
|
|
161
189
|
prompt += `### Code Context:\n\`\`\`\n${codeContext.slice(0, 2000)}\n\`\`\`\n\n`;
|
|
162
190
|
}
|
|
@@ -232,8 +260,8 @@ Focus on:
|
|
|
232
260
|
if (sourceFiles.length === 0) {
|
|
233
261
|
return err(new Error('No source files provided for analysis'));
|
|
234
262
|
}
|
|
235
|
-
// Analyze metrics for each file
|
|
236
|
-
const fileMetrics = await this.collectFileMetrics(sourceFiles, includeMetrics);
|
|
263
|
+
// Analyze metrics for each file; failures become unmeasured (#1011)
|
|
264
|
+
const { fileMetrics, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
|
|
237
265
|
// Calculate aggregated metrics
|
|
238
266
|
const metricDetails = this.aggregateMetrics(fileMetrics);
|
|
239
267
|
// Calculate overall quality score
|
|
@@ -247,7 +275,7 @@ Focus on:
|
|
|
247
275
|
// ADR-051: Generate LLM insights if enabled
|
|
248
276
|
let llmInsights;
|
|
249
277
|
if (this.isLLMInsightsAvailable()) {
|
|
250
|
-
const insights = await this.generateQualityInsightsWithLLM(metricDetails, score);
|
|
278
|
+
const insights = await this.generateQualityInsightsWithLLM(metricDetails, score, undefined, unmeasured);
|
|
251
279
|
if (insights) {
|
|
252
280
|
llmInsights = insights;
|
|
253
281
|
}
|
|
@@ -258,6 +286,9 @@ Focus on:
|
|
|
258
286
|
trends,
|
|
259
287
|
recommendations,
|
|
260
288
|
llmInsights,
|
|
289
|
+
unmeasured,
|
|
290
|
+
excluded,
|
|
291
|
+
partial,
|
|
261
292
|
};
|
|
262
293
|
// Store the report
|
|
263
294
|
await this.storeReport(report, sourceFiles);
|
|
@@ -342,88 +373,148 @@ Focus on:
|
|
|
342
373
|
// ============================================================================
|
|
343
374
|
// Private Helper Methods
|
|
344
375
|
// ============================================================================
|
|
345
|
-
|
|
376
|
+
/**
|
|
377
|
+
* Collect per-file metric values. #1011 / #1021:
|
|
378
|
+
* - excluded files (binary, generated, minified, declarations, refused by
|
|
379
|
+
* reader policy) leave the scope with a reason;
|
|
380
|
+
* - failed files (unreadable, unparseable) make a parsed metric partial, or
|
|
381
|
+
* unmeasured below MIN_ANALYSED_SHARE or when a failed file was named
|
|
382
|
+
* explicitly;
|
|
383
|
+
* - failed duplication detection and missing coverage are unmeasured.
|
|
384
|
+
* Never a fixed fallback value.
|
|
385
|
+
*/
|
|
386
|
+
async collectFileMetrics(files, includeMetrics, explicitFiles) {
|
|
387
|
+
const requested = includeMetrics.length === 0 ? [...ANALYZER_METRICS] : includeMetrics;
|
|
388
|
+
const wants = (metric) => requested.includes(metric);
|
|
346
389
|
const fileMetrics = new Map();
|
|
347
|
-
const
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
duplicationPercentage = 0;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
390
|
+
const unmeasured = [];
|
|
391
|
+
const excluded = [];
|
|
392
|
+
const partial = [];
|
|
393
|
+
const parseFailed = [];
|
|
394
|
+
const unreadable = [];
|
|
395
|
+
const readable = [];
|
|
396
|
+
const missingCoverage = [];
|
|
397
|
+
const explicit = new Set(explicitFiles);
|
|
398
|
+
const needsAnalysis = requested.some((m) => PARSED_METRICS.has(m) || m === 'duplication');
|
|
359
399
|
for (const file of files) {
|
|
360
400
|
const metrics = {};
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
}
|
|
368
|
-
if (includeAll || includeMetrics.includes('maintainability')) {
|
|
369
|
-
metrics.maintainability = fileAnalysis.maintainabilityIndex;
|
|
401
|
+
if (needsAnalysis) {
|
|
402
|
+
const outcome = await this.metricsAnalyzer.analyzeFileDetailed(file);
|
|
403
|
+
const reason = outcome.reason ?? `${file} could not be analysed`;
|
|
404
|
+
if (outcome.status === 'excluded') {
|
|
405
|
+
excluded.push({ file, reason });
|
|
406
|
+
continue;
|
|
370
407
|
}
|
|
371
|
-
if (
|
|
372
|
-
|
|
408
|
+
if (outcome.metrics)
|
|
409
|
+
readable.push(file);
|
|
410
|
+
if (outcome.status === 'failed') {
|
|
411
|
+
(outcome.metrics ? parseFailed : unreadable).push({ file, reason });
|
|
373
412
|
}
|
|
374
|
-
if (
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
metrics.coverage = storedCoverage;
|
|
413
|
+
else if (outcome.metrics) {
|
|
414
|
+
const analysis = outcome.metrics;
|
|
415
|
+
if (wants('complexity'))
|
|
416
|
+
metrics.complexity = analysis.cyclomaticComplexity;
|
|
417
|
+
if (wants('maintainability'))
|
|
418
|
+
metrics.maintainability = analysis.maintainabilityIndex;
|
|
419
|
+
if (wants('testability')) {
|
|
420
|
+
// Testability is derived from complexity and maintainability
|
|
421
|
+
// Lower complexity and higher maintainability = higher testability
|
|
422
|
+
const complexityFactor = Math.max(0, 100 - analysis.cyclomaticComplexity * 3);
|
|
423
|
+
const maintainabilityFactor = analysis.maintainabilityIndex;
|
|
424
|
+
metrics.testability = Math.round((complexityFactor * 0.4 + maintainabilityFactor * 0.6) * 100) / 100;
|
|
387
425
|
}
|
|
388
|
-
// If no coverage data exists, omit the metric rather than guessing
|
|
389
426
|
}
|
|
390
427
|
}
|
|
391
|
-
|
|
392
|
-
//
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
if (storedCoverage !== null) {
|
|
397
|
-
metrics.coverage = storedCoverage;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
if (includeAll || includeMetrics.includes('complexity')) {
|
|
401
|
-
metrics.complexity = 10;
|
|
402
|
-
}
|
|
403
|
-
if (includeAll || includeMetrics.includes('maintainability')) {
|
|
404
|
-
metrics.maintainability = 70;
|
|
405
|
-
}
|
|
406
|
-
if (includeAll || includeMetrics.includes('duplication')) {
|
|
407
|
-
metrics.duplication = duplicationPercentage;
|
|
428
|
+
if (wants('coverage')) {
|
|
429
|
+
// Coverage requires external data (from test runners) — never fabricate a number
|
|
430
|
+
const storedCoverage = await this.getStoredCoverage(file);
|
|
431
|
+
if (storedCoverage !== null) {
|
|
432
|
+
metrics.coverage = storedCoverage;
|
|
408
433
|
}
|
|
409
|
-
|
|
410
|
-
|
|
434
|
+
else {
|
|
435
|
+
missingCoverage.push(file);
|
|
411
436
|
}
|
|
412
437
|
}
|
|
413
438
|
fileMetrics.set(file, metrics);
|
|
414
439
|
}
|
|
415
|
-
|
|
440
|
+
const total = fileMetrics.size;
|
|
441
|
+
if (missingCoverage.length > 0) {
|
|
442
|
+
for (const metrics of fileMetrics.values())
|
|
443
|
+
delete metrics.coverage;
|
|
444
|
+
unmeasured.push({
|
|
445
|
+
metric: 'coverage',
|
|
446
|
+
reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s)`,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
/** Decide whether a metric with these failures is measured, partial or unmeasured. */
|
|
450
|
+
const judge = (metric, failures) => {
|
|
451
|
+
const analysed = total - failures.length;
|
|
452
|
+
if (analysed === 0) {
|
|
453
|
+
unmeasured.push({
|
|
454
|
+
metric,
|
|
455
|
+
reason: total === 0
|
|
456
|
+
? `no analysable files: ${excluded.length} file(s) excluded (${summariseFailures(excluded)})`
|
|
457
|
+
: `none of ${total} file(s) could be analysed: ${summariseFailures(failures)}`,
|
|
458
|
+
...(failures.length > 0 ? { files: failures.map((f) => f.file) } : {}),
|
|
459
|
+
});
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
if (failures.length === 0)
|
|
463
|
+
return true;
|
|
464
|
+
const share = analysed / total;
|
|
465
|
+
// Round DOWN so a partial scope never reads as 1 / 100% (#1021).
|
|
466
|
+
const permille = Math.floor((analysed * 1000) / total);
|
|
467
|
+
const coverageOfScope = permille / 1000;
|
|
468
|
+
const explicitFailure = failures.find((f) => explicit.has(f.file));
|
|
469
|
+
if (explicitFailure || share < MIN_ANALYSED_SHARE) {
|
|
470
|
+
const why = explicitFailure
|
|
471
|
+
? `explicit target ${explicitFailure.file} could not be analysed`
|
|
472
|
+
: `${analysed} of ${total} file(s) analysed (${permille / 10}%, below ${MIN_ANALYSED_SHARE * 100}%)`;
|
|
473
|
+
unmeasured.push({
|
|
474
|
+
metric,
|
|
475
|
+
reason: `${why}: ${summariseFailures(failures)}`,
|
|
476
|
+
files: failures.map((f) => f.file),
|
|
477
|
+
});
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
partial.push({ metric, analysedFiles: analysed, totalFiles: total, coverageOfScope, failed: failures });
|
|
481
|
+
return true;
|
|
482
|
+
};
|
|
483
|
+
const failedToParse = [...unreadable, ...parseFailed];
|
|
484
|
+
for (const metric of requested.filter((m) => PARSED_METRICS.has(m))) {
|
|
485
|
+
if (!judge(metric, failedToParse)) {
|
|
486
|
+
for (const metrics of fileMetrics.values())
|
|
487
|
+
delete metrics[metric];
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
// Duplication needs readable text, not a parse (#1021 N2).
|
|
491
|
+
if (wants('duplication') && judge('duplication', unreadable)) {
|
|
492
|
+
try {
|
|
493
|
+
const { percentage } = await this.metricsAnalyzer.detectDuplication(readable);
|
|
494
|
+
for (const metrics of fileMetrics.values())
|
|
495
|
+
metrics.duplication = percentage;
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
const index = partial.findIndex((p) => p.metric === 'duplication');
|
|
499
|
+
if (index >= 0)
|
|
500
|
+
partial.splice(index, 1);
|
|
501
|
+
unmeasured.push({ metric: 'duplication', reason: `duplication detection failed: ${toError(error).message}` });
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return { fileMetrics, unmeasured, excluded, partial };
|
|
416
505
|
}
|
|
417
506
|
async getStoredCoverage(file) {
|
|
418
507
|
try {
|
|
419
508
|
// 1. Try per-file coverage stored by test executor
|
|
420
|
-
|
|
421
|
-
|
|
509
|
+
// #1014: only measured records count. Legacy unstamped estimate
|
|
510
|
+
// records (written by <= 3.15.4, never expiring) are ignored.
|
|
511
|
+
const fileCoverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
|
|
512
|
+
if (fileCoverage) {
|
|
422
513
|
return fileCoverage.line;
|
|
423
514
|
}
|
|
424
515
|
// 2. Fall back to project-wide summary from coverage-analyzer
|
|
425
|
-
const summary = await this.memory.get('coverage:latest');
|
|
426
|
-
if (summary
|
|
516
|
+
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
517
|
+
if (summary) {
|
|
427
518
|
return summary.line;
|
|
428
519
|
}
|
|
429
520
|
// No coverage data available — return null (never fabricate)
|
|
@@ -478,15 +569,18 @@ Focus on:
|
|
|
478
569
|
weightedSum += normalizedValue * weight;
|
|
479
570
|
totalWeight += weight;
|
|
480
571
|
}
|
|
481
|
-
|
|
572
|
+
// #1011: no measured metric means no score — -1, never 0.
|
|
573
|
+
const overall = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : UNMEASURED;
|
|
482
574
|
// Use -1 to signal "no data available" rather than 0 which implies "0% coverage"
|
|
483
|
-
|
|
575
|
+
// (#996: the same holds for every score field — never fabricate a value).
|
|
576
|
+
const valueOf = (name) => metrics.find((m) => m.name === name)?.value ?? UNMEASURED;
|
|
484
577
|
return {
|
|
485
578
|
overall,
|
|
486
|
-
coverage:
|
|
487
|
-
complexity:
|
|
488
|
-
maintainability:
|
|
489
|
-
security
|
|
579
|
+
coverage: valueOf('coverage'),
|
|
580
|
+
complexity: valueOf('complexity'),
|
|
581
|
+
maintainability: valueOf('maintainability'),
|
|
582
|
+
// No security analysis runs here; -1 = not measured (was a fixed 85 placeholder).
|
|
583
|
+
security: UNMEASURED,
|
|
490
584
|
};
|
|
491
585
|
}
|
|
492
586
|
async generateTrends(currentMetrics, _compareBaseline) {
|
|
@@ -555,7 +649,7 @@ Focus on:
|
|
|
555
649
|
});
|
|
556
650
|
}
|
|
557
651
|
// Overall score recommendation
|
|
558
|
-
if (score.overall < 70) {
|
|
652
|
+
if (score.overall >= 0 && score.overall < 70) {
|
|
559
653
|
recommendations.push({
|
|
560
654
|
type: 'critical',
|
|
561
655
|
title: 'Overall Quality Improvement Needed',
|
|
@@ -571,50 +665,43 @@ Focus on:
|
|
|
571
665
|
}
|
|
572
666
|
async analyzeFileComplexity(file, requestedMetrics) {
|
|
573
667
|
const includesAll = requestedMetrics.length === 0;
|
|
668
|
+
const wants = (metric) => includesAll || requestedMetrics.includes(metric);
|
|
574
669
|
// Use real CodeMetricsAnalyzer for file analysis
|
|
575
|
-
const
|
|
576
|
-
if (
|
|
670
|
+
const { status, metrics: analysis, reason } = await this.metricsAnalyzer.analyzeFileDetailed(file);
|
|
671
|
+
if (status !== 'measured' || !analysis) {
|
|
672
|
+
// #1011: never invent values for a file that could not be analysed
|
|
577
673
|
return {
|
|
578
674
|
path: file,
|
|
579
|
-
cyclomatic:
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
: 0,
|
|
585
|
-
maintainability: includesAll || requestedMetrics.includes('maintainability')
|
|
586
|
-
? fileAnalysis.maintainabilityIndex
|
|
587
|
-
: 0,
|
|
588
|
-
linesOfCode: fileAnalysis.linesOfCode,
|
|
675
|
+
cyclomatic: UNMEASURED,
|
|
676
|
+
cognitive: UNMEASURED,
|
|
677
|
+
maintainability: UNMEASURED,
|
|
678
|
+
linesOfCode: UNMEASURED,
|
|
679
|
+
unmeasuredReason: reason ?? `${file} could not be analysed`,
|
|
589
680
|
};
|
|
590
681
|
}
|
|
591
|
-
//
|
|
682
|
+
// A metric that was not requested is not measured (-1), not 0 — a 0
|
|
683
|
+
// maintainability would otherwise be reported as a critical hotspot.
|
|
592
684
|
return {
|
|
593
685
|
path: file,
|
|
594
|
-
cyclomatic:
|
|
595
|
-
cognitive:
|
|
596
|
-
maintainability:
|
|
597
|
-
linesOfCode:
|
|
686
|
+
cyclomatic: wants('cyclomatic') ? analysis.cyclomaticComplexity : UNMEASURED,
|
|
687
|
+
cognitive: wants('cognitive') ? analysis.cognitiveComplexity : UNMEASURED,
|
|
688
|
+
maintainability: wants('maintainability') ? analysis.maintainabilityIndex : UNMEASURED,
|
|
689
|
+
linesOfCode: analysis.linesOfCode,
|
|
598
690
|
};
|
|
599
691
|
}
|
|
600
692
|
calculateComplexitySummary(files) {
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
}
|
|
609
|
-
const sumCyclomatic = files.reduce((sum, f) => sum + f.cyclomatic, 0);
|
|
610
|
-
const sumCognitive = files.reduce((sum, f) => sum + f.cognitive, 0);
|
|
611
|
-
const sumMaintainability = files.reduce((sum, f) => sum + f.maintainability, 0);
|
|
612
|
-
const totalLOC = files.reduce((sum, f) => sum + f.linesOfCode, 0);
|
|
693
|
+
// #1011: average measured values only; -1 when nothing was measured.
|
|
694
|
+
const average = (values) => {
|
|
695
|
+
const measured = values.filter((v) => v >= 0);
|
|
696
|
+
if (measured.length === 0)
|
|
697
|
+
return UNMEASURED;
|
|
698
|
+
return Math.round((measured.reduce((sum, v) => sum + v, 0) / measured.length) * 100) / 100;
|
|
699
|
+
};
|
|
613
700
|
return {
|
|
614
|
-
averageCyclomatic:
|
|
615
|
-
averageCognitive:
|
|
616
|
-
averageMaintainability:
|
|
617
|
-
totalLinesOfCode:
|
|
701
|
+
averageCyclomatic: average(files.map((f) => f.cyclomatic)),
|
|
702
|
+
averageCognitive: average(files.map((f) => f.cognitive)),
|
|
703
|
+
averageMaintainability: average(files.map((f) => f.maintainability)),
|
|
704
|
+
totalLinesOfCode: files.reduce((sum, f) => sum + Math.max(0, f.linesOfCode), 0),
|
|
618
705
|
};
|
|
619
706
|
}
|
|
620
707
|
identifyHotspots(files) {
|
|
@@ -643,8 +730,8 @@ Focus on:
|
|
|
643
730
|
: 'Simplify control flow and reduce nesting depth.',
|
|
644
731
|
});
|
|
645
732
|
}
|
|
646
|
-
// Check maintainability (lower is worse)
|
|
647
|
-
if (file.maintainability <= thresholds.maintainability.warning) {
|
|
733
|
+
// Check maintainability (lower is worse); -1 = not measured, never a hotspot
|
|
734
|
+
if (file.maintainability >= 0 && file.maintainability <= thresholds.maintainability.warning) {
|
|
648
735
|
hotspots.push({
|
|
649
736
|
file: file.path,
|
|
650
737
|
function: 'unknown',
|
|
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../../logging/index.js';
|
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
7
|
import { ok, err } from '../../../../shared/types/index.js';
|
|
8
8
|
import { toError } from '../../../../shared/error-utils.js';
|
|
9
|
+
import { fetchWithResponseDeadline } from '../../../../shared/llm/providers/response-deadline.js';
|
|
9
10
|
import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, handleFetchError, calculateSummary, storeScanResults, } from './dast-helpers.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// DAST Scanner Service
|
|
@@ -144,20 +145,19 @@ export class DASTScanner {
|
|
|
144
145
|
}
|
|
145
146
|
const timeout = options.timeout ?? this.config.timeout;
|
|
146
147
|
const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
|
|
147
|
-
// Perform main page scan
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
// Perform main page scan. #980: the deadline must cover the body too —
|
|
149
|
+
// the target is untrusted and may send headers and then stall the body,
|
|
150
|
+
// so it stays armed until `response.clone().text()` below has finished.
|
|
151
|
+
const deadlineMs = Math.min(timeout, 30000);
|
|
150
152
|
try {
|
|
151
|
-
const response = await
|
|
153
|
+
const response = await fetchWithResponseDeadline(targetUrl, {
|
|
152
154
|
method: 'GET',
|
|
153
155
|
headers: {
|
|
154
156
|
'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
|
|
155
157
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
156
158
|
},
|
|
157
|
-
signal: controller.signal,
|
|
158
159
|
redirect: 'follow',
|
|
159
|
-
});
|
|
160
|
-
clearTimeout(timeoutId);
|
|
160
|
+
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
161
161
|
crawledUrls++;
|
|
162
162
|
// Security header analysis
|
|
163
163
|
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities);
|
|
@@ -171,19 +171,25 @@ export class DASTScanner {
|
|
|
171
171
|
analyzeServerHeaders(response.headers, targetUrl, vulnerabilities);
|
|
172
172
|
// Active scanning features
|
|
173
173
|
if (options.activeScanning ?? this.config.dastActiveScanning) {
|
|
174
|
+
// Read the page body first, inside the request deadline (#980), so the
|
|
175
|
+
// slower probes below cannot use up the deadline of a healthy target.
|
|
176
|
+
const responseText = await response.text();
|
|
174
177
|
crawledUrls = await scanSensitiveFiles(parsedUrl, crawledUrls, maxDepth, vulnerabilities);
|
|
175
178
|
await analyzeCORS(targetUrl, vulnerabilities);
|
|
176
179
|
// Enhanced DAST: Link crawling, injection testing, form analysis
|
|
177
|
-
const responseText = await response.clone().text();
|
|
178
180
|
crawledUrls = await extractAndCrawlLinks(responseText, parsedUrl, crawledUrls, maxDepth, vulnerabilities);
|
|
179
181
|
if (parsedUrl.search) {
|
|
180
182
|
await this.testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities);
|
|
181
183
|
}
|
|
182
184
|
analyzeFormsForSecurityIssues(responseText, targetUrl, vulnerabilities);
|
|
183
185
|
}
|
|
186
|
+
else {
|
|
187
|
+
// Passive scan: headers only. Release the connection instead of
|
|
188
|
+
// leaving an unread body to the deadline timer.
|
|
189
|
+
await response.body?.cancel().catch(() => undefined);
|
|
190
|
+
}
|
|
184
191
|
}
|
|
185
192
|
catch (fetchError) {
|
|
186
|
-
clearTimeout(timeoutId);
|
|
187
193
|
handleFetchError(fetchError, targetUrl, vulnerabilities);
|
|
188
194
|
}
|
|
189
195
|
}
|
|
@@ -210,20 +216,21 @@ export class DASTScanner {
|
|
|
210
216
|
}
|
|
211
217
|
const timeout = options.timeout ?? this.config.timeout;
|
|
212
218
|
const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
|
|
213
|
-
|
|
214
|
-
|
|
219
|
+
// #980 review N8: same deadline treatment as the unauthenticated scan.
|
|
220
|
+
// This path reads headers only; the unread body is cancelled below so
|
|
221
|
+
// a target that stalls it cannot hold the connection open.
|
|
222
|
+
const deadlineMs = Math.min(timeout, 30000);
|
|
215
223
|
try {
|
|
216
|
-
const response = await
|
|
224
|
+
const response = await fetchWithResponseDeadline(targetUrl, {
|
|
217
225
|
method: 'GET',
|
|
218
226
|
headers: {
|
|
219
227
|
'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
|
|
220
228
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
221
229
|
...authHeaders,
|
|
222
230
|
},
|
|
223
|
-
signal: controller.signal,
|
|
224
231
|
redirect: 'follow',
|
|
225
|
-
});
|
|
226
|
-
|
|
232
|
+
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
233
|
+
await response.body?.cancel().catch(() => undefined);
|
|
227
234
|
crawledUrls++;
|
|
228
235
|
// Check if authentication was successful
|
|
229
236
|
if (response.status === 401 || response.status === 403) {
|
|
@@ -244,7 +251,6 @@ export class DASTScanner {
|
|
|
244
251
|
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities, true);
|
|
245
252
|
}
|
|
246
253
|
catch (fetchError) {
|
|
247
|
-
clearTimeout(timeoutId);
|
|
248
254
|
handleFetchError(fetchError, targetUrl, vulnerabilities);
|
|
249
255
|
}
|
|
250
256
|
}
|
|
@@ -76,9 +76,11 @@ export interface ITestRunResult {
|
|
|
76
76
|
export interface IFileCoverageData {
|
|
77
77
|
path: string;
|
|
78
78
|
line: number;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
/** `null` = no branches in the file (istanbul 0/0): not collected, not 100% (#1015). */
|
|
80
|
+
branch: number | null;
|
|
81
|
+
/** `null` = no functions in the file (istanbul 0/0): not collected, not 100% (#1015). */
|
|
82
|
+
function: number | null;
|
|
83
|
+
statement: number | null;
|
|
82
84
|
}
|
|
83
85
|
export interface IFailedTest {
|
|
84
86
|
testId: string;
|
|
@@ -90,9 +92,11 @@ export interface IFailedTest {
|
|
|
90
92
|
}
|
|
91
93
|
export interface ICoverageData {
|
|
92
94
|
line: number;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
/** `null` = not collected (no branches anywhere), never a fake 0 or 100 (#1015). */
|
|
96
|
+
branch: number | null;
|
|
97
|
+
/** `null` = not collected (no functions anywhere), never a fake 0 or 100 (#1015). */
|
|
98
|
+
function: number | null;
|
|
99
|
+
statement: number | null;
|
|
96
100
|
}
|
|
97
101
|
export interface IFlakyDetectionRequest {
|
|
98
102
|
testFiles: string[];
|
|
@@ -6,6 +6,7 @@ import { err } from '../../shared/types/index.js';
|
|
|
6
6
|
import { BaseDomainPlugin } from '../domain-interface.js';
|
|
7
7
|
import { createTestExecutionCoordinator } from './coordinator.js';
|
|
8
8
|
import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
|
|
9
|
+
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
9
10
|
// ============================================================================
|
|
10
11
|
// Plugin Implementation
|
|
11
12
|
// ============================================================================
|
|
@@ -200,6 +201,9 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
200
201
|
});
|
|
201
202
|
}
|
|
202
203
|
async handleCoverageGapDetected(event) {
|
|
204
|
+
// #1014: only a gap found in MEASURED coverage is acted on / learned from.
|
|
205
|
+
if (!isMeasuredGapPayload(event.payload))
|
|
206
|
+
return;
|
|
203
207
|
const payload = event.payload;
|
|
204
208
|
// Could trigger targeted test execution for high-risk gaps
|
|
205
209
|
if (payload.riskScore > 0.7) {
|