agentic-qe 3.15.13 → 3.15.15
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/agents/v3/templates/qx-report-template.html +1 -1
- package/.claude/helpers/brain-checkpoint.cjs +124 -5
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +124 -0
- package/assets/agents/v3/templates/qx-report-template.html +1 -1
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-QU6INSKP.js +2 -0
- package/dist/cli/chunks/agent-booster-wasm-EUF4XVUC.js +2 -0
- package/dist/cli/chunks/{agent-handler-AOH6TV7W.js → agent-handler-MOX6PSIQ.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2P54SF5N.js → agent-memory-branch-AEXKIGDG.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +2 -0
- package/dist/cli/chunks/{arena-NSVFCAF5.js → arena-IQ5ZZDRF.js} +2 -2
- package/dist/cli/chunks/{arena-X6MOGQHA.js → arena-M7GA3CVG.js} +4 -4
- package/dist/cli/chunks/{audit-27DJLQNM.js → audit-4IPBMKWB.js} +3 -3
- package/dist/cli/chunks/base-OTGSN6IC.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BU5GXILS.js → better-sqlite3-IKDKJ2IE.js} +2 -2
- package/dist/cli/chunks/brain-handler-5NQUDH4W.js +95 -0
- package/dist/cli/chunks/{branch-enumerator-5CLULOCU.js → branch-enumerator-KSXELWRC.js} +2 -2
- package/dist/cli/chunks/{browser-R4DMU3LN.js → browser-6LACARWE.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +2 -0
- package/dist/cli/chunks/{chunk-LUZNKJE6.js → chunk-22UKJGGN.js} +3 -3
- package/dist/cli/chunks/{chunk-BLSLEVDI.js → chunk-27HE2BHC.js} +2 -2
- package/dist/cli/chunks/{chunk-K4CZA77U.js → chunk-2CKERSMB.js} +2 -2
- package/dist/cli/chunks/{chunk-YSZ5OE3Z.js → chunk-2IIXCEMS.js} +2 -2
- package/dist/cli/chunks/{chunk-F3YS57NF.js → chunk-2LUTPMBO.js} +2 -2
- package/dist/cli/chunks/{chunk-GHM6MQNK.js → chunk-2ZFLULL4.js} +2 -2
- package/dist/cli/chunks/{chunk-7CMTY45A.js → chunk-337Z52QM.js} +2 -2
- package/dist/cli/chunks/{chunk-W26B7ERY.js → chunk-3CYNZFKH.js} +1 -1
- package/dist/cli/chunks/chunk-3HVFIITW.js +2 -0
- package/dist/cli/chunks/{chunk-K3TLLJMX.js → chunk-3J3RNJNX.js} +1 -1
- package/dist/cli/chunks/{chunk-MAMQA43L.js → chunk-4ATQP3PR.js} +1 -1
- package/dist/cli/chunks/{chunk-YXRASAPI.js → chunk-4D4CWP72.js} +2 -2
- package/dist/cli/chunks/{chunk-GHY6Z6KO.js → chunk-4HKAD25N.js} +3 -3
- package/dist/cli/chunks/{chunk-XNBOGCF3.js → chunk-4X3SWKBA.js} +2 -2
- package/dist/cli/chunks/{chunk-IJUHSJ2U.js → chunk-5AFVEWMT.js} +2 -2
- package/dist/cli/chunks/{chunk-SE4VNN4I.js → chunk-5C62XMJR.js} +3 -3
- package/dist/cli/chunks/{chunk-KDNJ4F3P.js → chunk-5G4UFTV4.js} +2 -2
- package/dist/cli/chunks/{chunk-DVGRPK7A.js → chunk-5I7357KS.js} +2 -2
- package/dist/cli/chunks/{chunk-YZWBNBTW.js → chunk-5KA5TVPR.js} +2 -2
- package/dist/cli/chunks/{chunk-JGZ722G3.js → chunk-5PTAFGJT.js} +2 -2
- package/dist/cli/chunks/{chunk-SVLQRAMF.js → chunk-6BRQPHMZ.js} +1 -1
- package/dist/cli/chunks/{chunk-KDVZND5Q.js → chunk-6KCSKGVY.js} +1 -1
- package/dist/cli/chunks/{chunk-LWR3FV3Y.js → chunk-6LE362LZ.js} +2 -2
- package/dist/cli/chunks/{chunk-WKGTGOYS.js → chunk-6NBRMD25.js} +3 -3
- package/dist/cli/chunks/{chunk-HQZGPJYG.js → chunk-6RBTS3NF.js} +2 -2
- package/dist/cli/chunks/{chunk-WOCGL4QP.js → chunk-6YVMX2TC.js} +2 -2
- package/dist/cli/chunks/{chunk-I3C7JOXC.js → chunk-73PBAWAF.js} +2 -2
- package/dist/cli/chunks/{chunk-75RDHBAX.js → chunk-74YG72NQ.js} +3 -3
- package/dist/cli/chunks/{chunk-O6FGXMHD.js → chunk-76P32JVU.js} +1 -1
- package/dist/cli/chunks/{chunk-LL7LDPXS.js → chunk-7ACCBHRB.js} +1 -1
- package/dist/cli/chunks/{chunk-3LJ7LQMV.js → chunk-7BLZHFKD.js} +1 -1
- package/dist/cli/chunks/{chunk-CM4LSLKR.js → chunk-7O45RQHF.js} +2 -2
- package/dist/cli/chunks/{chunk-NU3W5WFT.js → chunk-7XB3FCKM.js} +2 -2
- package/dist/cli/chunks/{chunk-E56B6IDX.js → chunk-AHMWD6JG.js} +2 -2
- package/dist/cli/chunks/{chunk-G2Q66Z23.js → chunk-AJPROCDW.js} +2 -2
- package/dist/cli/chunks/{chunk-NW7IBHJA.js → chunk-AKZO6GGG.js} +13 -13
- package/dist/cli/chunks/{chunk-IC3TQEOA.js → chunk-AOKKUB5F.js} +1 -1
- package/dist/cli/chunks/{chunk-4OVC4RIL.js → chunk-AP2W7Z3A.js} +1 -1
- package/dist/cli/chunks/{chunk-PHP5UBT4.js → chunk-BBRROA3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-5FKWCZNF.js → chunk-BDKEAGQ2.js} +2 -2
- package/dist/cli/chunks/{chunk-BTVEYBW2.js → chunk-BFQTLF5X.js} +2 -2
- package/dist/cli/chunks/{chunk-HZ5NXFXH.js → chunk-BLL2XU7A.js} +2 -2
- package/dist/cli/chunks/{chunk-UTRV7T2N.js → chunk-BP5T3OEV.js} +2 -2
- package/dist/cli/chunks/{chunk-GB6HBNH2.js → chunk-BQ47GQPK.js} +2 -2
- package/dist/cli/chunks/{chunk-RFNW2LGD.js → chunk-BU4UQR36.js} +2 -2
- package/dist/cli/chunks/{chunk-WO274FRI.js → chunk-BZULJMGH.js} +2 -2
- package/dist/cli/chunks/{chunk-GU5HNCWI.js → chunk-C4KLXFJP.js} +1 -1
- package/dist/cli/chunks/{chunk-LFJALJOA.js → chunk-C4RTAVC6.js} +2 -2
- package/dist/cli/chunks/{chunk-WNQS4WTS.js → chunk-C5CXL3JP.js} +2 -2
- package/dist/cli/chunks/{chunk-MGZ5FJUW.js → chunk-CAOUV5GZ.js} +2 -2
- package/dist/cli/chunks/{chunk-XPRVF4YE.js → chunk-CBK5CT6T.js} +2 -2
- package/dist/cli/chunks/{chunk-JRRXCODW.js → chunk-DEKR3CTS.js} +2 -2
- package/dist/cli/chunks/{chunk-AQSVJNEH.js → chunk-DKX4GNRU.js} +2 -2
- package/dist/cli/chunks/{chunk-6KATY3KS.js → chunk-DUKE27HC.js} +2 -2
- package/dist/cli/chunks/{chunk-W2QWSQVE.js → chunk-DURD37JZ.js} +2 -2
- package/dist/cli/chunks/{chunk-KCW47QR5.js → chunk-E3MRDIZF.js} +1 -1
- package/dist/cli/chunks/{chunk-6Z7PRBSG.js → chunk-E56PVVWC.js} +2 -2
- package/dist/cli/chunks/{chunk-WQL7WCIZ.js → chunk-E5G4WZ2T.js} +1 -1
- package/dist/cli/chunks/{chunk-PB6J6HAA.js → chunk-EBTNMQSS.js} +2 -2
- package/dist/cli/chunks/{chunk-KADFXPPN.js → chunk-EFUJDMNC.js} +2 -2
- package/dist/cli/chunks/{chunk-QPNG5ZN2.js → chunk-EKP2SC77.js} +2 -2
- package/dist/cli/chunks/{chunk-U2FUXDDJ.js → chunk-EMSZVUYA.js} +3 -3
- package/dist/cli/chunks/{chunk-XEAEYC6Y.js → chunk-ERN56H6S.js} +1 -1
- package/dist/cli/chunks/{chunk-DNDL7SOS.js → chunk-FOOW4JVS.js} +2 -2
- package/dist/cli/chunks/{chunk-HOAJUIBQ.js → chunk-FTRSS64D.js} +2 -2
- package/dist/cli/chunks/{chunk-TOQWL2ZF.js → chunk-G242G224.js} +2 -2
- package/dist/cli/chunks/{chunk-VTDFVFST.js → chunk-G6RDCCFV.js} +2 -2
- package/dist/cli/chunks/{chunk-TWDW32W2.js → chunk-GCHYOPRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-MFW5HSG4.js → chunk-GGQGCT4Y.js} +2 -2
- package/dist/cli/chunks/{chunk-G6WDYBLQ.js → chunk-GKSMRBHU.js} +1 -1
- package/dist/cli/chunks/{chunk-CCMKSHAT.js → chunk-GQABPCQE.js} +2 -2
- package/dist/cli/chunks/{chunk-G77ERMUD.js → chunk-GV2QE5TO.js} +1 -1
- package/dist/cli/chunks/{chunk-756CGMEH.js → chunk-H5DER3JY.js} +1 -1
- package/dist/cli/chunks/{chunk-W3PPFHI5.js → chunk-HH4ED4F7.js} +52 -50
- package/dist/cli/chunks/{chunk-3Y2ROSCL.js → chunk-HL2ANKN3.js} +2 -2
- package/dist/cli/chunks/{chunk-T3PGQFDI.js → chunk-HTZSRMHW.js} +2 -2
- package/dist/cli/chunks/{chunk-3QZEGE67.js → chunk-IXL5ZHWJ.js} +1 -1
- package/dist/cli/chunks/{chunk-5ZGM3RMH.js → chunk-J3FP5UGL.js} +1 -1
- package/dist/cli/chunks/{chunk-FZ76G4QJ.js → chunk-JCQGJGGZ.js} +1 -1
- package/dist/cli/chunks/chunk-JCZCJE6X.js +86 -0
- package/dist/cli/chunks/{chunk-YZEXYO4W.js → chunk-JKJOB65O.js} +1 -1
- package/dist/cli/chunks/{chunk-A64JFBWI.js → chunk-JUDUBQHA.js} +2 -2
- package/dist/cli/chunks/{chunk-PIDQVU3L.js → chunk-JW74KRBC.js} +2 -2
- package/dist/cli/chunks/{chunk-EXGMJFAT.js → chunk-K3WZICFA.js} +1 -1
- package/dist/cli/chunks/{chunk-ASQYASNV.js → chunk-K3XBQC3R.js} +1 -1
- package/dist/cli/chunks/{chunk-E7CLYGS7.js → chunk-KCQNFBBR.js} +1 -1
- package/dist/cli/chunks/chunk-KJBPB7P5.js +3 -0
- package/dist/cli/chunks/chunk-KLTMOXIK.js +3 -0
- package/dist/cli/chunks/{chunk-5MDERQH3.js → chunk-L32JNNKL.js} +1 -1
- package/dist/cli/chunks/{chunk-32ZMWEP3.js → chunk-LB2LGEDP.js} +2 -2
- package/dist/cli/chunks/{chunk-42J34YG4.js → chunk-LHMQIZ6B.js} +2 -2
- package/dist/cli/chunks/{chunk-NURIILUB.js → chunk-LJMYRTJ7.js} +1 -1
- package/dist/cli/chunks/{chunk-M6AAGIG7.js → chunk-LNX74WHQ.js} +1 -1
- package/dist/cli/chunks/{chunk-P7A4NKTZ.js → chunk-LTQVUAPH.js} +2 -2
- package/dist/cli/chunks/{chunk-3YNLWPBF.js → chunk-LVABQNRF.js} +2 -2
- package/dist/cli/chunks/{chunk-2G7TVT6W.js → chunk-LYJHUNBK.js} +2 -2
- package/dist/cli/chunks/{chunk-DLD7RUZ4.js → chunk-M4CJCPCQ.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3UDLV5Z.js → chunk-M4WMSCAE.js} +1 -1
- package/dist/cli/chunks/{chunk-UDQSYWVF.js → chunk-MIA447GY.js} +1 -1
- package/dist/cli/chunks/{chunk-RF7HWBHN.js → chunk-MPFPWJTH.js} +2 -2
- package/dist/cli/chunks/{chunk-BK577VL7.js → chunk-MV55NXTD.js} +2 -2
- package/dist/cli/chunks/{chunk-JQGMW45H.js → chunk-NQS3BWS6.js} +1 -1
- package/dist/cli/chunks/{chunk-BEGR4D6N.js → chunk-NWIIYHT6.js} +2 -2
- package/dist/cli/chunks/{chunk-SSU73QAX.js → chunk-O6EWL5DQ.js} +2 -2
- package/dist/cli/chunks/chunk-OBDONJQM.js +2 -0
- package/dist/cli/chunks/chunk-OLZH5LRT.js +141 -0
- package/dist/cli/chunks/{chunk-W3INMZZ6.js → chunk-OQG3UQQ7.js} +1 -1
- package/dist/cli/chunks/{chunk-72ASBE35.js → chunk-PFQCV6YS.js} +3 -3
- package/dist/cli/chunks/{chunk-7YTGHGK4.js → chunk-PS6UMZVK.js} +2 -2
- package/dist/cli/chunks/{chunk-OCAEXYFA.js → chunk-PXATBHWN.js} +2 -2
- package/dist/cli/chunks/{chunk-ARJW4I2O.js → chunk-PYPS65P7.js} +2 -2
- package/dist/cli/chunks/{chunk-SYV2V3PL.js → chunk-Q6I4SIUU.js} +4 -4
- package/dist/cli/chunks/{chunk-H4H2YSFH.js → chunk-QFGYH6HD.js} +1 -1
- package/dist/cli/chunks/{chunk-526QYFJU.js → chunk-QGBGSQ2E.js} +2 -2
- package/dist/cli/chunks/{chunk-YBQH2VOP.js → chunk-QRKTBSZT.js} +2 -2
- package/dist/cli/chunks/{chunk-C7JM7CD3.js → chunk-R6LHJ7ME.js} +2 -2
- package/dist/cli/chunks/{chunk-TSQC2KKZ.js → chunk-RBKUU7WF.js} +2 -2
- package/dist/cli/chunks/{chunk-CE7B5LU7.js → chunk-RDMRY7CT.js} +1 -1
- package/dist/cli/chunks/chunk-RIRZHOS2.js +8 -0
- package/dist/cli/chunks/{chunk-CRWPZT74.js → chunk-SHRI7TKJ.js} +2 -2
- package/dist/cli/chunks/{chunk-KWYH3FI4.js → chunk-SJCKCSN3.js} +1 -1
- package/dist/cli/chunks/{chunk-DFUASIKA.js → chunk-SON6ZRH3.js} +2 -2
- package/dist/cli/chunks/{chunk-J2ZIFFM6.js → chunk-SZAZQZWI.js} +2 -2
- package/dist/cli/chunks/{chunk-HD7YIFOI.js → chunk-T4GE7MPI.js} +2 -2
- package/dist/cli/chunks/{chunk-3Y7TJFHU.js → chunk-T66PPF4D.js} +2 -2
- package/dist/cli/chunks/{chunk-3RZV5DGO.js → chunk-T67R2MUN.js} +2 -2
- package/dist/cli/chunks/{chunk-H4GG2NLO.js → chunk-TDQWTSBS.js} +2 -2
- package/dist/cli/chunks/{chunk-TWJTK4CC.js → chunk-TODNOP7C.js} +2 -2
- package/dist/cli/chunks/{chunk-NZ3GUMB2.js → chunk-TX2CHQD7.js} +2 -2
- package/dist/cli/chunks/{chunk-AL6FBH3E.js → chunk-TZIHDJZD.js} +2 -2
- package/dist/cli/chunks/{chunk-GII6UM3F.js → chunk-U62OUXBF.js} +1 -1
- package/dist/cli/chunks/{chunk-YQFLQE53.js → chunk-UAQZI6N4.js} +2 -2
- package/dist/cli/chunks/{chunk-R7SYRCRP.js → chunk-UE2J6MA5.js} +1 -1
- package/dist/cli/chunks/{chunk-VRHRBAEM.js → chunk-UGYM4U44.js} +1 -1
- package/dist/cli/chunks/{chunk-NT4DBXSX.js → chunk-UJABDXST.js} +2 -2
- package/dist/cli/chunks/{chunk-OFACHK5O.js → chunk-UORB2QDU.js} +9 -9
- package/dist/cli/chunks/{chunk-QDEJ4CI2.js → chunk-UQPA33UK.js} +2 -2
- package/dist/cli/chunks/{chunk-TCBBNUBP.js → chunk-UUBIQR6A.js} +3 -3
- package/dist/cli/chunks/{chunk-NZD4DPSU.js → chunk-UXIY4IAI.js} +2 -2
- package/dist/cli/chunks/{chunk-SG3NX7QE.js → chunk-VCXI4XC4.js} +2 -2
- package/dist/cli/chunks/{chunk-PSFSPGUD.js → chunk-VMAM46HQ.js} +2 -2
- package/dist/cli/chunks/{chunk-3AN5TNGD.js → chunk-VY4U6DPO.js} +3 -3
- package/dist/cli/chunks/{chunk-X7N2JF2X.js → chunk-W27AJ5B4.js} +2 -2
- package/dist/cli/chunks/{chunk-CT6SAVXQ.js → chunk-W5ZJG2OU.js} +2 -2
- package/dist/cli/chunks/{chunk-KV4T4MXK.js → chunk-W62OOK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-5K26BEYB.js → chunk-WNTA4YKE.js} +2 -2
- package/dist/cli/chunks/{chunk-LZYQHVD4.js → chunk-WUOOX7UG.js} +2 -2
- package/dist/cli/chunks/{chunk-7NA7JXNB.js → chunk-WVXJ2QIG.js} +2 -2
- package/dist/cli/chunks/{chunk-KB56CPU4.js → chunk-X33CWRDF.js} +2 -2
- package/dist/cli/chunks/{chunk-7JUC2MVZ.js → chunk-XG4F4XH4.js} +2 -2
- package/dist/cli/chunks/{chunk-ZAKQLAHT.js → chunk-XH4JMX5O.js} +1 -1
- package/dist/cli/chunks/{chunk-X2Z7F4EU.js → chunk-XHHWABJV.js} +2 -2
- package/dist/cli/chunks/{chunk-7PLIEBY7.js → chunk-XHLYGXYE.js} +2 -2
- package/dist/cli/chunks/{chunk-UXZSUMEA.js → chunk-XIVVTYM2.js} +2 -2
- package/dist/cli/chunks/{chunk-MVVB7C2E.js → chunk-XM6ZVFM5.js} +156 -156
- package/dist/cli/chunks/{chunk-VTOBUZL6.js → chunk-XWIAZG3C.js} +2 -2
- package/dist/cli/chunks/{chunk-CV77DMDQ.js → chunk-Y2OX6KGN.js} +2 -2
- package/dist/cli/chunks/{chunk-VRVMIPTM.js → chunk-YUS6TWAL.js} +2 -2
- package/dist/cli/chunks/{chunk-VU5TBX2V.js → chunk-ZIPAB5J6.js} +2 -2
- package/dist/cli/chunks/{chunk-KUAKV3IW.js → chunk-ZSOMUTNL.js} +1 -1
- package/dist/cli/chunks/{chunk-UOC3O6RP.js → chunk-ZWBGYJ7K.js} +2 -2
- package/dist/cli/chunks/{chunk-5VMAV6T6.js → chunk-ZYJB6FML.js} +1 -1
- package/dist/cli/chunks/{ci-ENOASTYB.js → ci-UCUJOSBW.js} +2 -2
- package/dist/cli/chunks/{ci-config-B26OXHQM.js → ci-config-2XILD3XG.js} +2 -2
- package/dist/cli/chunks/{ci-output-JTCLLNOQ.js → ci-output-BL6KWOHW.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-23JMFNM5.js → circuit-breaker-5XLIOXE5.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-ON6L462G.js → claude-flow-setup-4IMP6ACS.js} +2 -2
- package/dist/cli/chunks/client-KKRNPX4F.js +2 -0
- package/dist/cli/chunks/{cline-installer-OWQ4D2FQ.js → cline-installer-RYLHCDK7.js} +2 -2
- package/dist/cli/chunks/{code-2ZRL7SEU.js → code-WY3GJXHX.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-JXSQVM67.js → code-index-extractor-Y4MZBZCW.js} +2 -2
- package/dist/cli/chunks/{codex-installer-7LXZYBSQ.js → codex-installer-SCJ3T3DX.js} +4 -4
- package/dist/cli/chunks/{completions-C2LR623C.js → completions-CN2DXQFU.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-TGQLHCYJ.js → complexity-analyzer-7MDPPIBH.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RUGD24D2.js → continuedev-installer-GCEJRK34.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-ZLFVLEJP.js → copilot-installer-BHPDSELY.js} +2 -2
- package/dist/cli/chunks/core-handlers-47MPMED7.js +2 -0
- package/dist/cli/chunks/{cost-tracker-RT4QL745.js → cost-tracker-VO5MFWR6.js} +2 -2
- package/dist/cli/chunks/coverage-LYFQYNH6.js +51 -0
- package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +2 -0
- package/dist/cli/chunks/{cursor-installer-LJKLNFF6.js → cursor-installer-KP4HA7TV.js} +2 -2
- package/dist/cli/chunks/{daemon-BMDXCQT5.js → daemon-7RC7TS57.js} +3 -3
- package/dist/cli/chunks/{daemon-FBH3IRYN.js → daemon-AXLVPKVO.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-JGDED55I.js → dag-attention-scheduler-NKA44RSR.js} +2 -2
- package/dist/cli/chunks/{detect-SZIHIVCJ.js → detect-CMYAJWYF.js} +2 -2
- package/dist/cli/chunks/{dist-node-FV3KWXQ6.js → dist-node-EN3PYEGW.js} +2 -2
- package/dist/cli/chunks/{domain-handler-GI5JWQOV.js → domain-handler-EXSZCX7A.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-BUWY36TL.js → domain-plugins-HCQFSNL7.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-GCY7W5DA.js → domain-transfer-3LGSNTPO.js} +2 -2
- package/dist/cli/chunks/dream-76L6EEN7.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-GPRR3ZGD.js → embed-and-insert-pattern-B6MNHICW.js} +2 -2
- package/dist/cli/chunks/{eval-XPB3IGAP.js → eval-OQELIWJK.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-2E554UB3.js → experience-capture-middleware-SUFILYPW.js} +3 -3
- package/dist/cli/chunks/{fast-paths-ZSMWZPUC.js → fast-paths-UV4NDEWM.js} +2 -2
- package/dist/cli/chunks/{feature-flags-GIWVDVVC.js → feature-flags-CKTYX67J.js} +2 -2
- package/dist/cli/chunks/{feature-flags-N7EOGE5P.js → feature-flags-H7H33B6C.js} +2 -2
- package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +2 -0
- package/dist/cli/chunks/{fleet-HCHDOUCX.js → fleet-ZJBCAKRG.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-CZNCNXXZ.js → gnn-wrapper-RUE2QZRG.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-6YUIF2YQ.js → heartbeat-handler-XRV327M7.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +2 -0
- package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-J3M3IK24.js → hnsw-legacy-bridge-UJID6ZZ4.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-ULGTGDZW.js → hnswlib-node-WS43R4AX.js} +2 -2
- package/dist/cli/chunks/{hooks-C4BUGYUQ.js → hooks-YZNJKXAJ.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-WINGVMPG.js → hypergraph-engine-XQJSIMTS.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-GADMWKAU.js → hypergraph-handler-ZD2NYXMR.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +2 -0
- package/dist/cli/chunks/{init-guard-K2T4QWAO.js → init-guard-DSRUAVRT.js} +2 -2
- package/dist/cli/chunks/{init-handler-PCZTDZYI.js → init-handler-RJU5QMAP.js} +6 -6
- package/dist/cli/chunks/init-wizard-JCKNGIGT.js +2 -0
- package/dist/cli/chunks/kernel-F7ILJTYD.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-XENXNEIU.js → kilocode-installer-BCPOCVMC.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-3PG2TJ67.js → kiro-installer-GFCWCB2S.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +2 -0
- package/dist/cli/chunks/learning-FZTD72CF.js +131 -0
- package/dist/cli/chunks/{llm-router-RKVDEWU2.js → llm-router-GJVKGRJL.js} +4 -4
- package/dist/cli/chunks/llm-router-service-TNOWQINA.js +2 -0
- package/dist/cli/chunks/{load-ITHC564X.js → load-YKTPOYBE.js} +2 -2
- package/dist/cli/chunks/load-test-FPVBK2EV.js +2 -0
- package/dist/cli/chunks/{mcp-TCL5UW3N.js → mcp-LT6R2IKS.js} +2 -2
- package/dist/cli/chunks/{memory-BKDAY2N2.js → memory-4HKKOLRY.js} +5 -5
- package/dist/cli/chunks/memory-backend-2QE7O67A.js +2 -0
- package/dist/cli/chunks/{memory-handlers-WN4FXFOA.js → memory-handlers-X4CMVBXB.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VHAT7ZPF.js → multi-model-executor-2YPM2WTK.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-E3VM3EEY.js → opencode-installer-WBAJMH5K.js} +2 -2
- package/dist/cli/chunks/{orchestrator-BMQ6X762.js → orchestrator-5W5WVMVJ.js} +109 -25
- package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-GOOR2BV5.js → pattern-usage-recorder-GXRMNPAZ.js} +2 -2
- package/dist/cli/chunks/{pipeline-5NSFQQIX.js → pipeline-2NA4DRDA.js} +2 -2
- package/dist/cli/chunks/{platform-SQM34J5G.js → platform-BGERNQ5V.js} +2 -2
- package/dist/cli/chunks/{plugin-UQJZRMZG.js → plugin-L4EPVENR.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-WMDJOL4S.js → prime-radiant-advanced-wasm-RTQRTPTM.js} +2 -2
- package/dist/cli/chunks/project-root-S7WDFTMU.js +2 -0
- package/dist/cli/chunks/protocol-executor-OPANXQVB.js +2 -0
- package/dist/cli/chunks/{protocol-handler-OBDCVY6X.js → protocol-handler-SYQXM6JK.js} +2 -2
- package/dist/cli/chunks/{prove-XDC7I4XT.js → prove-5O7GPJCU.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +2 -0
- package/dist/cli/chunks/{quality-L4GQ6WX4.js → quality-KIIDHGNF.js} +2 -2
- package/dist/cli/chunks/{quality-gate-MJG66LKN.js → quality-gate-H65VECD3.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +2 -0
- package/dist/cli/chunks/{real-embeddings-HW4G2LWL.js → real-embeddings-DYIOLKQ3.js} +2 -2
- package/dist/cli/chunks/{ref-validation-FC7JOJ2C.js → ref-validation-CSBJOMZM.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-KWS4CEIC.js → roocode-installer-G7OVYXEN.js} +2 -2
- package/dist/cli/chunks/router-DBBW4NC2.js +2 -0
- package/dist/cli/chunks/routing-feedback-W35QHCL4.js +2 -0
- package/dist/cli/chunks/{routing-handler-QF4WVB2S.js → routing-handler-ZNZPPI5Y.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-2MTCOUK6.js → ruvector-commands-C6IG3OY3.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-BREJCXWN.js → rvf-migration-coordinator-4ATTHGHD.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-KKC6HOJD.js → rvf-store-integrity-3G6LFLT3.js} +2 -2
- package/dist/cli/chunks/safe-db-ZS2QKANY.js +2 -0
- package/dist/cli/chunks/schedule-ZH6VNA32.js +2 -0
- package/dist/cli/chunks/scheduler-T6CD74B6.js +2 -0
- package/dist/cli/chunks/{security-OSAE7VAP.js → security-A3IMVLFM.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-COUOS665.js → shared-rvf-adapter-VHWQ6US5.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-YXMPZKQE.js → shared-rvf-dual-writer-JB3QS7IG.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +2 -0
- package/dist/cli/chunks/{standalone-memory-E6JBMOIL.js → standalone-memory-DDNXCSBD.js} +2 -2
- package/dist/cli/chunks/{status-handler-AFTCIYIX.js → status-handler-2HK7XPEK.js} +2 -2
- package/dist/cli/chunks/{structural-health-2FROCEI4.js → structural-health-DSJVLEPV.js} +2 -2
- package/dist/cli/chunks/{sync-VAYTOWDC.js → sync-3MUV6S5E.js} +2 -2
- package/dist/cli/chunks/{sync-YIQYOFGW.js → sync-NTUR53PI.js} +2 -2
- package/dist/cli/chunks/{task-handler-KVQHDEX3.js → task-handler-74MZN2EO.js} +2 -2
- package/dist/cli/chunks/{task-handlers-MVVECQA6.js → task-handlers-VJR6EHRZ.js} +3 -3
- package/dist/cli/chunks/{test-5JSVTOMY.js → test-O6FK3FVF.js} +4 -4
- package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +2 -0
- package/dist/cli/chunks/{test-scheduling-HBOHVLI3.js → test-scheduling-Q6QEEOS6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-5VEPTPFA.js → token-bootstrap-TTRCECLP.js} +2 -2
- package/dist/cli/chunks/{token-usage-TBJHDLY6.js → token-usage-YEEFWSSI.js} +2 -2
- package/dist/cli/chunks/{transformers-VAWYMHMZ.js → transformers-BZCHJJJT.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +2 -0
- package/dist/cli/chunks/{types-R5SDZU2E.js → types-4AOKZYOX.js} +2 -2
- package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +2 -0
- package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +2 -0
- package/dist/cli/chunks/{upgrade-K5PIHXRB.js → upgrade-2MWW6BT2.js} +2 -2
- package/dist/cli/chunks/{validate-RPTS7RYJ.js → validate-PAEV3GT5.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-B2ZL556X.js → validate-swarm-ZIXACK5K.js} +2 -2
- package/dist/cli/chunks/visual-security-GXGSFBVA.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-K4DUJC32.js → web-tree-sitter-VLTXZFAB.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-OK2AJN35.js → windsurf-installer-VELMLOZF.js} +2 -2
- package/dist/cli/chunks/witness-chain-MRJKVCOW.js +2 -0
- package/dist/cli/chunks/witness-chain-WWHJKITG.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-L6Y5RFXR.js → witness-chain-repair-5SAXPETG.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-N4CW7FZX.js → witness-chain-verifier-MIDWD4JS.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-TDNPS3WD.js → witness-key-manager-OSVCWOB2.js} +2 -2
- package/dist/cli/chunks/{workflow-XRZA3YCY.js → workflow-MK7A7QCX.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +2 -0
- package/dist/cli/chunks/{wrappers-5JIFWKN6.js → wrappers-5QFMCKXL.js} +2 -2
- package/dist/cli/commands/coverage.js +6 -0
- package/dist/cli/commands/learning-prune.d.ts +14 -0
- package/dist/cli/commands/learning-prune.js +105 -0
- package/dist/cli/commands/learning.js +9 -0
- package/dist/cli/handlers/brain-handler.js +12 -1
- package/dist/cli/utils/coverage-verdict.js +14 -3
- package/dist/context/compaction/index.d.ts +7 -0
- package/dist/context/compaction/index.js +30 -6
- package/dist/coordination/handlers/coverage-evidence.d.ts +19 -0
- package/dist/coordination/handlers/coverage-evidence.js +31 -2
- package/dist/coordination/handlers/coverage-handlers.js +5 -1
- package/dist/coordination/handlers/coverage-target.js +8 -1
- package/dist/coordination/handlers/quality-handlers.js +9 -1
- package/dist/coordination/result-saver-adapters.js +1 -0
- package/dist/coordination/result-saver.js +9 -5
- package/dist/domains/chaos-resilience/services/chaos-engineer.d.ts +1 -0
- package/dist/domains/chaos-resilience/services/chaos-engineer.js +23 -45
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +22 -6
- package/dist/domains/coverage-analysis/collected-metrics.js +37 -12
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +2 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +3 -6
- package/dist/domains/quality-assessment/coverage-report-event.d.ts +8 -0
- package/dist/domains/quality-assessment/coverage-report-event.js +22 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +6 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +4 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.js +63 -17
- package/dist/domains/test-execution/interfaces.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.js +6 -0
- package/dist/init/init-wizard-hooks.d.ts +1 -1
- package/dist/init/init-wizard-hooks.js +7 -8
- package/dist/init/phases/07-hooks.js +90 -6
- package/dist/init/phases/08-mcp.js +9 -0
- package/dist/init/settings-merge.d.ts +13 -0
- package/dist/init/settings-merge.js +49 -2
- package/dist/integrations/agent-booster-wasm/agent_booster_wasm.js +849 -0
- package/dist/integrations/agent-booster-wasm/agent_booster_wasm_bg.wasm +0 -0
- package/dist/integrations/agent-booster-wasm/index.d.ts +8 -0
- package/dist/integrations/agent-booster-wasm/index.js +25 -2
- package/dist/integrations/agent-booster-wasm/package.json +16 -0
- package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +25 -0
- package/dist/integrations/ruvector/brain-rvf-exporter.js +154 -61
- package/dist/learning/dream/dream-engine.d.ts +27 -3
- package/dist/learning/dream/dream-engine.js +97 -28
- package/dist/learning/dream/dream-lock-retry.d.ts +38 -0
- package/dist/learning/dream/dream-lock-retry.js +66 -0
- package/dist/learning/dream/speculative-dreamer.js +1 -1
- package/dist/learning/learning-retention.d.ts +103 -0
- package/dist/learning/learning-retention.js +213 -0
- package/dist/mcp/bundle.js +501 -496
- package/dist/mcp/handlers/domain-handler-configs.d.ts +9 -1
- package/dist/mcp/handlers/domain-handler-configs.js +24 -14
- package/dist/mcp/protocol-server.js +1 -1
- package/dist/mcp/tools/chaos-resilience/inject.d.ts +3 -4
- package/dist/mcp/tools/chaos-resilience/inject.js +11 -81
- package/dist/mcp/tools/learning-optimization/dream.d.ts +8 -0
- package/dist/mcp/tools/learning-optimization/dream.js +4 -0
- package/package.json +4 -2
- package/dist/cli/chunks/adapter-KCQDVYY2.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-6RRQWMNE.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +0 -2
- package/dist/cli/chunks/base-WCACU3FN.js +0 -2
- package/dist/cli/chunks/brain-handler-GTQNHHZS.js +0 -94
- package/dist/cli/chunks/browser-workflow-G6IASEAP.js +0 -2
- package/dist/cli/chunks/chunk-C6JTLKG7.js +0 -141
- package/dist/cli/chunks/chunk-K65CGKLD.js +0 -8
- package/dist/cli/chunks/chunk-MB46UBGY.js +0 -3
- package/dist/cli/chunks/chunk-N4CYAKOX.js +0 -79
- package/dist/cli/chunks/chunk-PT4FMJPQ.js +0 -3
- package/dist/cli/chunks/chunk-S5AZCIZS.js +0 -2
- package/dist/cli/chunks/chunk-UT2VZ33P.js +0 -2
- package/dist/cli/chunks/client-TV3V2YZ5.js +0 -2
- package/dist/cli/chunks/core-handlers-PZT4OLWR.js +0 -2
- package/dist/cli/chunks/coverage-NV3C4IMM.js +0 -50
- package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +0 -2
- package/dist/cli/chunks/dream-TRFBGDSQ.js +0 -2
- package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +0 -2
- package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +0 -2
- package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +0 -2
- package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +0 -2
- package/dist/cli/chunks/init-wizard-TZDJQK3U.js +0 -2
- package/dist/cli/chunks/kernel-Y6RRIOKW.js +0 -2
- package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +0 -2
- package/dist/cli/chunks/learning-6KDH7FK4.js +0 -122
- package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +0 -2
- package/dist/cli/chunks/load-test-RUF7DZA5.js +0 -2
- package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +0 -2
- package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +0 -2
- package/dist/cli/chunks/project-root-IO5KRNGL.js +0 -2
- package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +0 -2
- package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +0 -2
- package/dist/cli/chunks/router-YUO3I7RU.js +0 -2
- package/dist/cli/chunks/routing-feedback-36SLQGJE.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +0 -2
- package/dist/cli/chunks/safe-db-4RRIGRXD.js +0 -2
- package/dist/cli/chunks/schedule-25RTO4DQ.js +0 -2
- package/dist/cli/chunks/scheduler-BPIOJZ5P.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +0 -2
- package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +0 -2
- package/dist/cli/chunks/unified-memory-TLGSSLMI.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +0 -2
- package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +0 -2
- package/dist/cli/chunks/visual-security-6Q44XNLB.js +0 -2
- package/dist/cli/chunks/witness-chain-KDOMXDQX.js +0 -2
- package/dist/cli/chunks/witness-chain-N3OY2RMH.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +0 -2
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* Either one makes the evidence insufficient: no verdict may pass on it.
|
|
17
17
|
*/
|
|
18
18
|
import type { FileCoverage } from '../../domains/coverage-analysis/interfaces';
|
|
19
|
+
import type { ExcludedCoverageEntry } from '../../domains/coverage-analysis/collected-metrics.js';
|
|
19
20
|
/** The report is older than these source files. */
|
|
20
21
|
export interface StaleReport {
|
|
21
22
|
reportPath: string;
|
|
@@ -35,6 +36,17 @@ export interface CoverageEvidence {
|
|
|
35
36
|
source: string;
|
|
36
37
|
readable: boolean;
|
|
37
38
|
};
|
|
39
|
+
/**
|
|
40
|
+
* #1219: report entries left out of the figures because they are not a
|
|
41
|
+
* measurement of a project file (outside the root, a Windows path on POSIX,
|
|
42
|
+
* or one file under two spellings).
|
|
43
|
+
*/
|
|
44
|
+
excludedEntries?: ExcludedCoverageEntry[];
|
|
45
|
+
/**
|
|
46
|
+
* #1219: project files the report lists under two spellings. Which entry is
|
|
47
|
+
* right is unknown, so they are UNMEASURED and the evidence is insufficient.
|
|
48
|
+
*/
|
|
49
|
+
conflictingFiles?: string[];
|
|
38
50
|
}
|
|
39
51
|
/**
|
|
40
52
|
* Production source files under a directory `target` that the report has no
|
|
@@ -66,10 +78,17 @@ export declare function assessCoverageEvidence(report: {
|
|
|
66
78
|
}, measuredFiles: FileCoverage[], projectRoot: string, target: string, options?: {
|
|
67
79
|
reportPath?: string;
|
|
68
80
|
checkCompleteness?: boolean;
|
|
81
|
+
excluded?: ExcludedCoverageEntry[];
|
|
69
82
|
}): CoverageEvidence;
|
|
70
83
|
/**
|
|
71
84
|
* Why the evidence is insufficient, one sentence per problem; empty when it is
|
|
72
85
|
* complete. Shared by MCP and CLI so the wording cannot drift.
|
|
73
86
|
*/
|
|
74
87
|
export declare function describeEvidence(evidence: CoverageEvidence | undefined, projectRoot: string): string[];
|
|
88
|
+
/**
|
|
89
|
+
* #1219: one line naming the report entries left out of the figures as not
|
|
90
|
+
* project files (empty when none were). A note, not an evidence gap: those
|
|
91
|
+
* entries never were the project's coverage. Shared by MCP and CLI.
|
|
92
|
+
*/
|
|
93
|
+
export declare function describeExcludedEntries(evidence: CoverageEvidence | undefined): string[];
|
|
75
94
|
//# sourceMappingURL=coverage-evidence.d.ts.map
|
|
@@ -115,12 +115,16 @@ export function assessCoverageEvidence(report, measuredFiles, projectRoot, targe
|
|
|
115
115
|
const stale = options.reportPath
|
|
116
116
|
? findStaleness(options.reportPath, [...sources].filter(file => fs.existsSync(file)))
|
|
117
117
|
: undefined;
|
|
118
|
+
const excluded = options.excluded ?? [];
|
|
119
|
+
const conflicting = [...new Set(excluded.flatMap(e => (e.file ? [e.file] : [])))].sort();
|
|
118
120
|
return {
|
|
119
|
-
status: unmeasured.length > 0 || stale ? 'insufficient-evidence' : 'complete',
|
|
121
|
+
status: unmeasured.length > 0 || stale || conflicting.length > 0 ? 'insufficient-evidence' : 'complete',
|
|
120
122
|
unmeasuredFiles: unmeasured,
|
|
121
|
-
targetFiles: sources.size,
|
|
123
|
+
targetFiles: sources.size + conflicting.filter(file => !sources.has(file)).length,
|
|
122
124
|
...(stale ? { stale } : {}),
|
|
123
125
|
...(coverageScope ? { coverageScope } : {}),
|
|
126
|
+
...(excluded.length > 0 ? { excludedEntries: excluded } : {}),
|
|
127
|
+
...(conflicting.length > 0 ? { conflictingFiles: conflicting } : {}),
|
|
124
128
|
};
|
|
125
129
|
}
|
|
126
130
|
const MAX_LISTED = 5;
|
|
@@ -148,6 +152,12 @@ export function describeEvidence(evidence, projectRoot) {
|
|
|
148
152
|
'the report with coverage for the whole target, or exclude files that are not meant to be measured in the ' +
|
|
149
153
|
`coverage tool's include/exclude config.${scopeNote}`);
|
|
150
154
|
}
|
|
155
|
+
const conflicting = evidence.conflictingFiles ?? [];
|
|
156
|
+
if (conflicting.length > 0) {
|
|
157
|
+
reasons.push(`${conflicting.length} source file${conflicting.length === 1 ? ' is' : 's are'} listed in the coverage ` +
|
|
158
|
+
'report under two spellings (e.g. `./src/a.ts` and `src/a.ts`), so which entry is right is unknown; ' +
|
|
159
|
+
`they are UNMEASURED and left out of the figures: ${listFiles(conflicting, projectRoot)}`);
|
|
160
|
+
}
|
|
151
161
|
if (evidence.stale) {
|
|
152
162
|
const m = evidence.stale.newerFiles.length;
|
|
153
163
|
reasons.push(`the coverage report ${path.relative(projectRoot, evidence.stale.reportPath) || evidence.stale.reportPath} ` +
|
|
@@ -156,4 +166,23 @@ export function describeEvidence(evidence, projectRoot) {
|
|
|
156
166
|
}
|
|
157
167
|
return reasons;
|
|
158
168
|
}
|
|
169
|
+
const EXCLUDED_WHY = {
|
|
170
|
+
'outside-project': 'outside the project root',
|
|
171
|
+
'windows-path': 'a Windows path, which cannot name a file here',
|
|
172
|
+
'duplicate-spelling': 'a second spelling of a file the report already lists',
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* #1219: one line naming the report entries left out of the figures as not
|
|
176
|
+
* project files (empty when none were). A note, not an evidence gap: those
|
|
177
|
+
* entries never were the project's coverage. Shared by MCP and CLI.
|
|
178
|
+
*/
|
|
179
|
+
export function describeExcludedEntries(evidence) {
|
|
180
|
+
const outside = (evidence?.excludedEntries ?? []).filter(e => e.reason !== 'duplicate-spelling');
|
|
181
|
+
if (outside.length === 0)
|
|
182
|
+
return [];
|
|
183
|
+
const shown = outside.slice(0, MAX_LISTED).map(e => `${e.path} (${EXCLUDED_WHY[e.reason]})`);
|
|
184
|
+
const more = outside.length > MAX_LISTED ? `, … ${outside.length - MAX_LISTED} more` : '';
|
|
185
|
+
return [`${outside.length} coverage report entr${outside.length === 1 ? 'y is' : 'ies are'} not a project file and ` +
|
|
186
|
+
`${outside.length === 1 ? 'is' : 'are'} left out of the figures: ${shown.join(', ')}${more}.`];
|
|
187
|
+
}
|
|
159
188
|
//# sourceMappingURL=coverage-evidence.js.map
|
|
@@ -9,7 +9,7 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
9
9
|
import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
|
|
10
10
|
import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
|
|
11
11
|
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
12
|
-
import { describeEvidence } from './coverage-evidence.js';
|
|
12
|
+
import { describeEvidence, describeExcludedEntries } from './coverage-evidence.js';
|
|
13
13
|
import { randomUUID } from 'crypto';
|
|
14
14
|
import * as path from 'path';
|
|
15
15
|
import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
|
|
@@ -289,6 +289,8 @@ export function registerCoverageHandlers(ctx) {
|
|
|
289
289
|
if (evidenceReasons.length > 0) {
|
|
290
290
|
warnings.push(`INSUFFICIENT EVIDENCE — the threshold is not met on this report: ${evidenceReasons.join('; ').replace(/\.?$/, '.')}`);
|
|
291
291
|
}
|
|
292
|
+
// #1219: entries that are not project files are named, not silently dropped.
|
|
293
|
+
warnings.push(...describeExcludedEntries(evidence));
|
|
292
294
|
// #569: the analyzer generates recommendations from the summary numbers.
|
|
293
295
|
// When branch or function data was never collected, those numbers are 0
|
|
294
296
|
// by construction, and the resulting advice ("Branch coverage is
|
|
@@ -325,6 +327,8 @@ export function registerCoverageHandlers(ctx) {
|
|
|
325
327
|
evidenceStatus: evidence.status,
|
|
326
328
|
unmeasuredFiles: evidence.unmeasuredFiles,
|
|
327
329
|
...(evidence.stale ? { staleReport: evidence.stale } : {}),
|
|
330
|
+
...(evidence.conflictingFiles ? { conflictingFiles: evidence.conflictingFiles } : {}),
|
|
331
|
+
...(evidence.excludedEntries ? { excludedReportEntries: evidence.excludedEntries } : {}),
|
|
328
332
|
} : {}),
|
|
329
333
|
delta: report.delta,
|
|
330
334
|
recommendations,
|
|
@@ -26,6 +26,7 @@ import { loadCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverage
|
|
|
26
26
|
import { isTestPath } from './coverage-collection.js';
|
|
27
27
|
import { assessCoverageEvidence } from './coverage-evidence.js';
|
|
28
28
|
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
29
|
+
import { classifyProjectCoveragePaths } from '../../domains/coverage-analysis/collected-metrics.js';
|
|
29
30
|
// ============================================================================
|
|
30
31
|
// Project root
|
|
31
32
|
// ============================================================================
|
|
@@ -428,7 +429,12 @@ export function scopeCoverageToTarget(data, root, target) {
|
|
|
428
429
|
export function evaluateCoverageForTarget(report, projectRoot, target, options = {}) {
|
|
429
430
|
if (options.numTotalTests === 0)
|
|
430
431
|
return { status: 'no-data', reason: 'no-tests-ran' };
|
|
431
|
-
|
|
432
|
+
// #1219: an entry that is not a measurement of a project file (outside the
|
|
433
|
+
// root, a Windows path on POSIX, one file under two spellings) is not part
|
|
434
|
+
// of the figures — the same rule as the per-file records (#1030).
|
|
435
|
+
const inTarget = scopeCoverageToTarget(report, projectRoot, target);
|
|
436
|
+
const { keys, excluded } = classifyProjectCoveragePaths(inTarget.map(f => f.path), projectRoot);
|
|
437
|
+
const scoped = inTarget.filter(f => keys.has(f.path));
|
|
432
438
|
if (scoped.length === 0)
|
|
433
439
|
return { status: 'no-data', reason: 'target-not-covered' };
|
|
434
440
|
// Coverage OF a test file is not production coverage (#569). A report with
|
|
@@ -438,6 +444,7 @@ export function evaluateCoverageForTarget(report, projectRoot, target, options =
|
|
|
438
444
|
return { status: 'no-data', reason: 'test-only-report' };
|
|
439
445
|
const evidence = assessCoverageEvidence(report, production, projectRoot, target, {
|
|
440
446
|
reportPath: options.reportPath, checkCompleteness: options.checkCompleteness,
|
|
447
|
+
excluded: excluded.filter(e => !e.file || !isTestPath(e.file, projectRoot)),
|
|
441
448
|
});
|
|
442
449
|
return { status: 'measured', files: production, evidence };
|
|
443
450
|
}
|
|
@@ -222,8 +222,16 @@ export function registerQualityHandlers(ctx) {
|
|
|
222
222
|
const insufficient = sufficiency.evidenceStatus !== 'measured';
|
|
223
223
|
const passed = !insufficient && measuredFailures.length === 0 && report.score.overall >= threshold;
|
|
224
224
|
const recommendations = report.recommendations.map(r => `[${r.type}] ${r.title}: ${r.description}`);
|
|
225
|
+
// A score that leaves out unmeasured metrics is not the overall score:
|
|
226
|
+
// -1 with the reason, as the gate's overallScore since #1223. The score
|
|
227
|
+
// over the measured metrics stays available, labelled as a subset.
|
|
228
|
+
const subsetScore = report.subsetScore ?? report.score.overall;
|
|
225
229
|
return ok({
|
|
226
|
-
qualityScore: report.score.overall,
|
|
230
|
+
qualityScore: insufficient ? UNMEASURED : report.score.overall,
|
|
231
|
+
...(insufficient ? {
|
|
232
|
+
qualityScoreReason: `not computed: ${sufficiency.unmeasured.join(', ')} unmeasured`,
|
|
233
|
+
...(subsetScore >= 0 ? { subsetScore } : {}),
|
|
234
|
+
} : {}),
|
|
227
235
|
passed,
|
|
228
236
|
threshold,
|
|
229
237
|
metrics: {
|
|
@@ -37,6 +37,7 @@ function qualityReport(result) {
|
|
|
37
37
|
: [];
|
|
38
38
|
return {
|
|
39
39
|
...(typeof score.overall === 'number' ? { qualityScore: score.overall } : {}),
|
|
40
|
+
...(typeof data.subsetScore === 'number' ? { subsetScore: data.subsetScore } : {}),
|
|
40
41
|
passed: false,
|
|
41
42
|
gateEvaluated: false,
|
|
42
43
|
metrics: Object.fromEntries(metrics.filter(m => m.name && typeof m.value === 'number').map(m => [m.name, m.value])),
|
|
@@ -501,11 +501,15 @@ ${data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
|
|
|
501
501
|
## Quality Score
|
|
502
502
|
|
|
503
503
|
${typeof data.qualityScore !== 'number' ? 'N/A — measured gate uses individual checks.'
|
|
504
|
-
: data.qualityScore < 0
|
|
505
|
-
: data.
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
504
|
+
: data.qualityScore < 0 && typeof data.subsetScore === 'number'
|
|
505
|
+
? `Not computed — unmeasured: ${data.unmeasured?.join(', ') || 'unknown'}.\n`
|
|
506
|
+
+ `Subset score over measured metrics: ${data.subsetScore.toFixed(1)} (not a verdict)`
|
|
507
|
+
+ (data.scoreBasis?.length ? `\nBased on: ${data.scoreBasis.join(', ')}` : '')
|
|
508
|
+
: data.qualityScore < 0 ? 'Not measured — no requested metric had measured data (#1011).'
|
|
509
|
+
: data.evidenceStatus === 'insufficient-evidence'
|
|
510
|
+
? `Subset score over measured metrics: ${data.qualityScore.toFixed(1)} (not a verdict)`
|
|
511
|
+
+ (data.scoreBasis?.length ? `\nBased on: ${data.scoreBasis.join(', ')}` : '')
|
|
512
|
+
: `**${data.qualityScore.toFixed(1)}** / 100`}
|
|
509
513
|
|
|
510
514
|
## Metrics
|
|
511
515
|
|
|
@@ -89,6 +89,7 @@ export declare class ChaosEngineerService implements IChaosEngineeringService {
|
|
|
89
89
|
private executeCommandProbe;
|
|
90
90
|
private executeMetricProbe;
|
|
91
91
|
private performFaultInjection;
|
|
92
|
+
private notInjected;
|
|
92
93
|
private injectLatency;
|
|
93
94
|
private injectError;
|
|
94
95
|
private injectTimeout;
|
|
@@ -609,32 +609,25 @@ Provide:
|
|
|
609
609
|
}
|
|
610
610
|
return err(new Error(`Unknown fault type: ${fault.type}`));
|
|
611
611
|
}
|
|
612
|
+
// #1258: these fault types need infrastructure this process does not control
|
|
613
|
+
// (a network proxy, service mesh, firewall or DNS server). They used to log a
|
|
614
|
+
// note and return ok(1), so an experiment reported a fault that never ran.
|
|
615
|
+
// They now fail with the reason, and injectFault() records injected: false.
|
|
616
|
+
notInjected(fault, requirement) {
|
|
617
|
+
return err(new Error(`${fault.type} fault not injected into ${fault.target.selector}: requires ${requirement}, ` +
|
|
618
|
+
'which this process does not control. Nothing was changed on the target.'));
|
|
619
|
+
}
|
|
612
620
|
async injectLatency(fault) {
|
|
613
|
-
|
|
614
|
-
// For simulation, we store the config and check during probe execution
|
|
615
|
-
const latencyMs = fault.parameters.latencyMs ?? 100;
|
|
616
|
-
logger.info(`Latency injection configured: ${latencyMs}ms for ${fault.target.selector}`);
|
|
617
|
-
logger.info(`Note: Actual latency injection requires network proxy (e.g., Toxiproxy, tc)`);
|
|
618
|
-
return ok(1);
|
|
621
|
+
return this.notInjected(fault, 'a network proxy (e.g., Toxiproxy, tc)');
|
|
619
622
|
}
|
|
620
623
|
async injectError(fault) {
|
|
621
|
-
|
|
622
|
-
const errorCode = fault.parameters.errorCode ?? 500;
|
|
623
|
-
logger.info(`Error injection configured: ${errorCode} for ${fault.target.selector}`);
|
|
624
|
-
logger.info(`Note: Actual error injection requires service mesh (e.g., Istio, Linkerd)`);
|
|
625
|
-
return ok(1);
|
|
624
|
+
return this.notInjected(fault, 'a service mesh or proxy (e.g., Istio, Linkerd, Toxiproxy)');
|
|
626
625
|
}
|
|
627
626
|
async injectTimeout(fault) {
|
|
628
|
-
|
|
629
|
-
logger.info(`Timeout injection configured for ${fault.target.selector}`);
|
|
630
|
-
logger.info(`Note: Actual timeout injection requires network proxy configuration`);
|
|
631
|
-
return ok(1);
|
|
627
|
+
return this.notInjected(fault, 'a network proxy (e.g., Toxiproxy)');
|
|
632
628
|
}
|
|
633
629
|
async injectPacketLoss(fault) {
|
|
634
|
-
|
|
635
|
-
logger.info(`Packet loss configured: ${lossPercent}% for ${fault.target.selector}`);
|
|
636
|
-
logger.info(`Note: Actual packet loss requires tc/iptables (Linux) or similar`);
|
|
637
|
-
return ok(1);
|
|
630
|
+
return this.notInjected(fault, 'tc/iptables (Linux) or a network proxy');
|
|
638
631
|
}
|
|
639
632
|
async injectCpuStress(fault) {
|
|
640
633
|
// Real CPU stress implementation using busy loops
|
|
@@ -689,34 +682,18 @@ Provide:
|
|
|
689
682
|
}
|
|
690
683
|
}
|
|
691
684
|
async injectDiskStress(fault) {
|
|
692
|
-
|
|
693
|
-
logger.info(`Disk stress configured for ${fault.target.selector}`);
|
|
694
|
-
logger.info(`Note: Actual disk stress requires file system write permissions`);
|
|
695
|
-
return ok(1);
|
|
685
|
+
return this.notInjected(fault, 'file system stress tooling (e.g., stress-ng)');
|
|
696
686
|
}
|
|
697
687
|
async injectNetworkPartition(fault) {
|
|
698
|
-
|
|
699
|
-
logger.info(`Network partition configured for ${fault.target.selector}`);
|
|
700
|
-
logger.info(`Note: Actual network partition requires iptables/firewall rules`);
|
|
701
|
-
return ok(1);
|
|
688
|
+
return this.notInjected(fault, 'iptables/firewall rules');
|
|
702
689
|
}
|
|
703
690
|
async injectDnsFailure(fault) {
|
|
704
|
-
|
|
705
|
-
logger.info(`DNS failure configured for ${fault.target.selector}`);
|
|
706
|
-
logger.info(`Note: Actual DNS failure requires DNS server or /etc/hosts modification`);
|
|
707
|
-
return ok(1);
|
|
691
|
+
return this.notInjected(fault, 'a DNS server or /etc/hosts modification');
|
|
708
692
|
}
|
|
709
693
|
async injectProcessKill(fault) {
|
|
710
|
-
//
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
logger.info(`Note: Actual process kill requires appropriate permissions`);
|
|
714
|
-
// In dry-run mode or without permissions, just log
|
|
715
|
-
if (this.config.enableDryRun) {
|
|
716
|
-
logger.info(`Would kill processes matching: ${processPattern}`);
|
|
717
|
-
return ok(0);
|
|
718
|
-
}
|
|
719
|
-
return ok(1);
|
|
694
|
+
// No process is signalled here, so a dry run and a real run both report
|
|
695
|
+
// the fault as not injected rather than counting a target as affected.
|
|
696
|
+
return this.notInjected(fault, 'process signalling with appropriate permissions (e.g., Chaos Monkey, Litmus)');
|
|
720
697
|
}
|
|
721
698
|
async performFaultRemoval(fault) {
|
|
722
699
|
logger.info(`Removing fault: ${fault.id} (${fault.type})`);
|
|
@@ -817,14 +794,15 @@ Provide:
|
|
|
817
794
|
if (!finalSteadyState) {
|
|
818
795
|
return 'failed';
|
|
819
796
|
}
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
}
|
|
823
|
-
// Check if any faults failed to inject
|
|
797
|
+
// #1258: a fault that was not injected means the experiment did not run as
|
|
798
|
+
// designed, so a hypothesis "validated" without it is not a completed run.
|
|
824
799
|
const failedFaults = execution.result.faultResults.filter((f) => !f.injected);
|
|
825
800
|
if (failedFaults.length > 0) {
|
|
826
801
|
return 'failed';
|
|
827
802
|
}
|
|
803
|
+
if (execution.result.hypothesisValidated) {
|
|
804
|
+
return 'completed';
|
|
805
|
+
}
|
|
828
806
|
return 'completed';
|
|
829
807
|
}
|
|
830
808
|
async rollbackExperiment(experiment) {
|
|
@@ -14,15 +14,31 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
|
|
|
14
14
|
* (or the cwd when none is known), so one file never has two records.
|
|
15
15
|
*/
|
|
16
16
|
export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
|
|
17
|
+
/** Why a report entry is not a measurement of a project file (#1030, #1219). */
|
|
18
|
+
export type ExcludedCoverageReason = 'outside-project' | 'windows-path' | 'duplicate-spelling';
|
|
19
|
+
/** A report entry left out of per-file records and of the report's summary. */
|
|
20
|
+
export interface ExcludedCoverageEntry {
|
|
21
|
+
/** The path as the report wrote it. */
|
|
22
|
+
path: string;
|
|
23
|
+
reason: ExcludedCoverageReason;
|
|
24
|
+
/** For `duplicate-spelling`: the project file both spellings name. */
|
|
25
|
+
file?: string;
|
|
26
|
+
}
|
|
17
27
|
/**
|
|
18
|
-
* #1030: the
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* (lcov `SF:../../outside.ts`),
|
|
22
|
-
* (it would resolve to a junk key), or the report lists
|
|
28
|
+
* #1030, #1219: sort the paths of ONE report into project files (with their
|
|
29
|
+
* per-file record key, keyed by the path as the report wrote it) and entries
|
|
30
|
+
* that are not a measurement of a project file: a path that resolves outside
|
|
31
|
+
* the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
|
|
32
|
+
* on POSIX (it would resolve to a junk key), or a file the report lists under
|
|
23
33
|
* two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
|
|
24
|
-
* unknown.
|
|
34
|
+
* unknown. A path under the root's realpath (macOS `/private/var` for
|
|
35
|
+
* `/var`) is inside.
|
|
25
36
|
*/
|
|
37
|
+
export declare function classifyProjectCoveragePaths(paths: readonly string[], projectRoot?: string): {
|
|
38
|
+
keys: Map<string, string>;
|
|
39
|
+
excluded: ExcludedCoverageEntry[];
|
|
40
|
+
};
|
|
41
|
+
/** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
|
|
26
42
|
export declare function projectFileCoverageKeys(paths: readonly string[], projectRoot?: string): Map<string, string>;
|
|
27
43
|
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
28
44
|
export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* summary figure is 0 by construction, and must be reported AND persisted as
|
|
7
7
|
* null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
|
|
8
8
|
*/
|
|
9
|
+
import * as fs from 'fs';
|
|
9
10
|
import * as path from 'path';
|
|
10
11
|
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
11
12
|
/**
|
|
@@ -17,34 +18,58 @@ import { findProjectRoot } from '../../kernel/project-root.js';
|
|
|
17
18
|
export function fileCoverageKey(filePath, projectRoot) {
|
|
18
19
|
return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
|
|
19
20
|
}
|
|
21
|
+
function isInside(root, key) {
|
|
22
|
+
const relative = path.relative(root, key);
|
|
23
|
+
return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
|
|
24
|
+
}
|
|
25
|
+
function realRoot(root) {
|
|
26
|
+
try {
|
|
27
|
+
return fs.realpathSync(root);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return root;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
20
33
|
/**
|
|
21
|
-
* #1030: the
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* (lcov `SF:../../outside.ts`),
|
|
25
|
-
* (it would resolve to a junk key), or the report lists
|
|
34
|
+
* #1030, #1219: sort the paths of ONE report into project files (with their
|
|
35
|
+
* per-file record key, keyed by the path as the report wrote it) and entries
|
|
36
|
+
* that are not a measurement of a project file: a path that resolves outside
|
|
37
|
+
* the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
|
|
38
|
+
* on POSIX (it would resolve to a junk key), or a file the report lists under
|
|
26
39
|
* two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
|
|
27
|
-
* unknown.
|
|
40
|
+
* unknown. A path under the root's realpath (macOS `/private/var` for
|
|
41
|
+
* `/var`) is inside.
|
|
28
42
|
*/
|
|
29
|
-
export function
|
|
43
|
+
export function classifyProjectCoveragePaths(paths, projectRoot) {
|
|
30
44
|
const root = path.resolve(projectRoot ?? findProjectRoot());
|
|
45
|
+
const canonicalRoot = realRoot(root);
|
|
31
46
|
const keys = new Map();
|
|
47
|
+
const excluded = [];
|
|
32
48
|
const spellings = new Map();
|
|
33
49
|
for (const filePath of paths) {
|
|
34
|
-
if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath))
|
|
50
|
+
if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath)) {
|
|
51
|
+
excluded.push({ path: filePath, reason: 'windows-path' });
|
|
35
52
|
continue;
|
|
53
|
+
}
|
|
36
54
|
const key = fileCoverageKey(filePath, root);
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
if (!isInside(root, key) && !isInside(canonicalRoot, key)) {
|
|
56
|
+
excluded.push({ path: filePath, reason: 'outside-project' });
|
|
39
57
|
continue;
|
|
58
|
+
}
|
|
40
59
|
keys.set(filePath, key);
|
|
41
60
|
spellings.set(key, (spellings.get(key) ?? 0) + 1);
|
|
42
61
|
}
|
|
43
62
|
for (const [filePath, key] of keys) {
|
|
44
|
-
if ((spellings.get(key) ?? 0) > 1)
|
|
63
|
+
if ((spellings.get(key) ?? 0) > 1) {
|
|
45
64
|
keys.delete(filePath);
|
|
65
|
+
excluded.push({ path: filePath, reason: 'duplicate-spelling', file: key });
|
|
66
|
+
}
|
|
46
67
|
}
|
|
47
|
-
return keys;
|
|
68
|
+
return { keys, excluded };
|
|
69
|
+
}
|
|
70
|
+
/** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
|
|
71
|
+
export function projectFileCoverageKeys(paths, projectRoot) {
|
|
72
|
+
return classifyProjectCoveragePaths(paths, projectRoot).keys;
|
|
48
73
|
}
|
|
49
74
|
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
50
75
|
export function fileCoverageLookupKeys(filePath, projectRoot) {
|
|
@@ -528,6 +528,8 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
528
528
|
function: pct(file.functions),
|
|
529
529
|
statement: pct(file.statements),
|
|
530
530
|
measured: true,
|
|
531
|
+
// #1219: the counts behind `line`, so several files can be line-weighted.
|
|
532
|
+
lines: { covered: file.lines.covered, total: file.lines.total },
|
|
531
533
|
...(runStatus ? { runStatus } : {}),
|
|
532
534
|
}, { persist: true });
|
|
533
535
|
}
|
|
@@ -16,7 +16,7 @@ import { TypeScriptParser } from '../../../shared/parsers/index.js';
|
|
|
16
16
|
import { toError } from '../../../shared/error-utils.js';
|
|
17
17
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
18
18
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
19
|
-
import {
|
|
19
|
+
import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
|
|
20
20
|
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
21
21
|
// LLMDefectAnalysis is imported from ../interfaces
|
|
22
22
|
const DEFAULT_CONFIG = {
|
|
@@ -616,11 +616,8 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
616
616
|
return 1 - fileCoverage.line / 100;
|
|
617
617
|
}
|
|
618
618
|
}
|
|
619
|
-
//
|
|
620
|
-
|
|
621
|
-
if (summary) {
|
|
622
|
-
return 1 - summary.line / 100;
|
|
623
|
-
}
|
|
619
|
+
// #1219: no fallback to the project-wide summary — it is not this
|
|
620
|
+
// file's coverage. A file with no record of its own gets the prior below.
|
|
624
621
|
}
|
|
625
622
|
catch {
|
|
626
623
|
// Non-critical lookup
|
|
@@ -34,6 +34,14 @@ export interface MeasuredFileCoverage {
|
|
|
34
34
|
function: number | null;
|
|
35
35
|
statement: number | null;
|
|
36
36
|
measured: true;
|
|
37
|
+
/**
|
|
38
|
+
* #1219: the line counts behind `line`, so a reader can weight several
|
|
39
|
+
* files by size. Absent on records written before 3.15.13.
|
|
40
|
+
*/
|
|
41
|
+
lines?: {
|
|
42
|
+
covered: number;
|
|
43
|
+
total: number;
|
|
44
|
+
};
|
|
37
45
|
}
|
|
38
46
|
/**
|
|
39
47
|
* Return the measured summary to store, or `null` when the payload is not
|
|
@@ -53,6 +53,27 @@ export function measuredFileCoverage(record) {
|
|
|
53
53
|
if (r.measured !== true || !isPercent(r.line))
|
|
54
54
|
return null;
|
|
55
55
|
const opt = (v) => (isPercent(v) ? v : null);
|
|
56
|
-
|
|
56
|
+
const lines = lineCounts(r.lines, r.line);
|
|
57
|
+
return {
|
|
58
|
+
line: r.line, branch: opt(r.branch), function: opt(r.function), statement: opt(r.statement), measured: true,
|
|
59
|
+
...(lines ? { lines } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* #1219: whole, consistent line counts (`covered / total` within rounding of
|
|
64
|
+
* the stored percentage), or `undefined` when the record has none or they do
|
|
65
|
+
* not describe its own percentage.
|
|
66
|
+
*/
|
|
67
|
+
function lineCounts(value, line) {
|
|
68
|
+
if (!value || typeof value !== 'object')
|
|
69
|
+
return undefined;
|
|
70
|
+
const { covered, total } = value;
|
|
71
|
+
if (!Number.isSafeInteger(covered) || !Number.isSafeInteger(total))
|
|
72
|
+
return undefined;
|
|
73
|
+
const c = covered;
|
|
74
|
+
const t = total;
|
|
75
|
+
if (t <= 0 || c < 0 || c > t || Math.abs((c / t) * 100 - line) > 0.01)
|
|
76
|
+
return undefined;
|
|
77
|
+
return { covered: c, total: t };
|
|
57
78
|
}
|
|
58
79
|
//# sourceMappingURL=coverage-report-event.js.map
|
|
@@ -103,6 +103,12 @@ export interface QualityReport {
|
|
|
103
103
|
* value covers `analysedFiles` of `totalFiles`; `failed` lists the gaps.
|
|
104
104
|
*/
|
|
105
105
|
partial?: PartialQualityMetric[];
|
|
106
|
+
/**
|
|
107
|
+
* The weighted score over the measured metrics only, present when a
|
|
108
|
+
* requested metric is unmeasured. `score.overall` is then -1: a score that
|
|
109
|
+
* leaves out unmeasured metrics is not the overall score (#1223 convention).
|
|
110
|
+
*/
|
|
111
|
+
subsetScore?: number;
|
|
106
112
|
}
|
|
107
113
|
/** #1021: a file excluded from static analysis, with the reason. */
|
|
108
114
|
export interface ExcludedQualityFile {
|
|
@@ -126,6 +126,10 @@ export declare class QualityAnalyzerService implements IQualityAnalyzerService {
|
|
|
126
126
|
* Never a fixed fallback value.
|
|
127
127
|
*/
|
|
128
128
|
private collectFileMetrics;
|
|
129
|
+
/**
|
|
130
|
+
* The file's own measured coverage record, or `null`. #1219: never the
|
|
131
|
+
* project-wide `coverage:latest` summary — that is not this file's coverage.
|
|
132
|
+
*/
|
|
129
133
|
private getStoredCoverage;
|
|
130
134
|
private aggregateMetrics;
|
|
131
135
|
private calculateQualityScore;
|