agentic-qe 3.15.14 → 3.15.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/v3/templates/qx-report-template.html +1 -1
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +136 -0
- package/assets/agents/v3/templates/qx-report-template.html +1 -1
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/audit/witness-chain.d.ts +7 -0
- package/dist/audit/witness-chain.js +10 -0
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-6CQ2PIP5.js +2 -0
- package/dist/cli/chunks/agent-booster-wasm-45NWEKVS.js +2 -0
- package/dist/cli/chunks/{agent-handler-P3IY7XEE.js → agent-handler-LVHMYFEF.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WWKC2H3G.js → agent-memory-branch-YDWOJFEQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +2 -0
- package/dist/cli/chunks/{arena-EIV5OALF.js → arena-CZKHXDDS.js} +2 -2
- package/dist/cli/chunks/{arena-4BMFF6BS.js → arena-ELDZH3CZ.js} +4 -4
- package/dist/cli/chunks/{audit-DNTI453H.js → audit-5MT4T47Z.js} +3 -3
- package/dist/cli/chunks/base-SMCMMVGP.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-TQBQGNC6.js → better-sqlite3-6TGYPC2B.js} +2 -2
- package/dist/cli/chunks/{brain-handler-HY57CNAO.js → brain-handler-HQWZFO52.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-THPMZPHQ.js → branch-enumerator-WVILM4SO.js} +2 -2
- package/dist/cli/chunks/{browser-O6JJOZCK.js → browser-RX5ALU3H.js} +2 -2
- package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +2 -0
- package/dist/cli/chunks/{chunk-CIINJHOX.js → chunk-24OX5TQJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6P4Q4RTC.js → chunk-24QHCVX6.js} +1 -1
- package/dist/cli/chunks/{chunk-U6IOQKCT.js → chunk-2H4XH6FT.js} +2 -2
- package/dist/cli/chunks/{chunk-OGEIHS76.js → chunk-2YZ4G6NW.js} +1 -1
- package/dist/cli/chunks/chunk-32BPDLRZ.js +27 -0
- package/dist/cli/chunks/{chunk-5PLBQZ5J.js → chunk-32GN3JKR.js} +1 -1
- package/dist/cli/chunks/{chunk-AJVLVF7V.js → chunk-3HD7E6HN.js} +2 -2
- package/dist/cli/chunks/{chunk-X7CUI7KH.js → chunk-4D4DENG6.js} +2 -2
- package/dist/cli/chunks/{chunk-E2JLAW3U.js → chunk-4LQFBY5L.js} +6 -6
- package/dist/cli/chunks/{chunk-E3QIQMMN.js → chunk-4NFQLP6R.js} +1 -1
- package/dist/cli/chunks/{chunk-7Y3LXH57.js → chunk-525CFDUE.js} +2 -2
- package/dist/cli/chunks/chunk-5B5QPCNU.js +65 -0
- package/dist/cli/chunks/{chunk-X6Q2N5S5.js → chunk-5JZRZI4S.js} +2 -2
- package/dist/cli/chunks/{chunk-MB4UKUBV.js → chunk-5LAVKGLH.js} +2 -2
- package/dist/cli/chunks/chunk-5NNNEWLS.js +755 -0
- package/dist/cli/chunks/{chunk-NKOLILT7.js → chunk-5PBLPQ5T.js} +2 -2
- package/dist/cli/chunks/chunk-5QO3R3TU.js +6 -0
- package/dist/cli/chunks/{chunk-7T6L3LFN.js → chunk-5SPCGMBB.js} +2 -2
- package/dist/cli/chunks/{chunk-2QLE6NDW.js → chunk-5V3TI2LG.js} +1 -1
- package/dist/cli/chunks/{chunk-A2T56XVL.js → chunk-5VZL4UVN.js} +2 -2
- package/dist/cli/chunks/{chunk-TWOV3I3A.js → chunk-63GMRQ25.js} +1 -1
- package/dist/cli/chunks/{chunk-YGOSSVY5.js → chunk-63ZKI4PX.js} +6 -6
- package/dist/cli/chunks/{chunk-FHPNWHY7.js → chunk-67Z5R7RJ.js} +2 -2
- package/dist/cli/chunks/{chunk-PCQZIAXB.js → chunk-6DPYNAOK.js} +2 -2
- package/dist/cli/chunks/{chunk-WCM6WE7G.js → chunk-6ICX3FEG.js} +3 -3
- package/dist/cli/chunks/{chunk-JB7R77SH.js → chunk-6XXZDV2C.js} +2 -2
- package/dist/cli/chunks/{chunk-FJOIBZUB.js → chunk-6ZBXSOX6.js} +2 -2
- package/dist/cli/chunks/{chunk-WZQADC5R.js → chunk-72XSEQMW.js} +2 -2
- package/dist/cli/chunks/{chunk-AYLEH2UF.js → chunk-7TE5ONQQ.js} +1 -1
- package/dist/cli/chunks/{chunk-7QUSNBAA.js → chunk-A5GBXCP5.js} +2 -2
- package/dist/cli/chunks/{chunk-7724KXM2.js → chunk-AAMLQ2LF.js} +3 -3
- package/dist/cli/chunks/chunk-AG2EWGXS.js +21 -0
- package/dist/cli/chunks/{chunk-2UZBLC5H.js → chunk-AGRV5B3T.js} +2 -2
- package/dist/cli/chunks/{chunk-V6SE2ZU2.js → chunk-AJMJNQMP.js} +1 -1
- package/dist/cli/chunks/{chunk-2HPNGK7A.js → chunk-AR67RJPY.js} +2 -2
- package/dist/cli/chunks/{chunk-G7HGUQAE.js → chunk-ASEOFRIG.js} +2 -2
- package/dist/cli/chunks/{chunk-7TH4PJSU.js → chunk-BEKDKVQT.js} +2 -2
- package/dist/cli/chunks/{chunk-M5JEA6ZY.js → chunk-BY5OF7OH.js} +2 -2
- package/dist/cli/chunks/{chunk-OLUOVNUF.js → chunk-C5FP5GW3.js} +2 -2
- package/dist/cli/chunks/{chunk-R5RRWLRI.js → chunk-C6D5AHBO.js} +2 -2
- package/dist/cli/chunks/{chunk-K7GFYFBO.js → chunk-CAKMOVZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-6NIGSY5L.js → chunk-CEYSYSK5.js} +2 -2
- package/dist/cli/chunks/{chunk-U4TML2VD.js → chunk-CGGUM2YJ.js} +2 -2
- package/dist/cli/chunks/{chunk-YE54T2NQ.js → chunk-CJSHWQXP.js} +2 -2
- package/dist/cli/chunks/{chunk-7SQTLUEN.js → chunk-CRPIYUTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-65EE2EST.js → chunk-D6COXLYE.js} +2 -2
- package/dist/cli/chunks/{chunk-4WLIOPHX.js → chunk-DTMAS2GB.js} +2 -2
- package/dist/cli/chunks/{chunk-E7QTWGPI.js → chunk-DVYHMDFR.js} +470 -411
- package/dist/cli/chunks/chunk-DXD6K2ZP.js +3 -0
- package/dist/cli/chunks/{chunk-HSDWPQQY.js → chunk-E3D4GPLP.js} +3 -3
- package/dist/cli/chunks/{chunk-JJHLGGPP.js → chunk-EA4YQVKS.js} +1 -1
- package/dist/cli/chunks/{chunk-EIEEST4T.js → chunk-EGYE5UPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-O756AOUX.js → chunk-EK7OLYOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-57DRT6UA.js → chunk-F742SZAX.js} +2 -2
- package/dist/cli/chunks/{chunk-6OI5SK7M.js → chunk-FBDVGRSC.js} +1 -1
- package/dist/cli/chunks/{chunk-H3C5FJRH.js → chunk-FDDC72IA.js} +2 -2
- package/dist/cli/chunks/{chunk-IQRPR4KB.js → chunk-FL64OUBA.js} +2 -2
- package/dist/cli/chunks/{chunk-BNG4J3CE.js → chunk-FLNAW7C4.js} +2 -2
- package/dist/cli/chunks/{chunk-C3OIBFAA.js → chunk-G5RHFBAY.js} +2 -2
- package/dist/cli/chunks/{chunk-NPCXGX7N.js → chunk-GAHNO6JJ.js} +2 -2
- package/dist/cli/chunks/{chunk-PNRPVQGI.js → chunk-GFWHUQSF.js} +2 -2
- package/dist/cli/chunks/{chunk-OCN53CCK.js → chunk-GJYHWYXR.js} +2 -2
- package/dist/cli/chunks/{chunk-5Z4MO2F3.js → chunk-GQ6TUIKY.js} +1 -1
- package/dist/cli/chunks/{chunk-N736GLWZ.js → chunk-GSKMOPL7.js} +2 -2
- package/dist/cli/chunks/{chunk-43XHGWYH.js → chunk-HCH4Y6XX.js} +2 -2
- package/dist/cli/chunks/{chunk-QP6GL3O5.js → chunk-HGWXF45W.js} +1 -1
- package/dist/cli/chunks/{chunk-PGN4TARY.js → chunk-HJ6ZGVTB.js} +2 -2
- package/dist/cli/chunks/{chunk-M2TG7VDK.js → chunk-HLUXXCHF.js} +1 -1
- package/dist/cli/chunks/{chunk-UMHFTQTR.js → chunk-HVRRLYX6.js} +4 -4
- package/dist/cli/chunks/{chunk-L7PC675Y.js → chunk-I7MQIM2U.js} +1 -1
- package/dist/cli/chunks/{chunk-JSSU4RIK.js → chunk-IESR7TNB.js} +2 -2
- package/dist/cli/chunks/{chunk-H4LYXLAT.js → chunk-IHRXZZQM.js} +1 -1
- package/dist/cli/chunks/{chunk-HV43NX4A.js → chunk-IOKYCMTJ.js} +6 -6
- package/dist/cli/chunks/{chunk-NZQYJCO6.js → chunk-IOQ6ZQ5W.js} +1 -1
- package/dist/cli/chunks/{chunk-JO26SG47.js → chunk-IOYG4VFL.js} +2 -2
- package/dist/cli/chunks/{chunk-6O63ZTVX.js → chunk-IUBJVHNB.js} +2 -2
- package/dist/cli/chunks/{chunk-XSPMLJCQ.js → chunk-J442IZLE.js} +1 -1
- package/dist/cli/chunks/{chunk-LTGQJYYO.js → chunk-J4ELZNLY.js} +2 -2
- package/dist/cli/chunks/chunk-J7I6PABJ.js +153 -0
- package/dist/cli/chunks/chunk-JDIYMZCQ.js +2 -0
- package/dist/cli/chunks/{chunk-TOJF3ZG4.js → chunk-JHQCRRJI.js} +2 -2
- package/dist/cli/chunks/{chunk-QUZ745UQ.js → chunk-JQ3DYUMS.js} +2 -2
- package/dist/cli/chunks/{chunk-P2TPH3TC.js → chunk-KITOPKRG.js} +2 -2
- package/dist/cli/chunks/{chunk-QNQE3EOH.js → chunk-KKU2QGSJ.js} +2 -2
- package/dist/cli/chunks/chunk-KL7OKSU2.js +4 -0
- package/dist/cli/chunks/{chunk-L5VSLPMW.js → chunk-KNSRL6NO.js} +2 -2
- package/dist/cli/chunks/{chunk-INGXD5IX.js → chunk-KPRCB5LT.js} +2 -2
- package/dist/cli/chunks/{chunk-GY4P7KAI.js → chunk-KQYJ4VQ5.js} +1 -1
- package/dist/cli/chunks/{chunk-Z2S7DNFP.js → chunk-KU2AUFGX.js} +2 -2
- package/dist/cli/chunks/{chunk-O5CEL447.js → chunk-KVF4NXGQ.js} +2 -2
- package/dist/cli/chunks/{chunk-2IJO3657.js → chunk-KXCLACFG.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJGFQK27.js → chunk-L2DWPVNJ.js} +1 -1
- package/dist/cli/chunks/{chunk-E7OR6V3V.js → chunk-L6QSTQME.js} +2 -2
- package/dist/cli/chunks/{chunk-RE6JTSDM.js → chunk-LE4QJREF.js} +1 -1
- package/dist/cli/chunks/{chunk-DSQESXL4.js → chunk-LKTTUHLF.js} +2 -2
- package/dist/cli/chunks/{chunk-YGC5QKQ4.js → chunk-LQLPB2T6.js} +2 -2
- package/dist/cli/chunks/{chunk-VGZOPQQY.js → chunk-LRSX2FJM.js} +1 -1
- package/dist/cli/chunks/chunk-M4FRQ4TE.js +12 -0
- package/dist/cli/chunks/chunk-M7WJCTG3.js +2 -0
- package/dist/cli/chunks/{chunk-56NSE3LJ.js → chunk-MAFQV4U4.js} +2 -2
- package/dist/cli/chunks/{chunk-MKYOE7NE.js → chunk-MD43XRX5.js} +1 -1
- package/dist/cli/chunks/{chunk-3TF27MG5.js → chunk-MI5MFHRA.js} +2 -2
- package/dist/cli/chunks/{chunk-JK6PMLQQ.js → chunk-MO55CVMT.js} +32 -32
- package/dist/cli/chunks/{chunk-X6NJOT3V.js → chunk-N7HL5PHH.js} +1 -1
- package/dist/cli/chunks/chunk-NAEWCFQT.js +14 -0
- package/dist/cli/chunks/{chunk-WUGXXNK4.js → chunk-NDJ7P2EP.js} +1 -1
- package/dist/cli/chunks/{chunk-D5GB5PUU.js → chunk-NO3IV5Q5.js} +1 -1
- package/dist/cli/chunks/{chunk-3XACRXBY.js → chunk-NQXXI77K.js} +2 -2
- package/dist/cli/chunks/{chunk-EC65UZ77.js → chunk-NVEWF4JV.js} +1 -1
- package/dist/cli/chunks/{chunk-JI67T6Q2.js → chunk-NZU4ACBZ.js} +2 -2
- package/dist/cli/chunks/chunk-O5W3FIO6.js +63 -0
- package/dist/cli/chunks/{chunk-YEFTK4HD.js → chunk-OAEE6JWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-JAOCHPYX.js → chunk-OCV2XEWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-IDBA5GK2.js → chunk-P3EYRILV.js} +2 -2
- package/dist/cli/chunks/{chunk-4RPBODN5.js → chunk-PEQDY4BO.js} +2 -2
- package/dist/cli/chunks/{chunk-CPPYZYXC.js → chunk-PF7RBAYL.js} +2 -2
- package/dist/cli/chunks/{chunk-WCPSR4MJ.js → chunk-PHT5N7SC.js} +2 -2
- package/dist/cli/chunks/{chunk-O2AAYJUV.js → chunk-PINSJCM3.js} +1 -1
- package/dist/cli/chunks/{chunk-HEDGFKC5.js → chunk-PPUZWYUG.js} +2 -2
- package/dist/cli/chunks/{chunk-XMCSKYDE.js → chunk-QPEOLAAS.js} +1 -1
- package/dist/cli/chunks/{chunk-7MUO4DEH.js → chunk-QQWBWEJS.js} +18 -18
- package/dist/cli/chunks/{chunk-UFP7SN5V.js → chunk-QVDCVD5D.js} +2 -2
- package/dist/cli/chunks/{chunk-NHEG2DLN.js → chunk-RJIEG3NA.js} +2 -2
- package/dist/cli/chunks/{chunk-KJ5A54ZH.js → chunk-RV74I3YO.js} +2 -2
- package/dist/cli/chunks/{chunk-UDSB3XCG.js → chunk-S75SOOZL.js} +2 -2
- package/dist/cli/chunks/{chunk-BPDAQB3F.js → chunk-SASBO5Y5.js} +2 -2
- package/dist/cli/chunks/{chunk-VJBJRFUO.js → chunk-SDLWKRVL.js} +9 -9
- package/dist/cli/chunks/{chunk-J6ASX536.js → chunk-SHKOCGNK.js} +2 -2
- package/dist/cli/chunks/{chunk-J35JWDJE.js → chunk-SI6DPU5D.js} +1 -1
- package/dist/cli/chunks/{chunk-V3MGY76S.js → chunk-SJ6Y4725.js} +2 -2
- package/dist/cli/chunks/{chunk-FTYRPEJS.js → chunk-SR52XP5F.js} +1 -1
- package/dist/cli/chunks/{chunk-ZUE524JL.js → chunk-SSUAAX3F.js} +2 -2
- package/dist/cli/chunks/{chunk-VG32EEUG.js → chunk-SSYAQZXA.js} +2 -2
- package/dist/cli/chunks/{chunk-HTVGHHX2.js → chunk-SUDMM5SO.js} +2 -2
- package/dist/cli/chunks/{chunk-K2SMP4OD.js → chunk-TIUKLYAI.js} +1 -1
- package/dist/cli/chunks/{chunk-VCVRZD4Y.js → chunk-TVGI32MB.js} +33 -33
- package/dist/cli/chunks/{chunk-CAZM63TP.js → chunk-U2A7NHZA.js} +2 -2
- package/dist/cli/chunks/{chunk-WBC6WB32.js → chunk-UE5ZOZR2.js} +2 -2
- package/dist/cli/chunks/{chunk-BQJ7CV53.js → chunk-UHEOGZLX.js} +12 -12
- package/dist/cli/chunks/chunk-UNGBRZDK.js +12 -0
- package/dist/cli/chunks/{chunk-XN3KCKAM.js → chunk-V5NHZV7S.js} +2 -2
- package/dist/cli/chunks/{chunk-UNYTHZDZ.js → chunk-VJCIEHEF.js} +1 -1
- package/dist/cli/chunks/{chunk-5Y7UFHJD.js → chunk-VMDFFTCK.js} +1 -1
- package/dist/cli/chunks/chunk-VSIKHWZ4.js +29 -0
- package/dist/cli/chunks/{chunk-UPWLMIDY.js → chunk-VWPM27GU.js} +2 -2
- package/dist/cli/chunks/{chunk-USAKCGHC.js → chunk-VXFLJNCA.js} +2 -2
- package/dist/cli/chunks/{chunk-WKI46WWN.js → chunk-W5HQUIML.js} +2 -2
- package/dist/cli/chunks/{chunk-Z54G2YOL.js → chunk-WP4RETKG.js} +2 -2
- package/dist/cli/chunks/{chunk-IRPNEXOU.js → chunk-XIIQ5QTT.js} +2 -2
- package/dist/cli/chunks/{chunk-O32BFQV4.js → chunk-XIQW7EFL.js} +2 -2
- package/dist/cli/chunks/{chunk-TW6Z6W4X.js → chunk-XWUWX7BV.js} +13 -13
- package/dist/cli/chunks/{chunk-57FX3GP6.js → chunk-Y4PFUMOU.js} +1 -1
- package/dist/cli/chunks/chunk-YAPLJR7K.js +2 -0
- package/dist/cli/chunks/{chunk-4T7XV5KQ.js → chunk-YLMNVLDK.js} +1 -1
- package/dist/cli/chunks/{chunk-TSP6SU5V.js → chunk-YNMJEDN5.js} +2 -2
- package/dist/cli/chunks/{chunk-PWQWKYBG.js → chunk-YPBSUGMI.js} +1 -1
- package/dist/cli/chunks/{chunk-QP2HLKTS.js → chunk-YRAX7SFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-O3ERGUXH.js → chunk-YTHTQPWR.js} +1 -1
- package/dist/cli/chunks/{chunk-MR2OPUSA.js → chunk-YU2BDRSD.js} +1 -1
- package/dist/cli/chunks/chunk-ZB3LEFYG.js +2 -0
- package/dist/cli/chunks/{chunk-2W5MQDHM.js → chunk-ZFL436FN.js} +2 -2
- package/dist/cli/chunks/{chunk-7MISCSL5.js → chunk-ZJH5MU2I.js} +2 -2
- package/dist/cli/chunks/{chunk-52KOPIMI.js → chunk-ZQ2XW3IP.js} +2 -2
- package/dist/cli/chunks/chunk-ZR2TKVXQ.js +14 -0
- package/dist/cli/chunks/{ci-UMA2SMNW.js → ci-MFUR4CWV.js} +2 -2
- package/dist/cli/chunks/{ci-config-UQSILJFQ.js → ci-config-PNDLQ6XV.js} +2 -2
- package/dist/cli/chunks/{ci-output-U6YZLLKH.js → ci-output-PFZ4M7NC.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ATYQP6X2.js → circuit-breaker-5HH6NLZN.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-6YHFD7AN.js → claude-flow-setup-QCKYLGLC.js} +2 -2
- package/dist/cli/chunks/client-MHQRTZM4.js +2 -0
- package/dist/cli/chunks/{cline-installer-EPE7IOZE.js → cline-installer-EASVPFXR.js} +2 -2
- package/dist/cli/chunks/{code-NUEJ4XYO.js → code-UJXDVYRK.js} +4 -3
- package/dist/cli/chunks/{code-index-extractor-D4DBT6OL.js → code-index-extractor-BZJ3UDP4.js} +2 -2
- package/dist/cli/chunks/{codex-installer-633SM4LR.js → codex-installer-XSQZUVOZ.js} +4 -4
- package/dist/cli/chunks/{completions-WUKVIW3L.js → completions-OWOOJFI2.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-F73ACR5H.js → complexity-analyzer-KP5TOHDT.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-QH42TKMS.js → continuedev-installer-IFKQXLHM.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-Y3XC7BTT.js → copilot-installer-IGJ6KGQY.js} +2 -2
- package/dist/cli/chunks/core-handlers-UAK3LLJE.js +2 -0
- package/dist/cli/chunks/{cost-tracker-57QPV7E3.js → cost-tracker-MMDDNKZB.js} +2 -2
- package/dist/cli/chunks/{coverage-IBCHMBCR.js → coverage-LUH2B7NT.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +2 -0
- package/dist/cli/chunks/{cursor-installer-F4UYQHIN.js → cursor-installer-4YLM5GWM.js} +2 -2
- package/dist/cli/chunks/daemon-CAVZ7OFV.js +18 -0
- package/dist/cli/chunks/{daemon-XR4Q6YZF.js → daemon-MZKVM4CJ.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-ZR5ZD3TW.js → dag-attention-scheduler-X4CYW665.js} +2 -2
- package/dist/cli/chunks/{detect-GEGYURLL.js → detect-7BM2XINO.js} +2 -2
- package/dist/cli/chunks/{dist-node-JU3KT2JO.js → dist-node-Y5APLEYB.js} +2 -2
- package/dist/cli/chunks/{domain-handler-7QI3FJGE.js → domain-handler-X3ZRJNAH.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-O2YRM2PD.js → domain-plugins-2UW5KQJB.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-7J3S2OS6.js → domain-transfer-35W4CIBV.js} +2 -2
- package/dist/cli/chunks/dream-EJY24JN6.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +3 -0
- package/dist/cli/chunks/embedding-space-SBM2MZD2.js +2 -0
- package/dist/cli/chunks/{eval-RVMCIUOR.js → eval-4QA2SROK.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-Z6BF6KYM.js +40 -0
- package/dist/cli/chunks/{fast-paths-QUKPKWKZ.js → fast-paths-FIORX6GN.js} +2 -2
- package/dist/cli/chunks/{feature-flags-K7JXNKJI.js → feature-flags-6LYI2T4G.js} +2 -2
- package/dist/cli/chunks/{feature-flags-5JCSKL2P.js → feature-flags-ZOO7LMIC.js} +2 -2
- package/dist/cli/chunks/file-discovery-UZSFSS4V.js +2 -0
- package/dist/cli/chunks/{fleet-II4Q6HXK.js → fleet-7WF53H4F.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-M7VO2EMS.js → gnn-wrapper-KJ6B7BRM.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-ND5CY26N.js → heartbeat-handler-DEKKMOVW.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +2 -0
- package/dist/cli/chunks/hnsw-index-POCPMVJH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-N3AUUUU7.js → hnsw-legacy-bridge-L27WS27N.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-NZY3E5EN.js → hnswlib-node-4YOQC6L4.js} +2 -2
- package/dist/cli/chunks/{hooks-QVJDTII5.js → hooks-TAOKV4EJ.js} +23 -22
- package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ZRY6MTDV.js → hypergraph-engine-BODRJLHL.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-56DO4XZQ.js → hypergraph-handler-RKMYJNTU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +2 -0
- package/dist/cli/chunks/{init-guard-DTF4EVUY.js → init-guard-MXHSLSB2.js} +2 -2
- package/dist/cli/chunks/{init-handler-M6CNQHMX.js → init-handler-HUE57IFW.js} +6 -6
- package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +2 -0
- package/dist/cli/chunks/kernel-CCDWT7KS.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-IJN7XKBH.js → kilocode-installer-S333IKYQ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-UKKPGPDC.js → kiro-installer-WM5DLQWC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +2 -0
- package/dist/cli/chunks/{learning-W2HETWQ4.js → learning-LNHMQLH5.js} +3 -3
- package/dist/cli/chunks/{llm-router-Y546K4VX.js → llm-router-EWFXYZZR.js} +4 -4
- package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +2 -0
- package/dist/cli/chunks/{load-MKAB2AXE.js → load-FGYGWVDK.js} +2 -2
- package/dist/cli/chunks/load-test-UNZUWY3F.js +2 -0
- package/dist/cli/chunks/{mcp-AZKUS6K3.js → mcp-2FHNAAOM.js} +2 -2
- package/dist/cli/chunks/{memory-ZDOQN2KU.js → memory-DZMQ73AB.js} +5 -5
- package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +2 -0
- package/dist/cli/chunks/memory-handlers-MP426XRJ.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-WWVXDHG4.js → multi-model-executor-6F2UAEUW.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-YUJNXXWS.js → opencode-installer-XY3BGOTZ.js} +2 -2
- package/dist/cli/chunks/{orchestrator-Z6PWPLRE.js → orchestrator-B4CNKUOS.js} +17 -17
- package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-TPWPX32U.js → pattern-usage-recorder-R4GUFNMD.js} +2 -2
- package/dist/cli/chunks/{pipeline-4BBGTE4M.js → pipeline-FG5RKVRO.js} +2 -2
- package/dist/cli/chunks/{platform-5GSHXCV5.js → platform-3BT4KEVJ.js} +2 -2
- package/dist/cli/chunks/{plugin-OFDVF5HS.js → plugin-WI4RIN7O.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NC6MUYGJ.js → prime-radiant-advanced-wasm-7ECDNQFS.js} +2 -2
- package/dist/cli/chunks/project-root-BEANNYWU.js +2 -0
- package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +2 -0
- package/dist/cli/chunks/{protocol-handler-MPOAAEPA.js → protocol-handler-WNODKPGW.js} +2 -2
- package/dist/cli/chunks/{prove-CDKMAIVM.js → prove-5RHAEPYZ.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +2 -0
- package/dist/cli/chunks/{quality-ZH4F7R7R.js → quality-WPHR7BGQ.js} +2 -2
- package/dist/cli/chunks/{quality-gate-IDRMW6OE.js → quality-gate-4RKTEZMX.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +2 -0
- package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +2 -0
- package/dist/cli/chunks/{ref-validation-Z5GCGVXK.js → ref-validation-TPAWHOHH.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-IZ2S7PH2.js → roocode-installer-7AVHFNDI.js} +2 -2
- package/dist/cli/chunks/router-EP34O3KB.js +2 -0
- package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +2 -0
- package/dist/cli/chunks/{routing-handler-NAX35VUW.js → routing-handler-YKEDVJSH.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-5YW2SOFF.js → ruvector-commands-JUAMM354.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-IPGCAT6C.js → rvf-store-integrity-VJDUIRTX.js} +2 -2
- package/dist/cli/chunks/safe-db-TCAU4FUT.js +2 -0
- package/dist/cli/chunks/schedule-NB5KV435.js +2 -0
- package/dist/cli/chunks/scheduler-JKXGKVK6.js +2 -0
- package/dist/cli/chunks/{security-3IH4BO5Z.js → security-ORDN3RD2.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-ABY7PAY2.js → shared-rvf-adapter-CF4BCIO7.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-6KENLN2W.js → shared-rvf-dual-writer-C32UBR6D.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +2 -0
- package/dist/cli/chunks/{standalone-memory-RLFAUGOW.js → standalone-memory-OXRJYZXN.js} +2 -2
- package/dist/cli/chunks/{status-handler-FCOZBPE5.js → status-handler-BCX5D4HY.js} +2 -2
- package/dist/cli/chunks/{structural-health-4RDA5UUM.js → structural-health-LFG7RUU6.js} +2 -2
- package/dist/cli/chunks/sync-OSF7C2NL.js +2 -0
- package/dist/cli/chunks/{sync-KGEEXXCC.js → sync-YJEE2K2L.js} +2 -2
- package/dist/cli/chunks/task-handler-6LXKPTXJ.js +64 -0
- package/dist/cli/chunks/{task-handlers-6H7L2UT4.js → task-handlers-CILP36I7.js} +4 -4
- package/dist/cli/chunks/{test-S7IG6EIX.js → test-SD457QJ6.js} +4 -4
- package/dist/cli/chunks/test-runner-process-VKD65QQU.js +2 -0
- package/dist/cli/chunks/{test-scheduling-7XYXI4L2.js → test-scheduling-ISI2O4Q5.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +2 -0
- package/dist/cli/chunks/{token-usage-Y2YTPOFE.js → token-usage-XOC5KG7S.js} +2 -2
- package/dist/cli/chunks/{transformers-UCJ3HHHC.js → transformers-LSLQAARK.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +2 -0
- package/dist/cli/chunks/{types-6CMFPETH.js → types-5BLCGLCR.js} +2 -2
- package/dist/cli/chunks/unified-memory-GI76TXFV.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +2 -0
- package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +2 -0
- package/dist/cli/chunks/{upgrade-K25DN6WU.js → upgrade-RQJYLK3J.js} +2 -2
- package/dist/cli/chunks/{validate-T4V3TBY3.js → validate-QBHWXXCK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-XSRC576T.js → validate-swarm-IKXBKFB5.js} +2 -2
- package/dist/cli/chunks/visual-security-GZ2MOKWB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-YOZXHRTN.js → web-tree-sitter-ZF6FIE5R.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-ITPU2IYL.js → windsurf-installer-HQGDZT5D.js} +2 -2
- package/dist/cli/chunks/witness-chain-DCHCAMSQ.js +2 -0
- package/dist/cli/chunks/witness-chain-P3XXXA62.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-DTDSVKOG.js → witness-chain-verifier-PX2OQ6XT.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-EWACWGAW.js → witness-key-manager-RXYQNFJB.js} +2 -2
- package/dist/cli/chunks/{workflow-ZIQ4FV42.js → workflow-FBKCA4H6.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +2 -0
- package/dist/cli/chunks/wrappers-TWSKBTWD.js +2 -0
- package/dist/cli/commands/code.js +4 -0
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +21 -1
- package/dist/cli/utils/task-result.d.ts +11 -0
- package/dist/cli/utils/task-result.js +39 -0
- package/dist/coordination/handlers/test-execution-handlers.js +92 -58
- package/dist/coordination/mincut/mincut-persistence.js +29 -25
- package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
- package/dist/domains/code-intelligence/coordinator.js +46 -13
- package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +32 -7
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +112 -53
- package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
- package/dist/domains/quality-assessment/coordinator.js +2 -1
- package/dist/domains/test-execution/coordinator.js +10 -5
- package/dist/domains/test-execution/interfaces.d.ts +12 -0
- package/dist/domains/test-execution/plugin.js +6 -2
- package/dist/domains/test-execution/services/retry-handler.d.ts +2 -0
- package/dist/domains/test-execution/services/retry-handler.js +14 -9
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +28 -9
- package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
- package/dist/domains/visual-accessibility/coordinator.js +15 -7
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
- package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
- package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
- package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
- package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
- package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
- package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
- package/dist/feedback/coverage-learner.js +13 -9
- package/dist/feedback/test-outcome-tracker.js +13 -9
- package/dist/governance/witness-chain.d.ts +5 -0
- package/dist/governance/witness-chain.js +22 -6
- package/dist/init/init-wizard-hooks.d.ts +1 -1
- package/dist/init/init-wizard-hooks.js +7 -8
- package/dist/init/phases/08-mcp.js +9 -0
- package/dist/init/settings-merge.d.ts +13 -0
- package/dist/init/settings-merge.js +49 -2
- package/dist/integrations/agent-booster-wasm/agent_booster_wasm.js +849 -0
- package/dist/integrations/agent-booster-wasm/agent_booster_wasm_bg.wasm +0 -0
- package/dist/integrations/agent-booster-wasm/index.d.ts +8 -0
- package/dist/integrations/agent-booster-wasm/index.js +25 -2
- package/dist/integrations/agent-booster-wasm/package.json +16 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
- package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
- package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
- package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
- package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
- package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
- package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
- package/dist/integrations/ruvector/delta-tracker.js +16 -0
- package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
- package/dist/integrations/ruvector/sona-persistence.js +49 -24
- package/dist/kernel/unified-memory.d.ts +24 -0
- package/dist/kernel/unified-memory.js +63 -8
- package/dist/learning/aqe-learning-engine.js +1 -1
- package/dist/learning/dream/dream-engine.d.ts +3 -2
- package/dist/learning/dream/dream-engine.js +42 -24
- package/dist/learning/dream/dream-lock-retry.d.ts +38 -0
- package/dist/learning/dream/dream-lock-retry.js +66 -0
- package/dist/learning/dream/speculative-dreamer.js +1 -1
- package/dist/learning/embed-and-insert-pattern.js +4 -2
- package/dist/learning/embedder-endpoint-client.d.ts +31 -0
- package/dist/learning/embedder-endpoint-client.js +103 -10
- package/dist/learning/embedding-space.d.ts +12 -0
- package/dist/learning/embedding-space.js +17 -0
- package/dist/learning/experience-capture-middleware.js +25 -13
- package/dist/learning/experience-capture.js +1 -1
- package/dist/learning/experience-consolidation.d.ts +18 -0
- package/dist/learning/experience-consolidation.js +55 -8
- package/dist/learning/experience-space-verification.d.ts +71 -0
- package/dist/learning/experience-space-verification.js +147 -0
- package/dist/learning/pattern-lifecycle.d.ts +40 -4
- package/dist/learning/pattern-lifecycle.js +153 -76
- package/dist/learning/pattern-null-store.d.ts +5 -0
- package/dist/learning/pattern-null-store.js +8 -0
- package/dist/learning/pattern-promotion.js +6 -3
- package/dist/learning/pattern-store.d.ts +6 -0
- package/dist/learning/pattern-store.js +19 -6
- package/dist/learning/qe-reasoning-bank.js +2 -2
- package/dist/learning/real-embeddings.js +3 -1
- package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
- package/dist/learning/real-qe-reasoning-bank.js +77 -47
- package/dist/learning/rvf-pattern-store.js +6 -2
- package/dist/learning/sqlite-persistence.d.ts +6 -0
- package/dist/learning/sqlite-persistence.js +10 -0
- package/dist/mcp/bundle.js +642 -571
- package/dist/mcp/entry.js +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +2 -0
- package/dist/mcp/handlers/trajectory-judge.js +1 -1
- package/dist/mcp/protocol-server.js +1 -0
- package/dist/mcp/tools/visual-accessibility/index.js +8 -2
- package/dist/mcp/types.d.ts +6 -0
- package/dist/optimization/session-cache.d.ts +17 -1
- package/dist/optimization/session-cache.js +40 -36
- package/dist/planning/goap-planner.d.ts +6 -0
- package/dist/planning/goap-planner.js +35 -19
- package/dist/planning/plan-executor.js +24 -15
- package/dist/routing/co-execution-repository.js +12 -9
- package/dist/routing/routing-feedback.d.ts +8 -0
- package/dist/routing/routing-feedback.js +46 -24
- package/dist/routing/routing-outcomes-migration.js +7 -2
- package/dist/shared/llm/spend-ledger.d.ts +9 -0
- package/dist/shared/llm/spend-ledger.js +64 -39
- package/dist/shared/sqlite-lock-wait.d.ts +27 -0
- package/dist/shared/sqlite-lock-wait.js +37 -0
- package/dist/shared/sqlite-write-queue.d.ts +28 -0
- package/dist/shared/sqlite-write-queue.js +38 -0
- package/dist/shared/test-runner-project.d.ts +69 -0
- package/dist/shared/test-runner-project.js +186 -0
- package/dist/skills/security-visual-testing/index.d.ts +3 -1
- package/dist/skills/security-visual-testing/index.js +49 -35
- package/dist/skills/security-visual-testing/types.d.ts +19 -3
- package/dist/workers/workers/heartbeat-scheduler.js +5 -5
- package/dist/workers/workers/learning-consolidation.js +8 -7
- package/package.json +4 -2
- package/dist/cli/chunks/adapter-23KA2YW7.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-2DLAEZK6.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +0 -2
- package/dist/cli/chunks/base-XPWGYDKD.js +0 -2
- package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +0 -2
- package/dist/cli/chunks/chunk-3FITMWWJ.js +0 -21
- package/dist/cli/chunks/chunk-ARRBXCII.js +0 -4
- package/dist/cli/chunks/chunk-BBYJBZHG.js +0 -14
- package/dist/cli/chunks/chunk-BM3EJLMV.js +0 -153
- package/dist/cli/chunks/chunk-D3ZZ2NLL.js +0 -62
- package/dist/cli/chunks/chunk-DLTB5KCR.js +0 -2
- package/dist/cli/chunks/chunk-DRLSJJIC.js +0 -6
- package/dist/cli/chunks/chunk-HAYKLXCT.js +0 -744
- package/dist/cli/chunks/chunk-HHBF2BZC.js +0 -65
- package/dist/cli/chunks/chunk-K7RT6ITZ.js +0 -2
- package/dist/cli/chunks/chunk-L752CNG3.js +0 -13
- package/dist/cli/chunks/chunk-MQXWG55U.js +0 -12
- package/dist/cli/chunks/chunk-WM2QRIRD.js +0 -14
- package/dist/cli/chunks/chunk-WRC3HLUY.js +0 -29
- package/dist/cli/chunks/chunk-XTZGAG6P.js +0 -27
- package/dist/cli/chunks/chunk-YKQWIXUY.js +0 -2
- package/dist/cli/chunks/client-E43GWLQH.js +0 -2
- package/dist/cli/chunks/core-handlers-R5A3SQDY.js +0 -2
- package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +0 -2
- package/dist/cli/chunks/daemon-BYYPIJ7G.js +0 -18
- package/dist/cli/chunks/dream-6C4NURSE.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-URES5Q6J.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-SYJQSBKE.js +0 -40
- package/dist/cli/chunks/file-discovery-J5IE5KP7.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +0 -2
- package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +0 -2
- package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +0 -2
- package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +0 -2
- package/dist/cli/chunks/init-wizard-RTLCRWDT.js +0 -2
- package/dist/cli/chunks/kernel-2OWIGGGT.js +0 -2
- package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +0 -2
- package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +0 -2
- package/dist/cli/chunks/load-test-D6QYNIVT.js +0 -2
- package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +0 -2
- package/dist/cli/chunks/memory-handlers-3SQVY7FE.js +0 -2
- package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +0 -2
- package/dist/cli/chunks/project-root-DDGBWDP6.js +0 -2
- package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +0 -2
- package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +0 -2
- package/dist/cli/chunks/real-embeddings-I2UVNNB3.js +0 -2
- package/dist/cli/chunks/router-FT5WJPUH.js +0 -2
- package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-VUIZHTVG.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +0 -2
- package/dist/cli/chunks/safe-db-TDZKUOZJ.js +0 -2
- package/dist/cli/chunks/schedule-CRKTRY2A.js +0 -2
- package/dist/cli/chunks/scheduler-6ZBDVQWN.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +0 -2
- package/dist/cli/chunks/sync-54LUAUTK.js +0 -2
- package/dist/cli/chunks/task-handler-K3OXHYKU.js +0 -62
- package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +0 -2
- package/dist/cli/chunks/token-bootstrap-3QMABE45.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +0 -2
- package/dist/cli/chunks/unified-memory-QARWQKJ2.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +0 -2
- package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +0 -2
- package/dist/cli/chunks/visual-security-O4ALMCXQ.js +0 -2
- package/dist/cli/chunks/witness-chain-B3YW5NMS.js +0 -2
- package/dist/cli/chunks/witness-chain-PIYR72HJ.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-YUG7E3UX.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +0 -2
- package/dist/cli/chunks/wrappers-PW2O27LL.js +0 -2
|
@@ -160,6 +160,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
160
160
|
workers,
|
|
161
161
|
timeout,
|
|
162
162
|
retryCount: request.retryCount,
|
|
163
|
+
projectRoot: request.projectRoot,
|
|
163
164
|
});
|
|
164
165
|
}
|
|
165
166
|
// Sequential execution
|
|
@@ -168,6 +169,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
168
169
|
framework,
|
|
169
170
|
timeout,
|
|
170
171
|
retryCount: request.retryCount,
|
|
172
|
+
projectRoot: request.projectRoot,
|
|
171
173
|
});
|
|
172
174
|
}
|
|
173
175
|
/**
|
|
@@ -176,7 +178,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
176
178
|
* as passed and flaky in the run's own counts (#1170). When that changes
|
|
177
179
|
* the outcome, the run is stored again with it (#1176).
|
|
178
180
|
*/
|
|
179
|
-
async retryFailures(run, retryCount, testFiles) {
|
|
181
|
+
async retryFailures(run, retryCount, testFiles, projectRoot) {
|
|
180
182
|
if (!retryCount || retryCount <= 0)
|
|
181
183
|
return;
|
|
182
184
|
if (run.failed === 0) {
|
|
@@ -188,6 +190,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
188
190
|
failedTests: run.failedTests.map(t => t.testId),
|
|
189
191
|
maxRetries: retryCount,
|
|
190
192
|
backoff: 'exponential',
|
|
193
|
+
projectRoot,
|
|
191
194
|
});
|
|
192
195
|
if (!retried.success)
|
|
193
196
|
return;
|
|
@@ -258,7 +261,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
258
261
|
// #1176: these first-attempt failures did happen; flaky analysis
|
|
259
262
|
// records them even when a retry then passes.
|
|
260
263
|
const firstAttemptFailures = [...result.value.failedTests];
|
|
261
|
-
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
264
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
|
|
262
265
|
// Record execution results for learning
|
|
263
266
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
264
267
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
@@ -296,7 +299,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
296
299
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
297
300
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
298
301
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
299
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
|
|
302
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
|
|
300
303
|
if (rerunResult)
|
|
301
304
|
return rerunResult;
|
|
302
305
|
}
|
|
@@ -367,7 +370,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
367
370
|
this.activeRuns.delete(runId);
|
|
368
371
|
if (result.success) {
|
|
369
372
|
// #1176: retries finish before the run is recorded or announced.
|
|
370
|
-
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
373
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
|
|
371
374
|
// Record execution results for learning
|
|
372
375
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
373
376
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
@@ -407,7 +410,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
407
410
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
408
411
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
409
412
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
410
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
|
|
413
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
|
|
411
414
|
if (rerunResult)
|
|
412
415
|
return rerunResult;
|
|
413
416
|
}
|
|
@@ -510,6 +513,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
510
513
|
failedTests: testsToRetry,
|
|
511
514
|
maxRetries: request.maxRetries,
|
|
512
515
|
backoff: request.backoff ?? 'exponential',
|
|
516
|
+
projectRoot: request.projectRoot,
|
|
513
517
|
onRetry: (testId, attempt) => {
|
|
514
518
|
// Could publish individual retry events here
|
|
515
519
|
void testId;
|
|
@@ -630,6 +634,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
630
634
|
timeout: originalRequest.timeout,
|
|
631
635
|
env: originalRequest.env,
|
|
632
636
|
retryCount: originalRequest.retryCount,
|
|
637
|
+
projectRoot: originalRequest.projectRoot,
|
|
633
638
|
});
|
|
634
639
|
}
|
|
635
640
|
/**
|
|
@@ -47,6 +47,11 @@ export interface ISimpleTestRequest {
|
|
|
47
47
|
timeout?: number;
|
|
48
48
|
/** Number of parallel workers (default: auto based on file count) */
|
|
49
49
|
workers?: number;
|
|
50
|
+
/**
|
|
51
|
+
* #1247: directory to run every file from, already checked to be inside the
|
|
52
|
+
* project. When omitted, each file runs from its nearest runner project.
|
|
53
|
+
*/
|
|
54
|
+
projectRoot?: string;
|
|
50
55
|
}
|
|
51
56
|
export interface IExecuteTestsRequest {
|
|
52
57
|
testFiles: string[];
|
|
@@ -59,6 +64,11 @@ export interface IExecuteTestsRequest {
|
|
|
59
64
|
* or TestRunCompleted is published, so both carry the final outcome.
|
|
60
65
|
*/
|
|
61
66
|
retryCount?: number;
|
|
67
|
+
/**
|
|
68
|
+
* #1247: directory to run every file from, already checked to be inside the
|
|
69
|
+
* project. When omitted, each file runs from its nearest runner project.
|
|
70
|
+
*/
|
|
71
|
+
projectRoot?: string;
|
|
62
72
|
}
|
|
63
73
|
export interface IParallelExecutionRequest extends IExecuteTestsRequest {
|
|
64
74
|
workers: number;
|
|
@@ -173,6 +183,8 @@ export interface IRetryRequest {
|
|
|
173
183
|
failedTests: string[];
|
|
174
184
|
maxRetries: number;
|
|
175
185
|
backoff?: 'linear' | 'exponential';
|
|
186
|
+
/** #1247: the run's explicit projectRoot; retries run from it too. */
|
|
187
|
+
projectRoot?: string;
|
|
176
188
|
}
|
|
177
189
|
export interface IRetryResult {
|
|
178
190
|
originalFailed: number;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { err } from '../../shared/types/index.js';
|
|
6
6
|
import { BaseDomainPlugin } from '../domain-interface.js';
|
|
7
7
|
import { requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
|
|
8
|
+
import { requireTestRunTargets } from '../../shared/test-runner-project.js';
|
|
8
9
|
import { createTestExecutionCoordinator } from './coordinator.js';
|
|
9
10
|
import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
|
|
10
11
|
import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
|
|
@@ -65,12 +66,14 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
65
66
|
// directories (#909 Jest targets) inside the project, passed on as the
|
|
66
67
|
// real paths that were checked. A missing one is still reported by the
|
|
67
68
|
// runner.
|
|
69
|
+
// #1247: an explicit projectRoot is confined the same way.
|
|
68
70
|
let testFiles;
|
|
71
|
+
let projectRoot;
|
|
69
72
|
if (payload.testFiles !== undefined) {
|
|
70
|
-
const confined = await
|
|
73
|
+
const confined = await requireTestRunTargets('execute-tests', payload.testFiles, payload.projectRoot);
|
|
71
74
|
if (!confined.success)
|
|
72
75
|
return confined;
|
|
73
|
-
testFiles = confined.value;
|
|
76
|
+
({ testFiles, projectRoot } = confined.value);
|
|
74
77
|
}
|
|
75
78
|
// Support both simple and full request formats
|
|
76
79
|
if (testFiles) {
|
|
@@ -81,6 +84,7 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
81
84
|
retryCount: payload.retryCount,
|
|
82
85
|
timeout: payload.timeout,
|
|
83
86
|
workers: payload.workers,
|
|
87
|
+
projectRoot,
|
|
84
88
|
};
|
|
85
89
|
return this.coordinator.runTests(request);
|
|
86
90
|
}
|
|
@@ -74,6 +74,8 @@ export interface RetryExecutionRequest {
|
|
|
74
74
|
baseDelay?: number;
|
|
75
75
|
maxDelay?: number;
|
|
76
76
|
onRetry?: (testId: string, attempt: number) => void;
|
|
77
|
+
/** #1247: the run's explicit projectRoot; every retry runs from it. */
|
|
78
|
+
projectRoot?: string;
|
|
77
79
|
}
|
|
78
80
|
export interface RetryStatistics {
|
|
79
81
|
totalRetries: number;
|
|
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../logging/index.js';
|
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
8
8
|
import { jestExactPathPattern, nameFilterArg, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
9
|
+
import { runnerCwdFor } from '../../../shared/test-runner-project.js';
|
|
9
10
|
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
10
11
|
import { resolve as resolvePath } from 'node:path';
|
|
11
12
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -92,7 +93,7 @@ export class RetryHandlerService {
|
|
|
92
93
|
* Execute failed tests with retry logic
|
|
93
94
|
*/
|
|
94
95
|
async executeWithRetry(request) {
|
|
95
|
-
const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, } = request;
|
|
96
|
+
const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, projectRoot, } = request;
|
|
96
97
|
try {
|
|
97
98
|
const stats = {
|
|
98
99
|
runId,
|
|
@@ -108,7 +109,7 @@ export class RetryHandlerService {
|
|
|
108
109
|
const unmatched = [];
|
|
109
110
|
const tests = [];
|
|
110
111
|
for (const test of failedTests) {
|
|
111
|
-
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
|
|
112
|
+
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot);
|
|
112
113
|
stats.totalRetries += result.attempts;
|
|
113
114
|
if (result.passed) {
|
|
114
115
|
nowPassing.push(test.testId);
|
|
@@ -228,7 +229,7 @@ export class RetryHandlerService {
|
|
|
228
229
|
return false;
|
|
229
230
|
}
|
|
230
231
|
}
|
|
231
|
-
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
|
|
232
|
+
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot) {
|
|
232
233
|
let attempts = 0;
|
|
233
234
|
// #1122: the final error is persisted in retry-history, so keep it redacted.
|
|
234
235
|
let lastError = redactFailureText(test.error);
|
|
@@ -246,7 +247,7 @@ export class RetryHandlerService {
|
|
|
246
247
|
onRetry(test.testId, attempts + 1);
|
|
247
248
|
}
|
|
248
249
|
// Execute test (simulated - in real implementation, would run actual test)
|
|
249
|
-
const result = await this.executeTest(test);
|
|
250
|
+
const result = await this.executeTest(test, projectRoot);
|
|
250
251
|
// #1141: a filter that selected no test reran nothing. Report that
|
|
251
252
|
// instead of counting it as a retry, and stop: another attempt would
|
|
252
253
|
// select nothing again.
|
|
@@ -272,7 +273,7 @@ export class RetryHandlerService {
|
|
|
272
273
|
finalError: lastError,
|
|
273
274
|
};
|
|
274
275
|
}
|
|
275
|
-
async executeTest(test) {
|
|
276
|
+
async executeTest(test, projectRoot) {
|
|
276
277
|
// In simulation mode (for unit testing), use random behavior
|
|
277
278
|
if (this.config.simulateForTesting) {
|
|
278
279
|
const passOnRetry = secureRandom() < this.config.simulatedRetrySuccessRate;
|
|
@@ -282,12 +283,12 @@ export class RetryHandlerService {
|
|
|
282
283
|
};
|
|
283
284
|
}
|
|
284
285
|
// In production mode, actually execute the test
|
|
285
|
-
return this.executeRealTest(test);
|
|
286
|
+
return this.executeRealTest(test, projectRoot);
|
|
286
287
|
}
|
|
287
288
|
/**
|
|
288
289
|
* Execute a real test using the configured test runner
|
|
289
290
|
*/
|
|
290
|
-
async executeRealTest(test) {
|
|
291
|
+
async executeRealTest(test, projectRoot) {
|
|
291
292
|
const testFile = test.file;
|
|
292
293
|
const testName = test.testName;
|
|
293
294
|
const cwd = this.config.cwd ?? process.cwd();
|
|
@@ -295,8 +296,12 @@ export class RetryHandlerService {
|
|
|
295
296
|
if (!existsSync(testFile)) {
|
|
296
297
|
throw new Error(`Test file not found: ${testFile}. Cannot retry non-existent test file.`);
|
|
297
298
|
}
|
|
299
|
+
// #1247: retry from the same directory as the first run: the caller's
|
|
300
|
+
// projectRoot, else a configured directory, else the file's runner
|
|
301
|
+
// project. The file path stays relative to `cwd`.
|
|
302
|
+
const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
|
|
298
303
|
// Detect or use configured test runner
|
|
299
|
-
const runner = await this.detectTestRunner(
|
|
304
|
+
const runner = await this.detectTestRunner(runCwd);
|
|
300
305
|
if (!runner) {
|
|
301
306
|
throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
|
|
302
307
|
`or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
|
|
@@ -304,7 +309,7 @@ export class RetryHandlerService {
|
|
|
304
309
|
// Build command based on runner
|
|
305
310
|
const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
|
|
306
311
|
// Execute the test
|
|
307
|
-
return this.spawnTestProcess(command, args,
|
|
312
|
+
return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined);
|
|
308
313
|
}
|
|
309
314
|
/**
|
|
310
315
|
* Detect which test runner is available in the project
|
|
@@ -113,6 +113,7 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
113
113
|
private mergeSequentialCoverage;
|
|
114
114
|
private executeTestFile;
|
|
115
115
|
private executeTestFiles;
|
|
116
|
+
private executeProjectFiles;
|
|
116
117
|
/**
|
|
117
118
|
* Spawn actual test runner process (vitest, jest, mocha)
|
|
118
119
|
*/
|
|
@@ -21,6 +21,7 @@ import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunn
|
|
|
21
21
|
import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
22
22
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
23
23
|
import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
24
|
+
import { groupByRunnerProject } from '../../../shared/test-runner-project.js';
|
|
24
25
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
25
26
|
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
26
27
|
const DEFAULT_CONFIG = {
|
|
@@ -314,7 +315,7 @@ Provide:
|
|
|
314
315
|
return ok(undefined);
|
|
315
316
|
}
|
|
316
317
|
async runTests(request) {
|
|
317
|
-
const { testFiles, framework, timeout = 30000 } = request;
|
|
318
|
+
const { testFiles, framework, timeout = 30000, projectRoot } = request;
|
|
318
319
|
const failedTests = [];
|
|
319
320
|
const coverages = [];
|
|
320
321
|
const allFileCoverages = [];
|
|
@@ -323,7 +324,7 @@ Provide:
|
|
|
323
324
|
let failed = 0;
|
|
324
325
|
let skipped = 0;
|
|
325
326
|
for (const file of testFiles) {
|
|
326
|
-
const result = await this.executeTestFile(file, framework, timeout);
|
|
327
|
+
const result = await this.executeTestFile(file, framework, timeout, projectRoot);
|
|
327
328
|
executionResults.push(result);
|
|
328
329
|
passed += result.passed;
|
|
329
330
|
failed += result.failed;
|
|
@@ -393,16 +394,34 @@ Provide:
|
|
|
393
394
|
const coverage = this.extractCoverageFromJson({ coverageMap: merged });
|
|
394
395
|
return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
|
|
395
396
|
}
|
|
396
|
-
async executeTestFile(file, framework, timeout) {
|
|
397
|
-
return this.executeTestFiles([file], framework, timeout);
|
|
397
|
+
async executeTestFile(file, framework, timeout, projectRoot) {
|
|
398
|
+
return this.executeTestFiles([file], framework, timeout, projectRoot);
|
|
398
399
|
}
|
|
399
|
-
async executeTestFiles(files, framework, timeout) {
|
|
400
|
+
async executeTestFiles(files, framework, timeout, projectRoot) {
|
|
400
401
|
// In simulation mode (for unit testing), use random behavior
|
|
401
402
|
if (this.config.simulateForTesting) {
|
|
402
403
|
return this.aggregateResults(files.map(file => this.simulateTestExecution(file)));
|
|
403
404
|
}
|
|
405
|
+
// #1247: a runner loads the config of the directory it starts in, so each
|
|
406
|
+
// file runs from its own runner project (or the caller's projectRoot).
|
|
407
|
+
const groups = projectRoot
|
|
408
|
+
? [{ cwd: projectRoot, files }]
|
|
409
|
+
: groupByRunnerProject(files);
|
|
410
|
+
if (groups.length === 1) {
|
|
411
|
+
return this.executeProjectFiles(groups[0].files, framework, timeout, groups[0].cwd);
|
|
412
|
+
}
|
|
413
|
+
// Each project gets its own runner and timeout. Their coverage maps are
|
|
414
|
+
// merged from raw counters, or left unmeasured (#1030).
|
|
415
|
+
const results = await Promise.all(groups.map(group => this.executeProjectFiles(group.files, framework, timeout, group.cwd)));
|
|
416
|
+
const combined = this.aggregateResults(results);
|
|
417
|
+
const merged = this.mergeSequentialCoverage(results);
|
|
418
|
+
combined.coverage = merged?.summary;
|
|
419
|
+
combined.fileCoverages = merged?.perFile;
|
|
420
|
+
return combined;
|
|
421
|
+
}
|
|
422
|
+
async executeProjectFiles(files, framework, timeout, cwd) {
|
|
404
423
|
// Production mode: spawn actual test runner process
|
|
405
|
-
const result = await this.spawnTestRunner(files, framework, timeout);
|
|
424
|
+
const result = await this.spawnTestRunner(files, framework, timeout, cwd);
|
|
406
425
|
if (result.success === false) {
|
|
407
426
|
// Runner/suite errors have no trustworthy assertion receipt to aggregate.
|
|
408
427
|
if (result.error instanceof TestRunnerExecutionError)
|
|
@@ -428,7 +447,7 @@ Provide:
|
|
|
428
447
|
/**
|
|
429
448
|
* Spawn actual test runner process (vitest, jest, mocha)
|
|
430
449
|
*/
|
|
431
|
-
async spawnTestRunner(files, framework, timeout) {
|
|
450
|
+
async spawnTestRunner(files, framework, timeout, cwd = process.cwd()) {
|
|
432
451
|
// Verify test file exists
|
|
433
452
|
const missingFile = files.find(file => !existsSync(file));
|
|
434
453
|
if (missingFile) {
|
|
@@ -466,7 +485,7 @@ Provide:
|
|
|
466
485
|
let proc;
|
|
467
486
|
try {
|
|
468
487
|
proc = spawn(command, args, {
|
|
469
|
-
cwd
|
|
488
|
+
cwd,
|
|
470
489
|
detached: process.platform !== 'win32',
|
|
471
490
|
env: {
|
|
472
491
|
...process.env,
|
|
@@ -999,7 +1018,7 @@ Provide:
|
|
|
999
1018
|
return shards;
|
|
1000
1019
|
}
|
|
1001
1020
|
async executeWorker(files, _workerIndex, _isolation, request) {
|
|
1002
|
-
return this.executeTestFiles(files, request.framework, request.timeout ?? 30000);
|
|
1021
|
+
return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot);
|
|
1003
1022
|
}
|
|
1004
1023
|
aggregateResults(results) {
|
|
1005
1024
|
const aggregated = {
|
|
@@ -25,6 +25,20 @@ export interface WorkflowStatus {
|
|
|
25
25
|
progress: number;
|
|
26
26
|
error?: string;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* A color-contrast violation as axe-core measured it (#1228). A colour the
|
|
30
|
+
* browser did not report is null and an unreported ratio is -1, with
|
|
31
|
+
* measured: false.
|
|
32
|
+
*/
|
|
33
|
+
export interface ContrastIssue {
|
|
34
|
+
element: string;
|
|
35
|
+
foreground: string | null;
|
|
36
|
+
background: string | null;
|
|
37
|
+
ratio: number;
|
|
38
|
+
required: number;
|
|
39
|
+
measured: boolean;
|
|
40
|
+
notMeasuredReason?: string;
|
|
41
|
+
}
|
|
28
42
|
/**
|
|
29
43
|
* Coordinator configuration
|
|
30
44
|
*/
|
|
@@ -140,13 +154,7 @@ export declare class VisualAccessibilityCoordinator extends BaseDomainCoordinato
|
|
|
140
154
|
url: string;
|
|
141
155
|
wcagLevel?: 'A' | 'AA' | 'AAA';
|
|
142
156
|
}): Promise<Result<{
|
|
143
|
-
issues:
|
|
144
|
-
element: string;
|
|
145
|
-
foreground: string;
|
|
146
|
-
background: string;
|
|
147
|
-
ratio: number;
|
|
148
|
-
required: number;
|
|
149
|
-
}>;
|
|
157
|
+
issues: ContrastIssue[];
|
|
150
158
|
}, Error>>;
|
|
151
159
|
/**
|
|
152
160
|
* Test responsive design across multiple viewports
|
|
@@ -11,6 +11,7 @@ import { cosineSimilarity } from '../../shared/utils/vector-math.js';
|
|
|
11
11
|
import { createVisualTesterServiceWithDependencies, } from './services/visual-tester.js';
|
|
12
12
|
import { AccessibilityTesterService, } from './services/accessibility-tester.js';
|
|
13
13
|
import { ResponsiveTesterService, } from './services/responsive-tester.js';
|
|
14
|
+
import { contrastValues, contrastValuesMeasured, defaultRequiredRatio } from './services/accessibility-contrast.js';
|
|
14
15
|
import { A2CAlgorithm } from '../../integrations/rl-suite/algorithms/a2c.js';
|
|
15
16
|
import { createQEFlashAttention } from '../../integrations/ruvector/wrappers.js';
|
|
16
17
|
// CQ-002: Base domain coordinator
|
|
@@ -589,13 +590,20 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
|
|
|
589
590
|
}
|
|
590
591
|
// Filter for color contrast violations
|
|
591
592
|
const contrastViolations = auditResult.value.violations.filter((v) => v.id.includes('color-contrast') || v.id.includes('contrast'));
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
593
|
+
// #1228: the colours and ratio axe-core measured; unreported values are null / -1
|
|
594
|
+
const issues = contrastViolations.flatMap((violation) => violation.nodes.map((node) => {
|
|
595
|
+
const values = node.contrast ?? contrastValues(undefined, node.failureSummary);
|
|
596
|
+
const measured = contrastValuesMeasured(values);
|
|
597
|
+
return {
|
|
598
|
+
element: node.target.join(' '),
|
|
599
|
+
foreground: values.foreground,
|
|
600
|
+
background: values.background,
|
|
601
|
+
ratio: values.ratio ?? -1,
|
|
602
|
+
required: values.requiredRatio ?? defaultRequiredRatio(level),
|
|
603
|
+
measured,
|
|
604
|
+
...(measured ? {} : { notMeasuredReason: 'axe-core did not report the colours and ratio for this element' }),
|
|
605
|
+
};
|
|
606
|
+
}));
|
|
599
607
|
return ok({ issues });
|
|
600
608
|
}
|
|
601
609
|
catch (error) {
|
|
@@ -187,18 +187,36 @@ export interface ViolationNode {
|
|
|
187
187
|
readonly target: string[];
|
|
188
188
|
readonly failureSummary: string;
|
|
189
189
|
readonly fixSuggestion?: string;
|
|
190
|
+
/** Colours and ratio axe-core reported for a contrast violation (#1228). */
|
|
191
|
+
readonly contrast?: ContrastValues;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Colours and contrast ratio as the browser measured them (#1228).
|
|
195
|
+
* A value the browser did not report is null, never a default colour or ratio.
|
|
196
|
+
*/
|
|
197
|
+
export interface ContrastValues {
|
|
198
|
+
readonly foreground: string | null;
|
|
199
|
+
readonly background: string | null;
|
|
200
|
+
readonly ratio: number | null;
|
|
201
|
+
/** The ratio axe-core required for this element (3:1 for large text), when reported. */
|
|
202
|
+
readonly requiredRatio: number | null;
|
|
190
203
|
}
|
|
191
204
|
/**
|
|
192
205
|
* Color contrast analysis
|
|
193
206
|
*/
|
|
194
207
|
export interface ContrastAnalysis {
|
|
195
208
|
readonly element: string;
|
|
196
|
-
|
|
197
|
-
readonly
|
|
209
|
+
/** null when the browser did not report the colour (#1228). */
|
|
210
|
+
readonly foreground: string | null;
|
|
211
|
+
readonly background: string | null;
|
|
212
|
+
/** -1 when the browser did not report the ratio (#1228). */
|
|
198
213
|
readonly ratio: number;
|
|
199
214
|
readonly requiredRatio: number;
|
|
200
215
|
readonly passes: boolean;
|
|
201
216
|
readonly wcagLevel: 'A' | 'AA' | 'AAA';
|
|
217
|
+
/** false when the colours or ratio were not reported; see notMeasuredReason (#1228). */
|
|
218
|
+
readonly measured?: boolean;
|
|
219
|
+
readonly notMeasuredReason?: string;
|
|
202
220
|
}
|
|
203
221
|
export interface VisualRegressionDetectedEvent extends DomainEvent {
|
|
204
222
|
readonly type: 'VisualRegressionDetectedEvent';
|
|
@@ -360,12 +378,18 @@ export interface KeyboardNavigationReport {
|
|
|
360
378
|
readonly tabOrder: TabOrderItem[];
|
|
361
379
|
readonly issues: KeyboardIssue[];
|
|
362
380
|
readonly traps: FocusTrap[];
|
|
381
|
+
/**
|
|
382
|
+
* What this report did not measure (#1228). An empty `traps` list, or a
|
|
383
|
+
* null `hasVisibleFocus`, is not a clean result for an aspect listed here.
|
|
384
|
+
*/
|
|
385
|
+
readonly notMeasured?: string[];
|
|
363
386
|
}
|
|
364
387
|
export interface TabOrderItem {
|
|
365
388
|
readonly index: number;
|
|
366
389
|
readonly selector: string;
|
|
367
390
|
readonly elementType: string;
|
|
368
|
-
|
|
391
|
+
/** null: the focus indicator was not measured (#1228). */
|
|
392
|
+
readonly hasVisibleFocus: boolean | null;
|
|
369
393
|
}
|
|
370
394
|
export interface KeyboardIssue {
|
|
371
395
|
readonly type: 'no-focus-indicator' | 'skip-link-missing' | 'incorrect-tab-order' | 'non-interactive-focusable';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Measured colour contrast values (#1228)
|
|
3
|
+
*
|
|
4
|
+
* axe-core reports the colours and ratio it measured for each element checked
|
|
5
|
+
* by its color-contrast rules: in the check data (fgColor, bgColor,
|
|
6
|
+
* contrastRatio, expectedContrastRatio) and in the failure summary text. These
|
|
7
|
+
* helpers carry those values through. A value the browser did not report is
|
|
8
|
+
* null (or a ratio of -1 in ContrastAnalysis), never a default colour or ratio.
|
|
9
|
+
*/
|
|
10
|
+
import type { ContrastAnalysis, ContrastValues } from '../interfaces.js';
|
|
11
|
+
/** The fields of axe-core's color-contrast check data that AQE keeps. */
|
|
12
|
+
export interface AxeContrastData {
|
|
13
|
+
fgColor?: string;
|
|
14
|
+
bgColor?: string;
|
|
15
|
+
contrastRatio?: number;
|
|
16
|
+
expectedContrastRatio?: string;
|
|
17
|
+
}
|
|
18
|
+
/** axe-core rule ids that measure text contrast. */
|
|
19
|
+
export declare const CONTRAST_RULE_IDS: readonly ["color-contrast", "color-contrast-enhanced"];
|
|
20
|
+
export declare function isContrastRule(ruleId: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Browser-side expression `(node) => AxeContrastData | undefined` for an axe-core
|
|
23
|
+
* result node. Embedded in the scripts that run axe-core in the page.
|
|
24
|
+
*/
|
|
25
|
+
export declare const AXE_CONTRAST_DATA_JS = "function (n) {\n var checks = [].concat(n.any || [], n.all || [], n.none || []);\n for (var i = 0; i < checks.length; i++) {\n var c = checks[i];\n if ((c.id === 'color-contrast' || c.id === 'color-contrast-enhanced') && c.data) {\n return {\n fgColor: c.data.fgColor,\n bgColor: c.data.bgColor,\n contrastRatio: c.data.contrastRatio,\n expectedContrastRatio: c.data.expectedContrastRatio\n };\n }\n }\n return undefined;\n}";
|
|
26
|
+
/**
|
|
27
|
+
* Read the values from axe-core's failure summary, e.g. "Element has insufficient
|
|
28
|
+
* color contrast of 2.32 (foreground color: #aaaaaa, background color: #ffffff,
|
|
29
|
+
* ...). Expected contrast ratio of 4.5:1".
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseContrastFailureSummary(summary: string | undefined): ContrastValues;
|
|
32
|
+
/** Values from axe-core's check data, with gaps filled from the failure summary. */
|
|
33
|
+
export declare function contrastValues(data: AxeContrastData | undefined, failureSummary?: string): ContrastValues;
|
|
34
|
+
export declare function contrastValuesMeasured(values: ContrastValues): boolean;
|
|
35
|
+
/** The ratio WCAG requires for normal text at a level, when axe-core did not say. */
|
|
36
|
+
export declare function defaultRequiredRatio(level: 'A' | 'AA' | 'AAA'): number;
|
|
37
|
+
/** One element's contrast result; unreported values stay unmeasured. */
|
|
38
|
+
export declare function toContrastAnalysis(element: string, values: ContrastValues, passes: boolean, wcagLevel: 'A' | 'AA' | 'AAA'): ContrastAnalysis;
|
|
39
|
+
//# sourceMappingURL=accessibility-contrast.d.ts.map
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Measured colour contrast values (#1228)
|
|
3
|
+
*
|
|
4
|
+
* axe-core reports the colours and ratio it measured for each element checked
|
|
5
|
+
* by its color-contrast rules: in the check data (fgColor, bgColor,
|
|
6
|
+
* contrastRatio, expectedContrastRatio) and in the failure summary text. These
|
|
7
|
+
* helpers carry those values through. A value the browser did not report is
|
|
8
|
+
* null (or a ratio of -1 in ContrastAnalysis), never a default colour or ratio.
|
|
9
|
+
*/
|
|
10
|
+
/** axe-core rule ids that measure text contrast. */
|
|
11
|
+
export const CONTRAST_RULE_IDS = ['color-contrast', 'color-contrast-enhanced'];
|
|
12
|
+
export function isContrastRule(ruleId) {
|
|
13
|
+
return ruleId.includes('contrast');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Browser-side expression `(node) => AxeContrastData | undefined` for an axe-core
|
|
17
|
+
* result node. Embedded in the scripts that run axe-core in the page.
|
|
18
|
+
*/
|
|
19
|
+
export const AXE_CONTRAST_DATA_JS = `function (n) {
|
|
20
|
+
var checks = [].concat(n.any || [], n.all || [], n.none || []);
|
|
21
|
+
for (var i = 0; i < checks.length; i++) {
|
|
22
|
+
var c = checks[i];
|
|
23
|
+
if ((c.id === 'color-contrast' || c.id === 'color-contrast-enhanced') && c.data) {
|
|
24
|
+
return {
|
|
25
|
+
fgColor: c.data.fgColor,
|
|
26
|
+
bgColor: c.data.bgColor,
|
|
27
|
+
contrastRatio: c.data.contrastRatio,
|
|
28
|
+
expectedContrastRatio: c.data.expectedContrastRatio
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}`;
|
|
34
|
+
const COLOR = '(#[0-9a-f]{3,8}|rgba?\\([^)]*\\))';
|
|
35
|
+
/**
|
|
36
|
+
* Read the values from axe-core's failure summary, e.g. "Element has insufficient
|
|
37
|
+
* color contrast of 2.32 (foreground color: #aaaaaa, background color: #ffffff,
|
|
38
|
+
* ...). Expected contrast ratio of 4.5:1".
|
|
39
|
+
*/
|
|
40
|
+
export function parseContrastFailureSummary(summary) {
|
|
41
|
+
const text = summary ?? '';
|
|
42
|
+
const ratio = text.match(/contrast (?:ratio )?of\s*(\d+(?:\.\d+)?)(?![\d.]|\s*:)/i);
|
|
43
|
+
const fg = text.match(new RegExp(`foreground colou?r:?\\s*${COLOR}`, 'i'));
|
|
44
|
+
const bg = text.match(new RegExp(`background colou?r:?\\s*${COLOR}`, 'i'));
|
|
45
|
+
const expected = text.match(/expected contrast ratio of\s*(\d+(?:\.\d+)?)\s*:\s*1/i);
|
|
46
|
+
return {
|
|
47
|
+
foreground: fg?.[1] ?? null,
|
|
48
|
+
background: bg?.[1] ?? null,
|
|
49
|
+
ratio: validRatio(ratio ? parseFloat(ratio[1]) : undefined),
|
|
50
|
+
requiredRatio: validRatio(expected ? parseFloat(expected[1]) : undefined),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Values from axe-core's check data, with gaps filled from the failure summary. */
|
|
54
|
+
export function contrastValues(data, failureSummary) {
|
|
55
|
+
const parsed = parseContrastFailureSummary(failureSummary);
|
|
56
|
+
const expected = data?.expectedContrastRatio?.match(/(\d+(?:\.\d+)?)/);
|
|
57
|
+
return {
|
|
58
|
+
foreground: nonEmpty(data?.fgColor) ?? parsed.foreground,
|
|
59
|
+
background: nonEmpty(data?.bgColor) ?? parsed.background,
|
|
60
|
+
ratio: validRatio(data?.contrastRatio) ?? parsed.ratio,
|
|
61
|
+
requiredRatio: validRatio(expected ? parseFloat(expected[1]) : undefined) ?? parsed.requiredRatio,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function contrastValuesMeasured(values) {
|
|
65
|
+
return values.foreground !== null && values.background !== null && values.ratio !== null;
|
|
66
|
+
}
|
|
67
|
+
/** The ratio WCAG requires for normal text at a level, when axe-core did not say. */
|
|
68
|
+
export function defaultRequiredRatio(level) {
|
|
69
|
+
return level === 'AAA' ? 7 : 4.5;
|
|
70
|
+
}
|
|
71
|
+
/** One element's contrast result; unreported values stay unmeasured. */
|
|
72
|
+
export function toContrastAnalysis(element, values, passes, wcagLevel) {
|
|
73
|
+
const measured = contrastValuesMeasured(values);
|
|
74
|
+
return {
|
|
75
|
+
element,
|
|
76
|
+
foreground: values.foreground,
|
|
77
|
+
background: values.background,
|
|
78
|
+
ratio: values.ratio ?? -1,
|
|
79
|
+
requiredRatio: values.requiredRatio ?? defaultRequiredRatio(wcagLevel),
|
|
80
|
+
passes,
|
|
81
|
+
wcagLevel,
|
|
82
|
+
measured,
|
|
83
|
+
...(measured ? {} : { notMeasuredReason: 'the browser did not report the colours and ratio for this element' }),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function validRatio(value) {
|
|
87
|
+
// A contrast ratio is between 1 and 21; axe-core reports 0 when it could not compute one.
|
|
88
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 1 ? value : null;
|
|
89
|
+
}
|
|
90
|
+
function nonEmpty(value) {
|
|
91
|
+
return typeof value === 'string' && value.trim() !== '' ? value : null;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=accessibility-contrast.js.map
|