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
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1247: the runner project a test file belongs to.
|
|
3
|
+
*
|
|
4
|
+
* Vitest and Jest load their configuration (setup files, aliases, include
|
|
5
|
+
* patterns, environment) from the directory they are started in. In a
|
|
6
|
+
* monorepo whose packages have their own config (`apps/webapp/vitest.config.ts`)
|
|
7
|
+
* a run started at the repository root never loads that package's setup, so
|
|
8
|
+
* the package's tests fail or produce no report. Each test file is therefore
|
|
9
|
+
* run from the nearest directory, at or above it, with runner configuration,
|
|
10
|
+
* but never from above the project root. Only real configuration counts, so a
|
|
11
|
+
* workspace package without its own config runs from the root that defines
|
|
12
|
+
* its project.
|
|
13
|
+
*
|
|
14
|
+
* A run from the current working directory is kept whenever that directory is
|
|
15
|
+
* already inside the file's runner project (a single-project repository, or a
|
|
16
|
+
* server started inside the package), so those runs behave as before.
|
|
17
|
+
*
|
|
18
|
+
* #1272: a package with its own config runs from that package, even when the
|
|
19
|
+
* root config also lists it in `test.projects` (or a `vitest.workspace.*`).
|
|
20
|
+
* Settings that only the root config adds to that project (its setup files,
|
|
21
|
+
* aliases or environment) are then not applied; the package's own config is
|
|
22
|
+
* what runs. A package without its own config still runs from the root.
|
|
23
|
+
*
|
|
24
|
+
* #1272: `vite.config.*` counts only when its text contains `test:`. The
|
|
25
|
+
* config is code, and reading what it exports would mean running it, so a
|
|
26
|
+
* `test` block built some other way (spread from another module, say) is not
|
|
27
|
+
* seen and a `test:` that only appears in a comment is. Name the runner config
|
|
28
|
+
* `vitest.config.*` for an exact match.
|
|
29
|
+
*
|
|
30
|
+
* #1248: a Python test file belongs to the nearest directory with pytest
|
|
31
|
+
* configuration instead (`pytest.ini`, `pyproject.toml` with
|
|
32
|
+
* `[tool.pytest.ini_options]`, `setup.cfg` with `[tool:pytest]`, `tox.ini`
|
|
33
|
+
* with `[pytest]`), and JavaScript files ignore that configuration. A
|
|
34
|
+
* `conftest.py` marks a pytest project for detection but is not a directory
|
|
35
|
+
* to run from: it is often in `tests/`, and pytest started there would not
|
|
36
|
+
* have the project root on `sys.path`.
|
|
37
|
+
*/
|
|
38
|
+
import { Result } from './types';
|
|
39
|
+
/**
|
|
40
|
+
* Files whose presence makes a directory a Vitest or Jest project. A root
|
|
41
|
+
* workspace file (`vitest.workspace.*`) counts too: its packages run from it.
|
|
42
|
+
*/
|
|
43
|
+
export declare const RUNNER_CONFIG_FILES: readonly string[];
|
|
44
|
+
export interface RunnerProjectOptions {
|
|
45
|
+
/** Directory runs start in today; defaults to process.cwd(). */
|
|
46
|
+
cwd?: string;
|
|
47
|
+
/** Highest directory the search may reach; defaults to findProjectRoot(). */
|
|
48
|
+
boundary?: string;
|
|
49
|
+
/** Directories already checked, so files that share a directory check it once. */
|
|
50
|
+
checked?: Map<string, boolean>;
|
|
51
|
+
}
|
|
52
|
+
/** A set of test files that run together from one directory. */
|
|
53
|
+
export interface RunnerProjectGroup {
|
|
54
|
+
cwd: string;
|
|
55
|
+
files: string[];
|
|
56
|
+
}
|
|
57
|
+
/** A runner whose project configuration can be recognised from its files. */
|
|
58
|
+
export type RunnerFramework = 'vitest' | 'jest';
|
|
59
|
+
/** True when `dir` holds a Vitest or Jest configuration. */
|
|
60
|
+
export declare function isRunnerProjectDir(dir: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* #1248: true when `dir` holds pytest configuration; with `conftest`, a
|
|
63
|
+
* `conftest.py` counts too (see the header note).
|
|
64
|
+
*/
|
|
65
|
+
export declare function isPytestProjectDir(dir: string, conftest?: boolean): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* #1248: true when `dir`, or a directory above it no higher than `boundary`,
|
|
68
|
+
* is configured for pytest (including a `conftest.py`).
|
|
69
|
+
*/
|
|
70
|
+
export declare function isPytestProject(dir: string, boundary?: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* #1272: the runner configured by the runner project that `dir` belongs to:
|
|
73
|
+
* the nearest directory at or above `dir`, no higher than `boundary`, with
|
|
74
|
+
* runner configuration. Jest config (`jest.config.*`, or a `jest` key in
|
|
75
|
+
* package.json) means jest; Vitest config (`vitest.config.*`,
|
|
76
|
+
* `vitest.workspace.*`, a `vite.config.*` with `test`, or a `vitest` key)
|
|
77
|
+
* means vitest. Undefined when no project is found or it configures both, so
|
|
78
|
+
* the caller keeps its own choice.
|
|
79
|
+
*/
|
|
80
|
+
export declare function runnerFrameworkFor(dir: string, boundary?: string): RunnerFramework | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* The nearest directory at or above `file` with runner configuration, searching no
|
|
83
|
+
* higher than `boundary`. Undefined when the file lies outside the boundary or
|
|
84
|
+
* no directory on the way has runner configuration.
|
|
85
|
+
*/
|
|
86
|
+
export declare function findRunnerProjectDir(file: string, boundary: string, cwd?: string, checked?: Map<string, boolean>): string | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Directory to start the runner in for `file`: its runner project, unless the
|
|
89
|
+
* current directory is already inside that project (or none is found), in
|
|
90
|
+
* which case the current directory is kept.
|
|
91
|
+
*/
|
|
92
|
+
export declare function runnerCwdFor(file: string, options?: RunnerProjectOptions): string;
|
|
93
|
+
/**
|
|
94
|
+
* Group `files` by the directory each must run from, in first-seen order.
|
|
95
|
+
* Files keep the spelling they were given. #1248: Python files never share a
|
|
96
|
+
* group with other files, since only pytest runs them.
|
|
97
|
+
*/
|
|
98
|
+
export declare function groupByRunnerProject(files: readonly string[], options?: RunnerProjectOptions): RunnerProjectGroup[];
|
|
99
|
+
/** Test files to run, and the directory to run them from when the caller named one. */
|
|
100
|
+
export interface TestRunTargets {
|
|
101
|
+
testFiles: string[];
|
|
102
|
+
projectRoot?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Handler-side check for an execute-tests payload. `testFiles` must name
|
|
106
|
+
* files or directories inside the project (#1126). An explicit `projectRoot`
|
|
107
|
+
* must be a directory inside the project, checked by realpath so `..`, an
|
|
108
|
+
* outside absolute path or a symlink pointing out is refused; relative test
|
|
109
|
+
* files are then read from it, and every path is returned absolute.
|
|
110
|
+
*/
|
|
111
|
+
export declare function requireTestRunTargets(taskType: string, testFiles: unknown, projectRoot: unknown): Promise<Result<TestRunTargets, Error>>;
|
|
112
|
+
/**
|
|
113
|
+
* An explicit `projectRoot` (MCP `test_execute_parallel`, CLI
|
|
114
|
+
* `aqe test execute --project-root`): a directory inside the project, checked
|
|
115
|
+
* by realpath so `..`, an outside absolute path or a symlink pointing out is
|
|
116
|
+
* refused. Returns the absolute directory.
|
|
117
|
+
*/
|
|
118
|
+
export declare function requireRunProjectRoot(taskType: string, projectRoot: unknown): Promise<Result<string, Error>>;
|
|
119
|
+
//# sourceMappingURL=test-runner-project.d.ts.map
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1247: the runner project a test file belongs to.
|
|
3
|
+
*
|
|
4
|
+
* Vitest and Jest load their configuration (setup files, aliases, include
|
|
5
|
+
* patterns, environment) from the directory they are started in. In a
|
|
6
|
+
* monorepo whose packages have their own config (`apps/webapp/vitest.config.ts`)
|
|
7
|
+
* a run started at the repository root never loads that package's setup, so
|
|
8
|
+
* the package's tests fail or produce no report. Each test file is therefore
|
|
9
|
+
* run from the nearest directory, at or above it, with runner configuration,
|
|
10
|
+
* but never from above the project root. Only real configuration counts, so a
|
|
11
|
+
* workspace package without its own config runs from the root that defines
|
|
12
|
+
* its project.
|
|
13
|
+
*
|
|
14
|
+
* A run from the current working directory is kept whenever that directory is
|
|
15
|
+
* already inside the file's runner project (a single-project repository, or a
|
|
16
|
+
* server started inside the package), so those runs behave as before.
|
|
17
|
+
*
|
|
18
|
+
* #1272: a package with its own config runs from that package, even when the
|
|
19
|
+
* root config also lists it in `test.projects` (or a `vitest.workspace.*`).
|
|
20
|
+
* Settings that only the root config adds to that project (its setup files,
|
|
21
|
+
* aliases or environment) are then not applied; the package's own config is
|
|
22
|
+
* what runs. A package without its own config still runs from the root.
|
|
23
|
+
*
|
|
24
|
+
* #1272: `vite.config.*` counts only when its text contains `test:`. The
|
|
25
|
+
* config is code, and reading what it exports would mean running it, so a
|
|
26
|
+
* `test` block built some other way (spread from another module, say) is not
|
|
27
|
+
* seen and a `test:` that only appears in a comment is. Name the runner config
|
|
28
|
+
* `vitest.config.*` for an exact match.
|
|
29
|
+
*
|
|
30
|
+
* #1248: a Python test file belongs to the nearest directory with pytest
|
|
31
|
+
* configuration instead (`pytest.ini`, `pyproject.toml` with
|
|
32
|
+
* `[tool.pytest.ini_options]`, `setup.cfg` with `[tool:pytest]`, `tox.ini`
|
|
33
|
+
* with `[pytest]`), and JavaScript files ignore that configuration. A
|
|
34
|
+
* `conftest.py` marks a pytest project for detection but is not a directory
|
|
35
|
+
* to run from: it is often in `tests/`, and pytest started there would not
|
|
36
|
+
* have the project root on `sys.path`.
|
|
37
|
+
*/
|
|
38
|
+
import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
39
|
+
import * as path from 'node:path';
|
|
40
|
+
import { findProjectRoot } from '../kernel/project-root.js';
|
|
41
|
+
import { CallerInputError } from './error-utils.js';
|
|
42
|
+
import { requirePayloadFiles, requirePayloadPath } from './io/payload-path-guard.js';
|
|
43
|
+
import { isPythonTestFile } from './pytest-junit-report.js';
|
|
44
|
+
import { safeJsonParse } from './safe-json.js';
|
|
45
|
+
import { runnerFilePath } from './test-runner-args.js';
|
|
46
|
+
import { ok, err } from './types/index.js';
|
|
47
|
+
const CONFIG_EXTENSIONS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
|
|
48
|
+
/**
|
|
49
|
+
* Files whose presence makes a directory a Vitest or Jest project. A root
|
|
50
|
+
* workspace file (`vitest.workspace.*`) counts too: its packages run from it.
|
|
51
|
+
*/
|
|
52
|
+
export const RUNNER_CONFIG_FILES = [
|
|
53
|
+
...CONFIG_EXTENSIONS.map(ext => `vitest.config.${ext}`),
|
|
54
|
+
...[...CONFIG_EXTENSIONS, 'json'].map(ext => `vitest.workspace.${ext}`),
|
|
55
|
+
...CONFIG_EXTENSIONS.map(ext => `jest.config.${ext}`),
|
|
56
|
+
'jest.config.json',
|
|
57
|
+
];
|
|
58
|
+
/** Vite configs: a runner project only when they configure `test`. */
|
|
59
|
+
const VITE_CONFIG_FILES = CONFIG_EXTENSIONS.map(ext => `vite.config.${ext}`);
|
|
60
|
+
/** Largest config or package.json read while looking for a runner setup. */
|
|
61
|
+
const MAX_MARKER_BYTES = 1024 * 1024;
|
|
62
|
+
function realDir(dir) {
|
|
63
|
+
try {
|
|
64
|
+
return realpathSync(dir);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return path.resolve(dir);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
71
|
+
function isWithin(root, candidate) {
|
|
72
|
+
const relative = path.relative(root, candidate);
|
|
73
|
+
return relative === '' || (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
74
|
+
}
|
|
75
|
+
function readSmallFile(file) {
|
|
76
|
+
try {
|
|
77
|
+
const stat = statSync(file);
|
|
78
|
+
if (!stat.isFile() || stat.size > MAX_MARKER_BYTES)
|
|
79
|
+
return undefined;
|
|
80
|
+
return readFileSync(file, 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Runners a package.json in `dir` configures (a top-level `jest` or `vitest`
|
|
88
|
+
* key). Listing a runner as a dependency or in `scripts.test` does not count:
|
|
89
|
+
* in a workspace the packages do that while the root config defines their
|
|
90
|
+
* projects and setup.
|
|
91
|
+
*/
|
|
92
|
+
function packageRunnerKeys(dir) {
|
|
93
|
+
const text = readSmallFile(path.join(dir, 'package.json'));
|
|
94
|
+
if (text === undefined)
|
|
95
|
+
return [];
|
|
96
|
+
let pkg;
|
|
97
|
+
try {
|
|
98
|
+
pkg = safeJsonParse(text);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
if (!pkg || typeof pkg !== 'object')
|
|
104
|
+
return [];
|
|
105
|
+
return ['vitest', 'jest'].filter(key => pkg[key] !== undefined);
|
|
106
|
+
}
|
|
107
|
+
/** True when a `vite.config.*` in `dir` mentions `test:` (see the header note). */
|
|
108
|
+
function viteConfiguresTest(dir) {
|
|
109
|
+
return VITE_CONFIG_FILES.some(name => {
|
|
110
|
+
const text = readSmallFile(path.join(dir, name));
|
|
111
|
+
return text !== undefined && /\btest\s*:/.test(text);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** The runners whose configuration `dir` holds. */
|
|
115
|
+
function configuredRunners(dir) {
|
|
116
|
+
const runners = new Set(packageRunnerKeys(dir));
|
|
117
|
+
for (const name of RUNNER_CONFIG_FILES) {
|
|
118
|
+
if (existsSync(path.join(dir, name)))
|
|
119
|
+
runners.add(name.startsWith('jest.') ? 'jest' : 'vitest');
|
|
120
|
+
}
|
|
121
|
+
if (!runners.has('vitest') && viteConfiguresTest(dir))
|
|
122
|
+
runners.add('vitest');
|
|
123
|
+
return runners;
|
|
124
|
+
}
|
|
125
|
+
/** True when `dir` holds a Vitest or Jest configuration. */
|
|
126
|
+
export function isRunnerProjectDir(dir) {
|
|
127
|
+
return configuredRunners(dir).size > 0;
|
|
128
|
+
}
|
|
129
|
+
/** pytest configuration files, and the section each must contain (none: always). */
|
|
130
|
+
const PYTEST_CONFIG_SECTIONS = [
|
|
131
|
+
['pytest.ini', undefined],
|
|
132
|
+
['pyproject.toml', /^\s*\[tool\.pytest(?:\.ini_options)?\]/m],
|
|
133
|
+
['tox.ini', /^\s*\[pytest\]/m],
|
|
134
|
+
['setup.cfg', /^\s*\[tool:pytest\]/m],
|
|
135
|
+
];
|
|
136
|
+
/**
|
|
137
|
+
* #1248: true when `dir` holds pytest configuration; with `conftest`, a
|
|
138
|
+
* `conftest.py` counts too (see the header note).
|
|
139
|
+
*/
|
|
140
|
+
export function isPytestProjectDir(dir, conftest = false) {
|
|
141
|
+
if (conftest && existsSync(path.join(dir, 'conftest.py')))
|
|
142
|
+
return true;
|
|
143
|
+
return PYTEST_CONFIG_SECTIONS.some(([name, section]) => {
|
|
144
|
+
if (!section)
|
|
145
|
+
return existsSync(path.join(dir, name));
|
|
146
|
+
const text = readSmallFile(path.join(dir, name));
|
|
147
|
+
return text !== undefined && section.test(text);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* #1248: true when `dir`, or a directory above it no higher than `boundary`,
|
|
152
|
+
* is configured for pytest (including a `conftest.py`).
|
|
153
|
+
*/
|
|
154
|
+
export function isPytestProject(dir, boundary = findProjectRoot()) {
|
|
155
|
+
const root = realDir(boundary);
|
|
156
|
+
let current = realDir(dir);
|
|
157
|
+
const bounded = isWithin(root, current);
|
|
158
|
+
for (;;) {
|
|
159
|
+
if (isPytestProjectDir(current, true))
|
|
160
|
+
return true;
|
|
161
|
+
if (!bounded || current === root)
|
|
162
|
+
return false;
|
|
163
|
+
const parent = path.dirname(current);
|
|
164
|
+
if (parent === current)
|
|
165
|
+
return false;
|
|
166
|
+
current = parent;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* #1272: the runner configured by the runner project that `dir` belongs to:
|
|
171
|
+
* the nearest directory at or above `dir`, no higher than `boundary`, with
|
|
172
|
+
* runner configuration. Jest config (`jest.config.*`, or a `jest` key in
|
|
173
|
+
* package.json) means jest; Vitest config (`vitest.config.*`,
|
|
174
|
+
* `vitest.workspace.*`, a `vite.config.*` with `test`, or a `vitest` key)
|
|
175
|
+
* means vitest. Undefined when no project is found or it configures both, so
|
|
176
|
+
* the caller keeps its own choice.
|
|
177
|
+
*/
|
|
178
|
+
export function runnerFrameworkFor(dir, boundary = findProjectRoot()) {
|
|
179
|
+
const root = realDir(boundary);
|
|
180
|
+
let current = realDir(dir);
|
|
181
|
+
const bounded = isWithin(root, current);
|
|
182
|
+
for (;;) {
|
|
183
|
+
const runners = configuredRunners(current);
|
|
184
|
+
if (runners.size > 0)
|
|
185
|
+
return runners.size === 1 ? [...runners][0] : undefined;
|
|
186
|
+
if (!bounded || current === root)
|
|
187
|
+
return undefined;
|
|
188
|
+
const parent = path.dirname(current);
|
|
189
|
+
if (parent === current)
|
|
190
|
+
return undefined;
|
|
191
|
+
current = parent;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The nearest directory at or above `file` with runner configuration, searching no
|
|
196
|
+
* higher than `boundary`. Undefined when the file lies outside the boundary or
|
|
197
|
+
* no directory on the way has runner configuration.
|
|
198
|
+
*/
|
|
199
|
+
export function findRunnerProjectDir(file, boundary, cwd = process.cwd(), checked = new Map()) {
|
|
200
|
+
const root = realDir(boundary);
|
|
201
|
+
let dir = path.dirname(runnerFilePath(file, cwd));
|
|
202
|
+
if (!isWithin(root, dir))
|
|
203
|
+
return undefined;
|
|
204
|
+
// #1248: Python files run from pytest config, other files from Vitest/Jest config.
|
|
205
|
+
const python = isPythonTestFile(file);
|
|
206
|
+
for (;;) {
|
|
207
|
+
const key = python ? `pytest:${dir}` : dir;
|
|
208
|
+
let isProject = checked.get(key);
|
|
209
|
+
if (isProject === undefined) {
|
|
210
|
+
isProject = python ? isPytestProjectDir(dir) : isRunnerProjectDir(dir);
|
|
211
|
+
checked.set(key, isProject);
|
|
212
|
+
}
|
|
213
|
+
if (isProject)
|
|
214
|
+
return dir;
|
|
215
|
+
if (dir === root)
|
|
216
|
+
return undefined;
|
|
217
|
+
const parent = path.dirname(dir);
|
|
218
|
+
if (parent === dir)
|
|
219
|
+
return undefined;
|
|
220
|
+
dir = parent;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Directory to start the runner in for `file`: its runner project, unless the
|
|
225
|
+
* current directory is already inside that project (or none is found), in
|
|
226
|
+
* which case the current directory is kept.
|
|
227
|
+
*/
|
|
228
|
+
export function runnerCwdFor(file, options = {}) {
|
|
229
|
+
const cwd = options.cwd ?? process.cwd();
|
|
230
|
+
const project = findRunnerProjectDir(file, options.boundary ?? findProjectRoot(), cwd, options.checked);
|
|
231
|
+
if (!project || isWithin(project, realDir(cwd)))
|
|
232
|
+
return cwd;
|
|
233
|
+
return project;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Group `files` by the directory each must run from, in first-seen order.
|
|
237
|
+
* Files keep the spelling they were given. #1248: Python files never share a
|
|
238
|
+
* group with other files, since only pytest runs them.
|
|
239
|
+
*/
|
|
240
|
+
export function groupByRunnerProject(files, options = {}) {
|
|
241
|
+
const resolved = {
|
|
242
|
+
cwd: options.cwd ?? process.cwd(),
|
|
243
|
+
boundary: options.boundary ?? findProjectRoot(),
|
|
244
|
+
checked: options.checked ?? new Map(),
|
|
245
|
+
};
|
|
246
|
+
const groups = new Map();
|
|
247
|
+
for (const file of files) {
|
|
248
|
+
const cwd = runnerCwdFor(file, resolved);
|
|
249
|
+
const key = `${isPythonTestFile(file) ? 'py' : 'js'}\0${cwd}`;
|
|
250
|
+
const group = groups.get(key);
|
|
251
|
+
if (group)
|
|
252
|
+
group.files.push(file);
|
|
253
|
+
else
|
|
254
|
+
groups.set(key, { cwd, files: [file] });
|
|
255
|
+
}
|
|
256
|
+
return [...groups.values()];
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Handler-side check for an execute-tests payload. `testFiles` must name
|
|
260
|
+
* files or directories inside the project (#1126). An explicit `projectRoot`
|
|
261
|
+
* must be a directory inside the project, checked by realpath so `..`, an
|
|
262
|
+
* outside absolute path or a symlink pointing out is refused; relative test
|
|
263
|
+
* files are then read from it, and every path is returned absolute.
|
|
264
|
+
*/
|
|
265
|
+
export async function requireTestRunTargets(taskType, testFiles, projectRoot) {
|
|
266
|
+
const fileOptions = { allowMissing: true, allowDirectory: true };
|
|
267
|
+
if (projectRoot === undefined) {
|
|
268
|
+
const confined = await requirePayloadFiles(taskType, 'testFiles', testFiles, fileOptions);
|
|
269
|
+
return confined.success ? ok({ testFiles: confined.value }) : confined;
|
|
270
|
+
}
|
|
271
|
+
const checked = await requireRunProjectRoot(taskType, projectRoot);
|
|
272
|
+
if (!checked.success)
|
|
273
|
+
return checked;
|
|
274
|
+
const root = checked.value;
|
|
275
|
+
const confined = await requirePayloadFiles(taskType, 'testFiles', testFiles, { ...fileOptions, basePath: root });
|
|
276
|
+
if (!confined.success)
|
|
277
|
+
return confined;
|
|
278
|
+
return ok({ testFiles: confined.value.map(file => path.resolve(root, file)), projectRoot: root });
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* An explicit `projectRoot` (MCP `test_execute_parallel`, CLI
|
|
282
|
+
* `aqe test execute --project-root`): a directory inside the project, checked
|
|
283
|
+
* by realpath so `..`, an outside absolute path or a symlink pointing out is
|
|
284
|
+
* refused. Returns the absolute directory.
|
|
285
|
+
*/
|
|
286
|
+
export async function requireRunProjectRoot(taskType, projectRoot) {
|
|
287
|
+
const checked = await requirePayloadPath(taskType, 'projectRoot', projectRoot, { allowDirectory: true });
|
|
288
|
+
if (!checked.success)
|
|
289
|
+
return checked;
|
|
290
|
+
const root = path.resolve(realDir(process.cwd()), checked.value);
|
|
291
|
+
let isDirectory = false;
|
|
292
|
+
try {
|
|
293
|
+
isDirectory = statSync(root).isDirectory();
|
|
294
|
+
}
|
|
295
|
+
catch { /* reported below */ }
|
|
296
|
+
if (!isDirectory) {
|
|
297
|
+
return err(new CallerInputError(`Invalid ${taskType} payload: 'projectRoot' must be a directory inside the project.`));
|
|
298
|
+
}
|
|
299
|
+
return ok(root);
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=test-runner-project.js.map
|
|
@@ -84,7 +84,9 @@ export declare class SecurityVisualTestingSkill implements ISecurityVisualTestin
|
|
|
84
84
|
*/
|
|
85
85
|
validateURLSecurity(url: string): Promise<Result<URLSecurityValidation, Error>>;
|
|
86
86
|
/**
|
|
87
|
-
* Detect PII in screenshot
|
|
87
|
+
* Detect PII in screenshot.
|
|
88
|
+
* No OCR scanner is available, so the result says the screenshot was not
|
|
89
|
+
* scanned (#1228): detected is null and confidence -1, never "no PII found".
|
|
88
90
|
*/
|
|
89
91
|
detectPII(screenshotPath: string): Promise<Result<PIIDetectionResult, Error>>;
|
|
90
92
|
private ensureInitialized;
|
|
@@ -142,20 +142,17 @@ export class SecurityVisualTestingSkill {
|
|
|
142
142
|
accessibilityReport = accessibilityResult.value;
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
// Step 4: Detect PII in screenshots if enabled
|
|
145
|
+
// Step 4: Detect PII in screenshots if enabled. #1228: no scanner exists,
|
|
146
|
+
// so each screenshot is reported as not scanned, never as free of PII.
|
|
146
147
|
if (this.config.pii.enabled && options.detectPII !== false) {
|
|
147
|
-
// In a real implementation, this would scan all captured screenshots
|
|
148
|
-
// For now, we'll generate a placeholder result
|
|
149
148
|
for (const url of secureUrls) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
screenshot: { original: `${url}-screenshot.png` },
|
|
155
|
-
confidence: 0.95,
|
|
156
|
-
});
|
|
149
|
+
const screenshot = visualReport.results.find((r) => r.url === url)?.screenshot.path.value ?? '';
|
|
150
|
+
const detection = await this.detectPII(screenshot);
|
|
151
|
+
if (detection.success)
|
|
152
|
+
piiDetections.push(detection.value);
|
|
157
153
|
}
|
|
158
154
|
}
|
|
155
|
+
const piiScanned = piiDetections.filter((p) => p.measured);
|
|
159
156
|
// Step 5: Generate recommendations
|
|
160
157
|
const recommendations = this.generateRecommendations(urlValidations, visualReport, accessibilityReport, piiDetections);
|
|
161
158
|
// Build report
|
|
@@ -166,7 +163,7 @@ export class SecurityVisualTestingSkill {
|
|
|
166
163
|
visualTestsPassed: visualReport.passed,
|
|
167
164
|
visualTestsFailed: visualReport.failed,
|
|
168
165
|
accessibilityIssues: accessibilityReport?.totalViolations ?? 0,
|
|
169
|
-
piiDetections:
|
|
166
|
+
piiDetections: piiScanned.length > 0 ? piiScanned.filter((p) => p.detected === true).length : -1,
|
|
170
167
|
duration: Date.now() - startTime,
|
|
171
168
|
},
|
|
172
169
|
urlValidations,
|
|
@@ -216,14 +213,22 @@ export class SecurityVisualTestingSkill {
|
|
|
216
213
|
return err(new Error(`Screenshot capture failed: ${screenshotResult.error.message}`));
|
|
217
214
|
}
|
|
218
215
|
const screenshot = screenshotResult.value;
|
|
219
|
-
// Step 5: Detect PII if enabled
|
|
220
|
-
let piiDetected =
|
|
216
|
+
// Step 5: Detect PII if enabled. #1228: unscanned is null, not false.
|
|
217
|
+
let piiDetected = null;
|
|
218
|
+
let piiNotMeasuredReason = 'PII NOT MEASURED: no PII scan was requested';
|
|
221
219
|
let piiTypes = [];
|
|
222
220
|
let maskedPath;
|
|
223
221
|
if (this.config.pii.enabled && (options.maskPII ?? this.config.pii.autoMask)) {
|
|
224
|
-
const piiResult = await this.detectPII(screenshot.path || '
|
|
225
|
-
if (piiResult.success
|
|
226
|
-
|
|
222
|
+
const piiResult = await this.detectPII(screenshot.path || '');
|
|
223
|
+
if (!piiResult.success) {
|
|
224
|
+
piiNotMeasuredReason = `PII NOT MEASURED: ${piiResult.error.message}`;
|
|
225
|
+
}
|
|
226
|
+
else if (!piiResult.value.measured) {
|
|
227
|
+
piiNotMeasuredReason = piiResult.value.notMeasuredReason;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
piiDetected = piiResult.value.detected;
|
|
231
|
+
piiNotMeasuredReason = undefined;
|
|
227
232
|
piiTypes = piiResult.value.types;
|
|
228
233
|
maskedPath = piiResult.value.screenshot.masked;
|
|
229
234
|
}
|
|
@@ -242,6 +247,7 @@ export class SecurityVisualTestingSkill {
|
|
|
242
247
|
masked: maskedPath,
|
|
243
248
|
},
|
|
244
249
|
piiDetected,
|
|
250
|
+
...(piiNotMeasuredReason ? { piiNotMeasuredReason } : {}),
|
|
245
251
|
piiTypes,
|
|
246
252
|
securityValidation: validation,
|
|
247
253
|
timestamp: new Date(),
|
|
@@ -270,24 +276,18 @@ export class SecurityVisualTestingSkill {
|
|
|
270
276
|
path: result.screenshot.path.value,
|
|
271
277
|
timestamp: result.screenshot.timestamp,
|
|
272
278
|
}));
|
|
279
|
+
// #1228: a missing diff is -1 and a new baseline is `new`, not a 0% pass or a failure
|
|
273
280
|
const visualRegressions = visualReport.results.map((result) => ({
|
|
274
281
|
viewport: result.viewport,
|
|
275
|
-
diffPercentage: result.diff?.diffPercentage ??
|
|
276
|
-
status: result.status
|
|
282
|
+
diffPercentage: result.diff?.diffPercentage ?? -1,
|
|
283
|
+
status: result.status,
|
|
277
284
|
}));
|
|
278
|
-
//
|
|
285
|
+
// #1228: element positions are not compared across viewports, so layout
|
|
286
|
+
// shifts are reported as not measured instead of "no shifts detected".
|
|
279
287
|
const layoutShifts = [];
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
layoutShifts.push({
|
|
284
|
-
viewport: options.viewports[0],
|
|
285
|
-
affectedElements: [],
|
|
286
|
-
score: 0,
|
|
287
|
-
severity: 'low',
|
|
288
|
-
description: 'No significant layout shifts detected',
|
|
289
|
-
});
|
|
290
|
-
}
|
|
288
|
+
const layoutShiftsNotMeasured = options.detectLayoutShifts
|
|
289
|
+
? { layoutShiftsMeasured: false, layoutShiftsNotMeasuredReason: 'layout shift detection is not implemented: element positions were not compared across viewports' }
|
|
290
|
+
: {};
|
|
291
291
|
// Generate recommendations
|
|
292
292
|
const recommendations = [];
|
|
293
293
|
if (visualReport.failed > 0) {
|
|
@@ -301,6 +301,7 @@ export class SecurityVisualTestingSkill {
|
|
|
301
301
|
viewports: options.viewports,
|
|
302
302
|
screenshots,
|
|
303
303
|
layoutShifts,
|
|
304
|
+
...layoutShiftsNotMeasured,
|
|
304
305
|
visualRegressions,
|
|
305
306
|
recommendations,
|
|
306
307
|
};
|
|
@@ -367,20 +368,22 @@ export class SecurityVisualTestingSkill {
|
|
|
367
368
|
}
|
|
368
369
|
}
|
|
369
370
|
/**
|
|
370
|
-
* Detect PII in screenshot
|
|
371
|
+
* Detect PII in screenshot.
|
|
372
|
+
* No OCR scanner is available, so the result says the screenshot was not
|
|
373
|
+
* scanned (#1228): detected is null and confidence -1, never "no PII found".
|
|
371
374
|
*/
|
|
372
375
|
async detectPII(screenshotPath) {
|
|
373
376
|
try {
|
|
374
|
-
// In a real implementation, this would use OCR and pattern matching
|
|
375
|
-
// For now, we'll return a placeholder result
|
|
376
377
|
const result = {
|
|
377
|
-
detected:
|
|
378
|
+
detected: null,
|
|
378
379
|
types: [],
|
|
379
380
|
locations: [],
|
|
380
381
|
screenshot: {
|
|
381
382
|
original: screenshotPath,
|
|
382
383
|
},
|
|
383
|
-
confidence:
|
|
384
|
+
confidence: -1,
|
|
385
|
+
measured: false,
|
|
386
|
+
notMeasuredReason: 'PII NOT MEASURED: no screenshot PII scanner (OCR) is available, so the screenshot was not scanned',
|
|
384
387
|
};
|
|
385
388
|
return ok(result);
|
|
386
389
|
}
|
|
@@ -454,6 +457,17 @@ export class SecurityVisualTestingSkill {
|
|
|
454
457
|
affectedUrls: [], // Would need to track which URLs had PII
|
|
455
458
|
});
|
|
456
459
|
}
|
|
460
|
+
// #1228: an unscanned screenshot needs a manual check, it is not clean
|
|
461
|
+
const piiUnscanned = piiDetections.filter((p) => !p.measured);
|
|
462
|
+
if (piiUnscanned.length > 0) {
|
|
463
|
+
recommendations.push({
|
|
464
|
+
type: 'pii',
|
|
465
|
+
severity: 'medium',
|
|
466
|
+
description: `PII NOT MEASURED for ${piiUnscanned.length} screenshot(s): ${piiUnscanned[0].notMeasuredReason ?? 'not scanned'}`,
|
|
467
|
+
action: 'Review the screenshots for PII manually before sharing them',
|
|
468
|
+
affectedUrls: [],
|
|
469
|
+
});
|
|
470
|
+
}
|
|
457
471
|
return recommendations;
|
|
458
472
|
}
|
|
459
473
|
}
|
|
@@ -27,14 +27,19 @@ export interface SecurityIssue {
|
|
|
27
27
|
* PII detection result in screenshot
|
|
28
28
|
*/
|
|
29
29
|
export interface PIIDetectionResult {
|
|
30
|
-
|
|
30
|
+
/** null when no scan ran: not scanned is not "no PII found" (#1228). */
|
|
31
|
+
detected: boolean | null;
|
|
31
32
|
types: PIIType[];
|
|
32
33
|
locations: PIILocation[];
|
|
33
34
|
screenshot: {
|
|
34
35
|
original: string;
|
|
35
36
|
masked?: string;
|
|
36
37
|
};
|
|
38
|
+
/** -1 when no scan ran (#1228). */
|
|
37
39
|
confidence: number;
|
|
40
|
+
/** false when the screenshot was not scanned; see notMeasuredReason (#1228). */
|
|
41
|
+
measured: boolean;
|
|
42
|
+
notMeasuredReason?: string;
|
|
38
43
|
}
|
|
39
44
|
/**
|
|
40
45
|
* Types of PII that can be detected
|
|
@@ -77,6 +82,7 @@ export interface SecurityVisualAuditReport {
|
|
|
77
82
|
visualTestsPassed: number;
|
|
78
83
|
visualTestsFailed: number;
|
|
79
84
|
accessibilityIssues: number;
|
|
85
|
+
/** Screenshots with PII found; -1 when no screenshot was scanned (#1228). */
|
|
80
86
|
piiDetections: number;
|
|
81
87
|
duration: number;
|
|
82
88
|
};
|
|
@@ -126,7 +132,9 @@ export interface PIISafeScreenshot {
|
|
|
126
132
|
original: string;
|
|
127
133
|
masked?: string;
|
|
128
134
|
};
|
|
129
|
-
|
|
135
|
+
/** null when the screenshot was not scanned for PII (#1228). */
|
|
136
|
+
piiDetected: boolean | null;
|
|
137
|
+
piiNotMeasuredReason?: string;
|
|
130
138
|
piiTypes: PIIType[];
|
|
131
139
|
securityValidation: URLSecurityValidation;
|
|
132
140
|
timestamp: Date;
|
|
@@ -163,10 +171,18 @@ export interface ResponsiveVisualAuditReport {
|
|
|
163
171
|
timestamp: Date;
|
|
164
172
|
}>;
|
|
165
173
|
layoutShifts: LayoutShift[];
|
|
174
|
+
/**
|
|
175
|
+
* false when layout shifts were requested but not measured: an empty
|
|
176
|
+
* `layoutShifts` list is then not a clean result (#1228).
|
|
177
|
+
*/
|
|
178
|
+
layoutShiftsMeasured?: boolean;
|
|
179
|
+
layoutShiftsNotMeasuredReason?: string;
|
|
166
180
|
visualRegressions: Array<{
|
|
167
181
|
viewport: Viewport;
|
|
182
|
+
/** -1 when no diff was computed, e.g. a new baseline (#1228). */
|
|
168
183
|
diffPercentage: number;
|
|
169
|
-
|
|
184
|
+
/** `new`: no baseline existed, so nothing was compared. */
|
|
185
|
+
status: 'passed' | 'failed' | 'new';
|
|
170
186
|
}>;
|
|
171
187
|
recommendations: string[];
|
|
172
188
|
}
|