agentic-qe 3.14.8 → 3.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/release/SKILL.md +6 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +189 -0
- package/README.md +143 -366
- package/assets/readme/credit-ruflo.svg +1 -0
- package/assets/readme/credit-ruvector.svg +1 -0
- package/assets/readme/project-header.svg +1 -0
- package/assets/readme/quality-loop.svg +1 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/notifications/retry-queue.js +5 -1
- package/dist/adapters/ag-ui/json-patch.js +14 -7
- package/dist/adapters/ag-ui/state-delta-cache.js +20 -12
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-Q6RPGMUE.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-67OKGDGZ.js → agent-booster-wasm-XUHRLKWP.js} +2 -2
- package/dist/cli/chunks/{agent-handler-4HZEQ3WQ.js → agent-handler-CL7MJP5W.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-IBHZQSRN.js → agent-memory-branch-F7RV72FC.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-JQPXIU7C.js +2 -0
- package/dist/cli/chunks/{arena-LCLRGUIK.js → arena-GRRNK7IN.js} +4 -4
- package/dist/cli/chunks/{arena-EJBIGSF4.js → arena-LHLVOQHW.js} +2 -2
- package/dist/cli/chunks/{audit-PY4JNDQQ.js → audit-EOP2K34L.js} +3 -3
- package/dist/cli/chunks/base-5SK64NXB.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-2JG5K6XT.js → better-sqlite3-YERQ5DOL.js} +2 -2
- package/dist/cli/chunks/{brain-handler-3UYK55GA.js → brain-handler-FBXBM5XE.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-GOSWOX46.js → branch-enumerator-NWO6LNHB.js} +2 -2
- package/dist/cli/chunks/{browser-DC2JV47Z.js → browser-EDCG7TNF.js} +2 -2
- package/dist/cli/chunks/browser-workflow-WN7XNTCJ.js +2 -0
- package/dist/cli/chunks/{chunk-Z5UZOYQS.js → chunk-25IWHVMW.js} +2 -2
- package/dist/cli/chunks/chunk-27S47AYK.js +3 -0
- package/dist/cli/chunks/{chunk-SUNXA2UR.js → chunk-2IPBCXTT.js} +2 -2
- package/dist/cli/chunks/chunk-2K3QFLX2.js +2 -0
- package/dist/cli/chunks/{chunk-775WGWLL.js → chunk-35XRY6ZW.js} +2 -2
- package/dist/cli/chunks/{chunk-RTD4U7IW.js → chunk-3NOSMJS4.js} +2 -2
- package/dist/cli/chunks/{chunk-GVLRE3BV.js → chunk-3TZRJ5QD.js} +3 -3
- package/dist/cli/chunks/{chunk-RJJIPTVH.js → chunk-46DUU44C.js} +2 -2
- package/dist/cli/chunks/{chunk-H5UH234L.js → chunk-4AEFJEZH.js} +1 -1
- package/dist/cli/chunks/{chunk-EXQGHTPD.js → chunk-4KHSWNFW.js} +4 -4
- package/dist/cli/chunks/{chunk-CLUHGBLN.js → chunk-4KSCJ462.js} +1 -1
- package/dist/cli/chunks/{chunk-3EKG7HFV.js → chunk-4P7CGSRL.js} +3 -3
- package/dist/cli/chunks/{chunk-XFT4FYTC.js → chunk-4THIRDBL.js} +2 -2
- package/dist/cli/chunks/{chunk-7TNCEVWX.js → chunk-4XEZ562Q.js} +2 -2
- package/dist/cli/chunks/{chunk-CIEXUYY7.js → chunk-53C7TGC4.js} +1 -1
- package/dist/cli/chunks/{chunk-LQVS5IWH.js → chunk-53HWWWFZ.js} +2 -2
- package/dist/cli/chunks/{chunk-EMOZ5O5S.js → chunk-54JYUOSR.js} +1 -1
- package/dist/cli/chunks/{chunk-J24AJEDE.js → chunk-5B5TA3X4.js} +2 -2
- package/dist/cli/chunks/{chunk-BITFGVZ4.js → chunk-5C4UYXQL.js} +2 -2
- package/dist/cli/chunks/{chunk-F6JJNBE5.js → chunk-5JJWVFUV.js} +1 -1
- package/dist/cli/chunks/{chunk-M7QKCHLQ.js → chunk-5QEXDXHQ.js} +2 -2
- package/dist/cli/chunks/{chunk-I6NZFBT3.js → chunk-5TEDVUEB.js} +2 -2
- package/dist/cli/chunks/{chunk-673XJBGW.js → chunk-66HKJJFH.js} +2 -2
- package/dist/cli/chunks/{chunk-AR2S4DOB.js → chunk-6AVVC7Y3.js} +1 -1
- package/dist/cli/chunks/{chunk-EBV3WFIR.js → chunk-6DF6X3SZ.js} +2 -2
- package/dist/cli/chunks/{chunk-GHMJFICO.js → chunk-6MGJMGAD.js} +2 -2
- package/dist/cli/chunks/{chunk-XECZYQT5.js → chunk-6Q7PWKWV.js} +2 -2
- package/dist/cli/chunks/{chunk-VV2JVYOI.js → chunk-6U6JQS4Z.js} +2 -2
- package/dist/cli/chunks/{chunk-BHPTHC5O.js → chunk-6WW6A6JM.js} +2 -2
- package/dist/cli/chunks/{chunk-G3C7Z6FO.js → chunk-7B3XVVYP.js} +2 -2
- package/dist/cli/chunks/{chunk-J5HTQHJK.js → chunk-7FGSX4UD.js} +2 -2
- package/dist/cli/chunks/{chunk-YIWBJ637.js → chunk-A5LOELVV.js} +2 -2
- package/dist/cli/chunks/{chunk-VCSNNLWL.js → chunk-ADEYBXAS.js} +2 -2
- package/dist/cli/chunks/{chunk-A53MMSGC.js → chunk-ALLABEUK.js} +2 -2
- package/dist/cli/chunks/{chunk-HBAFXWSO.js → chunk-ARGMYSDY.js} +1 -1
- package/dist/cli/chunks/{chunk-HPVYJ6JH.js → chunk-ARWSPV2C.js} +2 -2
- package/dist/cli/chunks/{chunk-VSPNIDQK.js → chunk-AVOYMVD6.js} +2 -2
- package/dist/cli/chunks/{chunk-BUVJIVFG.js → chunk-B3DWOR5R.js} +1 -1
- package/dist/cli/chunks/{chunk-K6EOHGKS.js → chunk-BW7S6LIJ.js} +2 -2
- package/dist/cli/chunks/{chunk-4HXFPBAA.js → chunk-C3BW3Q27.js} +1 -1
- package/dist/cli/chunks/{chunk-JRK5GX56.js → chunk-CFZJEOCD.js} +1 -1
- package/dist/cli/chunks/{chunk-3S5IIK32.js → chunk-CHX65QXY.js} +1 -1
- package/dist/cli/chunks/{chunk-FRC7AFB4.js → chunk-CTK7NMSJ.js} +2 -2
- package/dist/cli/chunks/{chunk-RM6OC35G.js → chunk-CTLHNFPM.js} +1 -1
- package/dist/cli/chunks/{chunk-3576QGPP.js → chunk-D3LREV4P.js} +1 -1
- package/dist/cli/chunks/{chunk-TCQWVVSR.js → chunk-DKWB4ERY.js} +1 -1
- package/dist/cli/chunks/{chunk-JQAJUXRE.js → chunk-DREYYJ7A.js} +2 -2
- package/dist/cli/chunks/{chunk-OZJQN7YE.js → chunk-DV7I6CRH.js} +2 -2
- package/dist/cli/chunks/{chunk-AEYJ4ZLA.js → chunk-EQ3BJS37.js} +1 -1
- package/dist/cli/chunks/{chunk-KNSQWM2E.js → chunk-FIIHSEXP.js} +2 -2
- package/dist/cli/chunks/{chunk-LRGTPUJA.js → chunk-FQYXPSWD.js} +2 -2
- package/dist/cli/chunks/{chunk-QQVE65ER.js → chunk-FRGNM6SW.js} +2 -2
- package/dist/cli/chunks/{chunk-AOD2ES44.js → chunk-FTHXV7N7.js} +2 -2
- package/dist/cli/chunks/{chunk-DZHXCOSK.js → chunk-GAKVCN3C.js} +1 -1
- package/dist/cli/chunks/{chunk-LMAI74EP.js → chunk-GDSYJHVB.js} +1 -1
- package/dist/cli/chunks/{chunk-VAXTPLO3.js → chunk-GUHJWBPN.js} +2 -2
- package/dist/cli/chunks/{chunk-OX7MJFLC.js → chunk-GUKBN3BS.js} +2 -2
- package/dist/cli/chunks/{chunk-R6I5I724.js → chunk-HU4QGCIJ.js} +2 -2
- package/dist/cli/chunks/{chunk-LTHV4PIG.js → chunk-HVAYG54D.js} +2 -2
- package/dist/cli/chunks/{chunk-AJMAKUS3.js → chunk-IUGY6Z4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-WFKE7NZ5.js → chunk-J2WALRWR.js} +2 -2
- package/dist/cli/chunks/{chunk-Z6G3QVZ4.js → chunk-J4ULR4QR.js} +19 -19
- package/dist/cli/chunks/{chunk-YHX74M7C.js → chunk-JEXPSOT2.js} +2 -2
- package/dist/cli/chunks/{chunk-25EEIAHS.js → chunk-JHKMUY4W.js} +2 -2
- package/dist/cli/chunks/{chunk-L5T32SRF.js → chunk-JQVECGYL.js} +1 -1
- package/dist/cli/chunks/{chunk-UHLZKH6B.js → chunk-JSHASVQ2.js} +25 -25
- package/dist/cli/chunks/{chunk-SPS472C5.js → chunk-JW2HNT3J.js} +2 -2
- package/dist/cli/chunks/{chunk-SMBGK7XI.js → chunk-JY6HWYC4.js} +1 -1
- package/dist/cli/chunks/{chunk-F57FTFWS.js → chunk-JYF3QF4C.js} +2 -2
- package/dist/cli/chunks/{chunk-CBWM5NOO.js → chunk-K4NB3MYN.js} +2 -2
- package/dist/cli/chunks/{chunk-LKFBW2QM.js → chunk-KBK4GBJQ.js} +2 -2
- package/dist/cli/chunks/{chunk-6F7MFHTY.js → chunk-KHVWIUAF.js} +2 -2
- package/dist/cli/chunks/{chunk-JDOVO4E4.js → chunk-KP6LNSDO.js} +126 -130
- package/dist/cli/chunks/{chunk-T53ZN4NO.js → chunk-KTBA2HJC.js} +2 -2
- package/dist/cli/chunks/{chunk-WVEHKAIH.js → chunk-L5GEWKR3.js} +3 -3
- package/dist/cli/chunks/chunk-LDDIYDIP.js +742 -0
- package/dist/cli/chunks/{chunk-QPACHVDI.js → chunk-LI7N45GM.js} +1 -1
- package/dist/cli/chunks/{chunk-UQGIC5OX.js → chunk-LQI5GVH7.js} +1 -1
- package/dist/cli/chunks/{chunk-T4WQPE77.js → chunk-MEOAKMKF.js} +1 -1
- package/dist/cli/chunks/{chunk-BT3MI2BW.js → chunk-N4HQ6FE2.js} +1 -1
- package/dist/cli/chunks/{chunk-JRLZ7LZ3.js → chunk-N5OSH5JO.js} +2 -2
- package/dist/cli/chunks/{chunk-BZIPW2PA.js → chunk-NF6SLLE6.js} +2 -2
- package/dist/cli/chunks/{chunk-QYCZYJH7.js → chunk-NGDRSF6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-O4QB2GFL.js → chunk-NK2BR4QZ.js} +2 -2
- package/dist/cli/chunks/{chunk-B2QKBQYD.js → chunk-NS4RIZ4F.js} +1 -1
- package/dist/cli/chunks/{chunk-CQEWL32R.js → chunk-NTLWHLAY.js} +1 -1
- package/dist/cli/chunks/{chunk-NWUFTLSF.js → chunk-NWNZMXNO.js} +2 -2
- package/dist/cli/chunks/{chunk-6GJWT2OY.js → chunk-OABFAREV.js} +2 -2
- package/dist/cli/chunks/{chunk-T7YCNOW5.js → chunk-OH4SKOAM.js} +2 -2
- package/dist/cli/chunks/{chunk-BL6273KR.js → chunk-OKS25EGZ.js} +3 -3
- package/dist/cli/chunks/{chunk-NJEEKYEP.js → chunk-OPBPFNBO.js} +2 -2
- package/dist/cli/chunks/{chunk-SKJQKOFJ.js → chunk-P24ZBDZY.js} +2 -2
- package/dist/cli/chunks/{chunk-KKXH25IH.js → chunk-PBWR2SKH.js} +2 -2
- package/dist/cli/chunks/{chunk-TGRHO4ES.js → chunk-PDLVO3ZR.js} +2 -2
- package/dist/cli/chunks/{chunk-GK5WLUX3.js → chunk-PGARKOE6.js} +1 -1
- package/dist/cli/chunks/{chunk-XAESN54Q.js → chunk-PNK5KHSI.js} +1 -1
- package/dist/cli/chunks/{chunk-BFIXUKOR.js → chunk-PZBYZV5M.js} +1 -1
- package/dist/cli/chunks/{chunk-EKO5QL2B.js → chunk-PZDI7WQ3.js} +1 -1
- package/dist/cli/chunks/{chunk-BCCSV3RH.js → chunk-Q7ONRZBD.js} +1 -1
- package/dist/cli/chunks/{chunk-N3ASALOL.js → chunk-QMHWJBD3.js} +2 -2
- package/dist/cli/chunks/{chunk-OA75C4HY.js → chunk-QOOADAT7.js} +2 -2
- package/dist/cli/chunks/{chunk-ES7TAJRJ.js → chunk-QVTV47TM.js} +2 -2
- package/dist/cli/chunks/{chunk-7X3LMTRA.js → chunk-R2ICZKQA.js} +2 -2
- package/dist/cli/chunks/{chunk-D2Y36V5J.js → chunk-RDI3W4H6.js} +2 -2
- package/dist/cli/chunks/{chunk-QP7EKLWU.js → chunk-REGPCPEJ.js} +2 -2
- package/dist/cli/chunks/{chunk-U2QTL5T2.js → chunk-RXKOZ6VS.js} +3 -3
- package/dist/cli/chunks/{chunk-OVMG6EEF.js → chunk-SRXXPZVT.js} +2 -2
- package/dist/cli/chunks/{chunk-CXUC7YKA.js → chunk-SUFXUM6W.js} +2 -2
- package/dist/cli/chunks/{chunk-77WL5HQW.js → chunk-T5K6ZCA6.js} +1 -1
- package/dist/cli/chunks/{chunk-3X2JSW3R.js → chunk-TBCQWD5A.js} +1 -1
- package/dist/cli/chunks/{chunk-BOIUENWW.js → chunk-TCJ65NPY.js} +1 -1
- package/dist/cli/chunks/{chunk-HE3BDBAO.js → chunk-TJCMG3QE.js} +2 -2
- package/dist/cli/chunks/{chunk-56M4QNXU.js → chunk-TLUMENRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-JTOFLDU7.js → chunk-TR37Q7A6.js} +6 -6
- package/dist/cli/chunks/{chunk-SVP3BP52.js → chunk-UE33MZOC.js} +2 -2
- package/dist/cli/chunks/{chunk-T6W2EYHC.js → chunk-UGUZFUQG.js} +2 -2
- package/dist/cli/chunks/{chunk-3FCHH4VP.js → chunk-UOHZRR5C.js} +1 -1
- package/dist/cli/chunks/{chunk-QKM4XT2F.js → chunk-UTFNHITI.js} +2 -2
- package/dist/cli/chunks/{chunk-6GNWVPMR.js → chunk-V3ISBQ5Q.js} +2 -2
- package/dist/cli/chunks/{chunk-6VTC3OHD.js → chunk-V5RP2SU3.js} +2 -2
- package/dist/cli/chunks/{chunk-5X4HDW5W.js → chunk-VEKRK3R6.js} +2 -2
- package/dist/cli/chunks/{chunk-TUZNWRYC.js → chunk-VGYLV6VD.js} +1 -1
- package/dist/cli/chunks/{chunk-C647D42G.js → chunk-VLL7ASGH.js} +2 -2
- package/dist/cli/chunks/{chunk-QH7C4PTX.js → chunk-W5HQQTVH.js} +1 -1
- package/dist/cli/chunks/{chunk-A5CLVZC3.js → chunk-W5NHBYYS.js} +2 -2
- package/dist/cli/chunks/{chunk-ISBOHF6Y.js → chunk-W6K77PQR.js} +1 -1
- package/dist/cli/chunks/{chunk-AUFV2G2J.js → chunk-WFDDWRWY.js} +5 -5
- package/dist/cli/chunks/{chunk-AJ5PCJQ2.js → chunk-WHBDSJUE.js} +3 -3
- package/dist/cli/chunks/{chunk-4RNCVSVN.js → chunk-WONHFDWF.js} +2 -2
- package/dist/cli/chunks/{chunk-VW7AXJQS.js → chunk-WPG6SW7C.js} +2 -2
- package/dist/cli/chunks/{chunk-GA63ESNT.js → chunk-WQZR6DS6.js} +2 -2
- package/dist/cli/chunks/{chunk-G36RZF2Y.js → chunk-WTFVYFRZ.js} +1 -1
- package/dist/cli/chunks/{chunk-F2WAB4WK.js → chunk-WYE3ICSL.js} +2 -2
- package/dist/cli/chunks/{chunk-TT45RCLN.js → chunk-X4PGLEPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-QDRFLM77.js → chunk-X6W35QXO.js} +2 -2
- package/dist/cli/chunks/{chunk-HHANMCD2.js → chunk-XCVD57GW.js} +1 -1
- package/dist/cli/chunks/{chunk-GQJ4QDEN.js → chunk-XYZUBAR6.js} +4 -4
- package/dist/cli/chunks/{chunk-TP7L4EX6.js → chunk-XZGRHJGC.js} +2 -2
- package/dist/cli/chunks/{chunk-BTBJ2NLH.js → chunk-YDM2DPUU.js} +2 -2
- package/dist/cli/chunks/{chunk-NEXBTLN6.js → chunk-YDMPTCJ3.js} +2 -2
- package/dist/cli/chunks/{chunk-4PY44TKH.js → chunk-YM3GAJMN.js} +2 -2
- package/dist/cli/chunks/{chunk-UNFE4RPV.js → chunk-YTMWPGVR.js} +1 -1
- package/dist/cli/chunks/{chunk-DSJJHPPS.js → chunk-YWX7KLNG.js} +3 -3
- package/dist/cli/chunks/{chunk-UIWXKRTK.js → chunk-ZE6WJDXM.js} +2 -2
- package/dist/cli/chunks/{chunk-W7JUD4EZ.js → chunk-ZX4I7IND.js} +2 -2
- package/dist/cli/chunks/{chunk-PVJLQ2YZ.js → chunk-ZZV6GR46.js} +1 -1
- package/dist/cli/chunks/{ci-5LIV2HW5.js → ci-K7DG4GSO.js} +3 -3
- package/dist/cli/chunks/{ci-output-UO5BDFU4.js → ci-output-EBSUG6HP.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-UQDPXYRD.js → circuit-breaker-P6N6YIRZ.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-62QES3QX.js → claude-flow-setup-P6EZPQZT.js} +2 -2
- package/dist/cli/chunks/client-ZYH66YRI.js +2 -0
- package/dist/cli/chunks/{cline-installer-X7VZTSZG.js → cline-installer-EVZZ3EFY.js} +2 -2
- package/dist/cli/chunks/{code-H3BF4L4H.js → code-3WLBG2XK.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BJGFZGGL.js → code-index-extractor-ZP6D4WL2.js} +2 -2
- package/dist/cli/chunks/{codex-installer-KVZWKU6S.js → codex-installer-XAUI4SB7.js} +2 -2
- package/dist/cli/chunks/{completions-YMILE6V7.js → completions-RHFNDDG3.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-J26N2PWG.js → complexity-analyzer-DCW7Q3OR.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-MAR42OV7.js → continuedev-installer-53SQA5T6.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-CVOJF6OT.js → copilot-installer-SXXMFB6T.js} +2 -2
- package/dist/cli/chunks/core-handlers-XKSPHEHE.js +2 -0
- package/dist/cli/chunks/{cost-tracker-SXLWXE55.js → cost-tracker-CKLDQ5AZ.js} +2 -2
- package/dist/cli/chunks/{coverage-D7HCHFP3.js → coverage-AWCS2SP7.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-6VYNFQZA.js +2 -0
- package/dist/cli/chunks/{cursor-installer-X37VHIKW.js → cursor-installer-4TYF5V5J.js} +2 -2
- package/dist/cli/chunks/{daemon-LIW47IDM.js → daemon-CTZXGN5V.js} +4 -4
- package/dist/cli/chunks/{daemon-JN7SOH6F.js → daemon-OOY4H6RJ.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-QCHHIZBT.js → dag-attention-scheduler-3WG24Q33.js} +2 -2
- package/dist/cli/chunks/{detect-WRFCWAX5.js → detect-O7MUZ6NX.js} +2 -2
- package/dist/cli/chunks/{dist-node-6FWT4XZO.js → dist-node-H4XI7BAF.js} +2 -2
- package/dist/cli/chunks/{domain-handler-SNFPNMRT.js → domain-handler-FU4WZ23B.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-MXKHH62P.js → domain-plugins-XK26KYNJ.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-47UJNERX.js → domain-transfer-6B5NOVH6.js} +2 -2
- package/dist/cli/chunks/dream-DRSSIHPP.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-LZFAUNBQ.js → embed-and-insert-pattern-XNZXPZNL.js} +2 -2
- package/dist/cli/chunks/{eval-AMUXTMJB.js → eval-J3Q5TTI7.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-3D65TR2C.js → experience-capture-middleware-COKIGMXW.js} +3 -3
- package/dist/cli/chunks/{fast-paths-Y7BBMM56.js → fast-paths-IHWPJI6I.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VESRRQ6V.js → feature-flags-G7ONDNTT.js} +2 -2
- package/dist/cli/chunks/{feature-flags-JMQQ7JW4.js → feature-flags-WUXFWZLR.js} +2 -2
- package/dist/cli/chunks/{file-discovery-JJKQQUV6.js → file-discovery-JN3YMBOJ.js} +2 -2
- package/dist/cli/chunks/{fleet-WIGHICJF.js → fleet-OUHUZJE4.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-BFNPETTT.js → gnn-wrapper-PRH55ZT6.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-HDXKTGUI.js → heartbeat-handler-6YF35AQS.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-FMICCNWK.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-4TGBNJEZ.js +2 -0
- package/dist/cli/chunks/hnsw-index-J4NSCPAZ.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-6A7OTAPT.js → hnsw-legacy-bridge-7PAFSTJO.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-LKV2H47B.js → hnswlib-node-UETDZNNN.js} +2 -2
- package/dist/cli/chunks/{hooks-KDSFYQQG.js → hooks-QQNUKQAS.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-NKPA3QE7.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-GDLPEPUC.js → hypergraph-engine-5GDGE3ET.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-4UMFA2EW.js → hypergraph-handler-C3F2OJYA.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-MWX7XY7X.js +2 -0
- package/dist/cli/chunks/{init-handler-4GCHPQHD.js → init-handler-C7ZBDAC5.js} +6 -6
- package/dist/cli/chunks/init-wizard-EX5N5Q7X.js +2 -0
- package/dist/cli/chunks/kernel-EQLZDHDD.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-HJZMT2G5.js → kilocode-installer-VLJENC76.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-WUPY67HG.js → kiro-installer-UYPYM6LA.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-A3WSMQ6U.js +2 -0
- package/dist/cli/chunks/{learning-AXKIS7IG.js → learning-SFIWIG6Z.js} +3 -3
- package/dist/cli/chunks/{llm-router-HUDPNZLJ.js → llm-router-V633KAS5.js} +4 -4
- package/dist/cli/chunks/llm-router-service-A6XYWTL6.js +2 -0
- package/dist/cli/chunks/{load-RM44POD7.js → load-UWZV4JRA.js} +2 -2
- package/dist/cli/chunks/load-test-WF2PCXLI.js +2 -0
- package/dist/cli/chunks/{mcp-5JVQRBOP.js → mcp-XVFHUKCP.js} +2 -2
- package/dist/cli/chunks/{memory-VGZ2V6PL.js → memory-BQ5652VK.js} +5 -5
- package/dist/cli/chunks/memory-backend-BKGLI2RF.js +2 -0
- package/dist/cli/chunks/{memory-handlers-EI537Z32.js → memory-handlers-PWI3G4P4.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-WPRKCSCM.js → multi-model-executor-X6AQ7VVR.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-YAJMRCQO.js → opencode-installer-N3V2Z4EF.js} +2 -2
- package/dist/cli/chunks/{orchestrator-MUGWBUYP.js → orchestrator-KNEKS4F7.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-YTBLEH7D.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-ZQJJ2YNG.js → pattern-usage-recorder-MZIM6XWU.js} +2 -2
- package/dist/cli/chunks/{pipeline-F4DXDUDC.js → pipeline-LNLBKSXR.js} +2 -2
- package/dist/cli/chunks/{platform-HI3A3OWF.js → platform-OMUDXHD3.js} +2 -2
- package/dist/cli/chunks/{plugin-XRITPTR7.js → plugin-HGY6KKZW.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-HHNJP7CQ.js → prime-radiant-advanced-wasm-LZBHLQYN.js} +2 -2
- package/dist/cli/chunks/{project-root-2VN4WO2A.js → project-root-VPSCDBMD.js} +2 -2
- package/dist/cli/chunks/protocol-executor-HFR2D54O.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ZEVHSEBG.js → protocol-handler-LZXT3TXU.js} +2 -2
- package/dist/cli/chunks/{prove-C4BLZWBS.js → prove-I4VKQEYQ.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-MYFBQUYV.js +2 -0
- package/dist/cli/chunks/{quality-M3DTE4KK.js → quality-VVAWK2DD.js} +2 -2
- package/dist/cli/chunks/{quality-gate-V6KS7ML3.js → quality-gate-RGXLWYT6.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-CQQMOTIW.js +2 -0
- package/dist/cli/chunks/{real-embeddings-YWSE3IRT.js → real-embeddings-WM66PMQ6.js} +2 -2
- package/dist/cli/chunks/{ref-validation-ZWOTFA3T.js → ref-validation-ZIWJNI6M.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-GJBIWETD.js → roocode-installer-QYSI3STC.js} +2 -2
- package/dist/cli/chunks/router-GKWLPA3N.js +2 -0
- package/dist/cli/chunks/routing-feedback-WA4D5JRF.js +2 -0
- package/dist/cli/chunks/{routing-handler-CFYLGNAR.js → routing-handler-BID3EOLE.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-EDKG456B.js → ruvector-commands-DXIFMF4W.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-H3ZXS5MA.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-J7MTCOQA.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-ZMEYMAI6.js → rvf-migration-coordinator-EV5E6SAO.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-HXBY4VYI.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-AH6PNJP6.js → rvf-store-integrity-IT6DCCJK.js} +2 -2
- package/dist/cli/chunks/safe-db-INVJ5LHR.js +2 -0
- package/dist/cli/chunks/schedule-XRIPPL52.js +2 -0
- package/dist/cli/chunks/scheduler-HBN3KPRW.js +2 -0
- package/dist/cli/chunks/{security-ZU2GW3ZM.js → security-AAFAEATQ.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-5FOVSL3T.js → shared-rvf-adapter-QIHSYHAF.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-IO4DC4XV.js → shared-rvf-dual-writer-V7OZ6TBR.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-6KNLT5Q2.js +2 -0
- package/dist/cli/chunks/{standalone-memory-3UXDZ7HI.js → standalone-memory-ALZI6VPX.js} +2 -2
- package/dist/cli/chunks/{status-handler-264CHTWS.js → status-handler-DED5A3OW.js} +2 -2
- package/dist/cli/chunks/{structural-health-E2QPUOZE.js → structural-health-CB7L3NWH.js} +2 -2
- package/dist/cli/chunks/{sync-2ACMWM7D.js → sync-QNPGETIO.js} +2 -2
- package/dist/cli/chunks/{sync-N2L2OST4.js → sync-S6Z2U46T.js} +2 -2
- package/dist/cli/chunks/{task-handler-IB5CVOTY.js → task-handler-CGHXYFIF.js} +2 -2
- package/dist/cli/chunks/{task-handlers-QBMYNJHE.js → task-handlers-A6BGQJIB.js} +3 -3
- package/dist/cli/chunks/{test-7RGLRDSP.js → test-IISTF5W6.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-RJABJT2W.js → test-scheduling-FKYX4OLF.js} +7 -7
- package/dist/cli/chunks/{token-bootstrap-JVHMHB72.js → token-bootstrap-OKO3JEKT.js} +2 -2
- package/dist/cli/chunks/{token-usage-3ECHQVCY.js → token-usage-25BRFKJ5.js} +2 -2
- package/dist/cli/chunks/{transformers-KJH3IJWI.js → transformers-TBVVSZMF.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-XN6PFI32.js → tree-sitter-wasm-parser-N7KCOQT4.js} +2 -2
- package/dist/cli/chunks/{types-5BAPXOLS.js → types-TFHWJGRK.js} +2 -2
- package/dist/cli/chunks/unified-memory-WVELSL6T.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-7P5MVKXD.js +2 -0
- package/dist/cli/chunks/unified-persistence-YLFCEWYY.js +2 -0
- package/dist/cli/chunks/{upgrade-S5NFQZID.js → upgrade-4VWQU7RD.js} +2 -2
- package/dist/cli/chunks/{validate-BIBWOLJD.js → validate-FF7WVXMP.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-WAA3LBHH.js → validate-swarm-NRLH4EDC.js} +2 -2
- package/dist/cli/chunks/visual-security-T5OM742H.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-OTBQTHAV.js → web-tree-sitter-VVU3LULW.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-NNQ22EW6.js → windsurf-installer-Q2ZNWG2D.js} +2 -2
- package/dist/cli/chunks/witness-chain-D6X4OZP5.js +2 -0
- package/dist/cli/chunks/{witness-chain-E7MUBOJW.js → witness-chain-FP3D4PQL.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-FW4QSN4C.js → witness-chain-repair-3LG4BF7C.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-YMROEBVL.js → witness-chain-verifier-LACGL6BK.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-4CGRNDMJ.js → witness-key-manager-GQZIB5ZE.js} +2 -2
- package/dist/cli/chunks/{workflow-4VRSTRAN.js → workflow-JPA5Y7L6.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-OORDDKT3.js +2 -0
- package/dist/cli/chunks/{wrappers-4M4UTGEU.js → wrappers-2B5NHICD.js} +2 -2
- package/dist/cli/utils/workflow-parser.js +73 -57
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.d.ts +1 -1
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +17 -15
- package/dist/domains/test-execution/services/retry-handler.js +6 -3
- package/dist/governance/ab-benchmarking.d.ts +5 -1
- package/dist/governance/ab-benchmarking.js +64 -29
- package/dist/mcp/bundle.js +414 -412
- package/dist/mcp/security/rate-limiter.d.ts +1 -0
- package/dist/mcp/security/rate-limiter.js +22 -5
- package/dist/mcp/services/session-store.js +17 -17
- package/dist/mcp/tools/planning/goap-status.d.ts +2 -0
- package/dist/mcp/tools/planning/goap-status.js +8 -2
- package/dist/planning/goap-planner.d.ts +3 -0
- package/dist/planning/goap-planner.js +80 -37
- package/dist/shared/embeddings/embedding-cache.js +1 -1
- package/dist/shared/embeddings/nomic-embedder.js +17 -7
- package/dist/shared/embeddings/ollama-client.js +5 -3
- package/dist/shared/git/git-analyzer.js +31 -30
- package/dist/shared/http/http-client.js +20 -13
- package/dist/shared/io/file-reader.js +11 -8
- package/dist/shared/llm/cache.d.ts +8 -29
- package/dist/shared/llm/cache.js +6 -2
- package/dist/shared/llm/cost-tracker.js +2 -1
- package/dist/shared/llm/provider-manager.js +4 -22
- package/dist/shared/llm/providers/gemini.d.ts +1 -0
- package/dist/shared/llm/providers/gemini.js +14 -5
- package/dist/shared/llm/providers/openrouter.js +6 -3
- package/dist/shared/metrics/code-metrics.js +1 -1
- package/dist/shared/metrics/system-metrics.js +8 -2
- package/dist/shared/retry-engine.js +2 -12
- package/dist/test-scheduling/executors/vitest-executor.js +26 -17
- package/package.json +3 -1
- package/dist/cli/chunks/adapter-XYCOXQCC.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +0 -2
- package/dist/cli/chunks/base-5TQ34GMD.js +0 -2
- package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +0 -2
- package/dist/cli/chunks/chunk-7STWD4KJ.js +0 -3
- package/dist/cli/chunks/chunk-PFXCRRR6.js +0 -736
- package/dist/cli/chunks/chunk-U64QORFO.js +0 -2
- package/dist/cli/chunks/client-AJZKCP4I.js +0 -2
- package/dist/cli/chunks/core-handlers-MQHEMGDV.js +0 -2
- package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +0 -2
- package/dist/cli/chunks/dream-OSWAITPT.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +0 -2
- package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +0 -2
- package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +0 -2
- package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +0 -2
- package/dist/cli/chunks/init-wizard-TAOPXHHD.js +0 -2
- package/dist/cli/chunks/kernel-6I6VZUWY.js +0 -2
- package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +0 -2
- package/dist/cli/chunks/llm-router-service-2D74XVM3.js +0 -2
- package/dist/cli/chunks/load-test-53FWOWNS.js +0 -2
- package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +0 -2
- package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +0 -2
- package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +0 -2
- package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +0 -2
- package/dist/cli/chunks/router-ZD4LXAWA.js +0 -2
- package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +0 -2
- package/dist/cli/chunks/safe-db-F6TRB5KZ.js +0 -2
- package/dist/cli/chunks/schedule-HBD4BYTE.js +0 -2
- package/dist/cli/chunks/scheduler-6FYWPMQC.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +0 -2
- package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +0 -2
- package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +0 -2
- package/dist/cli/chunks/visual-security-APOXJ3Q3.js +0 -2
- package/dist/cli/chunks/witness-chain-7IP5IJGT.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +0 -2
|
@@ -694,33 +694,50 @@ function detectCircularDependencies(stages) {
|
|
|
694
694
|
* Validate cron expression (basic validation)
|
|
695
695
|
*/
|
|
696
696
|
export function isValidCronExpression(expression) {
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
/^(\*|
|
|
710
|
-
/^(\*|
|
|
711
|
-
/^(\*|[1-9]|
|
|
712
|
-
/^(\*|[
|
|
697
|
+
return parseCronFields(expression) !== undefined;
|
|
698
|
+
}
|
|
699
|
+
/** Parse the existing numeric five-field grammar and its four named aliases. */
|
|
700
|
+
function parseCronFields(expression) {
|
|
701
|
+
const normalized = Object.hasOwn(CRON_PATTERNS, expression)
|
|
702
|
+
? CRON_PATTERNS[expression]
|
|
703
|
+
: expression;
|
|
704
|
+
const parts = normalized.trim().split(/\s+/);
|
|
705
|
+
if (parts.length !== 5)
|
|
706
|
+
return undefined;
|
|
707
|
+
const bounds = [[0, 59], [0, 23], [1, 31], [1, 12], [0, 7]];
|
|
708
|
+
const syntax = [
|
|
709
|
+
/^(\*|[0-5]?\d)(-[0-5]?\d)?(\/\d+)?$/,
|
|
710
|
+
/^(\*|1?\d|2[0-3])(-\d+)?(\/\d+)?$/,
|
|
711
|
+
/^(\*|[1-9]|[12]\d|3[01])(-\d+)?(\/\d+)?$/,
|
|
712
|
+
/^(\*|[1-9]|1[0-2])(-\d+)?(\/\d+)?$/,
|
|
713
|
+
/^(\*|[0-7])(-[0-7])?(\/\d+)?$/,
|
|
713
714
|
];
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
const
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
715
|
+
const fields = [];
|
|
716
|
+
for (let index = 0; index < parts.length; index++) {
|
|
717
|
+
const [minimum, maximum] = bounds[index];
|
|
718
|
+
const values = new Set();
|
|
719
|
+
for (const item of parts[index].split(',')) {
|
|
720
|
+
if (!syntax[index].test(item))
|
|
721
|
+
return undefined;
|
|
722
|
+
const match = /^(\*|\d+)(?:-(\d+))?(?:\/(\d+))?$/.exec(item);
|
|
723
|
+
if (!match || (match[1] === '*' && match[2] !== undefined))
|
|
724
|
+
return undefined;
|
|
725
|
+
const start = match[1] === '*' ? minimum : Number(match[1]);
|
|
726
|
+
const end = match[2] !== undefined ? Number(match[2])
|
|
727
|
+
: match[1] === '*' || match[3] !== undefined ? maximum : start;
|
|
728
|
+
const step = match[3] === undefined ? 1 : Number(match[3]);
|
|
729
|
+
if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) ||
|
|
730
|
+
!Number.isSafeInteger(step) || step <= 0 ||
|
|
731
|
+
start < minimum || end > maximum || start > end)
|
|
732
|
+
return undefined;
|
|
733
|
+
for (let value = start; value <= end; value += step) {
|
|
734
|
+
values.add(index === 4 && value === 7 ? 0 : value);
|
|
720
735
|
}
|
|
721
736
|
}
|
|
737
|
+
fields.push(values);
|
|
722
738
|
}
|
|
723
|
-
|
|
739
|
+
// Cronie records DOM_STAR/DOW_STAR from the first character, before parsing lists.
|
|
740
|
+
return { fields: fields, wildcardDay: parts[2].startsWith('*') || parts[4].startsWith('*') };
|
|
724
741
|
}
|
|
725
742
|
/**
|
|
726
743
|
* Parse cron expression to human-readable string
|
|
@@ -773,40 +790,39 @@ export function describeCronSchedule(expression) {
|
|
|
773
790
|
* Calculate next run time from cron expression
|
|
774
791
|
*/
|
|
775
792
|
export function calculateNextRun(cronExpression, fromDate = new Date()) {
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
if (nextRun <= fromDate) {
|
|
802
|
-
nextRun.setHours(nextRun.getHours() + 1);
|
|
793
|
+
const parsed = parseCronFields(cronExpression);
|
|
794
|
+
if (!parsed)
|
|
795
|
+
throw new Error(`Invalid cron expression: ${cronExpression}`);
|
|
796
|
+
if (!Number.isFinite(fromDate.getTime()))
|
|
797
|
+
throw new Error('Invalid schedule start date');
|
|
798
|
+
const [minutes, hours, days, months, weekdays] = parsed.fields;
|
|
799
|
+
// Preserve the existing host-local timezone. Advance elapsed minutes to
|
|
800
|
+
// skip absent DST times and inspect both occurrences of repeated times.
|
|
801
|
+
let candidate = new Date(Math.floor(fromDate.getTime() / 60000) * 60000 + 60000);
|
|
802
|
+
const deadline = new Date(fromDate);
|
|
803
|
+
deadline.setFullYear(fromDate.getFullYear() + 400);
|
|
804
|
+
// A complete Gregorian cycle contains 146097 days and repeats weekdays.
|
|
805
|
+
// Near the Date maximum a full cycle is not representable: clamp the
|
|
806
|
+
// search to that finite boundary and report the limitation on exhaustion.
|
|
807
|
+
const deadlineMs = Number.isFinite(deadline.getTime())
|
|
808
|
+
? deadline.getTime() : 8_640_000_000_000_000;
|
|
809
|
+
while (Number.isFinite(candidate.getTime()) && candidate.getTime() <= deadlineMs) {
|
|
810
|
+
const dayMatches = days.has(candidate.getDate());
|
|
811
|
+
const weekdayMatches = weekdays.has(candidate.getDay());
|
|
812
|
+
const calendarMatches = months.has(candidate.getMonth() + 1) &&
|
|
813
|
+
(parsed.wildcardDay ? dayMatches && weekdayMatches : dayMatches || weekdayMatches);
|
|
814
|
+
if (!calendarMatches) {
|
|
815
|
+
// Skip a nonmatching local calendar day instead of scanning its minutes.
|
|
816
|
+
candidate.setHours(24, 0, 0, 0);
|
|
817
|
+
continue;
|
|
803
818
|
}
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
819
|
+
if (hours.has(candidate.getHours()) && minutes.has(candidate.getMinutes()))
|
|
820
|
+
return candidate;
|
|
821
|
+
candidate = new Date(candidate.getTime() + 60000);
|
|
822
|
+
}
|
|
823
|
+
// An impossible date such as February 31 must not spin indefinitely or
|
|
824
|
+
// silently become a daily schedule. Leap-day/weekday intersections may
|
|
825
|
+
// exceed a leap-day-only horizon, so search one complete Gregorian cycle.
|
|
826
|
+
throw new Error(`No matching cron date within a 400-year Gregorian cycle and the supported Date range: ${cronExpression}`);
|
|
811
827
|
}
|
|
812
828
|
//# sourceMappingURL=workflow-parser.js.map
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Detection priority by project type:
|
|
8
8
|
* 1. Node.js: vitest > jest > fallback pattern matching
|
|
9
|
-
* 2. Rust: cargo test --list
|
|
9
|
+
* 2. Rust: cargo test -- --list
|
|
10
10
|
* 3. Python: pytest --collect-only
|
|
11
11
|
* 4. Go: go test -list
|
|
12
12
|
*
|
|
@@ -262,11 +262,11 @@ function countJestTests(projectPath, config) {
|
|
|
262
262
|
}
|
|
263
263
|
/**
|
|
264
264
|
* Count tests using Cargo (Rust)
|
|
265
|
-
* Uses `cargo test --list` for accurate test enumeration
|
|
265
|
+
* Uses `cargo test -- --list` for accurate test enumeration
|
|
266
266
|
*/
|
|
267
267
|
function countCargoTests(projectPath, config) {
|
|
268
268
|
try {
|
|
269
|
-
const output = execSync('cargo test --list', {
|
|
269
|
+
const output = execSync('cargo test -- --list', {
|
|
270
270
|
cwd: projectPath,
|
|
271
271
|
encoding: 'utf-8',
|
|
272
272
|
timeout: config.timeout,
|
|
@@ -310,13 +310,14 @@ function countPytestTests(projectPath, config) {
|
|
|
310
310
|
// Count test function lines (format: "tests/test_foo.py::test_bar")
|
|
311
311
|
const testLines = output.split('\n').filter(line => line.includes('::test_') || line.includes('::Test'));
|
|
312
312
|
const total = testLines.length;
|
|
313
|
-
//
|
|
314
|
-
|
|
315
|
-
const integration = testLines.filter(t => t.includes('integration') || t.includes('_integration')).length;
|
|
313
|
+
// Match fallback classification precedence so every collected test belongs
|
|
314
|
+
// to exactly one category, even when its path names multiple categories.
|
|
316
315
|
const e2e = testLines.filter(t => t.includes('e2e') || t.includes('end_to_end')).length;
|
|
316
|
+
const integration = testLines.filter(t => !t.includes('e2e') && !t.includes('end_to_end') && t.includes('integration')).length;
|
|
317
|
+
const unit = total - integration - e2e;
|
|
317
318
|
return {
|
|
318
319
|
total,
|
|
319
|
-
unit
|
|
320
|
+
unit,
|
|
320
321
|
integration,
|
|
321
322
|
e2e,
|
|
322
323
|
source: 'pytest',
|
|
@@ -343,13 +344,14 @@ function countGoTests(projectPath, config) {
|
|
|
343
344
|
encoding: 'utf-8',
|
|
344
345
|
timeout: config.timeout,
|
|
345
346
|
});
|
|
346
|
-
//
|
|
347
|
-
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
const integration = testLines.filter(t => t.includes('Integration')).length;
|
|
347
|
+
// Benchmarks and examples are listed too, but are not included in the
|
|
348
|
+
// test total. Apply that same selection to every category.
|
|
349
|
+
const testLines = output.split('\n').filter(line => line.startsWith('Test'));
|
|
350
|
+
const total = testLines.length;
|
|
351
|
+
// Use disjoint categories, with e2e taking precedence over integration.
|
|
352
352
|
const e2e = testLines.filter(t => t.includes('E2E')).length;
|
|
353
|
+
const integration = testLines.filter(t => !t.includes('E2E') && t.includes('Integration')).length;
|
|
354
|
+
const unit = total - integration - e2e;
|
|
353
355
|
return {
|
|
354
356
|
total,
|
|
355
357
|
unit,
|
|
@@ -474,8 +476,8 @@ function countTestsInPythonFile(filePath) {
|
|
|
474
476
|
const content = readFileSync(filePath, 'utf-8');
|
|
475
477
|
// Count def test_ functions and async def test_ functions
|
|
476
478
|
const funcMatches = content.match(/\bdef\s+test_\w+\s*\(/g) || [];
|
|
477
|
-
|
|
478
|
-
return funcMatches.length
|
|
479
|
+
// The def pattern also matches async def; every declaration counts once.
|
|
480
|
+
return funcMatches.length;
|
|
479
481
|
}
|
|
480
482
|
catch {
|
|
481
483
|
return 0;
|
|
@@ -336,6 +336,9 @@ export class RetryHandlerService {
|
|
|
336
336
|
*/
|
|
337
337
|
buildTestCommand(runner, testFile, testName) {
|
|
338
338
|
const npx = this.config.npxPath;
|
|
339
|
+
// These runners interpret name filters as regular expressions, but a
|
|
340
|
+
// FailedTest contains the literal assertion name from the previous run.
|
|
341
|
+
const namePattern = testName?.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') ?? '';
|
|
339
342
|
switch (runner) {
|
|
340
343
|
case 'vitest':
|
|
341
344
|
// vitest run --reporter=json testFile -t "testName"
|
|
@@ -344,7 +347,7 @@ export class RetryHandlerService {
|
|
|
344
347
|
const report = createVitestJsonReport();
|
|
345
348
|
const vitestArgs = ['vitest', 'run', '--reporter=json', testFile];
|
|
346
349
|
if (testName && testName !== testFile) {
|
|
347
|
-
vitestArgs.push('-t',
|
|
350
|
+
vitestArgs.push('-t', namePattern);
|
|
348
351
|
}
|
|
349
352
|
vitestArgs.push(...report.args);
|
|
350
353
|
return { command: npx, args: vitestArgs, report };
|
|
@@ -354,7 +357,7 @@ export class RetryHandlerService {
|
|
|
354
357
|
{
|
|
355
358
|
const jestArgs = ['jest', '--json', '--testPathPattern', testFile];
|
|
356
359
|
if (testName && testName !== testFile) {
|
|
357
|
-
jestArgs.push('-t',
|
|
360
|
+
jestArgs.push('-t', namePattern);
|
|
358
361
|
}
|
|
359
362
|
return { command: npx, args: jestArgs };
|
|
360
363
|
}
|
|
@@ -363,7 +366,7 @@ export class RetryHandlerService {
|
|
|
363
366
|
{
|
|
364
367
|
const mochaArgs = ['mocha', '--reporter', 'json', testFile];
|
|
365
368
|
if (testName && testName !== testFile) {
|
|
366
|
-
mochaArgs.push('--grep',
|
|
369
|
+
mochaArgs.push('--grep', namePattern);
|
|
367
370
|
}
|
|
368
371
|
return { command: npx, args: mochaArgs };
|
|
369
372
|
}
|
|
@@ -168,7 +168,8 @@ export interface WinnerResult {
|
|
|
168
168
|
benchmarkId: string;
|
|
169
169
|
winnerId: string;
|
|
170
170
|
winnerName: string;
|
|
171
|
-
confidence
|
|
171
|
+
/** Ranking heuristic, not a probability or statistical confidence level. */
|
|
172
|
+
heuristicScore: number;
|
|
172
173
|
combinedScore: number;
|
|
173
174
|
significantMetrics: string[];
|
|
174
175
|
recommendation: string;
|
|
@@ -290,10 +291,13 @@ export declare class ABBenchmarkingFramework {
|
|
|
290
291
|
* Calculate statistical significance for a benchmark
|
|
291
292
|
*/
|
|
292
293
|
calculateStatisticalSignificance(benchmarkId: string): SignificanceResult;
|
|
294
|
+
private calculateSignificance;
|
|
293
295
|
/**
|
|
294
296
|
* Get the winner of a benchmark
|
|
295
297
|
*/
|
|
296
298
|
getWinner(benchmarkId: string): WinnerResult | null;
|
|
299
|
+
/** Require evidence for this candidate over its ranked runner-up. */
|
|
300
|
+
private isSignificantlyBetterThanRunnerUp;
|
|
297
301
|
/**
|
|
298
302
|
* Compare two specific variants
|
|
299
303
|
*/
|
|
@@ -523,11 +523,17 @@ export class ABBenchmarkingFramework {
|
|
|
523
523
|
* Calculate statistical significance for a benchmark
|
|
524
524
|
*/
|
|
525
525
|
calculateStatisticalSignificance(benchmarkId) {
|
|
526
|
+
return this.calculateSignificance(benchmarkId);
|
|
527
|
+
}
|
|
528
|
+
calculateSignificance(benchmarkId, variantIds) {
|
|
526
529
|
const benchmark = this.benchmarks.get(benchmarkId);
|
|
527
530
|
if (!benchmark) {
|
|
528
531
|
throw new Error(`Benchmark ${benchmarkId} not found`);
|
|
529
532
|
}
|
|
530
|
-
const { config
|
|
533
|
+
const { config } = benchmark;
|
|
534
|
+
const variantMetrics = variantIds
|
|
535
|
+
? new Map(variantIds.map(id => [id, benchmark.variantMetrics.get(id)]))
|
|
536
|
+
: benchmark.variantMetrics;
|
|
531
537
|
const alpha = 1 - config.confidenceLevel;
|
|
532
538
|
// Bonferroni correction for multiple comparisons
|
|
533
539
|
const numComparisons = config.metrics.length;
|
|
@@ -540,10 +546,10 @@ export class ABBenchmarkingFramework {
|
|
|
540
546
|
const chiSquareResult = chiSquareTest(variants);
|
|
541
547
|
// Per-metric statistics (pairwise comparisons between first two variants)
|
|
542
548
|
const metricStatistics = [];
|
|
543
|
-
const
|
|
544
|
-
if (
|
|
545
|
-
const v1 = variantMetrics.get(
|
|
546
|
-
const v2 = variantMetrics.get(
|
|
549
|
+
const comparedIds = Array.from(variantMetrics.keys());
|
|
550
|
+
if (comparedIds.length >= 2) {
|
|
551
|
+
const v1 = variantMetrics.get(comparedIds[0]);
|
|
552
|
+
const v2 = variantMetrics.get(comparedIds[1]);
|
|
547
553
|
for (const metricConfig of config.metrics) {
|
|
548
554
|
const values1 = (v1.metrics.get(metricConfig.name) || []).map(d => d.value);
|
|
549
555
|
const values2 = (v2.metrics.get(metricConfig.name) || []).map(d => d.value);
|
|
@@ -618,10 +624,10 @@ export class ABBenchmarkingFramework {
|
|
|
618
624
|
// Sort by combined score (descending)
|
|
619
625
|
scores.sort((a, b) => b.score - a.score);
|
|
620
626
|
const winner = scores[0];
|
|
621
|
-
// Calculate
|
|
627
|
+
// Calculate a ranking heuristic based on significance and score gap
|
|
622
628
|
const significance = this.calculateStatisticalSignificance(benchmarkId);
|
|
623
629
|
const scoreGap = scores.length > 1 ? winner.score - scores[1].score : winner.score;
|
|
624
|
-
const
|
|
630
|
+
const heuristicScore = significance.isSignificant
|
|
625
631
|
? Math.min(0.99, 0.5 + scoreGap * 0.5 + (significance.powerAnalysis.currentPower * 0.25))
|
|
626
632
|
: Math.min(0.5, scoreGap * 0.5);
|
|
627
633
|
const significantMetrics = significance.metricStatistics
|
|
@@ -632,12 +638,38 @@ export class ABBenchmarkingFramework {
|
|
|
632
638
|
benchmarkId,
|
|
633
639
|
winnerId: winner.variantId,
|
|
634
640
|
winnerName: variantConfig?.name || winner.variantId,
|
|
635
|
-
|
|
641
|
+
heuristicScore,
|
|
636
642
|
combinedScore: winner.score,
|
|
637
643
|
significantMetrics,
|
|
638
|
-
recommendation: this.generateWinnerRecommendation(winner,
|
|
644
|
+
recommendation: this.generateWinnerRecommendation(winner, heuristicScore, significantMetrics),
|
|
639
645
|
};
|
|
640
646
|
}
|
|
647
|
+
/** Require evidence for this candidate over its ranked runner-up. */
|
|
648
|
+
isSignificantlyBetterThanRunnerUp(benchmarkId, winnerId) {
|
|
649
|
+
const benchmark = this.benchmarks.get(benchmarkId);
|
|
650
|
+
const scores = this.calculateCombinedScores(benchmark).sort((a, b) => b.score - a.score);
|
|
651
|
+
const [winner, runnerUp] = scores;
|
|
652
|
+
if (!runnerUp || winner.variantId !== winnerId || winner.score <= runnerUp.score) {
|
|
653
|
+
return false;
|
|
654
|
+
}
|
|
655
|
+
const significance = this.calculateSignificance(benchmarkId, [winnerId, runnerUp.variantId]);
|
|
656
|
+
const winnerMetrics = benchmark.variantMetrics.get(winnerId);
|
|
657
|
+
const runnerUpMetrics = benchmark.variantMetrics.get(runnerUp.variantId);
|
|
658
|
+
const successMetrics = benchmark.config.metrics.filter(metric => metric.type === 'success_rate');
|
|
659
|
+
const successContributesToScore = successMetrics.length === 0 ||
|
|
660
|
+
successMetrics.some(metric => metric.weight > 0);
|
|
661
|
+
if (successContributesToScore && significance.chiSquareTest?.isSignificant &&
|
|
662
|
+
this.getSuccessRate(winnerMetrics) > this.getSuccessRate(runnerUpMetrics)) {
|
|
663
|
+
return true;
|
|
664
|
+
}
|
|
665
|
+
return significance.metricStatistics.some(statistic => {
|
|
666
|
+
const metric = benchmark.config.metrics.find(config => config.name === statistic.metric);
|
|
667
|
+
return statistic.isSignificant && metric.weight > 0 &&
|
|
668
|
+
(metric.higherIsBetter
|
|
669
|
+
? statistic.variantA.mean > statistic.variantB.mean
|
|
670
|
+
: statistic.variantA.mean < statistic.variantB.mean);
|
|
671
|
+
});
|
|
672
|
+
}
|
|
641
673
|
/**
|
|
642
674
|
* Compare two specific variants
|
|
643
675
|
*/
|
|
@@ -693,9 +725,6 @@ export class ABBenchmarkingFramework {
|
|
|
693
725
|
scoreA += normalizedA * metricConfig.weight;
|
|
694
726
|
scoreB += normalizedB * metricConfig.weight;
|
|
695
727
|
}
|
|
696
|
-
// Add success rate comparison
|
|
697
|
-
const successRateA = this.getSuccessRate(metricsA);
|
|
698
|
-
const successRateB = this.getSuccessRate(metricsB);
|
|
699
728
|
const overallWinner = scoreA > scoreB ? variantA : scoreB > scoreA ? variantB : null;
|
|
700
729
|
const confidence = Math.abs(scoreA - scoreB) / Math.max(scoreA, scoreB, 0.001);
|
|
701
730
|
return {
|
|
@@ -760,16 +789,19 @@ export class ABBenchmarkingFramework {
|
|
|
760
789
|
if (winner.significantMetrics.length > 0) {
|
|
761
790
|
reasoning.push(`Significant improvements in: ${winner.significantMetrics.join(', ')}`);
|
|
762
791
|
}
|
|
763
|
-
if (
|
|
792
|
+
if (!this.isSignificantlyBetterThanRunnerUp(benchmarkId, winner.winnerId)) {
|
|
793
|
+
caveats.push('Leading variant is not significantly better than the runner-up');
|
|
794
|
+
}
|
|
795
|
+
else if (winner.heuristicScore >= 0.95) {
|
|
764
796
|
readyToApply = true;
|
|
765
|
-
reasoning.push('High
|
|
797
|
+
reasoning.push('High heuristic score with runner-up significance - ready to apply');
|
|
766
798
|
}
|
|
767
|
-
else if (winner.
|
|
799
|
+
else if (winner.heuristicScore >= 0.8) {
|
|
768
800
|
readyToApply = true;
|
|
769
|
-
reasoning.push('Good
|
|
801
|
+
reasoning.push('Good heuristic score with runner-up significance - ready to apply');
|
|
770
802
|
}
|
|
771
803
|
else {
|
|
772
|
-
caveats.push(`
|
|
804
|
+
caveats.push(`Heuristic score (${winner.heuristicScore.toFixed(3)}) below recommended threshold`);
|
|
773
805
|
}
|
|
774
806
|
}
|
|
775
807
|
else {
|
|
@@ -778,7 +810,7 @@ export class ABBenchmarkingFramework {
|
|
|
778
810
|
return {
|
|
779
811
|
benchmarkId,
|
|
780
812
|
suggestedWinnerId,
|
|
781
|
-
confidence: winner?.
|
|
813
|
+
confidence: winner?.heuristicScore ?? 0,
|
|
782
814
|
reasoning,
|
|
783
815
|
caveats,
|
|
784
816
|
readyToApply,
|
|
@@ -798,12 +830,15 @@ export class ABBenchmarkingFramework {
|
|
|
798
830
|
if (!winner) {
|
|
799
831
|
throw new Error(`No winner determined for benchmark ${benchmarkId}`);
|
|
800
832
|
}
|
|
833
|
+
if (!this.isSignificantlyBetterThanRunnerUp(benchmarkId, winner.winnerId)) {
|
|
834
|
+
throw new Error(`Winner is not significantly better than the runner-up for benchmark ${benchmarkId}`);
|
|
835
|
+
}
|
|
801
836
|
// Mark benchmark as completed
|
|
802
837
|
benchmark.status = 'completed';
|
|
803
838
|
benchmark.endTime = Date.now();
|
|
804
839
|
benchmark.winnerId = winner.winnerId;
|
|
805
840
|
// Promote winner in Evolution Pipeline
|
|
806
|
-
evolutionPipelineIntegration.promoteRule(winner.winnerId, `Won A/B benchmark ${benchmarkId} with ${
|
|
841
|
+
evolutionPipelineIntegration.promoteRule(winner.winnerId, `Won A/B benchmark ${benchmarkId} with heuristic score ${winner.heuristicScore.toFixed(3)} and runner-up significance`);
|
|
807
842
|
// Complete the variant test
|
|
808
843
|
evolutionPipelineIntegration.completeVariantTest(benchmarkId);
|
|
809
844
|
this.logEvent('winner_applied', `Applied winner ${winner.winnerId} for benchmark ${benchmarkId}`);
|
|
@@ -979,25 +1014,25 @@ export class ABBenchmarkingFramework {
|
|
|
979
1014
|
/**
|
|
980
1015
|
* Generate winner recommendation text
|
|
981
1016
|
*/
|
|
982
|
-
generateWinnerRecommendation(winner,
|
|
983
|
-
if (
|
|
1017
|
+
generateWinnerRecommendation(winner, heuristicScore, significantMetrics) {
|
|
1018
|
+
if (heuristicScore >= 0.95) {
|
|
984
1019
|
return `Strongly recommend applying ${winner.variantId}. ` +
|
|
985
|
-
`High
|
|
1020
|
+
`High heuristic score (${heuristicScore.toFixed(3)}) with significant improvements ` +
|
|
986
1021
|
`in: ${significantMetrics.length > 0 ? significantMetrics.join(', ') : 'overall performance'}.`;
|
|
987
1022
|
}
|
|
988
|
-
else if (
|
|
1023
|
+
else if (heuristicScore >= 0.8) {
|
|
989
1024
|
return `Recommend applying ${winner.variantId}. ` +
|
|
990
|
-
`Good
|
|
991
|
-
`Consider collecting more samples for higher
|
|
1025
|
+
`Good heuristic score (${heuristicScore.toFixed(3)}). ` +
|
|
1026
|
+
`Consider collecting more samples for a higher heuristic score.`;
|
|
992
1027
|
}
|
|
993
|
-
else if (
|
|
994
|
-
return `${winner.variantId} shows promise with moderate
|
|
995
|
-
`(${
|
|
1028
|
+
else if (heuristicScore >= 0.6) {
|
|
1029
|
+
return `${winner.variantId} shows promise with moderate heuristic score ` +
|
|
1030
|
+
`(${heuristicScore.toFixed(3)}). ` +
|
|
996
1031
|
`Recommend collecting more samples before applying.`;
|
|
997
1032
|
}
|
|
998
1033
|
else {
|
|
999
1034
|
return `Results are inconclusive. ${winner.variantId} is currently leading but ` +
|
|
1000
|
-
`
|
|
1035
|
+
`heuristic score (${heuristicScore.toFixed(3)}) is low. Continue collecting data.`;
|
|
1001
1036
|
}
|
|
1002
1037
|
}
|
|
1003
1038
|
/**
|