agentic-qe 3.15.15 → 3.15.17
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/skills-manifest.json +1 -1
- package/CHANGELOG.md +168 -0
- 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-OMILP6KH.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-EUF4XVUC.js → agent-booster-wasm-6BUOFQZA.js} +2 -2
- package/dist/cli/chunks/{agent-handler-MOX6PSIQ.js → agent-handler-HPDK3JI3.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-AEXKIGDG.js → agent-memory-branch-5QKUTWK5.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +2 -0
- package/dist/cli/chunks/{arena-IQ5ZZDRF.js → arena-7OKPMNHD.js} +2 -2
- package/dist/cli/chunks/{arena-M7GA3CVG.js → arena-HZ35LESR.js} +4 -4
- package/dist/cli/chunks/{audit-4IPBMKWB.js → audit-XI575SVK.js} +3 -3
- package/dist/cli/chunks/base-MAK2BLTG.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-IKDKJ2IE.js → better-sqlite3-YO5X7ZJS.js} +2 -2
- package/dist/cli/chunks/{brain-handler-5NQUDH4W.js → brain-handler-GCQZFZGQ.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-KSXELWRC.js → branch-enumerator-N6G44UU2.js} +2 -2
- package/dist/cli/chunks/{browser-6LACARWE.js → browser-EVKPTLOI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +2 -0
- package/dist/cli/chunks/{chunk-DKX4GNRU.js → chunk-2EQK7B5L.js} +2 -2
- package/dist/cli/chunks/chunk-2PCEMDIX.js +757 -0
- package/dist/cli/chunks/{chunk-JCQGJGGZ.js → chunk-2UUZCQSD.js} +7 -7
- package/dist/cli/chunks/chunk-2YWYW7NU.js +21 -0
- package/dist/cli/chunks/{chunk-PFQCV6YS.js → chunk-45223KK6.js} +6 -6
- package/dist/cli/chunks/chunk-4EJLHNER.js +12 -0
- package/dist/cli/chunks/{chunk-E5G4WZ2T.js → chunk-4L6WX5KC.js} +1 -1
- package/dist/cli/chunks/{chunk-UQPA33UK.js → chunk-4NKZU2JZ.js} +2 -2
- package/dist/cli/chunks/{chunk-OBDONJQM.js → chunk-4UKTIQDT.js} +2 -2
- package/dist/cli/chunks/{chunk-7BLZHFKD.js → chunk-4YM45Z5B.js} +1 -1
- package/dist/cli/chunks/{chunk-ZWBGYJ7K.js → chunk-5FSPELOG.js} +2 -2
- package/dist/cli/chunks/{chunk-NWIIYHT6.js → chunk-5WATBVU6.js} +2 -2
- package/dist/cli/chunks/{chunk-7ACCBHRB.js → chunk-5WYZVSL2.js} +1 -1
- package/dist/cli/chunks/{chunk-ZYJB6FML.js → chunk-6LSZCEW2.js} +1 -1
- package/dist/cli/chunks/{chunk-U62OUXBF.js → chunk-6V6BD6PH.js} +1 -1
- package/dist/cli/chunks/{chunk-MIA447GY.js → chunk-74MDUIAZ.js} +1 -1
- package/dist/cli/chunks/{chunk-AJPROCDW.js → chunk-776K4ZLE.js} +2 -2
- package/dist/cli/chunks/{chunk-CBK5CT6T.js → chunk-7BSOO3CY.js} +2 -2
- package/dist/cli/chunks/{chunk-ERN56H6S.js → chunk-7SNSI4VY.js} +1 -1
- package/dist/cli/chunks/{chunk-JKJOB65O.js → chunk-A4BVDYIL.js} +1 -1
- package/dist/cli/chunks/{chunk-MV55NXTD.js → chunk-AGCS5GSO.js} +2 -2
- package/dist/cli/chunks/{chunk-XIVVTYM2.js → chunk-AVHYJ3XP.js} +2 -2
- package/dist/cli/chunks/{chunk-KJBPB7P5.js → chunk-BE7ZHM34.js} +2 -2
- package/dist/cli/chunks/{chunk-GKSMRBHU.js → chunk-BHQ2DLJU.js} +1 -1
- package/dist/cli/chunks/{chunk-7XB3FCKM.js → chunk-BKHEQIRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-G242G224.js → chunk-BSIWI4ES.js} +2 -2
- package/dist/cli/chunks/{chunk-NQS3BWS6.js → chunk-C7QLLMYI.js} +1 -1
- package/dist/cli/chunks/{chunk-XWIAZG3C.js → chunk-CMN7PU2H.js} +2 -2
- package/dist/cli/chunks/{chunk-4X3SWKBA.js → chunk-COTQ44YO.js} +2 -2
- package/dist/cli/chunks/{chunk-3J3RNJNX.js → chunk-CQER6IJ5.js} +1 -1
- package/dist/cli/chunks/{chunk-6KCSKGVY.js → chunk-CVPXHDQU.js} +1 -1
- package/dist/cli/chunks/{chunk-R6LHJ7ME.js → chunk-CVYPMGUM.js} +2 -2
- package/dist/cli/chunks/chunk-CXCMATZ6.js +3 -0
- package/dist/cli/chunks/{chunk-PYPS65P7.js → chunk-D75GLKEL.js} +2 -2
- package/dist/cli/chunks/chunk-DCDSN67A.js +2 -0
- package/dist/cli/chunks/{chunk-6RBTS3NF.js → chunk-DHKSPOUQ.js} +2 -2
- package/dist/cli/chunks/{chunk-JW74KRBC.js → chunk-DJDVD6RM.js} +2 -2
- package/dist/cli/chunks/{chunk-X33CWRDF.js → chunk-DNVRTJKB.js} +2 -2
- package/dist/cli/chunks/{chunk-BQ47GQPK.js → chunk-DS5IFRY6.js} +2 -2
- package/dist/cli/chunks/{chunk-AHMWD6JG.js → chunk-E7XIMOKW.js} +2 -2
- package/dist/cli/chunks/{chunk-SON6ZRH3.js → chunk-ECKHDHR2.js} +2 -2
- package/dist/cli/chunks/chunk-EPVPXHL7.js +2 -0
- package/dist/cli/chunks/{chunk-BP5T3OEV.js → chunk-ERYADKMZ.js} +4 -4
- package/dist/cli/chunks/{chunk-DUKE27HC.js → chunk-EUWG2JG4.js} +2 -2
- package/dist/cli/chunks/chunk-FAQ24UHB.js +29 -0
- package/dist/cli/chunks/{chunk-XG4F4XH4.js → chunk-FBBPRVNF.js} +2 -2
- package/dist/cli/chunks/{chunk-5PTAFGJT.js → chunk-FBSBXCZS.js} +2 -2
- package/dist/cli/chunks/chunk-G2X3OLMN.js +153 -0
- package/dist/cli/chunks/{chunk-IXL5ZHWJ.js → chunk-GG7PMTHD.js} +1 -1
- package/dist/cli/chunks/{chunk-6BRQPHMZ.js → chunk-GN6OE3JT.js} +1 -1
- package/dist/cli/chunks/{chunk-SZAZQZWI.js → chunk-GPPTRKEM.js} +2 -2
- package/dist/cli/chunks/{chunk-LTQVUAPH.js → chunk-H2LHWZRE.js} +2 -2
- package/dist/cli/chunks/{chunk-WVXJ2QIG.js → chunk-HAQJFUAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-C5CXL3JP.js → chunk-HD6W6PHV.js} +2 -2
- package/dist/cli/chunks/{chunk-K3WZICFA.js → chunk-HFZD5KLR.js} +1 -1
- package/dist/cli/chunks/{chunk-VCXI4XC4.js → chunk-HRUHHHVR.js} +2 -2
- package/dist/cli/chunks/{chunk-GV2QE5TO.js → chunk-HVT7RMGV.js} +1 -1
- package/dist/cli/chunks/chunk-HWQPMUSN.js +2 -0
- package/dist/cli/chunks/{chunk-4ATQP3PR.js → chunk-HZ5O7G2P.js} +1 -1
- package/dist/cli/chunks/{chunk-XHHWABJV.js → chunk-IHQGNDMX.js} +2 -2
- package/dist/cli/chunks/{chunk-UUBIQR6A.js → chunk-IJSROBM6.js} +18 -18
- package/dist/cli/chunks/{chunk-PS6UMZVK.js → chunk-IJZFJPHS.js} +2 -2
- package/dist/cli/chunks/{chunk-C4KLXFJP.js → chunk-IKB3M7OF.js} +1 -1
- package/dist/cli/chunks/{chunk-SJCKCSN3.js → chunk-INI3Q4CN.js} +1 -1
- package/dist/cli/chunks/{chunk-LYJHUNBK.js → chunk-IOWEBPXJ.js} +2 -2
- package/dist/cli/chunks/{chunk-HTZSRMHW.js → chunk-IQL6XRF5.js} +2 -2
- package/dist/cli/chunks/{chunk-DEKR3CTS.js → chunk-IRHXGCQR.js} +2 -2
- package/dist/cli/chunks/{chunk-TODNOP7C.js → chunk-J3QFJI2Y.js} +6 -6
- package/dist/cli/chunks/{chunk-OLZH5LRT.js → chunk-J6QRNQJF.js} +11 -11
- package/dist/cli/chunks/{chunk-HL2ANKN3.js → chunk-J7Q5TXFZ.js} +2 -2
- package/dist/cli/chunks/{chunk-6YVMX2TC.js → chunk-JHKKIJT2.js} +2 -2
- package/dist/cli/chunks/{chunk-K3XBQC3R.js → chunk-JI33PMPZ.js} +1 -1
- package/dist/cli/chunks/{chunk-74YG72NQ.js → chunk-JRIJM4LE.js} +3 -3
- package/dist/cli/chunks/{chunk-TDQWTSBS.js → chunk-JVWZAE2H.js} +2 -2
- package/dist/cli/chunks/{chunk-RDMRY7CT.js → chunk-K7WAI662.js} +1 -1
- package/dist/cli/chunks/{chunk-C4RTAVC6.js → chunk-KB34MTFZ.js} +2 -2
- package/dist/cli/chunks/{chunk-2CKERSMB.js → chunk-KPIPVSIP.js} +2 -2
- package/dist/cli/chunks/{chunk-LNX74WHQ.js → chunk-KR2TAAF6.js} +1 -1
- package/dist/cli/chunks/{chunk-73PBAWAF.js → chunk-KT2QCXO6.js} +2 -2
- package/dist/cli/chunks/{chunk-BBRROA3Z.js → chunk-KTORRIX3.js} +2 -2
- package/dist/cli/chunks/{chunk-GCHYOPRZ.js → chunk-LCWEQRZI.js} +2 -2
- package/dist/cli/chunks/{chunk-M4WMSCAE.js → chunk-LG5PPJT7.js} +1 -1
- package/dist/cli/chunks/{chunk-UAQZI6N4.js → chunk-LIF6UWHV.js} +2 -2
- package/dist/cli/chunks/chunk-LN7NKE3N.js +27 -0
- package/dist/cli/chunks/chunk-LOLSZG5J.js +2 -0
- package/dist/cli/chunks/{chunk-BLL2XU7A.js → chunk-LOMT4UC2.js} +2 -2
- package/dist/cli/chunks/chunk-LRKLATSH.js +2 -0
- package/dist/cli/chunks/{chunk-EKP2SC77.js → chunk-LRY6UIRI.js} +2 -2
- package/dist/cli/chunks/{chunk-JCZCJE6X.js → chunk-LV7UIK4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-LVABQNRF.js → chunk-M2YI5YUR.js} +2 -2
- package/dist/cli/chunks/{chunk-RIRZHOS2.js → chunk-MCXW3DKE.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSOMUTNL.js → chunk-MGZ6XZHU.js} +1 -1
- package/dist/cli/chunks/{chunk-H5DER3JY.js → chunk-MLMD3I75.js} +1 -1
- package/dist/cli/chunks/{chunk-UXIY4IAI.js → chunk-MVVVGQJ6.js} +2 -2
- package/dist/cli/chunks/{chunk-WUOOX7UG.js → chunk-ND72UDVH.js} +2 -2
- package/dist/cli/chunks/{chunk-AKZO6GGG.js → chunk-NE3LRUNC.js} +4 -4
- package/dist/cli/chunks/{chunk-O6EWL5DQ.js → chunk-NKUHMA4T.js} +2 -2
- package/dist/cli/chunks/{chunk-L32JNNKL.js → chunk-NQFDJ6BT.js} +1 -1
- package/dist/cli/chunks/{chunk-T66PPF4D.js → chunk-NZJVDOUN.js} +31 -31
- package/dist/cli/chunks/{chunk-EBTNMQSS.js → chunk-O7VJ3VKD.js} +2 -2
- package/dist/cli/chunks/{chunk-76P32JVU.js → chunk-OJIUIEI4.js} +1 -1
- package/dist/cli/chunks/chunk-OO2M2QUV.js +12 -0
- package/dist/cli/chunks/{chunk-CAOUV5GZ.js → chunk-ORQ2YBRR.js} +2 -2
- package/dist/cli/chunks/chunk-OWIQR6N2.js +4 -0
- package/dist/cli/chunks/chunk-OWIZBZLN.js +14 -0
- package/dist/cli/chunks/{chunk-J3FP5UGL.js → chunk-P3D7SEHW.js} +1 -1
- package/dist/cli/chunks/{chunk-3CYNZFKH.js → chunk-P4OB6WDJ.js} +1 -1
- package/dist/cli/chunks/{chunk-LHMQIZ6B.js → chunk-PCL5JRKN.js} +2 -2
- package/dist/cli/chunks/{chunk-KLTMOXIK.js → chunk-PIWGKGWP.js} +2 -2
- package/dist/cli/chunks/{chunk-VMAM46HQ.js → chunk-PK34KJH7.js} +2 -2
- package/dist/cli/chunks/chunk-POPSZDI2.js +65 -0
- package/dist/cli/chunks/{chunk-JUDUBQHA.js → chunk-Q6F3DYZN.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2OX6KGN.js → chunk-QJSSUBO3.js} +2 -2
- package/dist/cli/chunks/{chunk-XM6ZVFM5.js → chunk-QN7HP2UW.js} +235 -173
- package/dist/cli/chunks/{chunk-T4GE7MPI.js → chunk-QSQNXBD2.js} +2 -2
- package/dist/cli/chunks/{chunk-5C62XMJR.js → chunk-QTQDX4TZ.js} +33 -33
- package/dist/cli/chunks/{chunk-DURD37JZ.js → chunk-R3KBOQ3O.js} +2 -2
- package/dist/cli/chunks/{chunk-LJMYRTJ7.js → chunk-REY52O7J.js} +1 -1
- package/dist/cli/chunks/{chunk-W5ZJG2OU.js → chunk-RKCN4B26.js} +2 -2
- package/dist/cli/chunks/chunk-S3DT5TPR.js +14 -0
- package/dist/cli/chunks/{chunk-4HKAD25N.js → chunk-S3TBOKAZ.js} +22 -22
- package/dist/cli/chunks/{chunk-2IIXCEMS.js → chunk-SAEECT23.js} +2 -2
- package/dist/cli/chunks/{chunk-LB2LGEDP.js → chunk-SAZ4PJBR.js} +2 -2
- package/dist/cli/chunks/{chunk-FOOW4JVS.js → chunk-SFITYZLV.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZFLULL4.js → chunk-SRBCBVSI.js} +2 -2
- package/dist/cli/chunks/chunk-SUAZ5Z47.js +63 -0
- package/dist/cli/chunks/{chunk-RBKUU7WF.js → chunk-TDZ6N43D.js} +2 -2
- package/dist/cli/chunks/chunk-TIVKDIF7.js +2 -0
- package/dist/cli/chunks/{chunk-MPFPWJTH.js → chunk-TM75GAXG.js} +2 -2
- package/dist/cli/chunks/{chunk-UJABDXST.js → chunk-TWBZONKT.js} +2 -2
- package/dist/cli/chunks/{chunk-AOKKUB5F.js → chunk-U4S74IIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-W62OOK7A.js → chunk-U5SMBJ6F.js} +2 -2
- package/dist/cli/chunks/{chunk-6LE362LZ.js → chunk-UHJVZEQA.js} +2 -2
- package/dist/cli/chunks/{chunk-T67R2MUN.js → chunk-UOVCTK5L.js} +2 -2
- package/dist/cli/chunks/{chunk-FTRSS64D.js → chunk-VDEKVIP5.js} +2 -2
- package/dist/cli/chunks/{chunk-BDKEAGQ2.js → chunk-VITV7AEC.js} +2 -2
- package/dist/cli/chunks/{chunk-BU4UQR36.js → chunk-VKREKVFI.js} +2 -2
- package/dist/cli/chunks/{chunk-BZULJMGH.js → chunk-VLTDW7XJ.js} +2 -2
- package/dist/cli/chunks/{chunk-UE2J6MA5.js → chunk-VQFV2IPV.js} +1 -1
- package/dist/cli/chunks/{chunk-TZIHDJZD.js → chunk-VYPVU3JF.js} +2 -2
- package/dist/cli/chunks/{chunk-UORB2QDU.js → chunk-WAOEQA3W.js} +2 -2
- package/dist/cli/chunks/{chunk-GQABPCQE.js → chunk-WBDWHHKP.js} +2 -2
- package/dist/cli/chunks/{chunk-GGQGCT4Y.js → chunk-WX4PO65Q.js} +2 -2
- package/dist/cli/chunks/chunk-X2DWHGCC.js +6 -0
- package/dist/cli/chunks/{chunk-337Z52QM.js → chunk-X5QD76IU.js} +2 -2
- package/dist/cli/chunks/{chunk-E56PVVWC.js → chunk-XBTGEYED.js} +2 -2
- package/dist/cli/chunks/{chunk-5AFVEWMT.js → chunk-XEMCHGAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-E3MRDIZF.js → chunk-XEYFZLIT.js} +1 -1
- package/dist/cli/chunks/{chunk-KCQNFBBR.js → chunk-XFTX3KLE.js} +1 -1
- package/dist/cli/chunks/{chunk-QFGYH6HD.js → chunk-XPTCQKVE.js} +1 -1
- package/dist/cli/chunks/{chunk-PXATBHWN.js → chunk-YAJOBZE5.js} +2 -2
- package/dist/cli/chunks/{chunk-27HE2BHC.js → chunk-YCVLKU6H.js} +2 -2
- package/dist/cli/chunks/{chunk-ZIPAB5J6.js → chunk-YD2C6EPN.js} +2 -2
- package/dist/cli/chunks/{chunk-5G4UFTV4.js → chunk-YKRLUTK7.js} +2 -2
- package/dist/cli/chunks/{chunk-YUS6TWAL.js → chunk-YMUY3TES.js} +6 -6
- package/dist/cli/chunks/chunk-YR5QBUHZ.js +6 -0
- package/dist/cli/chunks/{chunk-XH4JMX5O.js → chunk-Z7SKUC6P.js} +1 -1
- package/dist/cli/chunks/{chunk-EFUJDMNC.js → chunk-ZAQMRFBB.js} +2 -2
- package/dist/cli/chunks/{chunk-22UKJGGN.js → chunk-ZC3KDNJW.js} +3 -3
- package/dist/cli/chunks/{chunk-AP2W7Z3A.js → chunk-ZGV7L4MW.js} +1 -1
- package/dist/cli/chunks/{chunk-W27AJ5B4.js → chunk-ZN35XSKF.js} +2 -2
- package/dist/cli/chunks/{chunk-M4CJCPCQ.js → chunk-ZNXM6WVL.js} +2 -2
- package/dist/cli/chunks/{chunk-5I7357KS.js → chunk-ZP5AWQRO.js} +2 -2
- package/dist/cli/chunks/{chunk-OQG3UQQ7.js → chunk-ZTP3DQ5M.js} +1 -1
- package/dist/cli/chunks/{chunk-BFQTLF5X.js → chunk-ZVMSSCTH.js} +2 -2
- package/dist/cli/chunks/chunk-ZWUF27P4.js +2 -0
- package/dist/cli/chunks/{ci-UCUJOSBW.js → ci-3RTTTS2D.js} +2 -2
- package/dist/cli/chunks/{ci-config-2XILD3XG.js → ci-config-XRUR3I4K.js} +2 -2
- package/dist/cli/chunks/{ci-output-BL6KWOHW.js → ci-output-E5IAMU2U.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5XLIOXE5.js → circuit-breaker-SHR2P44P.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-4IMP6ACS.js → claude-flow-setup-ZDDILFMF.js} +2 -2
- package/dist/cli/chunks/client-NO5FOWT4.js +2 -0
- package/dist/cli/chunks/{cline-installer-RYLHCDK7.js → cline-installer-BGYVUM6G.js} +2 -2
- package/dist/cli/chunks/{code-WY3GJXHX.js → code-PJ4MC3MC.js} +4 -3
- package/dist/cli/chunks/{code-index-extractor-Y4MZBZCW.js → code-index-extractor-IW2P22YG.js} +2 -2
- package/dist/cli/chunks/{codex-installer-SCJ3T3DX.js → codex-installer-A7WZ6OGL.js} +2 -2
- package/dist/cli/chunks/{completions-CN2DXQFU.js → completions-KS23WD5J.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-7MDPPIBH.js → complexity-analyzer-Q7GLSR2E.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-GCEJRK34.js → continuedev-installer-SK55BFW2.js} +2 -2
- package/dist/cli/chunks/copilot-installer-3N5J3WTM.js +3 -0
- package/dist/cli/chunks/core-handlers-JNAZPXE2.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VO5MFWR6.js → cost-tracker-NENVSO4A.js} +2 -2
- package/dist/cli/chunks/{coverage-LYFQYNH6.js → coverage-5L7UQWDH.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +2 -0
- package/dist/cli/chunks/{cursor-installer-KP4HA7TV.js → cursor-installer-XXBO2ZE6.js} +2 -2
- package/dist/cli/chunks/{daemon-7RC7TS57.js → daemon-CDCQU3LR.js} +3 -3
- package/dist/cli/chunks/daemon-JEBJGEUK.js +18 -0
- package/dist/cli/chunks/{dag-attention-scheduler-NKA44RSR.js → dag-attention-scheduler-HOMMF7FA.js} +2 -2
- package/dist/cli/chunks/{detect-CMYAJWYF.js → detect-FXCOUG6X.js} +2 -2
- package/dist/cli/chunks/{dist-node-EN3PYEGW.js → dist-node-GXQ7FMTY.js} +2 -2
- package/dist/cli/chunks/{domain-handler-EXSZCX7A.js → domain-handler-TI3JBAPC.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-HCQFSNL7.js → domain-plugins-R7LTUM32.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-3LGSNTPO.js → domain-transfer-LBIAFHIQ.js} +2 -2
- package/dist/cli/chunks/dream-GQDCEJMS.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +3 -0
- package/dist/cli/chunks/embedding-space-HHLWTBF5.js +2 -0
- package/dist/cli/chunks/{eval-OQELIWJK.js → eval-KDOZMAXJ.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-X45PECQN.js +40 -0
- package/dist/cli/chunks/{fast-paths-UV4NDEWM.js → fast-paths-462V6UUB.js} +2 -2
- package/dist/cli/chunks/{feature-flags-H7H33B6C.js → feature-flags-G66OT3AS.js} +2 -2
- package/dist/cli/chunks/{feature-flags-CKTYX67J.js → feature-flags-NIRQ4YDM.js} +2 -2
- package/dist/cli/chunks/file-discovery-33USPLB5.js +2 -0
- package/dist/cli/chunks/{fleet-ZJBCAKRG.js → fleet-PXWGB7CU.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-RUE2QZRG.js → gnn-wrapper-7MUW3M5M.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-XRV327M7.js → heartbeat-handler-5237PB35.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +2 -0
- package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-UJID6ZZ4.js → hnsw-legacy-bridge-OSQPW7JP.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-WS43R4AX.js → hnswlib-node-GX6WG2GB.js} +2 -2
- package/dist/cli/chunks/{hooks-YZNJKXAJ.js → hooks-GUWHL7VC.js} +23 -22
- package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-XQJSIMTS.js → hypergraph-engine-SRWLLCU3.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZD2NYXMR.js → hypergraph-handler-AVOPRHHO.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +2 -0
- package/dist/cli/chunks/{init-guard-DSRUAVRT.js → init-guard-P4N6EVZS.js} +2 -2
- package/dist/cli/chunks/{init-handler-RJU5QMAP.js → init-handler-LRGWOJMD.js} +6 -6
- package/dist/cli/chunks/init-wizard-XWWAXY25.js +2 -0
- package/dist/cli/chunks/kernel-ZEJPNDBW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-BCPOCVMC.js → kilocode-installer-7R2EPOQ6.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-GFCWCB2S.js → kiro-installer-QNM7DPOB.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +2 -0
- package/dist/cli/chunks/{learning-FZTD72CF.js → learning-7OIZBPXZ.js} +3 -3
- package/dist/cli/chunks/{llm-router-GJVKGRJL.js → llm-router-SIDXES23.js} +4 -4
- package/dist/cli/chunks/llm-router-service-3OSW67LC.js +2 -0
- package/dist/cli/chunks/{load-YKTPOYBE.js → load-EI2E2C3S.js} +2 -2
- package/dist/cli/chunks/load-test-7TRIH2WJ.js +2 -0
- package/dist/cli/chunks/{mcp-LT6R2IKS.js → mcp-IOE5WOCS.js} +2 -2
- package/dist/cli/chunks/{memory-4HKKOLRY.js → memory-DLYGJAP7.js} +5 -5
- package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +2 -0
- package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-2YPM2WTK.js → multi-model-executor-WHH4YCHM.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-WBAJMH5K.js → opencode-installer-63FDZAMS.js} +2 -2
- package/dist/cli/chunks/{orchestrator-5W5WVMVJ.js → orchestrator-3LA776KK.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-GXRMNPAZ.js → pattern-usage-recorder-NW54QUGI.js} +2 -2
- package/dist/cli/chunks/{pipeline-2NA4DRDA.js → pipeline-P3TYX6J6.js} +2 -2
- package/dist/cli/chunks/{platform-BGERNQ5V.js → platform-FNA2WLI6.js} +2 -2
- package/dist/cli/chunks/{plugin-L4EPVENR.js → plugin-NJS7BC2S.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-RTQRTPTM.js → prime-radiant-advanced-wasm-NIAVL2OT.js} +2 -2
- package/dist/cli/chunks/project-root-GMOFJEKD.js +2 -0
- package/dist/cli/chunks/protocol-executor-AD345XRO.js +2 -0
- package/dist/cli/chunks/{protocol-handler-SYQXM6JK.js → protocol-handler-JU5C4JHY.js} +2 -2
- package/dist/cli/chunks/{prove-5O7GPJCU.js → prove-35VOSLYP.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +2 -0
- package/dist/cli/chunks/{quality-KIIDHGNF.js → quality-ET74X7HN.js} +2 -2
- package/dist/cli/chunks/{quality-gate-H65VECD3.js → quality-gate-FEDQISNB.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +2 -0
- package/dist/cli/chunks/real-embeddings-II6CXTCI.js +2 -0
- package/dist/cli/chunks/{ref-validation-CSBJOMZM.js → ref-validation-DTBPYCEB.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-G7OVYXEN.js → roocode-installer-LYQEMR4J.js} +2 -2
- package/dist/cli/chunks/router-PLM3MWME.js +2 -0
- package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +2 -0
- package/dist/cli/chunks/{routing-handler-ZNZPPI5Y.js → routing-handler-DJOJFPII.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-C6IG3OY3.js → ruvector-commands-VXYGJDPW.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-3G6LFLT3.js → rvf-store-integrity-GA2ZYOEG.js} +2 -2
- package/dist/cli/chunks/safe-db-RZPQGLGQ.js +2 -0
- package/dist/cli/chunks/schedule-G7JMQDUX.js +2 -0
- package/dist/cli/chunks/scheduler-4SEGPCKD.js +2 -0
- package/dist/cli/chunks/{security-A3IMVLFM.js → security-MM6YOECX.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-VHWQ6US5.js → shared-rvf-adapter-6AHPA3V5.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-JB3QS7IG.js → shared-rvf-dual-writer-EYAVY2GZ.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-DDNXCSBD.js → standalone-memory-A3PLB4CZ.js} +2 -2
- package/dist/cli/chunks/{status-handler-2HK7XPEK.js → status-handler-OSSFAP4Z.js} +2 -2
- package/dist/cli/chunks/{structural-health-DSJVLEPV.js → structural-health-PGY5XUNO.js} +2 -2
- package/dist/cli/chunks/{sync-NTUR53PI.js → sync-CWEHYGNN.js} +2 -2
- package/dist/cli/chunks/sync-PM6D7EQF.js +2 -0
- package/dist/cli/chunks/task-handler-LHMQ75W4.js +64 -0
- package/dist/cli/chunks/{task-handlers-VJR6EHRZ.js → task-handlers-S2TX5FTR.js} +4 -4
- package/dist/cli/chunks/test-4EGZZ6NJ.js +34 -0
- package/dist/cli/chunks/test-runner-process-72YACW6M.js +2 -0
- package/dist/cli/chunks/{test-scheduling-Q6QEEOS6.js → test-scheduling-YJQHH3XE.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +2 -0
- package/dist/cli/chunks/{token-usage-YEEFWSSI.js → token-usage-WPNOJR6H.js} +2 -2
- package/dist/cli/chunks/{transformers-BZCHJJJT.js → transformers-4MRPXCPU.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +2 -0
- package/dist/cli/chunks/{types-4AOKZYOX.js → types-6P5FB4EB.js} +2 -2
- package/dist/cli/chunks/unified-memory-2VMGSGQL.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +2 -0
- package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +2 -0
- package/dist/cli/chunks/{upgrade-2MWW6BT2.js → upgrade-4ICTN63Y.js} +2 -2
- package/dist/cli/chunks/{validate-PAEV3GT5.js → validate-HQF5GZ7L.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-ZIXACK5K.js → validate-swarm-45JYG7VW.js} +2 -2
- package/dist/cli/chunks/visual-security-ZYP2KPH7.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-VLTXZFAB.js → web-tree-sitter-UOTWZLNH.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VELMLOZF.js → windsurf-installer-WDWSBXGN.js} +2 -2
- package/dist/cli/chunks/witness-chain-5QRT7EMX.js +2 -0
- package/dist/cli/chunks/witness-chain-DOYMNPC7.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-MIDWD4JS.js → witness-chain-verifier-JB42X62J.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-OSVCWOB2.js → witness-key-manager-LXXO6L2G.js} +2 -2
- package/dist/cli/chunks/{workflow-MK7A7QCX.js → workflow-6ARK47NF.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +2 -0
- package/dist/cli/chunks/wrappers-CYQBOMPL.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/commands/test.js +26 -4
- 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 +137 -59
- 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 +37 -7
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +135 -62
- package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
- package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
- 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.d.ts +3 -1
- package/dist/domains/test-execution/coordinator.js +21 -7
- package/dist/domains/test-execution/interfaces.d.ts +17 -0
- package/dist/domains/test-execution/plugin.js +8 -2
- package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
- package/dist/domains/test-execution/services/flaky-detector.js +26 -8
- package/dist/domains/test-execution/services/retry-handler.d.ts +9 -1
- package/dist/domains/test-execution/services/retry-handler.js +56 -12
- package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -1
- package/dist/domains/test-execution/services/test-executor.js +97 -14
- 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/copilot-installer.d.ts +6 -0
- package/dist/init/copilot-installer.js +37 -17
- package/dist/init/platform-config-generator.d.ts +10 -0
- package/dist/init/platform-config-generator.js +26 -1
- 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 +32 -0
- package/dist/kernel/unified-memory.js +76 -8
- package/dist/learning/aqe-learning-engine.js +1 -1
- package/dist/learning/embed-and-insert-pattern.js +4 -2
- package/dist/learning/embedder-endpoint-client.d.ts +76 -0
- package/dist/learning/embedder-endpoint-client.js +201 -13
- package/dist/learning/embedding-space-registry.d.ts +75 -0
- package/dist/learning/embedding-space-registry.js +142 -0
- 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.d.ts +3 -0
- package/dist/learning/real-embeddings.js +52 -12
- 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 +699 -619
- 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/embeddings/index.d.ts +2 -2
- package/dist/shared/embeddings/index.js +1 -1
- package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
- package/dist/shared/embeddings/nomic-embedder.js +19 -11
- package/dist/shared/embeddings/ollama-client.d.ts +28 -2
- package/dist/shared/embeddings/ollama-client.js +84 -22
- package/dist/shared/embeddings/types.d.ts +15 -0
- package/dist/shared/embeddings/types.js +4 -0
- package/dist/shared/llm/spend-ledger.d.ts +9 -0
- package/dist/shared/llm/spend-ledger.js +64 -39
- package/dist/shared/pytest-junit-report.d.ts +93 -0
- package/dist/shared/pytest-junit-report.js +241 -0
- 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 +119 -0
- package/dist/shared/test-runner-project.js +301 -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 +1 -1
- package/dist/cli/chunks/adapter-QU6INSKP.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +0 -2
- package/dist/cli/chunks/base-OTGSN6IC.js +0 -2
- package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +0 -2
- package/dist/cli/chunks/chunk-2LUTPMBO.js +0 -21
- package/dist/cli/chunks/chunk-3HVFIITW.js +0 -2
- package/dist/cli/chunks/chunk-4D4CWP72.js +0 -2
- package/dist/cli/chunks/chunk-5KA5TVPR.js +0 -6
- package/dist/cli/chunks/chunk-6NBRMD25.js +0 -13
- package/dist/cli/chunks/chunk-7O45RQHF.js +0 -153
- package/dist/cli/chunks/chunk-EMSZVUYA.js +0 -29
- package/dist/cli/chunks/chunk-G6RDCCFV.js +0 -4
- package/dist/cli/chunks/chunk-HH4ED4F7.js +0 -744
- package/dist/cli/chunks/chunk-Q6I4SIUU.js +0 -65
- package/dist/cli/chunks/chunk-QGBGSQ2E.js +0 -14
- package/dist/cli/chunks/chunk-QRKTBSZT.js +0 -27
- package/dist/cli/chunks/chunk-SHRI7TKJ.js +0 -62
- package/dist/cli/chunks/chunk-TX2CHQD7.js +0 -2
- package/dist/cli/chunks/chunk-UGYM4U44.js +0 -2
- package/dist/cli/chunks/chunk-VY4U6DPO.js +0 -12
- package/dist/cli/chunks/chunk-WNTA4YKE.js +0 -14
- package/dist/cli/chunks/chunk-XHLYGXYE.js +0 -2
- package/dist/cli/chunks/client-KKRNPX4F.js +0 -2
- package/dist/cli/chunks/copilot-installer-BHPDSELY.js +0 -3
- package/dist/cli/chunks/core-handlers-47MPMED7.js +0 -2
- package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +0 -2
- package/dist/cli/chunks/daemon-AXLVPKVO.js +0 -18
- package/dist/cli/chunks/dream-76L6EEN7.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-B6MNHICW.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-SUFILYPW.js +0 -40
- package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +0 -2
- package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +0 -2
- package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +0 -2
- package/dist/cli/chunks/init-wizard-JCKNGIGT.js +0 -2
- package/dist/cli/chunks/kernel-F7ILJTYD.js +0 -2
- package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +0 -2
- package/dist/cli/chunks/llm-router-service-TNOWQINA.js +0 -2
- package/dist/cli/chunks/load-test-FPVBK2EV.js +0 -2
- package/dist/cli/chunks/memory-backend-2QE7O67A.js +0 -2
- package/dist/cli/chunks/memory-handlers-X4CMVBXB.js +0 -2
- package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +0 -2
- package/dist/cli/chunks/project-root-S7WDFTMU.js +0 -2
- package/dist/cli/chunks/protocol-executor-OPANXQVB.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +0 -2
- package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +0 -2
- package/dist/cli/chunks/real-embeddings-DYIOLKQ3.js +0 -2
- package/dist/cli/chunks/router-DBBW4NC2.js +0 -2
- package/dist/cli/chunks/routing-feedback-W35QHCL4.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-4ATTHGHD.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +0 -2
- package/dist/cli/chunks/safe-db-ZS2QKANY.js +0 -2
- package/dist/cli/chunks/schedule-ZH6VNA32.js +0 -2
- package/dist/cli/chunks/scheduler-T6CD74B6.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +0 -2
- package/dist/cli/chunks/sync-3MUV6S5E.js +0 -2
- package/dist/cli/chunks/task-handler-74MZN2EO.js +0 -62
- package/dist/cli/chunks/test-O6FK3FVF.js +0 -34
- package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +0 -2
- package/dist/cli/chunks/token-bootstrap-TTRCECLP.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +0 -2
- package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +0 -2
- package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +0 -2
- package/dist/cli/chunks/visual-security-GXGSFBVA.js +0 -2
- package/dist/cli/chunks/witness-chain-MRJKVCOW.js +0 -2
- package/dist/cli/chunks/witness-chain-WWHJKITG.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-5SAXPETG.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +0 -2
- package/dist/cli/chunks/wrappers-5QFMCKXL.js +0 -2
|
@@ -16,6 +16,7 @@ import { createDomainFinding, } from '../../coordination/consensus/domain-findin
|
|
|
16
16
|
// CQ-002: Base domain coordinator
|
|
17
17
|
import { BaseDomainCoordinator, } from '../base-domain-coordinator.js';
|
|
18
18
|
import { toError } from '../../shared/error-utils.js';
|
|
19
|
+
import { isPythonTestFile } from '../../shared/pytest-junit-report.js';
|
|
19
20
|
import { createMinCutTestOptimizer, } from './services/mincut-test-optimizer.js';
|
|
20
21
|
// ============================================================================
|
|
21
22
|
// Coordinator Configuration
|
|
@@ -146,6 +147,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
146
147
|
});
|
|
147
148
|
}
|
|
148
149
|
const framework = request.framework ?? this.detectFramework(testsToRun);
|
|
150
|
+
// #1272: without an explicit framework, each runner project's config decides.
|
|
151
|
+
const frameworkFromConfig = request.framework === undefined;
|
|
149
152
|
const workers = request.workers ?? Math.min(4, Math.max(1, testsToRun.length));
|
|
150
153
|
// Batched runners own internal parallelism, so the timeout applies to the
|
|
151
154
|
// whole discovered suite rather than one file.
|
|
@@ -157,17 +160,21 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
157
160
|
return this.executeParallel({
|
|
158
161
|
testFiles: testsToRun,
|
|
159
162
|
framework,
|
|
163
|
+
frameworkFromConfig,
|
|
160
164
|
workers,
|
|
161
165
|
timeout,
|
|
162
166
|
retryCount: request.retryCount,
|
|
167
|
+
projectRoot: request.projectRoot,
|
|
163
168
|
});
|
|
164
169
|
}
|
|
165
170
|
// Sequential execution
|
|
166
171
|
return this.execute({
|
|
167
172
|
testFiles: testsToRun,
|
|
168
173
|
framework,
|
|
174
|
+
frameworkFromConfig,
|
|
169
175
|
timeout,
|
|
170
176
|
retryCount: request.retryCount,
|
|
177
|
+
projectRoot: request.projectRoot,
|
|
171
178
|
});
|
|
172
179
|
}
|
|
173
180
|
/**
|
|
@@ -176,7 +183,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
176
183
|
* as passed and flaky in the run's own counts (#1170). When that changes
|
|
177
184
|
* the outcome, the run is stored again with it (#1176).
|
|
178
185
|
*/
|
|
179
|
-
async retryFailures(run, retryCount, testFiles) {
|
|
186
|
+
async retryFailures(run, retryCount, testFiles, projectRoot) {
|
|
180
187
|
if (!retryCount || retryCount <= 0)
|
|
181
188
|
return;
|
|
182
189
|
if (run.failed === 0) {
|
|
@@ -188,6 +195,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
188
195
|
failedTests: run.failedTests.map(t => t.testId),
|
|
189
196
|
maxRetries: retryCount,
|
|
190
197
|
backoff: 'exponential',
|
|
198
|
+
projectRoot,
|
|
191
199
|
});
|
|
192
200
|
if (!retried.success)
|
|
193
201
|
return;
|
|
@@ -195,9 +203,13 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
195
203
|
await this.executor.recordFinalOutcome(run, testFiles);
|
|
196
204
|
}
|
|
197
205
|
/**
|
|
198
|
-
*
|
|
206
|
+
* Fallback framework from file names. With no explicit framework, each
|
|
207
|
+
* runner project's own config still decides between jest and vitest (#1272),
|
|
208
|
+
* and Python files always run with pytest (#1248).
|
|
199
209
|
*/
|
|
200
210
|
detectFramework(testFiles) {
|
|
211
|
+
if (testFiles.every(isPythonTestFile))
|
|
212
|
+
return 'pytest';
|
|
201
213
|
// Check file patterns for common framework indicators
|
|
202
214
|
const hasVitestPattern = testFiles.some(f => f.includes('.test.') || f.includes('.spec.'));
|
|
203
215
|
const hasMochaPattern = testFiles.some(f => f.includes('_test.') || f.includes('.mocha.'));
|
|
@@ -206,7 +218,6 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
206
218
|
return 'vitest';
|
|
207
219
|
if (hasMochaPattern)
|
|
208
220
|
return 'mocha';
|
|
209
|
-
// Could add project config detection here (vitest.config.ts, jest.config.js, etc.)
|
|
210
221
|
return 'vitest';
|
|
211
222
|
}
|
|
212
223
|
/**
|
|
@@ -258,7 +269,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
258
269
|
// #1176: these first-attempt failures did happen; flaky analysis
|
|
259
270
|
// records them even when a retry then passes.
|
|
260
271
|
const firstAttemptFailures = [...result.value.failedTests];
|
|
261
|
-
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
272
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
|
|
262
273
|
// Record execution results for learning
|
|
263
274
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
264
275
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
@@ -296,7 +307,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
296
307
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
297
308
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
298
309
|
// 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 });
|
|
310
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
|
|
300
311
|
if (rerunResult)
|
|
301
312
|
return rerunResult;
|
|
302
313
|
}
|
|
@@ -367,7 +378,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
367
378
|
this.activeRuns.delete(runId);
|
|
368
379
|
if (result.success) {
|
|
369
380
|
// #1176: retries finish before the run is recorded or announced.
|
|
370
|
-
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
381
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
|
|
371
382
|
// Record execution results for learning
|
|
372
383
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
373
384
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
@@ -407,7 +418,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
407
418
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
408
419
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
409
420
|
// 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 });
|
|
421
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
|
|
411
422
|
if (rerunResult)
|
|
412
423
|
return rerunResult;
|
|
413
424
|
}
|
|
@@ -510,6 +521,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
510
521
|
failedTests: testsToRetry,
|
|
511
522
|
maxRetries: request.maxRetries,
|
|
512
523
|
backoff: request.backoff ?? 'exponential',
|
|
524
|
+
projectRoot: request.projectRoot,
|
|
513
525
|
onRetry: (testId, attempt) => {
|
|
514
526
|
// Could publish individual retry events here
|
|
515
527
|
void testId;
|
|
@@ -627,9 +639,11 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
627
639
|
return this.execute({
|
|
628
640
|
testFiles: [...filesToRerun],
|
|
629
641
|
framework,
|
|
642
|
+
frameworkFromConfig: originalRequest.frameworkFromConfig,
|
|
630
643
|
timeout: originalRequest.timeout,
|
|
631
644
|
env: originalRequest.env,
|
|
632
645
|
retryCount: originalRequest.retryCount,
|
|
646
|
+
projectRoot: originalRequest.projectRoot,
|
|
633
647
|
});
|
|
634
648
|
}
|
|
635
649
|
/**
|
|
@@ -47,10 +47,20 @@ 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[];
|
|
53
58
|
framework: string;
|
|
59
|
+
/**
|
|
60
|
+
* #1272: the caller named no framework, so each runner project's own config
|
|
61
|
+
* chooses jest or vitest; `framework` is used where it names neither.
|
|
62
|
+
*/
|
|
63
|
+
frameworkFromConfig?: boolean;
|
|
54
64
|
timeout?: number;
|
|
55
65
|
env?: Record<string, string>;
|
|
56
66
|
reporters?: string[];
|
|
@@ -59,6 +69,11 @@ export interface IExecuteTestsRequest {
|
|
|
59
69
|
* or TestRunCompleted is published, so both carry the final outcome.
|
|
60
70
|
*/
|
|
61
71
|
retryCount?: number;
|
|
72
|
+
/**
|
|
73
|
+
* #1247: directory to run every file from, already checked to be inside the
|
|
74
|
+
* project. When omitted, each file runs from its nearest runner project.
|
|
75
|
+
*/
|
|
76
|
+
projectRoot?: string;
|
|
62
77
|
}
|
|
63
78
|
export interface IParallelExecutionRequest extends IExecuteTestsRequest {
|
|
64
79
|
workers: number;
|
|
@@ -173,6 +188,8 @@ export interface IRetryRequest {
|
|
|
173
188
|
failedTests: string[];
|
|
174
189
|
maxRetries: number;
|
|
175
190
|
backoff?: 'linear' | 'exponential';
|
|
191
|
+
/** #1247: the run's explicit projectRoot; retries run from it too. */
|
|
192
|
+
projectRoot?: string;
|
|
176
193
|
}
|
|
177
194
|
export interface IRetryResult {
|
|
178
195
|
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,22 +66,27 @@ 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) {
|
|
77
80
|
// Simple request format
|
|
78
81
|
const request = {
|
|
79
82
|
testFiles,
|
|
83
|
+
// #1272: an explicit framework wins over the project's config.
|
|
84
|
+
framework: typeof payload.framework === 'string' ? payload.framework : undefined,
|
|
80
85
|
parallel: payload.parallel,
|
|
81
86
|
retryCount: payload.retryCount,
|
|
82
87
|
timeout: payload.timeout,
|
|
83
88
|
workers: payload.workers,
|
|
89
|
+
projectRoot,
|
|
84
90
|
};
|
|
85
91
|
return this.coordinator.runTests(request);
|
|
86
92
|
}
|
|
@@ -39,7 +39,8 @@ export interface FlakyDetectorConfig {
|
|
|
39
39
|
*/
|
|
40
40
|
testRunnerArgs: string[];
|
|
41
41
|
/**
|
|
42
|
-
* Working directory for test execution.
|
|
42
|
+
* Working directory for test execution. When omitted, each file runs from
|
|
43
|
+
* its nearest runner project, as test_execute_parallel does (#1247, #1272).
|
|
43
44
|
*/
|
|
44
45
|
cwd?: string;
|
|
45
46
|
/**
|
|
@@ -112,6 +113,13 @@ export declare class FlakyDetectorService implements IFlakyTestDetector {
|
|
|
112
113
|
/** Cache TTL for analysis results (1 hour) */
|
|
113
114
|
private readonly ANALYSIS_CACHE_TTL_MS;
|
|
114
115
|
constructor(memory: MemoryBackend, config?: Partial<FlakyDetectorConfig>);
|
|
116
|
+
/** True when the caller chose the runner command; else the project's config picks it. */
|
|
117
|
+
private readonly runnerConfigured;
|
|
118
|
+
/**
|
|
119
|
+
* #1272: the runner command for a run started in `cwd`. A configured command
|
|
120
|
+
* is used as given; the default runs Jest in a project configured for Jest.
|
|
121
|
+
*/
|
|
122
|
+
private runnerCommandIn;
|
|
115
123
|
/**
|
|
116
124
|
* Detect flaky tests by running them multiple times
|
|
117
125
|
*/
|
|
@@ -14,6 +14,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
|
14
14
|
import { getTestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
15
15
|
import { createVitestJsonReport, needsVitestJsonReportFile } from '../../../shared/vitest-json-report.js';
|
|
16
16
|
import { isJestCommand, jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
17
|
+
import { runnerCwdFor, runnerFrameworkFor } from '../../../shared/test-runner-project.js';
|
|
17
18
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
18
19
|
import { redactFailureText } from './runner-test-cases.js';
|
|
19
20
|
const DEFAULT_FLAKY_CONFIG = {
|
|
@@ -41,6 +42,19 @@ export class FlakyDetectorService {
|
|
|
41
42
|
constructor(memory, config = {}) {
|
|
42
43
|
this.memory = memory;
|
|
43
44
|
this.config = { ...DEFAULT_FLAKY_CONFIG, ...config };
|
|
45
|
+
this.runnerConfigured = config.testRunner !== undefined || config.testRunnerArgs !== undefined;
|
|
46
|
+
}
|
|
47
|
+
/** True when the caller chose the runner command; else the project's config picks it. */
|
|
48
|
+
runnerConfigured;
|
|
49
|
+
/**
|
|
50
|
+
* #1272: the runner command for a run started in `cwd`. A configured command
|
|
51
|
+
* is used as given; the default runs Jest in a project configured for Jest.
|
|
52
|
+
*/
|
|
53
|
+
runnerCommandIn(cwd) {
|
|
54
|
+
if (!this.runnerConfigured && runnerFrameworkFor(cwd) === 'jest') {
|
|
55
|
+
return { runner: 'npx', runnerArgs: ['jest', '--json'] };
|
|
56
|
+
}
|
|
57
|
+
return { runner: this.config.testRunner, runnerArgs: this.config.testRunnerArgs };
|
|
44
58
|
}
|
|
45
59
|
/**
|
|
46
60
|
* Detect flaky tests by running them multiple times
|
|
@@ -259,20 +273,24 @@ export class FlakyDetectorService {
|
|
|
259
273
|
const runId = uuidv4();
|
|
260
274
|
const startTime = Date.now();
|
|
261
275
|
return new Promise((resolve, reject) => {
|
|
262
|
-
const
|
|
276
|
+
const fileBase = this.config.cwd ?? process.cwd();
|
|
277
|
+
// #1272: a runner loads the config of the directory it starts in, so the
|
|
278
|
+
// file runs from its own runner project (the file path stays absolute).
|
|
279
|
+
const cwd = this.config.cwd ?? runnerCwdFor(file);
|
|
280
|
+
const { runner, runnerArgs } = this.runnerCommandIn(cwd);
|
|
263
281
|
// #909: pass an absolute path (never read as a flag); Jest reads it as a
|
|
264
282
|
// regex, so escape and anchor it to select exactly this file.
|
|
265
|
-
const fileArg = isJestCommand([
|
|
266
|
-
? jestExactPathPattern(file,
|
|
267
|
-
: runnerFilePath(file,
|
|
268
|
-
const baseArgs = [...
|
|
283
|
+
const fileArg = isJestCommand([runner, ...runnerArgs])
|
|
284
|
+
? jestExactPathPattern(file, fileBase)
|
|
285
|
+
: runnerFilePath(file, fileBase);
|
|
286
|
+
const baseArgs = [...runnerArgs, fileArg];
|
|
269
287
|
// Vitest 5 writes --reporter=json output to a file, not stdout. Detect
|
|
270
288
|
// Vitest from the runner command too (testRunner: 'vitest', args: ['run', ...]).
|
|
271
|
-
const report = needsVitestJsonReportFile([
|
|
289
|
+
const report = needsVitestJsonReportFile([runner, ...baseArgs])
|
|
272
290
|
? createVitestJsonReport()
|
|
273
291
|
: undefined;
|
|
274
292
|
const args = report ? [...baseArgs, ...report.args] : baseArgs;
|
|
275
|
-
const child = spawn(
|
|
293
|
+
const child = spawn(runner, args, {
|
|
276
294
|
cwd,
|
|
277
295
|
env: { ...process.env, ...this.config.env },
|
|
278
296
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -295,7 +313,7 @@ export class FlakyDetectorService {
|
|
|
295
313
|
clearTimeout(timeout);
|
|
296
314
|
report?.cleanup();
|
|
297
315
|
reject(new Error(`Failed to execute test runner: ${error.message}. ` +
|
|
298
|
-
`Ensure ${
|
|
316
|
+
`Ensure ${[runner, ...runnerArgs.slice(0, 1)].join(' ')} is installed and accessible.`));
|
|
299
317
|
});
|
|
300
318
|
child.on('close', (code) => {
|
|
301
319
|
clearTimeout(timeout);
|
|
@@ -8,7 +8,7 @@ import { MemoryBackend } from '../../../kernel/interfaces';
|
|
|
8
8
|
/**
|
|
9
9
|
* Supported test runners for retry execution
|
|
10
10
|
*/
|
|
11
|
-
export type TestRunner = 'vitest' | 'jest' | 'mocha' | 'auto';
|
|
11
|
+
export type TestRunner = 'vitest' | 'jest' | 'mocha' | 'pytest' | 'auto';
|
|
12
12
|
/**
|
|
13
13
|
* Configuration for the retry handler service
|
|
14
14
|
*/
|
|
@@ -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;
|
|
@@ -157,6 +159,12 @@ export declare class RetryHandlerService implements IRetryHandler {
|
|
|
157
159
|
* Spawn a test process and parse the result
|
|
158
160
|
*/
|
|
159
161
|
private spawnTestProcess;
|
|
162
|
+
/**
|
|
163
|
+
* #1248: a pytest retry passes only when its JUnit report shows the test
|
|
164
|
+
* passed. A node id pytest cannot find (exit code 4) or no collected test
|
|
165
|
+
* (exit code 5) reran nothing.
|
|
166
|
+
*/
|
|
167
|
+
private parsePytestRetry;
|
|
160
168
|
/**
|
|
161
169
|
* Parse test runner output to determine pass/fail status
|
|
162
170
|
*/
|
|
@@ -6,6 +6,8 @@ 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';
|
|
10
|
+
import { createPytestJunitReport, isPythonTestFile, parsePytestJunitXml, pytestCommand, PYTEST_ENV, } from '../../../shared/pytest-junit-report.js';
|
|
9
11
|
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
10
12
|
import { resolve as resolvePath } from 'node:path';
|
|
11
13
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -92,7 +94,7 @@ export class RetryHandlerService {
|
|
|
92
94
|
* Execute failed tests with retry logic
|
|
93
95
|
*/
|
|
94
96
|
async executeWithRetry(request) {
|
|
95
|
-
const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, } = request;
|
|
97
|
+
const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, projectRoot, } = request;
|
|
96
98
|
try {
|
|
97
99
|
const stats = {
|
|
98
100
|
runId,
|
|
@@ -108,7 +110,7 @@ export class RetryHandlerService {
|
|
|
108
110
|
const unmatched = [];
|
|
109
111
|
const tests = [];
|
|
110
112
|
for (const test of failedTests) {
|
|
111
|
-
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
|
|
113
|
+
const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot);
|
|
112
114
|
stats.totalRetries += result.attempts;
|
|
113
115
|
if (result.passed) {
|
|
114
116
|
nowPassing.push(test.testId);
|
|
@@ -228,7 +230,7 @@ export class RetryHandlerService {
|
|
|
228
230
|
return false;
|
|
229
231
|
}
|
|
230
232
|
}
|
|
231
|
-
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
|
|
233
|
+
async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot) {
|
|
232
234
|
let attempts = 0;
|
|
233
235
|
// #1122: the final error is persisted in retry-history, so keep it redacted.
|
|
234
236
|
let lastError = redactFailureText(test.error);
|
|
@@ -246,7 +248,7 @@ export class RetryHandlerService {
|
|
|
246
248
|
onRetry(test.testId, attempts + 1);
|
|
247
249
|
}
|
|
248
250
|
// Execute test (simulated - in real implementation, would run actual test)
|
|
249
|
-
const result = await this.executeTest(test);
|
|
251
|
+
const result = await this.executeTest(test, projectRoot);
|
|
250
252
|
// #1141: a filter that selected no test reran nothing. Report that
|
|
251
253
|
// instead of counting it as a retry, and stop: another attempt would
|
|
252
254
|
// select nothing again.
|
|
@@ -272,7 +274,7 @@ export class RetryHandlerService {
|
|
|
272
274
|
finalError: lastError,
|
|
273
275
|
};
|
|
274
276
|
}
|
|
275
|
-
async executeTest(test) {
|
|
277
|
+
async executeTest(test, projectRoot) {
|
|
276
278
|
// In simulation mode (for unit testing), use random behavior
|
|
277
279
|
if (this.config.simulateForTesting) {
|
|
278
280
|
const passOnRetry = secureRandom() < this.config.simulatedRetrySuccessRate;
|
|
@@ -282,12 +284,12 @@ export class RetryHandlerService {
|
|
|
282
284
|
};
|
|
283
285
|
}
|
|
284
286
|
// In production mode, actually execute the test
|
|
285
|
-
return this.executeRealTest(test);
|
|
287
|
+
return this.executeRealTest(test, projectRoot);
|
|
286
288
|
}
|
|
287
289
|
/**
|
|
288
290
|
* Execute a real test using the configured test runner
|
|
289
291
|
*/
|
|
290
|
-
async executeRealTest(test) {
|
|
292
|
+
async executeRealTest(test, projectRoot) {
|
|
291
293
|
const testFile = test.file;
|
|
292
294
|
const testName = test.testName;
|
|
293
295
|
const cwd = this.config.cwd ?? process.cwd();
|
|
@@ -295,8 +297,12 @@ export class RetryHandlerService {
|
|
|
295
297
|
if (!existsSync(testFile)) {
|
|
296
298
|
throw new Error(`Test file not found: ${testFile}. Cannot retry non-existent test file.`);
|
|
297
299
|
}
|
|
298
|
-
//
|
|
299
|
-
|
|
300
|
+
// #1247: retry from the same directory as the first run: the caller's
|
|
301
|
+
// projectRoot, else a configured directory, else the file's runner
|
|
302
|
+
// project. The file path stays relative to `cwd`.
|
|
303
|
+
const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
|
|
304
|
+
// Detect or use configured test runner. #1248: a Python file is pytest's.
|
|
305
|
+
const runner = isPythonTestFile(testFile) ? 'pytest' : await this.detectTestRunner(runCwd);
|
|
300
306
|
if (!runner) {
|
|
301
307
|
throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
|
|
302
308
|
`or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
|
|
@@ -304,7 +310,7 @@ export class RetryHandlerService {
|
|
|
304
310
|
// Build command based on runner
|
|
305
311
|
const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
|
|
306
312
|
// Execute the test
|
|
307
|
-
return this.spawnTestProcess(command, args,
|
|
313
|
+
return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined, runner === 'pytest' ? (code, reportText, output) => this.parsePytestRetry(code, reportText, output) : undefined);
|
|
308
314
|
}
|
|
309
315
|
/**
|
|
310
316
|
* Detect which test runner is available in the project
|
|
@@ -410,6 +416,13 @@ export class RetryHandlerService {
|
|
|
410
416
|
mochaArgs.push(nameFilterArg('mocha', testName));
|
|
411
417
|
return { command: npx, args: mochaArgs };
|
|
412
418
|
}
|
|
419
|
+
case 'pytest':
|
|
420
|
+
// #1248: the failed test's node id is <file>::<name> (name from the run).
|
|
421
|
+
{
|
|
422
|
+
const report = createPytestJunitReport();
|
|
423
|
+
const file = runnerFilePath(testFile, cwd);
|
|
424
|
+
return { ...pytestCommand([filterByName ? `${file}::${testName}` : file], report.path), report };
|
|
425
|
+
}
|
|
413
426
|
default:
|
|
414
427
|
throw new Error(`Unsupported test runner: ${runner}`);
|
|
415
428
|
}
|
|
@@ -417,7 +430,7 @@ export class RetryHandlerService {
|
|
|
417
430
|
/**
|
|
418
431
|
* Spawn a test process and parse the result
|
|
419
432
|
*/
|
|
420
|
-
spawnTestProcess(command, args, cwd, report, targetFile) {
|
|
433
|
+
spawnTestProcess(command, args, cwd, report, targetFile, parseReport) {
|
|
421
434
|
return new Promise((resolve, reject) => {
|
|
422
435
|
const timeout = this.config.testTimeout;
|
|
423
436
|
let stdout = '';
|
|
@@ -434,7 +447,7 @@ export class RetryHandlerService {
|
|
|
434
447
|
const proc = spawn(command, args, {
|
|
435
448
|
cwd,
|
|
436
449
|
detached: process.platform !== 'win32',
|
|
437
|
-
env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
|
|
450
|
+
env: { ...process.env, FORCE_COLOR: '0', CI: 'true', ...PYTEST_ENV },
|
|
438
451
|
});
|
|
439
452
|
const untrackExit = trackTestRunnerExit(proc);
|
|
440
453
|
const timeoutHandle = setTimeout(() => {
|
|
@@ -465,6 +478,10 @@ export class RetryHandlerService {
|
|
|
465
478
|
// report to the --outputFile; read it back rather than trusting stdout).
|
|
466
479
|
try {
|
|
467
480
|
const reportText = report ? report.read(stdout) : stdout;
|
|
481
|
+
if (parseReport) {
|
|
482
|
+
settle(resolve, parseReport(code, reportText, `${stderr}\n${stdout}`.trim()));
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
468
485
|
if (reportText === undefined) {
|
|
469
486
|
throw new Error('The current Vitest JSON report is missing for the retry run.');
|
|
470
487
|
}
|
|
@@ -484,6 +501,33 @@ export class RetryHandlerService {
|
|
|
484
501
|
});
|
|
485
502
|
});
|
|
486
503
|
}
|
|
504
|
+
/**
|
|
505
|
+
* #1248: a pytest retry passes only when its JUnit report shows the test
|
|
506
|
+
* passed. A node id pytest cannot find (exit code 4) or no collected test
|
|
507
|
+
* (exit code 5) reran nothing.
|
|
508
|
+
*/
|
|
509
|
+
parsePytestRetry(exitCode, report, output) {
|
|
510
|
+
const failure = (text) => ({
|
|
511
|
+
passed: false,
|
|
512
|
+
error: redactFailureText(text || `pytest exited with code ${exitCode}`).substring(0, 1000),
|
|
513
|
+
});
|
|
514
|
+
if (exitCode === 4 || exitCode === 5)
|
|
515
|
+
return UNMATCHED;
|
|
516
|
+
if (report === undefined)
|
|
517
|
+
return failure(output);
|
|
518
|
+
try {
|
|
519
|
+
const cases = parsePytestJunitXml(report);
|
|
520
|
+
if (cases.length === 0)
|
|
521
|
+
return UNMATCHED;
|
|
522
|
+
const failed = cases.find(c => c.status === 'failed' || c.status === 'error');
|
|
523
|
+
if (exitCode === 0 && !failed && cases.some(c => c.status === 'passed'))
|
|
524
|
+
return { passed: true };
|
|
525
|
+
return failure(failed ? [failed.message, failed.details].filter(Boolean).join('\n') : output);
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
return failure(output);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
487
531
|
/**
|
|
488
532
|
* Parse test runner output to determine pass/fail status
|
|
489
533
|
*/
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* derived from aggregate counts.
|
|
7
7
|
*/
|
|
8
8
|
import type { ITestCaseResult } from '../interfaces';
|
|
9
|
+
/** A test case's failure text: redacted (#1122) and capped. */
|
|
10
|
+
export declare function testCaseFailureMessage(text: string): string | undefined;
|
|
9
11
|
/**
|
|
10
12
|
* #1122: failure text goes back over MCP and into saved results, so
|
|
11
13
|
* credential-shaped values (e.g. a connection string) are redacted first.
|
|
@@ -12,10 +12,14 @@ const MAX_FAILURE_MESSAGE_LENGTH = 4000;
|
|
|
12
12
|
function failureMessageOf(assertion) {
|
|
13
13
|
if (!Array.isArray(assertion.failureMessages))
|
|
14
14
|
return undefined;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
return testCaseFailureMessage(assertion.failureMessages.filter((m) => typeof m === 'string').join('\n'));
|
|
16
|
+
}
|
|
17
|
+
/** A test case's failure text: redacted (#1122) and capped. */
|
|
18
|
+
export function testCaseFailureMessage(text) {
|
|
19
|
+
const trimmed = text.trim();
|
|
20
|
+
if (!trimmed)
|
|
17
21
|
return undefined;
|
|
18
|
-
const message = redactFailureText(
|
|
22
|
+
const message = redactFailureText(trimmed);
|
|
19
23
|
return message.length > MAX_FAILURE_MESSAGE_LENGTH
|
|
20
24
|
? `${message.slice(0, MAX_FAILURE_MESSAGE_LENGTH)}… [truncated]`
|
|
21
25
|
: message;
|
|
@@ -113,8 +113,9 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
113
113
|
private mergeSequentialCoverage;
|
|
114
114
|
private executeTestFile;
|
|
115
115
|
private executeTestFiles;
|
|
116
|
+
private executeProjectFiles;
|
|
116
117
|
/**
|
|
117
|
-
* Spawn actual test runner process (vitest, jest, mocha)
|
|
118
|
+
* Spawn actual test runner process (vitest, jest, mocha, node:test, pytest)
|
|
118
119
|
*/
|
|
119
120
|
private spawnTestRunner;
|
|
120
121
|
/**
|
|
@@ -125,6 +126,10 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
125
126
|
* Parse test runner output to extract results
|
|
126
127
|
*/
|
|
127
128
|
private parseTestOutput;
|
|
129
|
+
/**
|
|
130
|
+
* #1248: a pytest run from its JUnit report (undefined when pytest wrote none).
|
|
131
|
+
*/
|
|
132
|
+
private parsePytestOutput;
|
|
128
133
|
/**
|
|
129
134
|
* Parse the TAP or spec summary emitted by Node's built-in test runner.
|
|
130
135
|
*/
|