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
|
@@ -112,12 +112,17 @@ export class PersistentScheduler {
|
|
|
112
112
|
}
|
|
113
113
|
try {
|
|
114
114
|
const content = fs.readFileSync(this.schedulesPath, 'utf-8');
|
|
115
|
-
const data = this.parseSchedulesFile(content);
|
|
115
|
+
const { file: data, skipped } = this.parseSchedulesFile(content);
|
|
116
|
+
if (skipped.length > 0) {
|
|
117
|
+
console.warn(`[PersistentScheduler] Skipped ${skipped.length} malformed schedule ` +
|
|
118
|
+
`entries in ${this.schedulesPath} (not an object, no id, or duplicate id)`);
|
|
119
|
+
}
|
|
116
120
|
this.log(`Loaded ${data.schedules.length} schedules`);
|
|
117
121
|
return data.schedules;
|
|
118
122
|
}
|
|
119
123
|
catch (error) {
|
|
120
|
-
//
|
|
124
|
+
// Only a genuinely unparseable file gets here (bad JSON, no schedules
|
|
125
|
+
// array, oversize); malformed entries are disabled or skipped (#991).
|
|
121
126
|
await this.handleCorruptFile(error);
|
|
122
127
|
return [];
|
|
123
128
|
}
|
|
@@ -128,7 +133,7 @@ export class PersistentScheduler {
|
|
|
128
133
|
async saveSchedule(schedule) {
|
|
129
134
|
await this.initialize();
|
|
130
135
|
await this.withFileLock(async () => {
|
|
131
|
-
const schedules =
|
|
136
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
132
137
|
const existingIndex = schedules.findIndex(s => s.id === schedule.id);
|
|
133
138
|
if (existingIndex >= 0) {
|
|
134
139
|
schedules[existingIndex] = schedule;
|
|
@@ -138,7 +143,7 @@ export class PersistentScheduler {
|
|
|
138
143
|
schedules.push(schedule);
|
|
139
144
|
this.log(`Added schedule: ${schedule.id}`);
|
|
140
145
|
}
|
|
141
|
-
await this.writeSchedules(schedules);
|
|
146
|
+
await this.writeSchedules(schedules, skipped);
|
|
142
147
|
});
|
|
143
148
|
}
|
|
144
149
|
/**
|
|
@@ -147,13 +152,13 @@ export class PersistentScheduler {
|
|
|
147
152
|
async removeSchedule(id) {
|
|
148
153
|
await this.initialize();
|
|
149
154
|
await this.withFileLock(async () => {
|
|
150
|
-
const schedules =
|
|
155
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
151
156
|
const newSchedules = schedules.filter(s => s.id !== id);
|
|
152
157
|
if (newSchedules.length === schedules.length) {
|
|
153
158
|
this.log(`Schedule not found: ${id}`);
|
|
154
159
|
return;
|
|
155
160
|
}
|
|
156
|
-
await this.writeSchedules(newSchedules);
|
|
161
|
+
await this.writeSchedules(newSchedules, skipped);
|
|
157
162
|
this.log(`Removed schedule: ${id}`);
|
|
158
163
|
});
|
|
159
164
|
}
|
|
@@ -189,15 +194,20 @@ export class PersistentScheduler {
|
|
|
189
194
|
async markExecuted(id) {
|
|
190
195
|
await this.initialize();
|
|
191
196
|
await this.withFileLock(async () => {
|
|
192
|
-
const schedules =
|
|
197
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
193
198
|
const schedule = schedules.find(s => s.id === id);
|
|
194
199
|
if (!schedule) {
|
|
195
200
|
throw new Error(`Schedule not found: ${id}`);
|
|
196
201
|
}
|
|
197
202
|
const now = new Date();
|
|
198
203
|
schedule.lastRun = now.toISOString();
|
|
199
|
-
|
|
200
|
-
|
|
204
|
+
// #913: an entry disabled on load (legacy/invalid cron, missing fields)
|
|
205
|
+
// has no computable next run. Record the run and keep it disabled
|
|
206
|
+
// instead of throwing from calculateNextRun.
|
|
207
|
+
if (!schedule.disabledReason) {
|
|
208
|
+
schedule.nextRun = calculateNextRun(schedule.schedule, now).toISOString();
|
|
209
|
+
}
|
|
210
|
+
await this.writeSchedules(schedules, skipped);
|
|
201
211
|
this.log(`Marked executed: ${id}, next run: ${schedule.nextRun}`);
|
|
202
212
|
});
|
|
203
213
|
}
|
|
@@ -207,17 +217,22 @@ export class PersistentScheduler {
|
|
|
207
217
|
async setEnabled(id, enabled) {
|
|
208
218
|
await this.initialize();
|
|
209
219
|
await this.withFileLock(async () => {
|
|
210
|
-
const schedules =
|
|
220
|
+
const { schedules, skipped } = this.loadForWrite();
|
|
211
221
|
const schedule = schedules.find(s => s.id === id);
|
|
212
222
|
if (!schedule) {
|
|
213
223
|
throw new Error(`Schedule not found: ${id}`);
|
|
214
224
|
}
|
|
225
|
+
// #913/#991: an entry disabled on load cannot run; say why instead of
|
|
226
|
+
// failing inside calculateNextRun (or with no cron at all).
|
|
227
|
+
if (enabled && schedule.disabledReason) {
|
|
228
|
+
throw new Error(`Cannot enable schedule ${id}: ${schedule.disabledReason}`);
|
|
229
|
+
}
|
|
215
230
|
schedule.enabled = enabled;
|
|
216
231
|
// If re-enabling, recalculate next run from now
|
|
217
232
|
if (enabled) {
|
|
218
233
|
schedule.nextRun = calculateNextRun(schedule.schedule, new Date()).toISOString();
|
|
219
234
|
}
|
|
220
|
-
await this.writeSchedules(schedules);
|
|
235
|
+
await this.writeSchedules(schedules, skipped);
|
|
221
236
|
this.log(`Set enabled=${enabled}: ${id}`);
|
|
222
237
|
});
|
|
223
238
|
}
|
|
@@ -241,7 +256,8 @@ export class PersistentScheduler {
|
|
|
241
256
|
async clearAll() {
|
|
242
257
|
await this.initialize();
|
|
243
258
|
await this.withFileLock(async () => {
|
|
244
|
-
|
|
259
|
+
const { skipped } = this.loadForWrite();
|
|
260
|
+
await this.writeSchedules([], skipped);
|
|
245
261
|
this.log('Cleared all schedules');
|
|
246
262
|
});
|
|
247
263
|
}
|
|
@@ -262,19 +278,22 @@ export class PersistentScheduler {
|
|
|
262
278
|
// Private Helper Methods
|
|
263
279
|
// ============================================================================
|
|
264
280
|
/**
|
|
265
|
-
* Load schedules
|
|
281
|
+
* Load schedules for a locked read-modify-write. A genuinely unparseable
|
|
282
|
+
* file is backed up (not removed) first, so the write that follows cannot
|
|
283
|
+
* silently replace it with fewer schedules.
|
|
266
284
|
*/
|
|
267
|
-
|
|
285
|
+
loadForWrite() {
|
|
268
286
|
if (!fs.existsSync(this.schedulesPath)) {
|
|
269
|
-
return [];
|
|
287
|
+
return { schedules: [], skipped: [] };
|
|
270
288
|
}
|
|
271
289
|
try {
|
|
272
290
|
const content = fs.readFileSync(this.schedulesPath, 'utf-8');
|
|
273
|
-
const
|
|
274
|
-
return
|
|
291
|
+
const { file, skipped } = this.parseSchedulesFile(content);
|
|
292
|
+
return { schedules: file.schedules, skipped };
|
|
275
293
|
}
|
|
276
|
-
catch {
|
|
277
|
-
|
|
294
|
+
catch (error) {
|
|
295
|
+
this.backupCorruptFile(error);
|
|
296
|
+
return { schedules: [], skipped: [] };
|
|
278
297
|
}
|
|
279
298
|
}
|
|
280
299
|
/**
|
|
@@ -288,32 +307,53 @@ export class PersistentScheduler {
|
|
|
288
307
|
throw new Error(`Schedules file exceeds maximum allowed size (${MAX_SCHEDULES_FILE_SIZE / (1024 * 1024)}MB). File is ${(contentSize / (1024 * 1024)).toFixed(2)}MB.`);
|
|
289
308
|
}
|
|
290
309
|
const data = safeJsonParse(content);
|
|
291
|
-
// Validate structure
|
|
292
|
-
if (!data
|
|
310
|
+
// Validate structure: only a missing schedules array makes the file corrupt.
|
|
311
|
+
if (!isPlainObject(data) || !Array.isArray(data.schedules)) {
|
|
293
312
|
throw new Error('Invalid schedules file: missing schedules array');
|
|
294
313
|
}
|
|
295
|
-
//
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
314
|
+
// #991: validate each entry on its own. A malformed entry is disabled
|
|
315
|
+
// (when it can still be addressed by id) or skipped; it never makes the
|
|
316
|
+
// whole file "corrupt", which used to back up and REMOVE schedules.json.
|
|
317
|
+
const schedules = [];
|
|
318
|
+
const skipped = [];
|
|
319
|
+
const seen = new Set();
|
|
320
|
+
for (const entry of data.schedules) {
|
|
321
|
+
if (!isPlainObject(entry) || typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id)) {
|
|
322
|
+
skipped.push(entry);
|
|
323
|
+
continue;
|
|
299
324
|
}
|
|
300
|
-
|
|
301
|
-
|
|
325
|
+
const schedule = entry;
|
|
326
|
+
seen.add(schedule.id);
|
|
327
|
+
const reason = scheduleDisabledReason(entry);
|
|
328
|
+
if (reason) {
|
|
329
|
+
schedule.disabledReason = reason;
|
|
302
330
|
if (schedule.enabled) {
|
|
303
|
-
console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${
|
|
331
|
+
console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${reason}`);
|
|
304
332
|
}
|
|
305
333
|
schedule.enabled = false;
|
|
306
334
|
}
|
|
307
335
|
else {
|
|
308
336
|
delete schedule.disabledReason;
|
|
309
337
|
}
|
|
338
|
+
schedules.push(schedule);
|
|
310
339
|
}
|
|
311
|
-
return data;
|
|
340
|
+
return { file: { ...data, schedules }, skipped };
|
|
312
341
|
}
|
|
313
342
|
/**
|
|
314
343
|
* Write schedules to disk
|
|
315
344
|
*/
|
|
316
|
-
async writeSchedules(schedules) {
|
|
345
|
+
async writeSchedules(schedules, skipped = []) {
|
|
346
|
+
// #991: entries skipped on load are not written back; keep a copy next to
|
|
347
|
+
// the file first so nothing a user stored is lost silently.
|
|
348
|
+
if (skipped.length > 0) {
|
|
349
|
+
const quarantinePath = `${this.schedulesPath}.quarantine.${Date.now()}.json`;
|
|
350
|
+
fs.writeFileSync(quarantinePath, JSON.stringify({
|
|
351
|
+
quarantinedAt: new Date().toISOString(),
|
|
352
|
+
reason: 'Malformed schedule entries (not an object, no id, or duplicate id)',
|
|
353
|
+
entries: skipped,
|
|
354
|
+
}, null, 2), { encoding: 'utf-8', flag: 'wx' });
|
|
355
|
+
console.warn(`[PersistentScheduler] Moved ${skipped.length} malformed schedule entries to ${quarantinePath}`);
|
|
356
|
+
}
|
|
317
357
|
const data = {
|
|
318
358
|
version: FILE_VERSION,
|
|
319
359
|
updatedAt: new Date().toISOString(),
|
|
@@ -329,17 +369,7 @@ export class PersistentScheduler {
|
|
|
329
369
|
async handleCorruptFile(error) {
|
|
330
370
|
const errorMsg = toErrorMessage(error);
|
|
331
371
|
this.log(`Corrupt schedules file detected: ${errorMsg}`);
|
|
332
|
-
|
|
333
|
-
const backupPath = `${this.schedulesPath}.corrupt.${Date.now()}`;
|
|
334
|
-
try {
|
|
335
|
-
if (fs.existsSync(this.schedulesPath)) {
|
|
336
|
-
fs.copyFileSync(this.schedulesPath, backupPath);
|
|
337
|
-
this.log(`Backed up corrupt file to: ${backupPath}`);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
catch (backupError) {
|
|
341
|
-
this.log(`Failed to backup corrupt file: ${backupError}`);
|
|
342
|
-
}
|
|
372
|
+
this.backupCorruptFile(error);
|
|
343
373
|
// Remove corrupt file
|
|
344
374
|
try {
|
|
345
375
|
if (fs.existsSync(this.schedulesPath)) {
|
|
@@ -351,6 +381,20 @@ export class PersistentScheduler {
|
|
|
351
381
|
this.log(`Failed to remove corrupt file: ${removeError}`);
|
|
352
382
|
}
|
|
353
383
|
}
|
|
384
|
+
/** Copy an unparseable schedules file to `.corrupt.<ts>` (left in place). */
|
|
385
|
+
backupCorruptFile(error) {
|
|
386
|
+
this.log(`Corrupt schedules file detected: ${toErrorMessage(error)}`);
|
|
387
|
+
const backupPath = `${this.schedulesPath}.corrupt.${Date.now()}`;
|
|
388
|
+
try {
|
|
389
|
+
if (fs.existsSync(this.schedulesPath)) {
|
|
390
|
+
fs.copyFileSync(this.schedulesPath, backupPath, fs.constants.COPYFILE_EXCL);
|
|
391
|
+
this.log(`Backed up corrupt file to: ${backupPath}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch (backupError) {
|
|
395
|
+
this.log(`Failed to backup corrupt file: ${backupError}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
354
398
|
/**
|
|
355
399
|
* Execute a function with file locking for safe concurrent access
|
|
356
400
|
*/
|
|
@@ -433,6 +477,28 @@ export class PersistentScheduler {
|
|
|
433
477
|
}
|
|
434
478
|
}
|
|
435
479
|
// ============================================================================
|
|
480
|
+
// Entry validation (#991)
|
|
481
|
+
// ============================================================================
|
|
482
|
+
function isPlainObject(value) {
|
|
483
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Why a persisted entry cannot run, or undefined when it is valid. Such
|
|
487
|
+
* entries are kept (disabled) so `workflow list` shows them with the reason.
|
|
488
|
+
*/
|
|
489
|
+
function scheduleDisabledReason(entry) {
|
|
490
|
+
if (!Object.prototype.hasOwnProperty.call(entry, 'schedule')) {
|
|
491
|
+
return 'Missing cron expression (no schedule field)';
|
|
492
|
+
}
|
|
493
|
+
if (typeof entry.schedule !== 'string' || !isValidCronExpression(entry.schedule)) {
|
|
494
|
+
return `Invalid cron expression: ${String(entry.schedule)}`;
|
|
495
|
+
}
|
|
496
|
+
if (typeof entry.workflowId !== 'string' || entry.workflowId.length === 0) {
|
|
497
|
+
return 'Missing workflowId';
|
|
498
|
+
}
|
|
499
|
+
return undefined;
|
|
500
|
+
}
|
|
501
|
+
// ============================================================================
|
|
436
502
|
// Factory Function
|
|
437
503
|
// ============================================================================
|
|
438
504
|
/**
|
|
@@ -64,14 +64,22 @@ export interface TestRunSummary {
|
|
|
64
64
|
tests?: TestResult[];
|
|
65
65
|
}
|
|
66
66
|
export interface CoverageResult {
|
|
67
|
+
/** `null` = the report never collected that metric (#995); not 0%. */
|
|
67
68
|
summary: {
|
|
68
|
-
line: number;
|
|
69
|
-
branch: number;
|
|
70
|
-
function: number;
|
|
71
|
-
statement: number;
|
|
69
|
+
line: number | null;
|
|
70
|
+
branch: number | null;
|
|
71
|
+
function: number | null;
|
|
72
|
+
statement: number | null;
|
|
72
73
|
};
|
|
73
|
-
|
|
74
|
+
/** `null` = no verdict: nothing was measured (UNMEASURED or estimate only, #1012). */
|
|
75
|
+
meetsThreshold: boolean | null;
|
|
74
76
|
threshold: number;
|
|
77
|
+
/** Provenance, the same vocabulary as MCP `coverage_analyze_sublinear` (#1012). */
|
|
78
|
+
measured?: boolean;
|
|
79
|
+
estimated?: boolean;
|
|
80
|
+
unmeasured?: boolean;
|
|
81
|
+
coverageMethod?: string;
|
|
82
|
+
warning?: string;
|
|
75
83
|
files?: Array<{
|
|
76
84
|
path: string;
|
|
77
85
|
lineCoverage: number;
|
|
@@ -96,6 +104,15 @@ export interface QualityGateResult {
|
|
|
96
104
|
threshold: number | string;
|
|
97
105
|
}>;
|
|
98
106
|
recommendations?: string[];
|
|
107
|
+
/** #996 (additive): 'insufficient-evidence' when the gate could not be evaluated. */
|
|
108
|
+
status?: 'insufficient-evidence';
|
|
109
|
+
evidenceStatus?: 'measured' | 'insufficient-evidence';
|
|
110
|
+
/** #996: canonical metrics with no measured evidence. */
|
|
111
|
+
unmeasured?: string[];
|
|
112
|
+
/** #996: false when missing evidence prevented the gate from running. */
|
|
113
|
+
gateEvaluated?: boolean;
|
|
114
|
+
/** #996: why the gate could not be evaluated. */
|
|
115
|
+
error?: string;
|
|
99
116
|
}
|
|
100
117
|
/**
|
|
101
118
|
* Standard --format and --output options to add to any Command.
|
|
@@ -207,13 +207,28 @@ export function toJUnit(summary) {
|
|
|
207
207
|
// ============================================================================
|
|
208
208
|
export function coverageToMarkdown(result) {
|
|
209
209
|
let md = `# Coverage Report\n\n`;
|
|
210
|
+
// #1012: an estimate is labelled and carries no verdict.
|
|
211
|
+
if (result.estimated) {
|
|
212
|
+
md += `> **STATIC ESTIMATE — not measured.** ${result.warning ?? ''}\n\n`;
|
|
213
|
+
}
|
|
214
|
+
const evaluated = result.meetsThreshold !== null && !result.estimated;
|
|
215
|
+
// #1027 N7: one decimal, never `~33.33333333333333%`.
|
|
216
|
+
const fmt = (v) => String(Math.round(v * 10) / 10);
|
|
210
217
|
md += `| Metric | Value | Status |\n`;
|
|
211
218
|
md += `|--------|-------|--------|\n`;
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
219
|
+
// #995: an uncollected metric is "n/a", with no pass/fail mark — it is not 0%.
|
|
220
|
+
const row = (label, v) => v === null
|
|
221
|
+
? `| ${label} | n/a (not collected) | \u2014 |\n`
|
|
222
|
+
: evaluated
|
|
223
|
+
? `| ${label} | ${fmt(v)}% | ${v >= result.threshold ? '\u2705' : '\u274C'} |\n`
|
|
224
|
+
: `| ${label} | ~${fmt(v)}% (estimate) | \u2014 |\n`;
|
|
225
|
+
md += row('Lines', result.summary.line);
|
|
226
|
+
md += row('Branches', result.summary.branch);
|
|
227
|
+
md += row('Functions', result.summary.function);
|
|
228
|
+
md += row('Statements', result.summary.statement);
|
|
229
|
+
md += evaluated
|
|
230
|
+
? `\n**Threshold:** ${result.threshold}% \u2014 ${result.meetsThreshold ? '\u2705 Met' : '\u274C Not met'}\n`
|
|
231
|
+
: `\n**Threshold:** ${result.threshold}% \u2014 not evaluated (UNMEASURED)\n`;
|
|
217
232
|
if (result.gaps && result.gaps.length > 0) {
|
|
218
233
|
md += `\n## Coverage Gaps\n\n`;
|
|
219
234
|
md += `| File | Uncovered Lines | Risk | Severity |\n`;
|
|
@@ -232,6 +247,19 @@ export function coverageToMarkdown(result) {
|
|
|
232
247
|
}
|
|
233
248
|
export function qualityGateToMarkdown(result) {
|
|
234
249
|
let md = `# Quality Gate Report\n\n`;
|
|
250
|
+
if (result.evidenceStatus === 'insufficient-evidence') {
|
|
251
|
+
// #996: a gate that could not run is neither a pass nor a measured failure.
|
|
252
|
+
md += `**Result:** \u26A0\uFE0F INSUFFICIENT EVIDENCE \u2014 quality gate not evaluated\n`;
|
|
253
|
+
if (result.unmeasured && result.unmeasured.length > 0) {
|
|
254
|
+
md += `**Unmeasured:** ${result.unmeasured.join(', ')}\n`;
|
|
255
|
+
}
|
|
256
|
+
if (result.error)
|
|
257
|
+
md += `**Reason:** ${result.error}\n`;
|
|
258
|
+
if (result.recommendations && result.recommendations.length > 0) {
|
|
259
|
+
md += `\n## Recommendations\n\n${result.recommendations.map(rec => `- ${rec}`).join('\n')}\n`;
|
|
260
|
+
}
|
|
261
|
+
return md;
|
|
262
|
+
}
|
|
235
263
|
md += `**Result:** ${result.passed ? '\u2705 PASSED' : '\u274C FAILED'}\n`;
|
|
236
264
|
md += `**Score:** ${result.score}\n\n`;
|
|
237
265
|
md += `## Checks\n\n`;
|
|
@@ -41,12 +41,22 @@ export interface CoverageData {
|
|
|
41
41
|
};
|
|
42
42
|
/** True if data came from real instrumented coverage (V8/istanbul) */
|
|
43
43
|
instrumented: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Source files the instrumented report has no entry for (#995). These are
|
|
46
|
+
* UNMEASURED — excluded from the figures rather than counted as 0%.
|
|
47
|
+
*/
|
|
48
|
+
unmeasuredFiles?: string[];
|
|
44
49
|
}
|
|
45
50
|
/**
|
|
46
51
|
* Try to read real coverage data from a coverage-final.json file.
|
|
47
52
|
* Returns null if no instrumented coverage is available.
|
|
53
|
+
*
|
|
54
|
+
* #1012: per-file figures come from the shared istanbul parser, so the CLI
|
|
55
|
+
* and MCP compute "line" coverage the same way (source lines, not statements).
|
|
48
56
|
*/
|
|
49
57
|
export declare function readInstrumentedCoverage(projectRoot: string): Map<string, FileCoverage> | null;
|
|
58
|
+
/** Aggregate per-file coverage into whole-number percentages. */
|
|
59
|
+
export declare function summarizeCoverage(files: FileCoverage[]): CoverageData['summary'];
|
|
50
60
|
/**
|
|
51
61
|
* Build coverage data for the given source files.
|
|
52
62
|
*
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import * as path from 'path';
|
|
14
|
+
import { parseCoverageJson } from '../../coordination/handlers/handler-utils.js';
|
|
14
15
|
// ============================================================================
|
|
15
16
|
// V8/Istanbul Coverage Reader
|
|
16
17
|
// ============================================================================
|
|
@@ -23,6 +24,9 @@ const COVERAGE_JSON_PATHS = [
|
|
|
23
24
|
/**
|
|
24
25
|
* Try to read real coverage data from a coverage-final.json file.
|
|
25
26
|
* Returns null if no instrumented coverage is available.
|
|
27
|
+
*
|
|
28
|
+
* #1012: per-file figures come from the shared istanbul parser, so the CLI
|
|
29
|
+
* and MCP compute "line" coverage the same way (source lines, not statements).
|
|
26
30
|
*/
|
|
27
31
|
export function readInstrumentedCoverage(projectRoot) {
|
|
28
32
|
for (const relPath of COVERAGE_JSON_PATHS) {
|
|
@@ -30,50 +34,16 @@ export function readInstrumentedCoverage(projectRoot) {
|
|
|
30
34
|
if (!fs.existsSync(fullPath))
|
|
31
35
|
continue;
|
|
32
36
|
try {
|
|
33
|
-
const
|
|
37
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
38
|
+
const raw = JSON.parse(content);
|
|
34
39
|
// coverage-summary.json has a different shape
|
|
35
40
|
if (raw.total && raw.total.lines) {
|
|
36
41
|
return readCoverageSummary(raw, projectRoot);
|
|
37
42
|
}
|
|
38
43
|
// coverage-final.json: Record<filepath, IstanbulFileCoverage>
|
|
39
44
|
const coverageMap = new Map();
|
|
40
|
-
for (const
|
|
41
|
-
|
|
42
|
-
const stmtKeys = Object.keys(cov.s);
|
|
43
|
-
const stmtCovered = stmtKeys.filter(k => cov.s[k] > 0).length;
|
|
44
|
-
const branchKeys = Object.keys(cov.b);
|
|
45
|
-
let branchTotal = 0;
|
|
46
|
-
let branchCovered = 0;
|
|
47
|
-
for (const k of branchKeys) {
|
|
48
|
-
for (const count of cov.b[k]) {
|
|
49
|
-
branchTotal++;
|
|
50
|
-
if (count > 0)
|
|
51
|
-
branchCovered++;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const fnKeys = Object.keys(cov.f);
|
|
55
|
-
const fnCovered = fnKeys.filter(k => cov.f[k] > 0).length;
|
|
56
|
-
// Compute uncovered lines from statement map
|
|
57
|
-
const coveredLineSet = new Set();
|
|
58
|
-
const allLineSet = new Set();
|
|
59
|
-
for (const stmtKey of stmtKeys) {
|
|
60
|
-
const stmt = cov.statementMap[stmtKey];
|
|
61
|
-
for (let line = stmt.start.line; line <= stmt.end.line; line++) {
|
|
62
|
-
allLineSet.add(line);
|
|
63
|
-
if (cov.s[stmtKey] > 0)
|
|
64
|
-
coveredLineSet.add(line);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
const uncoveredLines = [...allLineSet].filter(l => !coveredLineSet.has(l)).sort((a, b) => a - b);
|
|
68
|
-
coverageMap.set(filePath, {
|
|
69
|
-
path: filePath,
|
|
70
|
-
lines: { covered: coveredLineSet.size, total: allLineSet.size },
|
|
71
|
-
branches: { covered: branchCovered, total: branchTotal },
|
|
72
|
-
functions: { covered: fnCovered, total: fnKeys.length },
|
|
73
|
-
statements: { covered: stmtCovered, total: stmtKeys.length },
|
|
74
|
-
uncoveredLines,
|
|
75
|
-
uncoveredBranches: uncoveredLines.slice(0, Math.floor(uncoveredLines.length / 2)),
|
|
76
|
-
});
|
|
45
|
+
for (const file of parseCoverageJson(content).files) {
|
|
46
|
+
coverageMap.set(file.path, file);
|
|
77
47
|
}
|
|
78
48
|
return coverageMap.size > 0 ? coverageMap : null;
|
|
79
49
|
}
|
|
@@ -161,6 +131,25 @@ function estimateFileCoverage(filePath, content) {
|
|
|
161
131
|
// ============================================================================
|
|
162
132
|
// Public API
|
|
163
133
|
// ============================================================================
|
|
134
|
+
/** Aggregate per-file coverage into whole-number percentages. */
|
|
135
|
+
export function summarizeCoverage(files) {
|
|
136
|
+
const sum = (pick) => files.reduce((acc, f) => acc + pick(f), 0);
|
|
137
|
+
const safeDiv = (a, b) => b > 0 ? Math.round((a / b) * 100) : 0;
|
|
138
|
+
const totalLines = sum(f => f.lines.total);
|
|
139
|
+
const coveredLines = sum(f => f.lines.covered);
|
|
140
|
+
// #1012: statements are statements. A report without statement detail
|
|
141
|
+
// (lcov) carries its line figures in `statements`, so this falls back alike.
|
|
142
|
+
const totalStatements = sum(f => f.statements.total);
|
|
143
|
+
return {
|
|
144
|
+
line: safeDiv(coveredLines, totalLines),
|
|
145
|
+
branch: safeDiv(sum(f => f.branches.covered), sum(f => f.branches.total)),
|
|
146
|
+
function: safeDiv(sum(f => f.functions.covered), sum(f => f.functions.total)),
|
|
147
|
+
statement: totalStatements > 0
|
|
148
|
+
? safeDiv(sum(f => f.statements.covered), totalStatements)
|
|
149
|
+
: safeDiv(coveredLines, totalLines),
|
|
150
|
+
files: files.length,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
164
153
|
/**
|
|
165
154
|
* Build coverage data for the given source files.
|
|
166
155
|
*
|
|
@@ -174,6 +163,7 @@ export function buildCoverageData(sourceFiles, projectRoot) {
|
|
|
174
163
|
// Try instrumented coverage first
|
|
175
164
|
const instrumentedData = readInstrumentedCoverage(root);
|
|
176
165
|
const files = [];
|
|
166
|
+
const unmeasuredFiles = [];
|
|
177
167
|
let isInstrumented = false;
|
|
178
168
|
if (instrumentedData && instrumentedData.size > 0) {
|
|
179
169
|
isInstrumented = true;
|
|
@@ -187,18 +177,10 @@ export function buildCoverageData(sourceFiles, projectRoot) {
|
|
|
187
177
|
files.push({ ...match, path: filePath });
|
|
188
178
|
}
|
|
189
179
|
else {
|
|
190
|
-
//
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
path: filePath,
|
|
195
|
-
lines: { covered: 0, total: totalLines },
|
|
196
|
-
branches: { covered: 0, total: 1 },
|
|
197
|
-
functions: { covered: 0, total: 1 },
|
|
198
|
-
statements: { covered: 0, total: totalLines },
|
|
199
|
-
uncoveredLines: Array.from({ length: totalLines }, (_, i) => i + 1),
|
|
200
|
-
uncoveredBranches: [],
|
|
201
|
-
});
|
|
180
|
+
// #995: the report has no entry for this file — the coverage run did
|
|
181
|
+
// not measure it. That is "unmeasured", not 0%: counting it as fully
|
|
182
|
+
// uncovered invented a figure nobody measured.
|
|
183
|
+
unmeasuredFiles.push(filePath);
|
|
202
184
|
}
|
|
203
185
|
}
|
|
204
186
|
}
|
|
@@ -209,24 +191,11 @@ export function buildCoverageData(sourceFiles, projectRoot) {
|
|
|
209
191
|
files.push(estimateFileCoverage(filePath, content));
|
|
210
192
|
}
|
|
211
193
|
}
|
|
212
|
-
// Compute summary
|
|
213
|
-
const totalLines = files.reduce((sum, f) => sum + f.lines.total, 0);
|
|
214
|
-
const coveredLines = files.reduce((sum, f) => sum + f.lines.covered, 0);
|
|
215
|
-
const totalBranches = files.reduce((sum, f) => sum + f.branches.total, 0);
|
|
216
|
-
const coveredBranches = files.reduce((sum, f) => sum + f.branches.covered, 0);
|
|
217
|
-
const totalFunctions = files.reduce((sum, f) => sum + f.functions.total, 0);
|
|
218
|
-
const coveredFunctions = files.reduce((sum, f) => sum + f.functions.covered, 0);
|
|
219
|
-
const safeDiv = (a, b) => b > 0 ? Math.round((a / b) * 100) : 0;
|
|
220
194
|
return {
|
|
221
195
|
files,
|
|
222
|
-
summary:
|
|
223
|
-
line: safeDiv(coveredLines, totalLines),
|
|
224
|
-
branch: safeDiv(coveredBranches, totalBranches),
|
|
225
|
-
function: safeDiv(coveredFunctions, totalFunctions),
|
|
226
|
-
statement: safeDiv(coveredLines, totalLines),
|
|
227
|
-
files: files.length,
|
|
228
|
-
},
|
|
196
|
+
summary: summarizeCoverage(files),
|
|
229
197
|
instrumented: isInstrumented,
|
|
198
|
+
...(unmeasuredFiles.length > 0 ? { unmeasuredFiles } : {}),
|
|
230
199
|
};
|
|
231
200
|
}
|
|
232
201
|
//# sourceMappingURL=coverage-data.js.map
|