agentic-qe 3.15.13 → 3.15.14
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/helpers/brain-checkpoint.cjs +124 -5
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +78 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-23KA2YW7.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-6RRQWMNE.js → agent-booster-wasm-2DLAEZK6.js} +2 -2
- package/dist/cli/chunks/{agent-handler-AOH6TV7W.js → agent-handler-P3IY7XEE.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2P54SF5N.js → agent-memory-branch-WWKC2H3G.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +2 -0
- package/dist/cli/chunks/{arena-X6MOGQHA.js → arena-4BMFF6BS.js} +4 -4
- package/dist/cli/chunks/{arena-NSVFCAF5.js → arena-EIV5OALF.js} +2 -2
- package/dist/cli/chunks/{audit-27DJLQNM.js → audit-DNTI453H.js} +3 -3
- package/dist/cli/chunks/base-XPWGYDKD.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BU5GXILS.js → better-sqlite3-TQBQGNC6.js} +2 -2
- package/dist/cli/chunks/brain-handler-HY57CNAO.js +95 -0
- package/dist/cli/chunks/{branch-enumerator-5CLULOCU.js → branch-enumerator-THPMZPHQ.js} +2 -2
- package/dist/cli/chunks/{browser-R4DMU3LN.js → browser-O6JJOZCK.js} +2 -2
- package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +2 -0
- package/dist/cli/chunks/{chunk-VU5TBX2V.js → chunk-2HPNGK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-5FKWCZNF.js → chunk-2IJO3657.js} +2 -2
- package/dist/cli/chunks/{chunk-K3TLLJMX.js → chunk-2QLE6NDW.js} +1 -1
- package/dist/cli/chunks/{chunk-J2ZIFFM6.js → chunk-2UZBLC5H.js} +2 -2
- package/dist/cli/chunks/{chunk-HD7YIFOI.js → chunk-2W5MQDHM.js} +2 -2
- package/dist/cli/chunks/{chunk-F3YS57NF.js → chunk-3FITMWWJ.js} +2 -2
- package/dist/cli/chunks/{chunk-K4CZA77U.js → chunk-3TF27MG5.js} +2 -2
- package/dist/cli/chunks/{chunk-BLSLEVDI.js → chunk-3XACRXBY.js} +2 -2
- package/dist/cli/chunks/{chunk-A64JFBWI.js → chunk-43XHGWYH.js} +2 -2
- package/dist/cli/chunks/{chunk-42J34YG4.js → chunk-4RPBODN5.js} +2 -2
- package/dist/cli/chunks/{chunk-W26B7ERY.js → chunk-4T7XV5KQ.js} +1 -1
- package/dist/cli/chunks/{chunk-SSU73QAX.js → chunk-4WLIOPHX.js} +2 -2
- package/dist/cli/chunks/{chunk-P7A4NKTZ.js → chunk-52KOPIMI.js} +2 -2
- package/dist/cli/chunks/{chunk-HQZGPJYG.js → chunk-56NSE3LJ.js} +2 -2
- package/dist/cli/chunks/{chunk-AQSVJNEH.js → chunk-57DRT6UA.js} +2 -2
- package/dist/cli/chunks/{chunk-M6AAGIG7.js → chunk-57FX3GP6.js} +1 -1
- package/dist/cli/chunks/{chunk-O6FGXMHD.js → chunk-5PLBQZ5J.js} +1 -1
- package/dist/cli/chunks/{chunk-ASQYASNV.js → chunk-5Y7UFHJD.js} +1 -1
- package/dist/cli/chunks/{chunk-5VMAV6T6.js → chunk-5Z4MO2F3.js} +1 -1
- package/dist/cli/chunks/chunk-65EE2EST.js +8 -0
- package/dist/cli/chunks/{chunk-7CMTY45A.js → chunk-6NIGSY5L.js} +2 -2
- package/dist/cli/chunks/chunk-6O63ZTVX.js +3 -0
- package/dist/cli/chunks/{chunk-FZ76G4QJ.js → chunk-6OI5SK7M.js} +1 -1
- package/dist/cli/chunks/{chunk-5ZGM3RMH.js → chunk-6P4Q4RTC.js} +1 -1
- package/dist/cli/chunks/{chunk-LUZNKJE6.js → chunk-7724KXM2.js} +3 -3
- package/dist/cli/chunks/{chunk-XPRVF4YE.js → chunk-7MISCSL5.js} +2 -2
- package/dist/cli/chunks/{chunk-TCBBNUBP.js → chunk-7MUO4DEH.js} +3 -3
- package/dist/cli/chunks/{chunk-NT4DBXSX.js → chunk-7QUSNBAA.js} +2 -2
- package/dist/cli/chunks/{chunk-TWDW32W2.js → chunk-7SQTLUEN.js} +2 -2
- package/dist/cli/chunks/{chunk-QPNG5ZN2.js → chunk-7T6L3LFN.js} +2 -2
- package/dist/cli/chunks/{chunk-E56B6IDX.js → chunk-7TH4PJSU.js} +2 -2
- package/dist/cli/chunks/{chunk-LZYQHVD4.js → chunk-7Y3LXH57.js} +2 -2
- package/dist/cli/chunks/{chunk-YQFLQE53.js → chunk-A2T56XVL.js} +2 -2
- package/dist/cli/chunks/{chunk-KV4T4MXK.js → chunk-AJVLVF7V.js} +2 -2
- package/dist/cli/chunks/{chunk-VTDFVFST.js → chunk-ARRBXCII.js} +2 -2
- package/dist/cli/chunks/{chunk-G6WDYBLQ.js → chunk-AYLEH2UF.js} +1 -1
- package/dist/cli/chunks/{chunk-526QYFJU.js → chunk-BBYJBZHG.js} +2 -2
- package/dist/cli/chunks/{chunk-CM4LSLKR.js → chunk-BM3EJLMV.js} +2 -2
- package/dist/cli/chunks/{chunk-DVGRPK7A.js → chunk-BNG4J3CE.js} +2 -2
- package/dist/cli/chunks/{chunk-BK577VL7.js → chunk-BPDAQB3F.js} +2 -2
- package/dist/cli/chunks/{chunk-C6JTLKG7.js → chunk-BQJ7CV53.js} +9 -9
- package/dist/cli/chunks/{chunk-GB6HBNH2.js → chunk-C3OIBFAA.js} +2 -2
- package/dist/cli/chunks/{chunk-RF7HWBHN.js → chunk-CAZM63TP.js} +2 -2
- package/dist/cli/chunks/{chunk-KWYH3FI4.js → chunk-CIINJHOX.js} +1 -1
- package/dist/cli/chunks/{chunk-ARJW4I2O.js → chunk-CPPYZYXC.js} +2 -2
- package/dist/cli/chunks/{chunk-CRWPZT74.js → chunk-D3ZZ2NLL.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3UDLV5Z.js → chunk-D5GB5PUU.js} +1 -1
- package/dist/cli/chunks/{chunk-7PLIEBY7.js → chunk-DLTB5KCR.js} +2 -2
- package/dist/cli/chunks/{chunk-YZWBNBTW.js → chunk-DRLSJJIC.js} +2 -2
- package/dist/cli/chunks/{chunk-BEGR4D6N.js → chunk-DSQESXL4.js} +2 -2
- package/dist/cli/chunks/{chunk-72ASBE35.js → chunk-E2JLAW3U.js} +3 -3
- package/dist/cli/chunks/{chunk-MAMQA43L.js → chunk-E3QIQMMN.js} +1 -1
- package/dist/cli/chunks/{chunk-WOCGL4QP.js → chunk-E7OR6V3V.js} +2 -2
- package/dist/cli/chunks/{chunk-MVVB7C2E.js → chunk-E7QTWGPI.js} +156 -156
- package/dist/cli/chunks/{chunk-JQGMW45H.js → chunk-EC65UZ77.js} +1 -1
- package/dist/cli/chunks/{chunk-YXRASAPI.js → chunk-EIEEST4T.js} +2 -2
- package/dist/cli/chunks/{chunk-AL6FBH3E.js → chunk-FHPNWHY7.js} +2 -2
- package/dist/cli/chunks/{chunk-C7JM7CD3.js → chunk-FJOIBZUB.js} +2 -2
- package/dist/cli/chunks/{chunk-LL7LDPXS.js → chunk-FTYRPEJS.js} +1 -1
- package/dist/cli/chunks/{chunk-MFW5HSG4.js → chunk-G7HGUQAE.js} +2 -2
- package/dist/cli/chunks/{chunk-WQL7WCIZ.js → chunk-GY4P7KAI.js} +1 -1
- package/dist/cli/chunks/{chunk-3YNLWPBF.js → chunk-H3C5FJRH.js} +2 -2
- package/dist/cli/chunks/{chunk-W3INMZZ6.js → chunk-H4LYXLAT.js} +1 -1
- package/dist/cli/chunks/{chunk-W3PPFHI5.js → chunk-HAYKLXCT.js} +52 -50
- package/dist/cli/chunks/{chunk-XNBOGCF3.js → chunk-HEDGFKC5.js} +2 -2
- package/dist/cli/chunks/{chunk-SYV2V3PL.js → chunk-HHBF2BZC.js} +4 -4
- package/dist/cli/chunks/{chunk-75RDHBAX.js → chunk-HSDWPQQY.js} +3 -3
- package/dist/cli/chunks/{chunk-6KATY3KS.js → chunk-HTVGHHX2.js} +2 -2
- package/dist/cli/chunks/{chunk-VRVMIPTM.js → chunk-HV43NX4A.js} +2 -2
- package/dist/cli/chunks/{chunk-RFNW2LGD.js → chunk-IDBA5GK2.js} +2 -2
- package/dist/cli/chunks/{chunk-DNDL7SOS.js → chunk-INGXD5IX.js} +2 -2
- package/dist/cli/chunks/{chunk-IJUHSJ2U.js → chunk-IQRPR4KB.js} +2 -2
- package/dist/cli/chunks/{chunk-UOC3O6RP.js → chunk-IRPNEXOU.js} +2 -2
- package/dist/cli/chunks/{chunk-KDVZND5Q.js → chunk-J35JWDJE.js} +1 -1
- package/dist/cli/chunks/{chunk-CV77DMDQ.js → chunk-J6ASX536.js} +2 -2
- package/dist/cli/chunks/{chunk-7YTGHGK4.js → chunk-JAOCHPYX.js} +2 -2
- package/dist/cli/chunks/{chunk-HZ5NXFXH.js → chunk-JB7R77SH.js} +2 -2
- package/dist/cli/chunks/{chunk-PB6J6HAA.js → chunk-JI67T6Q2.js} +2 -2
- package/dist/cli/chunks/{chunk-E7CLYGS7.js → chunk-JJHLGGPP.js} +1 -1
- package/dist/cli/chunks/{chunk-3Y7TJFHU.js → chunk-JK6PMLQQ.js} +2 -2
- package/dist/cli/chunks/{chunk-CCMKSHAT.js → chunk-JO26SG47.js} +2 -2
- package/dist/cli/chunks/{chunk-NU3W5WFT.js → chunk-JSSU4RIK.js} +2 -2
- package/dist/cli/chunks/{chunk-756CGMEH.js → chunk-K2SMP4OD.js} +1 -1
- package/dist/cli/chunks/{chunk-OCAEXYFA.js → chunk-K7GFYFBO.js} +2 -2
- package/dist/cli/chunks/{chunk-VRHRBAEM.js → chunk-K7RT6ITZ.js} +1 -1
- package/dist/cli/chunks/{chunk-LFJALJOA.js → chunk-KJ5A54ZH.js} +2 -2
- package/dist/cli/chunks/{chunk-3Y2ROSCL.js → chunk-L5VSLPMW.js} +2 -2
- package/dist/cli/chunks/{chunk-WKGTGOYS.js → chunk-L752CNG3.js} +3 -3
- package/dist/cli/chunks/{chunk-IC3TQEOA.js → chunk-L7PC675Y.js} +1 -1
- package/dist/cli/chunks/{chunk-TOQWL2ZF.js → chunk-LTGQJYYO.js} +2 -2
- package/dist/cli/chunks/{chunk-SVLQRAMF.js → chunk-M2TG7VDK.js} +1 -1
- package/dist/cli/chunks/{chunk-X7N2JF2X.js → chunk-M5JEA6ZY.js} +2 -2
- package/dist/cli/chunks/{chunk-GHM6MQNK.js → chunk-MB4UKUBV.js} +2 -2
- package/dist/cli/chunks/{chunk-R7SYRCRP.js → chunk-MKYOE7NE.js} +1 -1
- package/dist/cli/chunks/{chunk-3AN5TNGD.js → chunk-MQXWG55U.js} +3 -3
- package/dist/cli/chunks/{chunk-3QZEGE67.js → chunk-MR2OPUSA.js} +1 -1
- package/dist/cli/chunks/{chunk-6Z7PRBSG.js → chunk-N736GLWZ.js} +2 -2
- package/dist/cli/chunks/{chunk-PIDQVU3L.js → chunk-NHEG2DLN.js} +2 -2
- package/dist/cli/chunks/chunk-NKOLILT7.js +86 -0
- package/dist/cli/chunks/{chunk-UXZSUMEA.js → chunk-NPCXGX7N.js} +2 -2
- package/dist/cli/chunks/{chunk-XEAEYC6Y.js → chunk-NZQYJCO6.js} +1 -1
- package/dist/cli/chunks/{chunk-G77ERMUD.js → chunk-O2AAYJUV.js} +1 -1
- package/dist/cli/chunks/{chunk-H4GG2NLO.js → chunk-O32BFQV4.js} +2 -2
- package/dist/cli/chunks/{chunk-3LJ7LQMV.js → chunk-O3ERGUXH.js} +1 -1
- package/dist/cli/chunks/{chunk-QDEJ4CI2.js → chunk-O5CEL447.js} +2 -2
- package/dist/cli/chunks/{chunk-W2QWSQVE.js → chunk-O756AOUX.js} +2 -2
- package/dist/cli/chunks/{chunk-PSFSPGUD.js → chunk-OCN53CCK.js} +2 -2
- package/dist/cli/chunks/{chunk-KCW47QR5.js → chunk-OGEIHS76.js} +1 -1
- package/dist/cli/chunks/{chunk-3RZV5DGO.js → chunk-OLUOVNUF.js} +2 -2
- package/dist/cli/chunks/{chunk-KADFXPPN.js → chunk-P2TPH3TC.js} +2 -2
- package/dist/cli/chunks/{chunk-7NA7JXNB.js → chunk-PCQZIAXB.js} +2 -2
- package/dist/cli/chunks/{chunk-HOAJUIBQ.js → chunk-PGN4TARY.js} +2 -2
- package/dist/cli/chunks/{chunk-KB56CPU4.js → chunk-PNRPVQGI.js} +2 -2
- package/dist/cli/chunks/{chunk-CE7B5LU7.js → chunk-PWQWKYBG.js} +1 -1
- package/dist/cli/chunks/{chunk-DLD7RUZ4.js → chunk-QNQE3EOH.js} +2 -2
- package/dist/cli/chunks/chunk-QP2HLKTS.js +2 -0
- package/dist/cli/chunks/{chunk-H4H2YSFH.js → chunk-QP6GL3O5.js} +1 -1
- package/dist/cli/chunks/{chunk-LWR3FV3Y.js → chunk-QUZ745UQ.js} +2 -2
- package/dist/cli/chunks/{chunk-X2Z7F4EU.js → chunk-R5RRWLRI.js} +2 -2
- package/dist/cli/chunks/{chunk-NURIILUB.js → chunk-RE6JTSDM.js} +1 -1
- package/dist/cli/chunks/{chunk-YSZ5OE3Z.js → chunk-TOJF3ZG4.js} +2 -2
- package/dist/cli/chunks/{chunk-7JUC2MVZ.js → chunk-TSP6SU5V.js} +2 -2
- package/dist/cli/chunks/{chunk-NW7IBHJA.js → chunk-TW6Z6W4X.js} +4 -4
- package/dist/cli/chunks/{chunk-UDQSYWVF.js → chunk-TWOV3I3A.js} +1 -1
- package/dist/cli/chunks/chunk-U4TML2VD.js +3 -0
- package/dist/cli/chunks/{chunk-WO274FRI.js → chunk-U6IOQKCT.js} +2 -2
- package/dist/cli/chunks/{chunk-KDNJ4F3P.js → chunk-UDSB3XCG.js} +2 -2
- package/dist/cli/chunks/{chunk-SG3NX7QE.js → chunk-UFP7SN5V.js} +2 -2
- package/dist/cli/chunks/{chunk-UTRV7T2N.js → chunk-UMHFTQTR.js} +2 -2
- package/dist/cli/chunks/{chunk-4OVC4RIL.js → chunk-UNYTHZDZ.js} +1 -1
- package/dist/cli/chunks/{chunk-32ZMWEP3.js → chunk-UPWLMIDY.js} +2 -2
- package/dist/cli/chunks/{chunk-T3PGQFDI.js → chunk-USAKCGHC.js} +2 -2
- package/dist/cli/chunks/{chunk-2G7TVT6W.js → chunk-V3MGY76S.js} +2 -2
- package/dist/cli/chunks/{chunk-ZAKQLAHT.js → chunk-V6SE2ZU2.js} +1 -1
- package/dist/cli/chunks/{chunk-SE4VNN4I.js → chunk-VCVRZD4Y.js} +3 -3
- package/dist/cli/chunks/{chunk-PHP5UBT4.js → chunk-VG32EEUG.js} +2 -2
- package/dist/cli/chunks/{chunk-YZEXYO4W.js → chunk-VGZOPQQY.js} +1 -1
- package/dist/cli/chunks/{chunk-OFACHK5O.js → chunk-VJBJRFUO.js} +2 -2
- package/dist/cli/chunks/{chunk-NZ3GUMB2.js → chunk-WBC6WB32.js} +2 -2
- package/dist/cli/chunks/{chunk-GHY6Z6KO.js → chunk-WCM6WE7G.js} +3 -3
- package/dist/cli/chunks/{chunk-NZD4DPSU.js → chunk-WCPSR4MJ.js} +2 -2
- package/dist/cli/chunks/{chunk-I3C7JOXC.js → chunk-WKI46WWN.js} +2 -2
- package/dist/cli/chunks/{chunk-5K26BEYB.js → chunk-WM2QRIRD.js} +2 -2
- package/dist/cli/chunks/{chunk-U2FUXDDJ.js → chunk-WRC3HLUY.js} +3 -3
- package/dist/cli/chunks/{chunk-GII6UM3F.js → chunk-WUGXXNK4.js} +1 -1
- package/dist/cli/chunks/{chunk-JGZ722G3.js → chunk-WZQADC5R.js} +2 -2
- package/dist/cli/chunks/{chunk-GU5HNCWI.js → chunk-X6NJOT3V.js} +1 -1
- package/dist/cli/chunks/{chunk-DFUASIKA.js → chunk-X6Q2N5S5.js} +2 -2
- package/dist/cli/chunks/{chunk-G2Q66Z23.js → chunk-X7CUI7KH.js} +2 -2
- package/dist/cli/chunks/{chunk-5MDERQH3.js → chunk-XMCSKYDE.js} +1 -1
- package/dist/cli/chunks/{chunk-VTOBUZL6.js → chunk-XN3KCKAM.js} +2 -2
- package/dist/cli/chunks/{chunk-KUAKV3IW.js → chunk-XSPMLJCQ.js} +1 -1
- package/dist/cli/chunks/{chunk-YBQH2VOP.js → chunk-XTZGAG6P.js} +2 -2
- package/dist/cli/chunks/{chunk-MGZ5FJUW.js → chunk-YE54T2NQ.js} +2 -2
- package/dist/cli/chunks/{chunk-BTVEYBW2.js → chunk-YEFTK4HD.js} +2 -2
- package/dist/cli/chunks/{chunk-CT6SAVXQ.js → chunk-YGC5QKQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-TWJTK4CC.js → chunk-YGOSSVY5.js} +2 -2
- package/dist/cli/chunks/chunk-YKQWIXUY.js +2 -0
- package/dist/cli/chunks/{chunk-TSQC2KKZ.js → chunk-Z2S7DNFP.js} +2 -2
- package/dist/cli/chunks/{chunk-JRRXCODW.js → chunk-Z54G2YOL.js} +2 -2
- package/dist/cli/chunks/{chunk-EXGMJFAT.js → chunk-ZJGFQK27.js} +1 -1
- package/dist/cli/chunks/{chunk-WNQS4WTS.js → chunk-ZUE524JL.js} +2 -2
- package/dist/cli/chunks/{ci-ENOASTYB.js → ci-UMA2SMNW.js} +2 -2
- package/dist/cli/chunks/{ci-config-B26OXHQM.js → ci-config-UQSILJFQ.js} +2 -2
- package/dist/cli/chunks/{ci-output-JTCLLNOQ.js → ci-output-U6YZLLKH.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-23JMFNM5.js → circuit-breaker-ATYQP6X2.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-ON6L462G.js → claude-flow-setup-6YHFD7AN.js} +2 -2
- package/dist/cli/chunks/client-E43GWLQH.js +2 -0
- package/dist/cli/chunks/{cline-installer-OWQ4D2FQ.js → cline-installer-EPE7IOZE.js} +2 -2
- package/dist/cli/chunks/{code-2ZRL7SEU.js → code-NUEJ4XYO.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-JXSQVM67.js → code-index-extractor-D4DBT6OL.js} +2 -2
- package/dist/cli/chunks/{codex-installer-7LXZYBSQ.js → codex-installer-633SM4LR.js} +2 -2
- package/dist/cli/chunks/{completions-C2LR623C.js → completions-WUKVIW3L.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-TGQLHCYJ.js → complexity-analyzer-F73ACR5H.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RUGD24D2.js → continuedev-installer-QH42TKMS.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-ZLFVLEJP.js → copilot-installer-Y3XC7BTT.js} +2 -2
- package/dist/cli/chunks/core-handlers-R5A3SQDY.js +2 -0
- package/dist/cli/chunks/{cost-tracker-RT4QL745.js → cost-tracker-57QPV7E3.js} +2 -2
- package/dist/cli/chunks/coverage-IBCHMBCR.js +51 -0
- package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +2 -0
- package/dist/cli/chunks/{cursor-installer-LJKLNFF6.js → cursor-installer-F4UYQHIN.js} +2 -2
- package/dist/cli/chunks/{daemon-FBH3IRYN.js → daemon-BYYPIJ7G.js} +4 -4
- package/dist/cli/chunks/{daemon-BMDXCQT5.js → daemon-XR4Q6YZF.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-JGDED55I.js → dag-attention-scheduler-ZR5ZD3TW.js} +2 -2
- package/dist/cli/chunks/{detect-SZIHIVCJ.js → detect-GEGYURLL.js} +2 -2
- package/dist/cli/chunks/{dist-node-FV3KWXQ6.js → dist-node-JU3KT2JO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-GI5JWQOV.js → domain-handler-7QI3FJGE.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-BUWY36TL.js → domain-plugins-O2YRM2PD.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-GCY7W5DA.js → domain-transfer-7J3S2OS6.js} +2 -2
- package/dist/cli/chunks/dream-6C4NURSE.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-GPRR3ZGD.js → embed-and-insert-pattern-URES5Q6J.js} +2 -2
- package/dist/cli/chunks/{eval-XPB3IGAP.js → eval-RVMCIUOR.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-2E554UB3.js → experience-capture-middleware-SYJQSBKE.js} +3 -3
- package/dist/cli/chunks/{fast-paths-ZSMWZPUC.js → fast-paths-QUKPKWKZ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-N7EOGE5P.js → feature-flags-5JCSKL2P.js} +2 -2
- package/dist/cli/chunks/{feature-flags-GIWVDVVC.js → feature-flags-K7JXNKJI.js} +2 -2
- package/dist/cli/chunks/file-discovery-J5IE5KP7.js +2 -0
- package/dist/cli/chunks/{fleet-HCHDOUCX.js → fleet-II4Q6HXK.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-CZNCNXXZ.js → gnn-wrapper-M7VO2EMS.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-6YUIF2YQ.js → heartbeat-handler-ND5CY26N.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +2 -0
- package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-J3M3IK24.js → hnsw-legacy-bridge-N3AUUUU7.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-ULGTGDZW.js → hnswlib-node-NZY3E5EN.js} +2 -2
- package/dist/cli/chunks/{hooks-C4BUGYUQ.js → hooks-QVJDTII5.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-WINGVMPG.js → hypergraph-engine-ZRY6MTDV.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-GADMWKAU.js → hypergraph-handler-56DO4XZQ.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +2 -0
- package/dist/cli/chunks/{init-guard-K2T4QWAO.js → init-guard-DTF4EVUY.js} +2 -2
- package/dist/cli/chunks/{init-handler-PCZTDZYI.js → init-handler-M6CNQHMX.js} +6 -6
- package/dist/cli/chunks/init-wizard-RTLCRWDT.js +2 -0
- package/dist/cli/chunks/kernel-2OWIGGGT.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-XENXNEIU.js → kilocode-installer-IJN7XKBH.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-3PG2TJ67.js → kiro-installer-UKKPGPDC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +2 -0
- package/dist/cli/chunks/learning-W2HETWQ4.js +131 -0
- package/dist/cli/chunks/{llm-router-RKVDEWU2.js → llm-router-Y546K4VX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +2 -0
- package/dist/cli/chunks/{load-ITHC564X.js → load-MKAB2AXE.js} +2 -2
- package/dist/cli/chunks/load-test-D6QYNIVT.js +2 -0
- package/dist/cli/chunks/{mcp-TCL5UW3N.js → mcp-AZKUS6K3.js} +2 -2
- package/dist/cli/chunks/{memory-BKDAY2N2.js → memory-ZDOQN2KU.js} +5 -5
- package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +2 -0
- package/dist/cli/chunks/{memory-handlers-WN4FXFOA.js → memory-handlers-3SQVY7FE.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VHAT7ZPF.js → multi-model-executor-WWVXDHG4.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-E3VM3EEY.js → opencode-installer-YUJNXXWS.js} +2 -2
- package/dist/cli/chunks/{orchestrator-BMQ6X762.js → orchestrator-Z6PWPLRE.js} +109 -25
- package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-GOOR2BV5.js → pattern-usage-recorder-TPWPX32U.js} +2 -2
- package/dist/cli/chunks/{pipeline-5NSFQQIX.js → pipeline-4BBGTE4M.js} +2 -2
- package/dist/cli/chunks/{platform-SQM34J5G.js → platform-5GSHXCV5.js} +2 -2
- package/dist/cli/chunks/{plugin-UQJZRMZG.js → plugin-OFDVF5HS.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-WMDJOL4S.js → prime-radiant-advanced-wasm-NC6MUYGJ.js} +2 -2
- package/dist/cli/chunks/project-root-DDGBWDP6.js +2 -0
- package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +2 -0
- package/dist/cli/chunks/{protocol-handler-OBDCVY6X.js → protocol-handler-MPOAAEPA.js} +2 -2
- package/dist/cli/chunks/{prove-XDC7I4XT.js → prove-CDKMAIVM.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +2 -0
- package/dist/cli/chunks/{quality-L4GQ6WX4.js → quality-ZH4F7R7R.js} +2 -2
- package/dist/cli/chunks/{quality-gate-MJG66LKN.js → quality-gate-IDRMW6OE.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +2 -0
- package/dist/cli/chunks/{real-embeddings-HW4G2LWL.js → real-embeddings-I2UVNNB3.js} +2 -2
- package/dist/cli/chunks/{ref-validation-FC7JOJ2C.js → ref-validation-Z5GCGVXK.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-KWS4CEIC.js → roocode-installer-IZ2S7PH2.js} +2 -2
- package/dist/cli/chunks/router-FT5WJPUH.js +2 -0
- package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +2 -0
- package/dist/cli/chunks/{routing-handler-QF4WVB2S.js → routing-handler-NAX35VUW.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-2MTCOUK6.js → ruvector-commands-5YW2SOFF.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-BREJCXWN.js → rvf-migration-coordinator-VUIZHTVG.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-KKC6HOJD.js → rvf-store-integrity-IPGCAT6C.js} +2 -2
- package/dist/cli/chunks/safe-db-TDZKUOZJ.js +2 -0
- package/dist/cli/chunks/schedule-CRKTRY2A.js +2 -0
- package/dist/cli/chunks/scheduler-6ZBDVQWN.js +2 -0
- package/dist/cli/chunks/{security-OSAE7VAP.js → security-3IH4BO5Z.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-COUOS665.js → shared-rvf-adapter-ABY7PAY2.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-YXMPZKQE.js → shared-rvf-dual-writer-6KENLN2W.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +2 -0
- package/dist/cli/chunks/{standalone-memory-E6JBMOIL.js → standalone-memory-RLFAUGOW.js} +2 -2
- package/dist/cli/chunks/{status-handler-AFTCIYIX.js → status-handler-FCOZBPE5.js} +2 -2
- package/dist/cli/chunks/{structural-health-2FROCEI4.js → structural-health-4RDA5UUM.js} +2 -2
- package/dist/cli/chunks/{sync-VAYTOWDC.js → sync-54LUAUTK.js} +2 -2
- package/dist/cli/chunks/{sync-YIQYOFGW.js → sync-KGEEXXCC.js} +2 -2
- package/dist/cli/chunks/{task-handler-KVQHDEX3.js → task-handler-K3OXHYKU.js} +2 -2
- package/dist/cli/chunks/{task-handlers-MVVECQA6.js → task-handlers-6H7L2UT4.js} +3 -3
- package/dist/cli/chunks/{test-5JSVTOMY.js → test-S7IG6EIX.js} +4 -4
- package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +2 -0
- package/dist/cli/chunks/{test-scheduling-HBOHVLI3.js → test-scheduling-7XYXI4L2.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-5VEPTPFA.js → token-bootstrap-3QMABE45.js} +2 -2
- package/dist/cli/chunks/{token-usage-TBJHDLY6.js → token-usage-Y2YTPOFE.js} +2 -2
- package/dist/cli/chunks/{transformers-VAWYMHMZ.js → transformers-UCJ3HHHC.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +2 -0
- package/dist/cli/chunks/{types-R5SDZU2E.js → types-6CMFPETH.js} +2 -2
- package/dist/cli/chunks/unified-memory-QARWQKJ2.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +2 -0
- package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +2 -0
- package/dist/cli/chunks/{upgrade-K5PIHXRB.js → upgrade-K25DN6WU.js} +2 -2
- package/dist/cli/chunks/{validate-RPTS7RYJ.js → validate-T4V3TBY3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-B2ZL556X.js → validate-swarm-XSRC576T.js} +2 -2
- package/dist/cli/chunks/visual-security-O4ALMCXQ.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-K4DUJC32.js → web-tree-sitter-YOZXHRTN.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-OK2AJN35.js → windsurf-installer-ITPU2IYL.js} +2 -2
- package/dist/cli/chunks/witness-chain-B3YW5NMS.js +2 -0
- package/dist/cli/chunks/witness-chain-PIYR72HJ.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-L6Y5RFXR.js → witness-chain-repair-YUG7E3UX.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-N4CW7FZX.js → witness-chain-verifier-DTDSVKOG.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-TDNPS3WD.js → witness-key-manager-EWACWGAW.js} +2 -2
- package/dist/cli/chunks/{workflow-XRZA3YCY.js → workflow-ZIQ4FV42.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +2 -0
- package/dist/cli/chunks/{wrappers-5JIFWKN6.js → wrappers-PW2O27LL.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/phases/07-hooks.js +90 -6
- 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 +24 -1
- package/dist/learning/dream/dream-engine.js +57 -6
- package/dist/learning/learning-retention.d.ts +103 -0
- package/dist/learning/learning-retention.js +213 -0
- package/dist/mcp/bundle.js +494 -489
- 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 +1 -1
- package/dist/cli/chunks/adapter-KCQDVYY2.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-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
|
@@ -9,7 +9,7 @@ import { getCodeMetricsAnalyzer } from '../../../shared/metrics/index.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
|
-
import {
|
|
12
|
+
import { measuredFileCoverage } from '../coverage-report-event.js';
|
|
13
13
|
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
14
14
|
/** Metrics the static analyzer produces when the caller asks for all of them. */
|
|
15
15
|
const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
|
|
@@ -25,6 +25,22 @@ const PARSED_METRICS = new Set(['complexity', 'maintainability', 'testability'])
|
|
|
25
25
|
export const MIN_ANALYSED_SHARE = 0.95;
|
|
26
26
|
/** #1011: the sentinel for "not measured" in score and complexity fields. */
|
|
27
27
|
const UNMEASURED = -1;
|
|
28
|
+
/**
|
|
29
|
+
* #1219: covered lines over total lines across the files, or `null` when a
|
|
30
|
+
* record has no line counts (a mean of percentages would weight a 10-line
|
|
31
|
+
* file like a 1000-line one).
|
|
32
|
+
*/
|
|
33
|
+
function lineWeightedCoverage(records) {
|
|
34
|
+
let covered = 0;
|
|
35
|
+
let total = 0;
|
|
36
|
+
for (const record of records) {
|
|
37
|
+
if (!record.lines)
|
|
38
|
+
return null;
|
|
39
|
+
covered += record.lines.covered;
|
|
40
|
+
total += record.lines.total;
|
|
41
|
+
}
|
|
42
|
+
return total > 0 ? (covered / total) * 100 : null;
|
|
43
|
+
}
|
|
28
44
|
/** First reasons of a failure list, for a one-line explanation. */
|
|
29
45
|
function summariseFailures(failures) {
|
|
30
46
|
return failures.slice(0, 3).map((f) => f.reason).join('; ')
|
|
@@ -262,11 +278,16 @@ Focus on:
|
|
|
262
278
|
return err(new Error('No source files provided for analysis'));
|
|
263
279
|
}
|
|
264
280
|
// Analyze metrics for each file; failures become unmeasured (#1011)
|
|
265
|
-
const { fileMetrics, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
|
|
281
|
+
const { fileMetrics, scopeValues, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
|
|
266
282
|
// Calculate aggregated metrics
|
|
267
|
-
const metricDetails = this.aggregateMetrics(fileMetrics);
|
|
268
|
-
// Calculate overall quality score
|
|
269
|
-
|
|
283
|
+
const metricDetails = this.aggregateMetrics(fileMetrics, scopeValues);
|
|
284
|
+
// Calculate overall quality score. With a requested metric unmeasured
|
|
285
|
+
// there is no overall score (-1, as the gate's overallScore since
|
|
286
|
+
// #1223); the score over the measured metrics is kept as subsetScore.
|
|
287
|
+
const computed = this.calculateQualityScore(metricDetails);
|
|
288
|
+
const insufficient = unmeasured.length > 0;
|
|
289
|
+
const score = insufficient ? { ...computed, overall: UNMEASURED } : computed;
|
|
290
|
+
const subsetScore = insufficient && computed.overall >= 0 ? computed.overall : undefined;
|
|
270
291
|
// Generate trends if enabled
|
|
271
292
|
const trends = this.config.enableTrendAnalysis
|
|
272
293
|
? await this.generateTrends(metricDetails, compareBaseline)
|
|
@@ -290,6 +311,7 @@ Focus on:
|
|
|
290
311
|
unmeasured,
|
|
291
312
|
excluded,
|
|
292
313
|
partial,
|
|
314
|
+
...(subsetScore !== undefined ? { subsetScore } : {}),
|
|
293
315
|
};
|
|
294
316
|
// Store the report
|
|
295
317
|
await this.storeReport(report, sourceFiles);
|
|
@@ -395,6 +417,8 @@ Focus on:
|
|
|
395
417
|
const unreadable = [];
|
|
396
418
|
const readable = [];
|
|
397
419
|
const missingCoverage = [];
|
|
420
|
+
const coverageRecords = [];
|
|
421
|
+
const scopeValues = {};
|
|
398
422
|
const explicit = new Set(explicitFiles);
|
|
399
423
|
const needsAnalysis = requested.some((m) => PARSED_METRICS.has(m) || m === 'duplication');
|
|
400
424
|
for (const file of files) {
|
|
@@ -430,7 +454,8 @@ Focus on:
|
|
|
430
454
|
// Coverage requires external data (from test runners) — never fabricate a number
|
|
431
455
|
const storedCoverage = await this.getStoredCoverage(file);
|
|
432
456
|
if (storedCoverage !== null) {
|
|
433
|
-
metrics.coverage = storedCoverage;
|
|
457
|
+
metrics.coverage = storedCoverage.line;
|
|
458
|
+
coverageRecords.push(storedCoverage);
|
|
434
459
|
}
|
|
435
460
|
else {
|
|
436
461
|
missingCoverage.push(file);
|
|
@@ -442,11 +467,33 @@ Focus on:
|
|
|
442
467
|
if (missingCoverage.length > 0) {
|
|
443
468
|
for (const metrics of fileMetrics.values())
|
|
444
469
|
delete metrics.coverage;
|
|
470
|
+
// #1219: the project-wide summary is not a measurement of these files.
|
|
445
471
|
unmeasured.push({
|
|
446
472
|
metric: 'coverage',
|
|
447
|
-
reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s)
|
|
473
|
+
reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s) `
|
|
474
|
+
+ `(${missingCoverage.slice(0, 3).join(', ')}${missingCoverage.length > 3 ? ', …' : ''}); `
|
|
475
|
+
+ 'a project-wide coverage figure is not a measurement of these files',
|
|
476
|
+
files: missingCoverage,
|
|
448
477
|
});
|
|
449
478
|
}
|
|
479
|
+
else if (coverageRecords.length > 1) {
|
|
480
|
+
const weighted = lineWeightedCoverage(coverageRecords);
|
|
481
|
+
if (weighted === null) {
|
|
482
|
+
for (const metrics of fileMetrics.values())
|
|
483
|
+
delete metrics.coverage;
|
|
484
|
+
const legacy = coverageRecords.filter((r) => !r.lines).length;
|
|
485
|
+
// #1219: a plain mean of per-file percentages is not the scope's coverage.
|
|
486
|
+
unmeasured.push({
|
|
487
|
+
metric: 'coverage',
|
|
488
|
+
reason: `${legacy} of ${coverageRecords.length} per-file coverage record(s) carry no line counts `
|
|
489
|
+
+ '(written before 3.15.13), so the files cannot be weighted by size and a mean of their '
|
|
490
|
+
+ 'percentages is not the coverage of the scope; re-run coverage to record line counts',
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
scopeValues.coverage = weighted;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
450
497
|
/** Decide whether a metric with these failures is measured, partial or unmeasured. */
|
|
451
498
|
const judge = (metric, failures) => {
|
|
452
499
|
const analysed = total - failures.length;
|
|
@@ -502,8 +549,12 @@ Focus on:
|
|
|
502
549
|
unmeasured.push({ metric: 'duplication', reason: `duplication detection failed: ${toError(error).message}` });
|
|
503
550
|
}
|
|
504
551
|
}
|
|
505
|
-
return { fileMetrics, unmeasured, excluded, partial };
|
|
552
|
+
return { fileMetrics, scopeValues, unmeasured, excluded, partial };
|
|
506
553
|
}
|
|
554
|
+
/**
|
|
555
|
+
* The file's own measured coverage record, or `null`. #1219: never the
|
|
556
|
+
* project-wide `coverage:latest` summary — that is not this file's coverage.
|
|
557
|
+
*/
|
|
507
558
|
async getStoredCoverage(file) {
|
|
508
559
|
try {
|
|
509
560
|
// 1. Try per-file coverage stored by test executor
|
|
@@ -512,21 +563,16 @@ Focus on:
|
|
|
512
563
|
for (const key of fileCoverageLookupKeys(file)) {
|
|
513
564
|
const fileCoverage = measuredFileCoverage(await this.memory.get(key));
|
|
514
565
|
if (fileCoverage)
|
|
515
|
-
return fileCoverage
|
|
516
|
-
}
|
|
517
|
-
// 2. Fall back to project-wide summary from coverage-analyzer
|
|
518
|
-
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
519
|
-
if (summary) {
|
|
520
|
-
return summary.line;
|
|
566
|
+
return fileCoverage;
|
|
521
567
|
}
|
|
522
|
-
// No coverage data
|
|
568
|
+
// No coverage data for this file — return null (never fabricate)
|
|
523
569
|
return null;
|
|
524
570
|
}
|
|
525
571
|
catch {
|
|
526
572
|
return null;
|
|
527
573
|
}
|
|
528
574
|
}
|
|
529
|
-
aggregateMetrics(fileMetrics) {
|
|
575
|
+
aggregateMetrics(fileMetrics, scopeValues = {}) {
|
|
530
576
|
const aggregated = new Map();
|
|
531
577
|
// Collect all values per metric
|
|
532
578
|
for (const metrics of fileMetrics.values()) {
|
|
@@ -539,7 +585,7 @@ Focus on:
|
|
|
539
585
|
// Calculate averages and generate details
|
|
540
586
|
const details = [];
|
|
541
587
|
for (const [name, values] of aggregated.entries()) {
|
|
542
|
-
const average = values.reduce((a, b) => a + b, 0) / values.length;
|
|
588
|
+
const average = scopeValues[name] ?? values.reduce((a, b) => a + b, 0) / values.length;
|
|
543
589
|
const rating = this.getMetricRating(average, name);
|
|
544
590
|
const trend = this.estimateTrend(values);
|
|
545
591
|
details.push({
|
|
@@ -128,6 +128,11 @@ export interface IFileCoverageData {
|
|
|
128
128
|
/** `null` = no functions in the file (istanbul 0/0): not collected, not 100% (#1015). */
|
|
129
129
|
function: number | null;
|
|
130
130
|
statement: number | null;
|
|
131
|
+
/** #1219: the line counts behind `line`, when the report has them. */
|
|
132
|
+
lines?: {
|
|
133
|
+
covered: number;
|
|
134
|
+
total: number;
|
|
135
|
+
};
|
|
131
136
|
}
|
|
132
137
|
export interface IFailedTest {
|
|
133
138
|
testId: string;
|
|
@@ -1114,6 +1114,7 @@ Provide:
|
|
|
1114
1114
|
branch: ratio(branches),
|
|
1115
1115
|
function: ratio(fns),
|
|
1116
1116
|
statement: ratio(statements),
|
|
1117
|
+
lines: { covered: lines[0], total: lines[1] },
|
|
1117
1118
|
});
|
|
1118
1119
|
for (const [key, [covered, count]] of [['line', lines], ['branch', branches], ['function', fns], ['statement', statements]]) {
|
|
1119
1120
|
totals[key][0] += covered;
|
|
@@ -1171,12 +1172,15 @@ Provide:
|
|
|
1171
1172
|
const line = summaryPct(entry?.lines);
|
|
1172
1173
|
if (line !== null) {
|
|
1173
1174
|
// #1015: a metric with total 0 is not collected (null), not its 100 pct.
|
|
1175
|
+
const counts = entry.lines;
|
|
1174
1176
|
perFile.push({
|
|
1175
1177
|
path: normalizedPath,
|
|
1176
1178
|
line,
|
|
1177
1179
|
branch: summaryPct(entry.branches),
|
|
1178
1180
|
function: summaryPct(entry.functions),
|
|
1179
1181
|
statement: summaryPct(entry.statements),
|
|
1182
|
+
...(typeof counts?.covered === 'number' && typeof counts.total === 'number'
|
|
1183
|
+
? { lines: { covered: counts.covered, total: counts.total } } : {}),
|
|
1180
1184
|
});
|
|
1181
1185
|
}
|
|
1182
1186
|
}
|
|
@@ -1268,6 +1272,8 @@ Provide:
|
|
|
1268
1272
|
function: fc.function ?? null,
|
|
1269
1273
|
statement: fc.statement ?? null,
|
|
1270
1274
|
measured: true,
|
|
1275
|
+
// #1219: the counts behind `line`, so several files can be line-weighted.
|
|
1276
|
+
...(fc.lines ? { lines: fc.lines } : {}),
|
|
1271
1277
|
runStatus,
|
|
1272
1278
|
}, { persist: true });
|
|
1273
1279
|
}
|
|
@@ -394,6 +394,7 @@ console.log(\`\\x1b[1m\\x1b[35m▊ Agentic QE v3\\x1b[0m\${branchStr}\${patStr}\
|
|
|
394
394
|
* node brain-checkpoint.cjs verify # Verify aqe.rvf exists (session-start)
|
|
395
395
|
*/
|
|
396
396
|
const { execFileSync } = require('child_process');
|
|
397
|
+
const crypto = require('crypto');
|
|
397
398
|
const fs = require('fs');
|
|
398
399
|
const path = require('path');
|
|
399
400
|
|
|
@@ -402,6 +403,11 @@ const AQE_DIR = path.join(PROJECT_ROOT, '.agentic-qe');
|
|
|
402
403
|
const RVF_PATH = path.join(AQE_DIR, 'aqe.rvf');
|
|
403
404
|
const DB_PATH = path.join(AQE_DIR, 'memory.db');
|
|
404
405
|
const MAX_AGE_HOURS = 24;
|
|
406
|
+
// #1238: after a too-large export, skip the Stop-hook export for a while
|
|
407
|
+
// unless a newer aqe.rvf shows that an export has succeeded since.
|
|
408
|
+
const SKIP_PATH = path.join(AQE_DIR, 'brain-checkpoint.skip.json');
|
|
409
|
+
const RETRY_ENV = Number.parseFloat(process.env.AQE_BRAIN_CHECKPOINT_RETRY_HOURS || '');
|
|
410
|
+
const TOO_LARGE_RETRY_HOURS = Number.isFinite(RETRY_ENV) && RETRY_ENV >= 0 ? RETRY_ENV : 6;
|
|
405
411
|
// Windows (#872): never execFile aqe.cmd (EINVAL without a shell); reuse the
|
|
406
412
|
// hook shim's resolver, which runs the AQE bundle via node instead.
|
|
407
413
|
function aqeInvocation() {
|
|
@@ -422,32 +428,110 @@ function aqeInvocation() {
|
|
|
422
428
|
|
|
423
429
|
function log(msg) { process.stderr.write('[brain-checkpoint] ' + msg + '\\n'); }
|
|
424
430
|
|
|
431
|
+
function activeSkip() {
|
|
432
|
+
let st; try { st = fs.lstatSync(SKIP_PATH); } catch { return null; }
|
|
433
|
+
let skip = null;
|
|
434
|
+
if (st.isFile()) { try { skip = JSON.parse(fs.readFileSync(SKIP_PATH, 'utf8')); } catch { /* unreadable */ } }
|
|
435
|
+
const at = skip ? Date.parse(skip.at) : NaN;
|
|
436
|
+
let rvfMtime = 0; try { rvfMtime = fs.lstatSync(RVF_PATH).mtimeMs; } catch { /* absent */ }
|
|
437
|
+
if (!Number.isFinite(at) || Date.now() >= at + TOO_LARGE_RETRY_HOURS * 3600000 || rvfMtime > at) {
|
|
438
|
+
try { fs.unlinkSync(SKIP_PATH); } catch { /* best-effort */ }
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
return skip;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function writeSkip(reason) {
|
|
445
|
+
const at = new Date();
|
|
446
|
+
const skip = { reason, at: at.toISOString(), retryAfter: new Date(at.getTime() + TOO_LARGE_RETRY_HOURS * 3600000).toISOString() };
|
|
447
|
+
// 'wx' after unlink: never write through a planted symlink (#970).
|
|
448
|
+
try { try { fs.unlinkSync(SKIP_PATH); } catch { /* absent */ } fs.writeFileSync(SKIP_PATH, JSON.stringify(skip) + '\\n', { flag: 'wx' }); } catch { /* best-effort */ }
|
|
449
|
+
return skip;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Export to a temp store next to aqe.rvf; rename it over aqe.rvf only on
|
|
453
|
+
// success, so a failed, too-large or killed export keeps the last checkpoint.
|
|
454
|
+
const RVF_SIDECARS = ['.idmap.json', '.manifest.json'];
|
|
455
|
+
const TMP_PREFIX = path.basename(RVF_PATH) + '.tmp-';
|
|
456
|
+
function removeEntry(p) { try { fs.unlinkSync(p); } catch (e) { if (!e || e.code !== 'ENOENT') throw e; } }
|
|
457
|
+
function isPidAlive(pid) { try { process.kill(pid, 0); return true; } catch (e) { return !!e && e.code === 'EPERM'; } }
|
|
458
|
+
function removeByPrefix(prefix, keep) {
|
|
459
|
+
let entries = []; try { entries = fs.readdirSync(AQE_DIR); } catch { return; }
|
|
460
|
+
for (const entry of entries) {
|
|
461
|
+
if (!entry.startsWith(prefix) || (keep && keep(entry))) continue;
|
|
462
|
+
try { removeEntry(path.join(AQE_DIR, entry)); } catch { /* best-effort */ }
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
function sweepStaleTmp() {
|
|
466
|
+
removeByPrefix(TMP_PREFIX, (entry) => {
|
|
467
|
+
const pid = Number.parseInt(entry.slice(TMP_PREFIX.length).split('-')[0], 10);
|
|
468
|
+
return !Number.isInteger(pid) || pid <= 0 || isPidAlive(pid);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
function lexists(p) { try { fs.lstatSync(p); return true; } catch { return false; } }
|
|
472
|
+
// rename() replaces a planted symlink without writing through it (#970). The
|
|
473
|
+
// store goes first: if that fails nothing changed. If a sidecar rename fails
|
|
474
|
+
// afterwards, the stale sidecar is removed, so the new store is never read
|
|
475
|
+
// with the previous export's idmap.
|
|
476
|
+
function promote(tmp) {
|
|
477
|
+
fs.renameSync(tmp, RVF_PATH);
|
|
478
|
+
for (const suffix of RVF_SIDECARS) {
|
|
479
|
+
try {
|
|
480
|
+
if (lexists(tmp + suffix)) fs.renameSync(tmp + suffix, RVF_PATH + suffix);
|
|
481
|
+
else removeEntry(RVF_PATH + suffix);
|
|
482
|
+
} catch { try { removeEntry(RVF_PATH + suffix); } catch { /* best-effort */ } }
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
425
486
|
function exportBrain() {
|
|
426
487
|
if (!fs.existsSync(DB_PATH)) { log('No memory.db, skipping'); return { exported: false }; }
|
|
427
488
|
const aqe = aqeInvocation();
|
|
428
489
|
if (!aqe.cmd) { log('Export skipped: ' + aqe.reason); return { exported: false, reason: aqe.reason }; }
|
|
429
|
-
// Never write through a committed symlink: .agentic-qe must be a real dir
|
|
430
|
-
// unlink (not existsSync) drops a planted aqe.rvf link, even a dangling one.
|
|
490
|
+
// Never write through a committed symlink: .agentic-qe must be a real dir.
|
|
431
491
|
let st; try { st = fs.lstatSync(AQE_DIR); } catch { /* missing */ }
|
|
432
492
|
if (!st || !st.isDirectory()) { log('Export skipped: .agentic-qe is a symlink'); return { exported: false }; }
|
|
433
|
-
|
|
493
|
+
const skip = activeSkip();
|
|
494
|
+
if (skip) {
|
|
495
|
+
log('Export skipped until ' + skip.retryAfter + ': ' + skip.reason);
|
|
496
|
+
return { exported: false, skipped: true, reason: skip.reason, retryAfter: skip.retryAfter };
|
|
497
|
+
}
|
|
498
|
+
sweepStaleTmp();
|
|
499
|
+
const tmp = path.join(AQE_DIR, TMP_PREFIX + process.pid + '-' + crypto.randomBytes(4).toString('hex'));
|
|
434
500
|
try {
|
|
501
|
+
for (const suffix of ['', ...RVF_SIDECARS]) removeEntry(tmp + suffix);
|
|
435
502
|
const result = execFileSync(
|
|
436
|
-
aqe.cmd, [...aqe.args, 'brain', 'export', '-o',
|
|
437
|
-
{ timeout: 60000, encoding: 'utf-8', windowsHide: true }
|
|
503
|
+
aqe.cmd, [...aqe.args, 'brain', 'export', '-o', tmp, '--format', 'rvf'],
|
|
504
|
+
{ timeout: 60000, encoding: 'utf-8', windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }
|
|
438
505
|
);
|
|
506
|
+
// A zero exit without a store is a failure, not an empty checkpoint.
|
|
507
|
+
if (!lexists(tmp)) throw new Error('brain export exited 0 but wrote no store');
|
|
508
|
+
promote(tmp);
|
|
439
509
|
const m = result.match(/Patterns:\\s+(\\d+)/);
|
|
440
510
|
const p = m ? m[1] : '0';
|
|
441
511
|
log('Exported ' + p + ' patterns to aqe.rvf');
|
|
442
512
|
return { exported: true, patterns: parseInt(p) };
|
|
443
513
|
} catch (e) {
|
|
444
|
-
|
|
514
|
+
const tooLarge = (String(e.stderr || '') + String(e.stdout || '')).match(/RVF_KERNEL_TOO_LARGE:[^\\n]*/);
|
|
515
|
+
if (tooLarge) {
|
|
516
|
+
const skip = writeSkip(tooLarge[0].trim());
|
|
517
|
+
log('Export failed: ' + skip.reason);
|
|
518
|
+
log('Skipping the checkpoint export until ' + skip.retryAfter + ' (AQE_BRAIN_CHECKPOINT_RETRY_HOURS sets the wait).');
|
|
519
|
+
return { exported: false, tooLarge: true, reason: skip.reason, retryAfter: skip.retryAfter };
|
|
520
|
+
}
|
|
521
|
+
log('Export failed: ' + e.message + ' (previous aqe.rvf kept)');
|
|
445
522
|
return { exported: false, reason: e.message };
|
|
523
|
+
} finally {
|
|
524
|
+
removeByPrefix(path.basename(tmp));
|
|
446
525
|
}
|
|
447
526
|
}
|
|
448
527
|
|
|
449
528
|
function verifyBrain() {
|
|
450
529
|
if (!fs.existsSync(RVF_PATH)) {
|
|
530
|
+
const skip = activeSkip();
|
|
531
|
+
if (skip) {
|
|
532
|
+
log('No aqe.rvf found; checkpoint export paused until ' + skip.retryAfter + ': ' + skip.reason);
|
|
533
|
+
return { valid: false, reason: 'missing', skippedUntil: skip.retryAfter };
|
|
534
|
+
}
|
|
451
535
|
log('No aqe.rvf found');
|
|
452
536
|
return { valid: false, reason: 'missing' };
|
|
453
537
|
}
|
|
@@ -19,6 +19,8 @@ export interface RvfBrainManifest {
|
|
|
19
19
|
readonly totalRecords?: number;
|
|
20
20
|
/** Per-table row counts used by the recovery-mirror richness guard. */
|
|
21
21
|
readonly tableCounts?: Readonly<Record<string, number>>;
|
|
22
|
+
/** Regenerable cache rows left out of the kernel, per table (#1238). */
|
|
23
|
+
readonly skippedCacheRows?: Readonly<Record<string, number>>;
|
|
22
24
|
};
|
|
23
25
|
readonly domains: readonly string[];
|
|
24
26
|
readonly checksum: string;
|
|
@@ -48,6 +50,8 @@ export interface RvfBrainExportOptions {
|
|
|
48
50
|
readonly signerKeyId?: string;
|
|
49
51
|
/** Explicit operator acknowledgement that a richer existing mirror may be replaced. */
|
|
50
52
|
readonly allowOverwriteRicher?: boolean;
|
|
53
|
+
/** Kernel size ceiling in bytes. Defaults to RVF_MAX_KERNEL_BYTES; lowered only by tests. */
|
|
54
|
+
readonly maxKernelBytes?: number;
|
|
51
55
|
}
|
|
52
56
|
export interface RvfBrainImportOptions {
|
|
53
57
|
readonly mergeStrategy: MergeStrategy;
|
|
@@ -59,6 +63,27 @@ export interface RvfBrainImportResult {
|
|
|
59
63
|
readonly conflicts: number;
|
|
60
64
|
readonly embeddingsRestored: number;
|
|
61
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Largest kernel image @ruvector/rvf-node accepts. One byte more and
|
|
68
|
+
* `embedKernel` fails with a misleading `RVF error 0x0303: FsyncFailed`
|
|
69
|
+
* (#1238; measured 134,217,728 B ok, 134,217,729 B fails).
|
|
70
|
+
*/
|
|
71
|
+
export declare const RVF_MAX_KERNEL_BYTES: number;
|
|
72
|
+
/**
|
|
73
|
+
* Vector ids written by the code-intelligence domain (KG nodes, semantic code
|
|
74
|
+
* index, C4 diagrams). They are derived from source code and rebuilt by
|
|
75
|
+
* `aqe code index`, so they stay out of the brain kernel (#1238).
|
|
76
|
+
*/
|
|
77
|
+
export declare const CODE_INDEX_VECTOR_ID_PREFIX = "code-intelligence:";
|
|
78
|
+
/** Thrown before any native call when the kernel would exceed the RVF limit. */
|
|
79
|
+
export declare class RvfKernelTooLargeError extends Error {
|
|
80
|
+
readonly kernelBytes: number;
|
|
81
|
+
readonly limitBytes: number;
|
|
82
|
+
readonly tableBytes: Readonly<Record<string, number>>;
|
|
83
|
+
readonly complete: boolean;
|
|
84
|
+
readonly code = "RVF_KERNEL_TOO_LARGE";
|
|
85
|
+
constructor(kernelBytes: number, limitBytes: number, tableBytes: Readonly<Record<string, number>>, complete: boolean);
|
|
86
|
+
}
|
|
62
87
|
/** Export brain state to a single `.rvf` file with vector embeddings + kernel. */
|
|
63
88
|
export declare function exportBrainToRvf(db: Database.Database, options: RvfBrainExportOptions, sourceDbLabel?: string): RvfBrainManifest;
|
|
64
89
|
/** Import brain state from a `.rvf` file into a SQLite database. */
|