agentic-qe 3.15.8 → 3.15.10
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 +434 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2ui/catalog/component-schemas.js +2 -1
- package/dist/adapters/a2ui/data/json-pointer-resolver.js +10 -5
- package/dist/adapters/a2ui/integration/agui-sync.js +10 -6
- package/dist/adapters/a2ui/integration/surface-state-bridge.js +9 -5
- package/dist/adapters/ag-ui/json-patch.js +10 -6
- package/dist/agents/claim-verifier/claim-verifier-service.js +13 -8
- package/dist/audit/witness-chain.d.ts +1 -1
- package/dist/bridge/captured-experience-bridge.js +12 -13
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-TR5SLAZC.js +2 -0
- package/dist/cli/chunks/agent-booster-wasm-H7ANGXW4.js +2 -0
- package/dist/cli/chunks/{agent-handler-2NQFHAWE.js → agent-handler-SVXSHEET.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-457ECHHK.js → agent-memory-branch-WKQH36XL.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +2 -0
- package/dist/cli/chunks/{arena-JV3WSEHU.js → arena-EKOOFVST.js} +2 -2
- package/dist/cli/chunks/{arena-IYBQ3GPY.js → arena-OPS36NFZ.js} +4 -4
- package/dist/cli/chunks/{audit-5OS3T3K6.js → audit-AO5NDZRI.js} +3 -3
- package/dist/cli/chunks/base-GTB6POYE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-IQKBFVAO.js → better-sqlite3-TFLVEMMY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-KA3SGAFM.js → brain-handler-ADBBJPYW.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-QZDU2VOQ.js → branch-enumerator-HGHUYYL5.js} +2 -2
- package/dist/cli/chunks/browser-5LU6P4SZ.js +4 -0
- package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +2 -0
- package/dist/cli/chunks/{chunk-CRUQ6RXU.js → chunk-2SXBBUM6.js} +2 -2
- package/dist/cli/chunks/{chunk-4GUVVGJX.js → chunk-2T7RRL6G.js} +1 -1
- package/dist/cli/chunks/{chunk-OJWEZYLR.js → chunk-2XGVTYVX.js} +2 -2
- package/dist/cli/chunks/{chunk-LVHZK7GW.js → chunk-2ZI5FKSF.js} +2 -2
- package/dist/cli/chunks/chunk-2ZMF4NCF.js +4 -0
- package/dist/cli/chunks/{chunk-62T7U25U.js → chunk-37OWRCUN.js} +1 -1
- package/dist/cli/chunks/{chunk-UQLAN5TX.js → chunk-3P34JFQH.js} +5 -5
- package/dist/cli/chunks/{chunk-UDCYQLTD.js → chunk-3Y7SPD72.js} +2 -2
- package/dist/cli/chunks/{chunk-PPIM7B5G.js → chunk-4G63WT4F.js} +2 -2
- package/dist/cli/chunks/chunk-4SJYIX54.js +3 -0
- package/dist/cli/chunks/chunk-5E6GHSTY.js +3 -0
- package/dist/cli/chunks/{chunk-4TZLZRZ4.js → chunk-5LPYV3TK.js} +1 -1
- package/dist/cli/chunks/{chunk-YUP3APSN.js → chunk-62OAY5KJ.js} +1 -1
- package/dist/cli/chunks/{chunk-VQRBBR27.js → chunk-6C3II5OM.js} +2 -2
- package/dist/cli/chunks/{chunk-RG42LDOB.js → chunk-6GP6W46M.js} +2 -2
- package/dist/cli/chunks/{chunk-KMZW2P3R.js → chunk-6KIL6CMD.js} +2 -2
- package/dist/cli/chunks/{chunk-UKKFZJME.js → chunk-6MVVSSID.js} +1 -1
- package/dist/cli/chunks/{chunk-VVK4ECVJ.js → chunk-6P7424AO.js} +2 -2
- package/dist/cli/chunks/{chunk-A2UGPKCS.js → chunk-6PX4OXQO.js} +2 -2
- package/dist/cli/chunks/{chunk-JLTGO5BB.js → chunk-6S3WJGUV.js} +2 -2
- package/dist/cli/chunks/{chunk-GSOK4M6V.js → chunk-6TB6YOCZ.js} +1 -1
- package/dist/cli/chunks/{chunk-VWRNG3UK.js → chunk-6X5DHU6Q.js} +1 -1
- package/dist/cli/chunks/{chunk-5YOO5QSE.js → chunk-6XCMKIZN.js} +1 -1
- package/dist/cli/chunks/{chunk-4C3RYBTT.js → chunk-7LFZ4CHM.js} +2 -2
- package/dist/cli/chunks/{chunk-O4RRVTXN.js → chunk-7OZVZIBE.js} +2 -2
- package/dist/cli/chunks/{chunk-2JCLACCS.js → chunk-7PJIR4ST.js} +2 -2
- package/dist/cli/chunks/{chunk-NWFBF3KT.js → chunk-7TB6FK4B.js} +1 -1
- package/dist/cli/chunks/{chunk-FJAO4UX2.js → chunk-7ZCDZHDB.js} +2 -2
- package/dist/cli/chunks/chunk-A55QKKT2.js +2 -0
- package/dist/cli/chunks/{chunk-ZOVAZTXE.js → chunk-ABFFWZPC.js} +273 -278
- package/dist/cli/chunks/{chunk-FWXNFPLS.js → chunk-ACWFKES2.js} +2 -2
- package/dist/cli/chunks/{chunk-IJSFZO7P.js → chunk-AH3ZD3NJ.js} +2 -2
- package/dist/cli/chunks/{chunk-7SLEUVPZ.js → chunk-AI4VYSFS.js} +2 -2
- package/dist/cli/chunks/chunk-APSRPR4W.js +2 -0
- package/dist/cli/chunks/chunk-ATHWDAXB.js +3 -0
- package/dist/cli/chunks/{chunk-2GSAAUW3.js → chunk-B6LTH6YV.js} +2 -2
- package/dist/cli/chunks/chunk-BQUAE3CP.js +3 -0
- package/dist/cli/chunks/{chunk-7XGM7Q2N.js → chunk-C522H7XR.js} +54 -33
- package/dist/cli/chunks/{chunk-7DHSHD5B.js → chunk-CESIR27V.js} +2 -2
- package/dist/cli/chunks/{chunk-V7VZSNDK.js → chunk-CFBEBXLO.js} +3 -3
- package/dist/cli/chunks/{chunk-NZATJ2C6.js → chunk-CMBLM26R.js} +2 -2
- package/dist/cli/chunks/{chunk-7CVMT64N.js → chunk-CZ2IF6MC.js} +1 -1
- package/dist/cli/chunks/{chunk-YVWMJZ6O.js → chunk-CZGOSJQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-TMNEK7TP.js → chunk-D6DA2KFD.js} +2 -2
- package/dist/cli/chunks/{chunk-UTNKMPTC.js → chunk-DBMNJSBV.js} +1 -1
- package/dist/cli/chunks/{chunk-JFWQFB3S.js → chunk-DE4YJQJF.js} +2 -2
- package/dist/cli/chunks/{chunk-767SR7WH.js → chunk-DEF34AFL.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWMFKZEQ.js → chunk-DKAC3E3B.js} +2 -2
- package/dist/cli/chunks/{chunk-CDLG3Q2O.js → chunk-DMFTELBS.js} +2 -2
- package/dist/cli/chunks/{chunk-P4UT4LBE.js → chunk-DNRWGATA.js} +10 -10
- package/dist/cli/chunks/{chunk-PUYQ6EKC.js → chunk-DT7SIJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-ST7ASEJO.js → chunk-DURHK377.js} +69 -69
- package/dist/cli/chunks/{chunk-V4QJ3MMT.js → chunk-EAU5KDFO.js} +1 -1
- package/dist/cli/chunks/{chunk-BLZEOGQE.js → chunk-EDLFX4ZB.js} +2 -2
- package/dist/cli/chunks/{chunk-ZBI7PJFX.js → chunk-EN2QSKFF.js} +2 -2
- package/dist/cli/chunks/{chunk-U7CIY3YR.js → chunk-ERQKYIP7.js} +2 -2
- package/dist/cli/chunks/{chunk-X7ZQIFES.js → chunk-ESUO3GTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-SHEVM5PF.js → chunk-EWFECZ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-JWPYMRIX.js → chunk-FAUCT5KR.js} +3 -3
- package/dist/cli/chunks/{chunk-KMVFBYJO.js → chunk-FB6TI3BH.js} +2 -2
- package/dist/cli/chunks/{chunk-22DOS3PM.js → chunk-FBXTQNRH.js} +2 -2
- package/dist/cli/chunks/{chunk-W5A36V3Z.js → chunk-FESZBPUB.js} +2 -2
- package/dist/cli/chunks/chunk-FFTPAWM6.js +141 -0
- package/dist/cli/chunks/{chunk-VWSGWYRB.js → chunk-FKL3R5JQ.js} +2 -2
- package/dist/cli/chunks/{chunk-2DPHFCMW.js → chunk-FPUDRSFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-VKFVJCIH.js → chunk-FZOWULMH.js} +1 -1
- package/dist/cli/chunks/{chunk-HXCGV5UJ.js → chunk-G3CZCUPM.js} +2 -2
- package/dist/cli/chunks/{chunk-GENNJRNK.js → chunk-G5I6KGMW.js} +22 -22
- package/dist/cli/chunks/{chunk-J7FLNP5L.js → chunk-GHBNRMSJ.js} +2 -2
- package/dist/cli/chunks/{chunk-I77D65X5.js → chunk-GJHWY3ZX.js} +2 -2
- package/dist/cli/chunks/{chunk-DKFSCJEF.js → chunk-GJMLK5UT.js} +2 -2
- package/dist/cli/chunks/{chunk-52YRSWPS.js → chunk-GRCIBCJ2.js} +2 -2
- package/dist/cli/chunks/{chunk-NW7HTOSN.js → chunk-GWZZ7DAO.js} +2 -2
- package/dist/cli/chunks/{chunk-D4IBIMWI.js → chunk-GZLZCZ42.js} +2 -2
- package/dist/cli/chunks/{chunk-FEN2DHFM.js → chunk-H2PYU7MN.js} +1 -1
- package/dist/cli/chunks/{chunk-4I35ARWW.js → chunk-H32EPIR2.js} +1 -1
- package/dist/cli/chunks/{chunk-MUDBF2JC.js → chunk-H74Q7TJN.js} +1 -1
- package/dist/cli/chunks/chunk-HOZUDE4C.js +2 -0
- package/dist/cli/chunks/{chunk-MMY52Y6R.js → chunk-I33O4BRQ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZG7UKWBB.js → chunk-IKISCIGH.js} +2 -2
- package/dist/cli/chunks/{chunk-SFPGLUXS.js → chunk-IPJ7Q3AJ.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZRNXEVI.js → chunk-IU2IV4NE.js} +1 -1
- package/dist/cli/chunks/{chunk-XOOBLZXR.js → chunk-JHIY4VCC.js} +2 -2
- package/dist/cli/chunks/{chunk-PJGQ2TKN.js → chunk-KG336OV3.js} +2 -2
- package/dist/cli/chunks/{chunk-YRH7KMTU.js → chunk-KI73QCR5.js} +2 -2
- package/dist/cli/chunks/{chunk-FAYXES7R.js → chunk-KNQ2ERFX.js} +2 -2
- package/dist/cli/chunks/{chunk-CQ3SBRDP.js → chunk-KOBVYY6H.js} +2 -2
- package/dist/cli/chunks/{chunk-3N627QRU.js → chunk-KSIWGGJI.js} +8 -8
- package/dist/cli/chunks/{chunk-2UN4JOTN.js → chunk-LMS3Y7JD.js} +2 -2
- package/dist/cli/chunks/{chunk-RSMPJWQH.js → chunk-LQEURY7C.js} +1 -1
- package/dist/cli/chunks/{chunk-NQDYOF35.js → chunk-LRZY4KS2.js} +2 -2
- package/dist/cli/chunks/{chunk-U3BWBP6B.js → chunk-M2QV7PT7.js} +2 -2
- package/dist/cli/chunks/{chunk-WLXGUQOZ.js → chunk-MA7JIQ6U.js} +2 -2
- package/dist/cli/chunks/{chunk-Y5ZBF7MA.js → chunk-MG27QY4D.js} +2 -2
- package/dist/cli/chunks/chunk-MNN5J4GU.js +12 -0
- package/dist/cli/chunks/chunk-N6PIIK6G.js +3 -0
- package/dist/cli/chunks/chunk-NAXGWDVM.js +12 -0
- package/dist/cli/chunks/{chunk-DCYUHCPK.js → chunk-NGKNYIQZ.js} +1 -1
- package/dist/cli/chunks/chunk-NNFZUTDH.js +2 -0
- package/dist/cli/chunks/{chunk-UTFMMZ57.js → chunk-NPPHWFA2.js} +3 -3
- package/dist/cli/chunks/chunk-NSHU347M.js +2 -0
- package/dist/cli/chunks/{chunk-NF63NHJH.js → chunk-NVYIZCSR.js} +2 -2
- package/dist/cli/chunks/{chunk-YNQPHRUZ.js → chunk-NW5JUCCG.js} +1 -1
- package/dist/cli/chunks/{chunk-G6CLO74Q.js → chunk-NZYLNXT6.js} +3 -3
- package/dist/cli/chunks/{chunk-R2NHGESM.js → chunk-OBAREPDC.js} +2 -2
- package/dist/cli/chunks/{chunk-X3HM7SV4.js → chunk-ODJNUMV3.js} +2 -2
- package/dist/cli/chunks/{chunk-OCLAMZJG.js → chunk-OEKP73MC.js} +2 -2
- package/dist/cli/chunks/{chunk-5MBNRTT5.js → chunk-OPFGRS5S.js} +2 -2
- package/dist/cli/chunks/{chunk-K5R3WUJP.js → chunk-OY2AHLSF.js} +1 -1
- package/dist/cli/chunks/{chunk-KJNUETCB.js → chunk-OY3NJNP2.js} +1 -1
- package/dist/cli/chunks/{chunk-P2EA62YS.js → chunk-PCEW6Q2C.js} +1 -1
- package/dist/cli/chunks/{chunk-HNGNRIZZ.js → chunk-PFG6VQ5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-DN3AKAPY.js → chunk-PGYMKGOE.js} +2 -2
- package/dist/cli/chunks/{chunk-BEVWCF3Q.js → chunk-PPSAMXYN.js} +3 -3
- package/dist/cli/chunks/chunk-RK73HB2F.js +2 -0
- package/dist/cli/chunks/{chunk-6E7EOHMN.js → chunk-RPHY2DU6.js} +2 -2
- package/dist/cli/chunks/{chunk-7C6FMLQR.js → chunk-RWWOHCMG.js} +25 -20
- package/dist/cli/chunks/{chunk-5ONJ7AV6.js → chunk-S75EYIJG.js} +1 -1
- package/dist/cli/chunks/chunk-SKQUUE4F.js +5 -0
- package/dist/cli/chunks/chunk-SO45NA4D.js +180 -0
- package/dist/cli/chunks/{chunk-SWY6KGMF.js → chunk-SU5H66SD.js} +2 -2
- package/dist/cli/chunks/{chunk-ZOHS32SI.js → chunk-SY2IB442.js} +2 -2
- package/dist/cli/chunks/{chunk-MV4S3TEC.js → chunk-TBLI254A.js} +2 -2
- package/dist/cli/chunks/{chunk-5DZDLOY6.js → chunk-TNMBRDCA.js} +3 -3
- package/dist/cli/chunks/{chunk-FEPFXXI7.js → chunk-TYFZXDGZ.js} +2 -2
- package/dist/cli/chunks/{chunk-A6GCO6ZU.js → chunk-U4OICXV2.js} +2 -2
- package/dist/cli/chunks/{chunk-G77Q22EN.js → chunk-U53ZB4IX.js} +2 -2
- package/dist/cli/chunks/chunk-UARKIZAS.js +2 -0
- package/dist/cli/chunks/{chunk-6GIC2263.js → chunk-UCJMVXO4.js} +2 -2
- package/dist/cli/chunks/{chunk-DAFMHM64.js → chunk-UHTTW3IT.js} +2 -2
- package/dist/cli/chunks/{chunk-2QRGIEQV.js → chunk-V2M2XCR5.js} +1 -1
- package/dist/cli/chunks/{chunk-XZQVC3GD.js → chunk-V2RSNVMW.js} +1 -1
- package/dist/cli/chunks/{chunk-GGSTLKY5.js → chunk-V6JBOIMX.js} +1 -1
- package/dist/cli/chunks/{chunk-BTMEOZYY.js → chunk-VFKF2XO7.js} +1 -1
- package/dist/cli/chunks/{chunk-4C7KE2EL.js → chunk-VFSYMOAL.js} +2 -2
- package/dist/cli/chunks/{chunk-D4O3TJI7.js → chunk-VJQYDYAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-PZ7FJ4UG.js → chunk-VKRTTFB6.js} +2 -2
- package/dist/cli/chunks/{chunk-CQ5G64EA.js → chunk-VWNFAW2M.js} +2 -2
- package/dist/cli/chunks/{chunk-DY37YMMQ.js → chunk-WBM6N6IM.js} +1 -1
- package/dist/cli/chunks/{chunk-K4N2MBCE.js → chunk-WDQ7IEZY.js} +2 -2
- package/dist/cli/chunks/{chunk-HI6OBDDY.js → chunk-WDVRE6GN.js} +2 -2
- package/dist/cli/chunks/{chunk-PICEGWGB.js → chunk-WQ4PYWSW.js} +1 -1
- package/dist/cli/chunks/{chunk-NHOMVBCI.js → chunk-WSF24I3D.js} +2 -2
- package/dist/cli/chunks/{chunk-LPSMVBB3.js → chunk-XBVUVFJK.js} +2 -2
- package/dist/cli/chunks/{chunk-J6LL25QJ.js → chunk-XEB3NLJR.js} +2 -2
- package/dist/cli/chunks/{chunk-SJMZZMHP.js → chunk-XFVTGAAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-KVMKYUOE.js → chunk-XLZYRTNO.js} +2 -2
- package/dist/cli/chunks/chunk-XUZDBQ5X.js +6 -0
- package/dist/cli/chunks/{chunk-WAWKAYPY.js → chunk-Y76IAYQD.js} +1 -1
- package/dist/cli/chunks/{chunk-3LFLO2WK.js → chunk-YAKGBHO4.js} +2 -2
- package/dist/cli/chunks/{chunk-TC52M542.js → chunk-YBSBABOS.js} +2 -2
- package/dist/cli/chunks/{chunk-BQUIZ5QT.js → chunk-YCGP5VFP.js} +2 -2
- package/dist/cli/chunks/{chunk-T2TDTBFV.js → chunk-YDAQK5UF.js} +1 -1
- package/dist/cli/chunks/{chunk-LHRVSK44.js → chunk-YK3BVZY6.js} +2 -2
- package/dist/cli/chunks/{chunk-QFYUZYRA.js → chunk-YK7JN5N7.js} +4 -4
- package/dist/cli/chunks/{chunk-IMSRWNWF.js → chunk-YKMU4LBV.js} +1 -1
- package/dist/cli/chunks/{chunk-NLYUC63R.js → chunk-YYTGXD3R.js} +2 -2
- package/dist/cli/chunks/{chunk-OWBFVAEH.js → chunk-Z2O2YJAF.js} +2 -2
- package/dist/cli/chunks/{chunk-KITKQUBX.js → chunk-Z7IYW5U7.js} +1 -1
- package/dist/cli/chunks/{chunk-4NTLGGXO.js → chunk-ZG5666GJ.js} +1 -1
- package/dist/cli/chunks/{chunk-4YUBWU3E.js → chunk-ZXPY654C.js} +1 -1
- package/dist/cli/chunks/{ci-7NUCRGWO.js → ci-MSKMVH5X.js} +2 -2
- package/dist/cli/chunks/{ci-config-VQVECCFI.js → ci-config-7ODMNAUM.js} +2 -2
- package/dist/cli/chunks/{ci-output-P7GQ6TKF.js → ci-output-FXZ7ZZW3.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5YP6N6HE.js → circuit-breaker-4VOUEPOX.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W5H7CMU6.js → claude-flow-setup-7D4SGLM4.js} +2 -2
- package/dist/cli/chunks/client-POSVREVS.js +2 -0
- package/dist/cli/chunks/{cline-installer-OYANSZ54.js → cline-installer-WRRT7BGQ.js} +2 -2
- package/dist/cli/chunks/{code-OMT4UEZI.js → code-ZDJRIL3S.js} +25 -24
- package/dist/cli/chunks/{code-index-extractor-M2JEWKNF.js → code-index-extractor-4S4SHM56.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YBS6N5O3.js → codex-installer-YTRHNDWR.js} +2 -2
- package/dist/cli/chunks/{completions-U7GS5RG6.js → completions-6N64JUXJ.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-QSXPIUIU.js → complexity-analyzer-I4A26VCJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-W5TTT743.js → continuedev-installer-IIDR66LB.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-KC2RT24C.js → copilot-installer-SVVFY3S2.js} +2 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +2 -0
- package/dist/cli/chunks/{cost-tracker-OQPVR6V4.js → cost-tracker-VGFS6IBX.js} +2 -2
- package/dist/cli/chunks/{coverage-TCO2A2NX.js → coverage-B7MCGNTE.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +2 -0
- package/dist/cli/chunks/{cursor-installer-MH7GWD4L.js → cursor-installer-UPETT57E.js} +2 -2
- package/dist/cli/chunks/daemon-7BDJHEIJ.js +18 -0
- package/dist/cli/chunks/{daemon-UJEARJZ2.js → daemon-CQFNZLXU.js} +7 -7
- package/dist/cli/chunks/{dag-attention-scheduler-F3SUJU5O.js → dag-attention-scheduler-PJVABHON.js} +2 -2
- package/dist/cli/chunks/{detect-5QTCRB32.js → detect-56SKAGWX.js} +2 -2
- package/dist/cli/chunks/{dist-node-XKZPHDBO.js → dist-node-UYTYUMLN.js} +2 -2
- package/dist/cli/chunks/{domain-handler-V3UEADKW.js → domain-handler-YOYLBYJE.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-7PES4UHZ.js → domain-plugins-7TARX2XF.js} +2 -2
- package/dist/cli/chunks/domain-transfer-AKVSBD6E.js +2 -0
- package/dist/cli/chunks/dream-UA7MKOPQ.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-D2HWORHF.js → embed-and-insert-pattern-IS6HSR66.js} +2 -2
- package/dist/cli/chunks/{eval-UF2UBAUC.js → eval-GNB574IM.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-2OUCEHHM.js → experience-capture-middleware-RCAOCKM7.js} +3 -3
- package/dist/cli/chunks/{fast-paths-KV5DKKHC.js → fast-paths-KTZ5SF54.js} +2 -2
- package/dist/cli/chunks/{feature-flags-MTW6NMR3.js → feature-flags-ITX5LQ57.js} +2 -2
- package/dist/cli/chunks/{feature-flags-6YWMTNO5.js → feature-flags-KFHSR5YF.js} +2 -2
- package/dist/cli/chunks/file-discovery-YCMNKZAK.js +2 -0
- package/dist/cli/chunks/fleet-2Y3ZE6CE.js +46 -0
- package/dist/cli/chunks/{gnn-wrapper-52V6ANOY.js → gnn-wrapper-RLFW3GSX.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-X7NHNRC7.js → heartbeat-handler-EM2URCYZ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +2 -0
- package/dist/cli/chunks/hnsw-index-DFUNARVD.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-DZBE3KMK.js → hnsw-legacy-bridge-JMHEOIBH.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-2AWWUJAZ.js → hnswlib-node-CBP73QHY.js} +2 -2
- package/dist/cli/chunks/{hooks-XLPVROL3.js → hooks-IP7XE34Z.js} +34 -34
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-6TI7YP6P.js → hypergraph-engine-ONAYHU25.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DBIBBOXS.js → hypergraph-handler-VINJRAID.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +2 -0
- package/dist/cli/chunks/{init-guard-OSO6MIDD.js → init-guard-RYVV5R3Z.js} +2 -2
- package/dist/cli/chunks/{init-handler-7S7IHMUF.js → init-handler-MPRGWMOE.js} +6 -6
- package/dist/cli/chunks/init-wizard-NIMZ4J55.js +2 -0
- package/dist/cli/chunks/kernel-JQK7PRAI.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2KBRFXMA.js → kilocode-installer-OPD7JBRL.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-5VFR4OQZ.js → kiro-installer-M4OPUNK2.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +2 -0
- package/dist/cli/chunks/{learning-G5NHL3DV.js → learning-4UWTQLMF.js} +24 -24
- package/dist/cli/chunks/{llm-router-4EAPPMHS.js → llm-router-SQ56FF6Z.js} +4 -4
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +2 -0
- package/dist/cli/chunks/{load-UYMZPEY6.js → load-HPHKDGGL.js} +2 -2
- package/dist/cli/chunks/load-test-UKNV5MWW.js +2 -0
- package/dist/cli/chunks/mcp-TELMAC7Z.js +2 -0
- package/dist/cli/chunks/{memory-QL53YIHP.js → memory-PFQ3KPVJ.js} +5 -5
- package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +2 -0
- package/dist/cli/chunks/memory-handlers-FCXN437E.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-PDDDXF2B.js → multi-model-executor-3VDRX6TZ.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-75D2SKOT.js → opencode-installer-PJ576R63.js} +2 -2
- package/dist/cli/chunks/{orchestrator-3WIZBV4T.js → orchestrator-72QP4UU7.js} +64 -19
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-TEX2JGHA.js → pattern-usage-recorder-754YQW7C.js} +2 -2
- package/dist/cli/chunks/pipeline-AVXY4MVB.js +19 -0
- package/dist/cli/chunks/{platform-WPSKRJE7.js → platform-3E3DXLYB.js} +2 -2
- package/dist/cli/chunks/{plugin-UUFOVVMU.js → plugin-7FUQAKRE.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-PDFSYWKZ.js → prime-radiant-advanced-wasm-NIB4F5NV.js} +2 -2
- package/dist/cli/chunks/project-root-JCAUNL6O.js +2 -0
- package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +2 -0
- package/dist/cli/chunks/{protocol-handler-3VRYRIQB.js → protocol-handler-BQRYMUTG.js} +2 -2
- package/dist/cli/chunks/{prove-2NAUROGF.js → prove-H52QGC6B.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +2 -0
- package/dist/cli/chunks/{quality-ZIEI2WGA.js → quality-QO4XPAUM.js} +2 -2
- package/dist/cli/chunks/{quality-gate-KWJO4SWQ.js → quality-gate-FBKE5E6F.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +2 -0
- package/dist/cli/chunks/{real-embeddings-TSZ4UIAE.js → real-embeddings-RWGOVOXO.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DWFFRETJ.js → ref-validation-LF76ZOBD.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-XTZHLUBO.js → roocode-installer-3BYEBTQ7.js} +2 -2
- package/dist/cli/chunks/router-3DIS5X4R.js +2 -0
- package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +2 -0
- package/dist/cli/chunks/{routing-handler-GG525TDM.js → routing-handler-DST7BVCU.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-QKRJDM7Z.js → ruvector-commands-XE32PGKC.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-FF52OS6Q.js → rvf-migration-coordinator-VP32XC75.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-M6DXTAZ4.js → rvf-store-integrity-SH2AMVI7.js} +2 -2
- package/dist/cli/chunks/safe-db-EVB4ZC7T.js +2 -0
- package/dist/cli/chunks/schedule-ORDDXXY4.js +2 -0
- package/dist/cli/chunks/scheduler-XFLJSFIU.js +2 -0
- package/dist/cli/chunks/{security-EHXSW22U.js → security-VSPNKCDS.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-6EH7UVJL.js → shared-rvf-adapter-HX6AHL3P.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-WML274E7.js → shared-rvf-dual-writer-MX4FC2JE.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +2 -0
- package/dist/cli/chunks/{standalone-memory-C7QKAXS4.js → standalone-memory-O4QUTK6L.js} +2 -2
- package/dist/cli/chunks/{status-handler-VLI7MRLM.js → status-handler-Z2BP6EOG.js} +2 -2
- package/dist/cli/chunks/{structural-health-3LPG6MQN.js → structural-health-R36WNLQG.js} +2 -2
- package/dist/cli/chunks/sync-2ELWUFQU.js +2 -0
- package/dist/cli/chunks/{sync-JFJEJBVK.js → sync-QF5Y3EMZ.js} +2 -2
- package/dist/cli/chunks/{task-handler-IED3K6E4.js → task-handler-43PYE75J.js} +13 -7
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +9 -0
- package/dist/cli/chunks/{test-GPKT3CKZ.js → test-UWA377D4.js} +16 -16
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +2 -0
- package/dist/cli/chunks/{test-scheduling-Z42XXZP6.js → test-scheduling-YQZPJRRN.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-F7C6UKTC.js +2 -0
- package/dist/cli/chunks/{token-usage-6Y2ERYIY.js → token-usage-DO6WLMXP.js} +2 -2
- package/dist/cli/chunks/{transformers-MB63T2XO.js → transformers-H5RGFKVO.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +2 -0
- package/dist/cli/chunks/{types-J4J6QV3I.js → types-PJS2FGPF.js} +2 -2
- package/dist/cli/chunks/unified-memory-EHD4VNFW.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +2 -0
- package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +2 -0
- package/dist/cli/chunks/{upgrade-U4XU7LFM.js → upgrade-4IC4F6AB.js} +2 -2
- package/dist/cli/chunks/{validate-B57HA4YK.js → validate-DHUWW7PF.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-UPPA4M6T.js → validate-swarm-OERQNOX5.js} +2 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-GDZMUKOZ.js → web-tree-sitter-TV7DMKES.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VJRWCHXP.js → windsurf-installer-QZPWSH37.js} +2 -2
- package/dist/cli/chunks/witness-chain-LC6Q2W27.js +2 -0
- package/dist/cli/chunks/witness-chain-QUIBAF3W.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-RUXIOE7F.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-Z23FVABW.js → witness-chain-verifier-YXENHB42.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-745MJ7WO.js → witness-key-manager-HL26AGFO.js} +2 -2
- package/dist/cli/chunks/{workflow-T245QNQM.js → workflow-EOVVCN2E.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +2 -0
- package/dist/cli/chunks/wrappers-AGODHBOO.js +2 -0
- package/dist/cli/commands/code.js +8 -0
- package/dist/cli/commands/daemon.js +8 -0
- package/dist/cli/commands/fleet.js +27 -15
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +9 -2
- package/dist/cli/commands/hooks-handlers/session-hooks.js +2 -2
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +3 -2
- package/dist/cli/commands/learning.js +5 -3
- package/dist/cli/commands/ruvector-commands.js +2 -1
- package/dist/cli/commands/test.js +6 -0
- package/dist/cli/handlers/task-handler.js +21 -1
- package/dist/cli/utils/ci-output.d.ts +9 -0
- package/dist/cli/utils/fleet-operation.d.ts +32 -0
- package/dist/cli/utils/fleet-operation.js +71 -0
- package/dist/cli/utils/fleet-result.d.ts +31 -0
- package/dist/cli/utils/fleet-result.js +124 -0
- package/dist/context/sources/git-source.js +6 -2
- package/dist/coordination/handlers/code-intelligence-handlers.js +74 -7
- package/dist/coordination/handlers/coverage-collection.js +9 -10
- package/dist/coordination/handlers/coverage-handlers.js +31 -4
- package/dist/coordination/handlers/coverage-runner.d.ts +2 -1
- package/dist/coordination/handlers/coverage-runner.js +9 -2
- package/dist/coordination/handlers/coverage-target.d.ts +13 -3
- package/dist/coordination/handlers/coverage-target.js +224 -7
- package/dist/coordination/handlers/handler-types.d.ts +2 -0
- package/dist/coordination/handlers/requirements-handlers.js +16 -2
- package/dist/coordination/handlers/security-handlers.js +11 -1
- package/dist/coordination/handlers/test-execution-handlers.js +57 -12
- package/dist/coordination/index.d.ts +2 -2
- package/dist/coordination/index.js +1 -1
- package/dist/coordination/mincut/queen-integration.d.ts +39 -1
- package/dist/coordination/mincut/queen-integration.js +83 -6
- package/dist/coordination/protocols/learning-consolidation-archive.d.ts +35 -0
- package/dist/coordination/protocols/learning-consolidation-archive.js +34 -0
- package/dist/coordination/protocols/learning-consolidation.d.ts +62 -3
- package/dist/coordination/protocols/learning-consolidation.js +187 -60
- package/dist/coordination/queen-coordinator.d.ts +13 -2
- package/dist/coordination/queen-coordinator.js +43 -8
- package/dist/coordination/queen-event-handlers.js +15 -1
- package/dist/coordination/queen-lifecycle.js +9 -0
- package/dist/coordination/queen-task-management.d.ts +18 -24
- package/dist/coordination/queen-task-management.js +94 -127
- package/dist/coordination/queen-task-queue.d.ts +41 -0
- package/dist/coordination/queen-task-queue.js +194 -0
- package/dist/coordination/queen-types.d.ts +11 -1
- package/dist/coordination/queen-types.js +8 -0
- package/dist/coordination/queen-work-stealing.d.ts +6 -1
- package/dist/coordination/queen-work-stealing.js +7 -4
- package/dist/coordination/result-saver-adapters.d.ts +15 -0
- package/dist/coordination/result-saver-adapters.js +57 -0
- package/dist/coordination/result-saver.d.ts +1 -1
- package/dist/coordination/result-saver.js +8 -5
- package/dist/coordination/task-dag/dag-algorithms.d.ts +33 -0
- package/dist/coordination/task-dag/dag-algorithms.js +162 -0
- package/dist/coordination/task-dag/dag-obligations.d.ts +21 -0
- package/dist/coordination/task-dag/dag-obligations.js +83 -0
- package/dist/coordination/task-dag/dag.d.ts +69 -19
- package/dist/coordination/task-dag/dag.js +215 -269
- package/dist/coordination/task-dag/index.d.ts +12 -4
- package/dist/coordination/task-dag/index.js +11 -3
- package/dist/coordination/task-dag/prerequisite-ledger.d.ts +84 -0
- package/dist/coordination/task-dag/prerequisite-ledger.js +252 -0
- package/dist/coordination/task-dag/scheduler.d.ts +19 -9
- package/dist/coordination/task-dag/scheduler.js +36 -12
- package/dist/coordination/task-dag/types.d.ts +160 -1
- package/dist/coordination/task-dag/types.js +2 -1
- package/dist/coordination/task-executability.d.ts +18 -0
- package/dist/coordination/task-executability.js +31 -0
- package/dist/coordination/task-executor.d.ts +1 -0
- package/dist/coordination/task-executor.js +5 -0
- package/dist/coordination/yaml-pipeline-loader.js +5 -2
- package/dist/domains/code-intelligence/coordinator.js +35 -9
- package/dist/domains/code-intelligence/index-path-guard.d.ts +52 -0
- package/dist/domains/code-intelligence/index-path-guard.js +95 -0
- package/dist/domains/code-intelligence/interfaces.d.ts +12 -0
- package/dist/domains/code-intelligence/plugin.js +5 -1
- package/dist/domains/code-intelligence/services/knowledge-graph.d.ts +6 -0
- package/dist/domains/code-intelligence/services/knowledge-graph.js +42 -5
- package/dist/domains/code-intelligence/services/metric-collector/index.d.ts +2 -2
- package/dist/domains/code-intelligence/services/metric-collector/index.js +2 -3
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +1 -1
- package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +11 -36
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.d.ts +1 -1
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +45 -103
- package/dist/domains/contract-testing/coordinator.js +3 -1
- package/dist/domains/contract-testing/services/api-compatibility.js +7 -6
- package/dist/domains/contract-testing/services/contract-validator.js +6 -4
- package/dist/domains/contract-testing/services/schema-validator.js +8 -5
- package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
- package/dist/domains/defect-intelligence/plugin.js +11 -2
- package/dist/domains/defect-intelligence/prediction-history.d.ts +27 -0
- package/dist/domains/defect-intelligence/prediction-history.js +68 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +29 -12
- package/dist/domains/enterprise-integration/services/message-broker-service.js +3 -2
- package/dist/domains/enterprise-integration/services/odata-service.js +2 -1
- package/dist/domains/enterprise-integration/services/sap-integration-service.js +3 -2
- package/dist/domains/learning-optimization/active-patterns.d.ts +14 -14
- package/dist/domains/learning-optimization/active-patterns.js +17 -14
- package/dist/domains/learning-optimization/coordinator-helpers.js +2 -3
- package/dist/domains/learning-optimization/coordinator.d.ts +0 -3
- package/dist/domains/learning-optimization/coordinator.js +52 -107
- package/dist/domains/learning-optimization/index.d.ts +1 -1
- package/dist/domains/learning-optimization/interfaces.d.ts +62 -6
- package/dist/domains/learning-optimization/pattern-archive.d.ts +31 -0
- package/dist/domains/learning-optimization/pattern-archive.js +56 -0
- package/dist/domains/learning-optimization/pattern-consolidation.d.ts +12 -0
- package/dist/domains/learning-optimization/pattern-consolidation.js +41 -0
- package/dist/domains/learning-optimization/plugin.js +11 -1
- package/dist/domains/learning-optimization/reward-source.d.ts +50 -0
- package/dist/domains/learning-optimization/reward-source.js +65 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.d.ts +7 -5
- package/dist/domains/learning-optimization/services/learning-coordinator.js +98 -75
- package/dist/domains/learning-optimization/services/metrics-optimizer.d.ts +14 -4
- package/dist/domains/learning-optimization/services/metrics-optimizer.js +129 -63
- package/dist/domains/learning-optimization/services/transfer-specialist.js +25 -15
- package/dist/domains/security-compliance/plugin.js +17 -3
- package/dist/domains/security-compliance/sast-path-guard.d.ts +9 -0
- package/dist/domains/security-compliance/sast-path-guard.js +17 -0
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +46 -56
- package/dist/domains/security-compliance/services/scanners/dast-helpers.js +76 -91
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +52 -62
- package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +21 -1
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +29 -24
- package/dist/domains/security-compliance/services/scanners/scanner-orchestrator.js +4 -1
- package/dist/domains/test-execution/coordinator.d.ts +5 -0
- package/dist/domains/test-execution/coordinator.js +35 -20
- package/dist/domains/test-execution/interfaces.d.ts +41 -0
- package/dist/domains/test-execution/plugin.js +19 -4
- package/dist/domains/test-execution/services/flaky-detector.js +9 -7
- package/dist/domains/test-execution/services/retry-handler.js +46 -7
- package/dist/domains/test-execution/services/runner-test-cases.d.ts +32 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +87 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.js +31 -9
- package/dist/domains/test-generation/plugin.js +7 -2
- package/dist/domains/test-generation/services/test-data-generator.js +3 -1
- package/dist/domains/visual-accessibility/services/axe-core-audit.js +1 -1
- package/dist/hooks/cross-phase-hooks.js +2 -1
- package/dist/init/fleet-integration.js +2 -0
- package/dist/init/init-wizard-steps.js +2 -0
- package/dist/init/phases/06-code-intelligence.js +2 -0
- package/dist/init/phases/10-workers.js +51 -6
- package/dist/integrations/browser/agent-browser/client.js +37 -52
- package/dist/integrations/browser/agent-browser/command-executor.d.ts +33 -27
- package/dist/integrations/browser/agent-browser/command-executor.js +53 -54
- package/dist/integrations/browser/agent-browser/session-manager.d.ts +1 -1
- package/dist/integrations/browser/agent-browser/session-manager.js +8 -9
- package/dist/integrations/browser/web-content-fetcher.js +9 -3
- package/dist/integrations/vibium/client.js +2 -2
- package/dist/integrations/vibium/runtime.d.ts +1 -1
- package/dist/integrations/vibium/runtime.js +14 -11
- package/dist/kernel/anti-drift-middleware.d.ts +44 -5
- package/dist/kernel/anti-drift-middleware.js +147 -11
- package/dist/kernel/interfaces.d.ts +5 -0
- package/dist/kernel/unified-memory-schemas.d.ts +3 -2
- package/dist/kernel/unified-memory-schemas.js +3 -2
- package/dist/kernel/unified-memory.js +25 -6
- package/dist/learning/dream/dream-commit.d.ts +65 -0
- package/dist/learning/dream/dream-commit.js +104 -0
- package/dist/learning/dream/dream-engine.d.ts +81 -31
- package/dist/learning/dream/dream-engine.js +225 -168
- package/dist/learning/dream/dream-insights-pruner.d.ts +24 -4
- package/dist/learning/dream/dream-insights-pruner.js +85 -11
- package/dist/learning/dream/index.d.ts +3 -2
- package/dist/learning/dream/index.js +3 -1
- package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -1
- package/dist/learning/dream/rvcow-branch-manager.js +8 -1
- package/dist/learning/dream/speculative-dreamer.d.ts +50 -74
- package/dist/learning/dream/speculative-dreamer.js +64 -111
- package/dist/learning/dream/spreading-activation.d.ts +2 -1
- package/dist/learning/dream/spreading-activation.js +15 -6
- package/dist/learning/experience-capture.d.ts +9 -0
- package/dist/learning/experience-capture.js +18 -4
- package/dist/learning/qe-reasoning-bank-types.d.ts +17 -2
- package/dist/learning/qe-reasoning-bank.js +22 -11
- package/dist/learning/skill-validation-learner.d.ts +2 -0
- package/dist/learning/skill-validation-learner.js +29 -21
- package/dist/learning/sqlite-persistence.d.ts +6 -0
- package/dist/learning/sqlite-persistence.js +16 -2
- package/dist/learning/usage-outcome.d.ts +68 -0
- package/dist/learning/usage-outcome.js +84 -0
- package/dist/mcp/background-workers.d.ts +13 -1
- package/dist/mcp/background-workers.js +23 -3
- package/dist/mcp/bundle.js +602 -551
- package/dist/mcp/handlers/core-handlers.js +11 -0
- package/dist/mcp/handlers/domain-handler-configs.d.ts +19 -0
- package/dist/mcp/handlers/domain-handler-configs.js +76 -30
- package/dist/mcp/handlers/handler-factory.d.ts +2 -1
- package/dist/mcp/handlers/handler-factory.js +37 -15
- package/dist/mcp/handlers/orchestrate-routes.d.ts +36 -0
- package/dist/mcp/handlers/orchestrate-routes.js +88 -0
- package/dist/mcp/handlers/task-handlers.d.ts +3 -0
- package/dist/mcp/handlers/task-handlers.js +69 -6
- package/dist/mcp/handlers/validation-pipeline-handler.js +6 -2
- package/dist/mcp/metrics/metrics-collector.d.ts +11 -9
- package/dist/mcp/metrics/metrics-collector.js +13 -26
- package/dist/mcp/protocol-server.js +10 -3
- package/dist/mcp/security/schema-validator.js +3 -2
- package/dist/mcp/tools/code-intelligence/c4.js +11 -1
- package/dist/mcp/tools/coverage-analysis/index.js +31 -2
- package/dist/mcp/tools/learning-optimization/dream.d.ts +8 -8
- package/dist/mcp/tools/learning-optimization/dream.js +38 -34
- package/dist/mcp/tools/learning-optimization/optimize.d.ts +52 -5
- package/dist/mcp/tools/learning-optimization/optimize.js +164 -80
- package/dist/mcp/tools/quality-assessment/gate.js +12 -1
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +9 -2
- package/dist/memory/crdt/lww-register.js +11 -1
- package/dist/migration/agent-compat.js +7 -5
- package/dist/migrations/20261018_add_dream_insights_archive.d.ts +27 -0
- package/dist/migrations/20261018_add_dream_insights_archive.js +57 -0
- package/dist/routing/calibration/ema-calibrator.js +3 -1
- package/dist/shared/base-domain-plugin.d.ts +4 -0
- package/dist/shared/base-domain-plugin.js +6 -0
- package/dist/shared/git/git-analyzer.d.ts +49 -0
- package/dist/shared/git/git-analyzer.js +159 -319
- package/dist/shared/git/git-process.d.ts +22 -0
- package/dist/shared/git/git-process.js +37 -0
- package/dist/shared/git/index.d.ts +1 -0
- package/dist/shared/git/index.js +1 -0
- package/dist/shared/io/payload-path-guard.d.ts +75 -0
- package/dist/shared/io/payload-path-guard.js +190 -0
- package/dist/shared/llm/cache.js +4 -1
- package/dist/shared/llm/router/agent-router-config.js +2 -1
- package/dist/shared/llm/translation/tool-translator.js +2 -1
- package/dist/shared/security/compliance-patterns.js +3 -1
- package/dist/shared/test-runner-args.d.ts +5 -0
- package/dist/shared/test-runner-args.js +6 -1
- package/dist/shared/test-runner-process.d.ts +32 -0
- package/dist/shared/test-runner-process.js +105 -0
- package/dist/shared/test-runner-verdict.d.ts +9 -1
- package/dist/shared/test-runner-verdict.js +15 -4
- package/dist/shared/types/index.d.ts +9 -0
- package/dist/shared/types/index.js +13 -0
- package/dist/shared/utils/namespaced-search.d.ts +56 -0
- package/dist/shared/utils/namespaced-search.js +71 -0
- package/dist/shared/utils/safe-expression-evaluator.js +4 -3
- package/dist/strange-loop/infra-healing/infra-action-executor.js +7 -3
- package/dist/strange-loop/infra-healing/infra-healing-orchestrator.js +10 -9
- package/dist/strange-loop/infra-healing/recovery-playbook.js +13 -3
- package/dist/validation/gate-reexecute.js +7 -4
- package/dist/workers/daemon.d.ts +2 -0
- package/dist/workers/daemon.js +23 -6
- package/dist/workers/namespaced-keys.d.ts +4 -7
- package/dist/workers/namespaced-keys.js +4 -15
- package/dist/workers/quality-daemon/ci-monitor.js +9 -5
- package/dist/workers/quality-daemon/git-watcher.js +9 -9
- package/dist/workers/worker-env.d.ts +16 -8
- package/dist/workers/worker-env.js +25 -12
- package/dist/workers/worker-manager.js +4 -0
- package/dist/workers/workers/defect-predictor.d.ts +8 -3
- package/dist/workers/workers/defect-predictor.js +48 -49
- package/dist/workers/workers/learning-consolidation.d.ts +3 -1
- package/dist/workers/workers/learning-consolidation.js +22 -8
- package/dist/workflows/browser/workflow-loader.js +8 -5
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-FC4EY447.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-W3V5P7LE.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-AUAL6UBL.js +0 -2
- package/dist/cli/chunks/base-2XML4WH7.js +0 -2
- package/dist/cli/chunks/browser-ZL7OLKJQ.js +0 -4
- package/dist/cli/chunks/browser-workflow-2IFEUAAK.js +0 -2
- package/dist/cli/chunks/chunk-4GYFONJB.js +0 -4
- package/dist/cli/chunks/chunk-6CKTLVYV.js +0 -2
- package/dist/cli/chunks/chunk-7H3GNRNA.js +0 -4
- package/dist/cli/chunks/chunk-EUVSSIGR.js +0 -12
- package/dist/cli/chunks/chunk-I4U7YCXG.js +0 -180
- package/dist/cli/chunks/chunk-J7RCI25Q.js +0 -2
- package/dist/cli/chunks/chunk-KNHLOANK.js +0 -4
- package/dist/cli/chunks/chunk-KNQUHGNY.js +0 -2
- package/dist/cli/chunks/chunk-LZWBUVCK.js +0 -5
- package/dist/cli/chunks/chunk-PIEKGKW6.js +0 -12
- package/dist/cli/chunks/chunk-PWA6XBW4.js +0 -120
- package/dist/cli/chunks/chunk-X6VYQVUM.js +0 -2
- package/dist/cli/chunks/chunk-YTYS2XSY.js +0 -2
- package/dist/cli/chunks/chunk-Z3LDUPLQ.js +0 -6
- package/dist/cli/chunks/client-RFUSQRUZ.js +0 -2
- package/dist/cli/chunks/core-handlers-ZC7QB432.js +0 -2
- package/dist/cli/chunks/cross-domain-router-GRBK7YFZ.js +0 -2
- package/dist/cli/chunks/daemon-JER6HE2J.js +0 -12
- package/dist/cli/chunks/domain-transfer-NF7UJW7B.js +0 -2
- package/dist/cli/chunks/dream-VALD726W.js +0 -2
- package/dist/cli/chunks/file-discovery-VL73ASNI.js +0 -2
- package/dist/cli/chunks/fleet-GJ66QFXK.js +0 -43
- package/dist/cli/chunks/heartbeat-scheduler-FSX7A3ZA.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-UX2QT6RL.js +0 -2
- package/dist/cli/chunks/hnsw-index-WRDDAMXH.js +0 -2
- package/dist/cli/chunks/hybrid-backend-O67NGIB5.js +0 -2
- package/dist/cli/chunks/impact-analyzer-6VXWWYWM.js +0 -2
- package/dist/cli/chunks/init-wizard-VH34J4TL.js +0 -2
- package/dist/cli/chunks/kernel-KJD24NO7.js +0 -2
- package/dist/cli/chunks/knowledge-graph-343O2HEZ.js +0 -2
- package/dist/cli/chunks/llm-router-service-2M4BT2AO.js +0 -2
- package/dist/cli/chunks/load-test-OTQ2JQ5F.js +0 -2
- package/dist/cli/chunks/mcp-NOTDZBW5.js +0 -2
- package/dist/cli/chunks/memory-backend-4QSNRRV6.js +0 -2
- package/dist/cli/chunks/memory-handlers-YFFYRSM6.js +0 -2
- package/dist/cli/chunks/pattern-null-store-5USH5MNR.js +0 -2
- package/dist/cli/chunks/pipeline-7ATPA6LU.js +0 -19
- package/dist/cli/chunks/project-root-SRTA6TBL.js +0 -2
- package/dist/cli/chunks/protocol-executor-4WYPCNBS.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-I4D6SFS4.js +0 -2
- package/dist/cli/chunks/queen-coordinator-24UMTZTE.js +0 -2
- package/dist/cli/chunks/router-AUD4GATI.js +0 -2
- package/dist/cli/chunks/routing-feedback-2FE6SIKQ.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-P5LEUF25.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-ZCYD5YJS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-QGV6BW2W.js +0 -2
- package/dist/cli/chunks/safe-db-Q6JUKG2A.js +0 -2
- package/dist/cli/chunks/schedule-44OSMGE5.js +0 -2
- package/dist/cli/chunks/scheduler-V3HO2QQT.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-N5T7DWMR.js +0 -2
- package/dist/cli/chunks/sync-4IMMQEPT.js +0 -2
- package/dist/cli/chunks/task-handlers-FH6DNTHW.js +0 -9
- package/dist/cli/chunks/token-bootstrap-HMM3AHXM.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-56GDQCMR.js +0 -2
- package/dist/cli/chunks/unified-memory-RQ3Q4CU3.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-ZOP5FEYX.js +0 -2
- package/dist/cli/chunks/unified-persistence-72OCJJKK.js +0 -2
- package/dist/cli/chunks/visual-security-7F5UV23J.js +0 -2
- package/dist/cli/chunks/witness-chain-KZ57QUFE.js +0 -2
- package/dist/cli/chunks/witness-chain-LFASSMZK.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-TPHN4DXN.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ZNWEUYBN.js +0 -2
- package/dist/cli/chunks/wrappers-WCAYIQUX.js +0 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Git Source - Recent commit context for target files
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { runGit } from '../../shared/git/git-process.js';
|
|
5
5
|
export class GitContextSource {
|
|
6
6
|
cwd;
|
|
7
7
|
id = 'git';
|
|
@@ -18,7 +18,11 @@ export class GitContextSource {
|
|
|
18
18
|
// filePaths can originate from MCP tool arguments. Pass each path as
|
|
19
19
|
// one argv element; interpolating it into a shell command would allow
|
|
20
20
|
// command execution via quotes or shell metacharacters.
|
|
21
|
-
|
|
21
|
+
// Async, in its own process group, so a slow git can neither stall
|
|
22
|
+
// the MCP server's event loop nor outlive its timeout (#1115).
|
|
23
|
+
const log = (await runGit(['log', '--oneline', '-5', '--', file], {
|
|
24
|
+
cwd: this.cwd ?? process.cwd(), timeout: 5000,
|
|
25
|
+
})).trim();
|
|
22
26
|
if (log) {
|
|
23
27
|
const content = `Recent commits for ${file}:\n${log}`;
|
|
24
28
|
fragments.push({
|
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
* Covers: index-code, predict-defects
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { prunePredictionHistory } from '../../domains/defect-intelligence/prediction-history.js';
|
|
8
10
|
import * as path from 'path';
|
|
9
11
|
import { ok, err } from '../../shared/types/index.js';
|
|
10
12
|
import { toError } from '../../shared/error-utils.js';
|
|
11
13
|
import { discoverSourceFiles } from './handler-utils.js';
|
|
12
14
|
import { resolveProjectRootFromPaths } from '../../domains/code-intelligence/project-root-resolver.js';
|
|
15
|
+
import { nothingIndexedError } from '../../domains/code-intelligence/index-path-guard.js';
|
|
13
16
|
import { createLogger } from '../../logging/logger-factory.js';
|
|
17
|
+
import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
|
|
14
18
|
const logger = createLogger('CodeIntelligenceHandlers');
|
|
15
19
|
async function collectProjectMetricsForTarget(ctx, targetPath, indexedFiles) {
|
|
16
20
|
if (!ctx.getCodeIntelligenceCoordinator)
|
|
@@ -42,13 +46,24 @@ async function collectProjectMetricsForTarget(ctx, targetPath, indexedFiles) {
|
|
|
42
46
|
return undefined;
|
|
43
47
|
}
|
|
44
48
|
}
|
|
49
|
+
/** #1126: a caller-named target must be a file or directory inside the project. */
|
|
50
|
+
async function confineTarget(taskType, target) {
|
|
51
|
+
if (!target || target === '.')
|
|
52
|
+
return ok(undefined);
|
|
53
|
+
return requirePayloadPath(taskType, 'target', target, { allowDirectory: true, allowMissing: true });
|
|
54
|
+
}
|
|
45
55
|
export function registerCodeIntelligenceHandlers(ctx) {
|
|
46
56
|
// Register code indexing handler - REAL IMPLEMENTATION
|
|
47
57
|
ctx.registerHandler('index-code', async (task) => {
|
|
48
58
|
const payload = task.payload;
|
|
49
59
|
try {
|
|
60
|
+
// #1126: refuse an outside target before listing it, so the error
|
|
61
|
+
// cannot name the files in an outside directory.
|
|
62
|
+
const confined = await confineTarget('index-code', payload.target);
|
|
63
|
+
if (!confined.success)
|
|
64
|
+
return confined;
|
|
50
65
|
const kg = ctx.getKnowledgeGraph();
|
|
51
|
-
const targetPath = payload.target || process.cwd();
|
|
66
|
+
const targetPath = confined.value ?? (payload.target || process.cwd());
|
|
52
67
|
const startTime = Date.now();
|
|
53
68
|
// Discover files to index
|
|
54
69
|
const filesToIndex = await discoverSourceFiles(targetPath, {
|
|
@@ -78,11 +93,21 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
78
93
|
return result;
|
|
79
94
|
}
|
|
80
95
|
const indexResult = result.value;
|
|
96
|
+
// #1096: files were found but none was indexed (e.g. the target is a
|
|
97
|
+
// symlink out of the project) - fail like the coordinator does.
|
|
98
|
+
if (indexResult.filesIndexed === 0) {
|
|
99
|
+
return err(nothingIndexedError(filesToIndex.length, indexResult.skipped ?? [], indexResult.errors));
|
|
100
|
+
}
|
|
101
|
+
const notIndexed = new Set([
|
|
102
|
+
...(indexResult.skipped ?? []).map((s) => s.path),
|
|
103
|
+
...indexResult.errors.map((e) => e.file),
|
|
104
|
+
]);
|
|
105
|
+
const indexedFiles = filesToIndex.filter((file) => !notIndexed.has(file));
|
|
81
106
|
// #999 MCP-CLI parity: `aqe code index` runs the coordinator's project
|
|
82
107
|
// metric step (LOC, tests, tools); run the same step here, rooted at the
|
|
83
108
|
// caller's target the way #997 resolves it. Best-effort: indexing has
|
|
84
109
|
// already succeeded, so a metric failure only omits projectMetrics.
|
|
85
|
-
const projectMetrics = await collectProjectMetricsForTarget(ctx, targetPath,
|
|
110
|
+
const projectMetrics = await collectProjectMetricsForTarget(ctx, targetPath, indexedFiles);
|
|
86
111
|
// Detect languages from files
|
|
87
112
|
const detectedLanguages = new Set();
|
|
88
113
|
const extToLang = {
|
|
@@ -95,7 +120,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
95
120
|
c: 'c', h: 'c', cpp: 'cpp', hpp: 'cpp', cc: 'cpp',
|
|
96
121
|
scala: 'scala',
|
|
97
122
|
};
|
|
98
|
-
for (const file of
|
|
123
|
+
for (const file of indexedFiles) {
|
|
99
124
|
const ext = path.extname(file).slice(1);
|
|
100
125
|
const lang = extToLang[ext];
|
|
101
126
|
if (lang)
|
|
@@ -116,6 +141,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
116
141
|
duration: indexResult.duration,
|
|
117
142
|
errors: indexResult.errors,
|
|
118
143
|
warnings: indexResult.warnings,
|
|
144
|
+
skipped: indexResult.skipped ?? [],
|
|
119
145
|
...(projectMetrics ? { projectMetrics } : {}),
|
|
120
146
|
});
|
|
121
147
|
}
|
|
@@ -127,7 +153,10 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
127
153
|
ctx.registerHandler('predict-defects', async (task) => {
|
|
128
154
|
const payload = task.payload;
|
|
129
155
|
try {
|
|
130
|
-
const
|
|
156
|
+
const confined = await confineTarget('predict-defects', payload.target);
|
|
157
|
+
if (!confined.success)
|
|
158
|
+
return confined;
|
|
159
|
+
const targetPath = confined.value ?? path.resolve(payload.target || process.cwd());
|
|
131
160
|
const minConfidence = payload.minConfidence || 0.5;
|
|
132
161
|
// Discover actual source files in the target directory
|
|
133
162
|
const sourceFiles = await discoverSourceFiles(targetPath, { includeTests: false });
|
|
@@ -144,6 +173,8 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
144
173
|
}
|
|
145
174
|
// Analyze each file for defect indicators based on real metrics
|
|
146
175
|
const predictedDefects = [];
|
|
176
|
+
const predictions = [];
|
|
177
|
+
let filesSkipped = 0;
|
|
147
178
|
for (const filePath of sourceFiles) {
|
|
148
179
|
try {
|
|
149
180
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
@@ -194,6 +225,18 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
194
225
|
reasons.push('Potentially long functions');
|
|
195
226
|
}
|
|
196
227
|
probability = Math.min(probability, 0.95);
|
|
228
|
+
// Keep every analyzed file, including a clean reanalysis below the
|
|
229
|
+
// display threshold. Absolute paths retain the project-relative
|
|
230
|
+
// identity when the caller targeted a nested directory (#1050).
|
|
231
|
+
const roundedProbability = Math.round(probability * 100) / 100;
|
|
232
|
+
predictions.push({
|
|
233
|
+
file: path.resolve(filePath),
|
|
234
|
+
probability: roundedProbability,
|
|
235
|
+
riskLevel: probability >= 0.8 ? 'critical' : probability >= 0.6 ? 'high'
|
|
236
|
+
: probability >= 0.4 ? 'medium' : probability >= 0.2 ? 'low' : 'info',
|
|
237
|
+
factors: [{ name: 'staticCodeIndicators', contribution: roundedProbability }],
|
|
238
|
+
recommendations: reasons,
|
|
239
|
+
});
|
|
197
240
|
if (probability >= minConfidence) {
|
|
198
241
|
// Use relative path for readability
|
|
199
242
|
const relativePath = filePath.startsWith(targetPath)
|
|
@@ -207,9 +250,27 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
207
250
|
}
|
|
208
251
|
}
|
|
209
252
|
catch {
|
|
253
|
+
filesSkipped++;
|
|
210
254
|
// Skip files that can't be read
|
|
211
255
|
}
|
|
212
256
|
}
|
|
257
|
+
if (predictions.length === 0) {
|
|
258
|
+
return err(new Error(`Defect prediction could not read any of ${sourceFiles.length} source files`));
|
|
259
|
+
}
|
|
260
|
+
// Record the run in the schema consumed by the background worker.
|
|
261
|
+
// These are static risk estimates from files actually read, not an
|
|
262
|
+
// empirically calibrated likelihood of future production defects.
|
|
263
|
+
const id = randomUUID();
|
|
264
|
+
await ctx.memory.set(`defect-intelligence:predictor:prediction:${id}`, {
|
|
265
|
+
id,
|
|
266
|
+
timestamp: new Date().toISOString(),
|
|
267
|
+
predictions,
|
|
268
|
+
predictionMethod: 'static-code-indicators',
|
|
269
|
+
estimated: true,
|
|
270
|
+
filesSkipped,
|
|
271
|
+
scanStatus: filesSkipped > 0 ? 'partial' : 'complete',
|
|
272
|
+
}, { namespace: 'defect-intelligence', ttl: 86400 * 7 });
|
|
273
|
+
await prunePredictionHistory(ctx.memory);
|
|
213
274
|
// Sort by probability descending
|
|
214
275
|
predictedDefects.sort((a, b) => b.probability - a.probability);
|
|
215
276
|
// Calculate overall risk score
|
|
@@ -220,7 +281,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
220
281
|
// Generate recommendations from actual findings
|
|
221
282
|
const recommendations = [];
|
|
222
283
|
if (predictedDefects.length > 0) {
|
|
223
|
-
recommendations.push(`${predictedDefects.length} files flagged for potential defects out of ${
|
|
284
|
+
recommendations.push(`${predictedDefects.length} files flagged for potential defects out of ${predictions.length} analyzed`);
|
|
224
285
|
const topFile = predictedDefects[0];
|
|
225
286
|
recommendations.push(`Highest risk: ${topFile.file} (${Math.round(topFile.probability * 100)}%) — ${topFile.reason}`);
|
|
226
287
|
}
|
|
@@ -231,13 +292,19 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
231
292
|
recommendations.push('Address TODO/FIXME comments to reduce technical debt');
|
|
232
293
|
}
|
|
233
294
|
if (predictedDefects.length === 0) {
|
|
234
|
-
recommendations.push(
|
|
295
|
+
recommendations.push(filesSkipped > 0
|
|
296
|
+
? `No analyzed files exceeded the threshold; ${filesSkipped} unreadable source files remain unassessed`
|
|
297
|
+
: 'No files exceeded the defect probability threshold — code looks healthy');
|
|
235
298
|
}
|
|
236
299
|
return ok({
|
|
237
300
|
predictedDefects: predictedDefects.slice(0, 20), // Top 20
|
|
238
301
|
riskScore,
|
|
239
302
|
recommendations,
|
|
240
|
-
filesAnalyzed:
|
|
303
|
+
filesAnalyzed: predictions.length,
|
|
304
|
+
filesSkipped,
|
|
305
|
+
scanStatus: filesSkipped > 0 ? 'partial' : 'complete',
|
|
306
|
+
predictionMethod: 'static-code-indicators',
|
|
307
|
+
estimated: true,
|
|
241
308
|
});
|
|
242
309
|
}
|
|
243
310
|
catch (error) {
|
|
@@ -22,6 +22,7 @@ import * as fs from 'fs';
|
|
|
22
22
|
import * as os from 'os';
|
|
23
23
|
import * as path from 'path';
|
|
24
24
|
import { parseLcovInfo } from './handler-utils.js';
|
|
25
|
+
import { runTestRunnerProcess } from '../../shared/test-runner-process.js';
|
|
25
26
|
/**
|
|
26
27
|
* Is the "never execute build tooling" kill-switch set?
|
|
27
28
|
*
|
|
@@ -402,26 +403,24 @@ export async function collectRustCoverage(targetPath, options = {}) {
|
|
|
402
403
|
// Honor the opt-out before doing any of that.
|
|
403
404
|
if (isCoverageExecDisabled())
|
|
404
405
|
return null;
|
|
405
|
-
const { execSync } = await import('child_process');
|
|
406
406
|
const timeout = options.timeoutMs ?? 300000;
|
|
407
407
|
// cargo must run from the crate root, not from whatever subdirectory the
|
|
408
408
|
// caller happened to point at.
|
|
409
409
|
const crateRoot = findCargoRoot(targetPath);
|
|
410
410
|
if (!crateRoot)
|
|
411
411
|
return null;
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
catch {
|
|
412
|
+
// #1074: run cargo asynchronously. The coverage run executes the crate's
|
|
413
|
+
// whole test suite, and a synchronous call would stop the MCP server
|
|
414
|
+
// answering any other request for up to `timeout`.
|
|
415
|
+
const version = await runTestRunnerProcess('cargo', ['llvm-cov', '--version'], { cwd: crateRoot, timeout: 30000 });
|
|
416
|
+
if (version.error || version.status !== 0) {
|
|
418
417
|
return null; // cargo-llvm-cov not installed — not an error, just unavailable.
|
|
419
418
|
}
|
|
420
419
|
const outPath = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'aqe-rust-cov-')), 'lcov.info');
|
|
421
420
|
try {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
421
|
+
const run = await runTestRunnerProcess('cargo', ['llvm-cov', '--lcov', '--output-path', outPath], { cwd: crateRoot, timeout });
|
|
422
|
+
if (run.error || run.status !== 0)
|
|
423
|
+
return null;
|
|
425
424
|
if (!fs.existsSync(outPath))
|
|
426
425
|
return null;
|
|
427
426
|
const parsed = parseLcovInfo(fs.readFileSync(outPath, 'utf-8'));
|
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { ok, err } from '../../shared/types/index.js';
|
|
8
8
|
import { toError } from '../../shared/error-utils.js';
|
|
9
|
+
import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
|
|
9
10
|
import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
|
|
10
|
-
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
11
|
+
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
11
12
|
import { randomUUID } from 'crypto';
|
|
13
|
+
import * as path from 'path';
|
|
12
14
|
import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
|
|
13
15
|
import { collectedMetrics } from '../../domains/coverage-analysis/collected-metrics.js';
|
|
14
16
|
/**
|
|
@@ -80,7 +82,8 @@ async function collectCoverage(targetPath) {
|
|
|
80
82
|
if (existing.status === 'evaluated') {
|
|
81
83
|
return fromEvaluation(existing.evaluation, false, existing.projectRoot);
|
|
82
84
|
}
|
|
83
|
-
const { target
|
|
85
|
+
const { target } = existing;
|
|
86
|
+
let projectRoot = existing.projectRoot;
|
|
84
87
|
// #569 work item 1: delegate to real instrumentation where available.
|
|
85
88
|
if (isRustProject(target)) {
|
|
86
89
|
const rust = await collectRustCoverage(target);
|
|
@@ -109,7 +112,23 @@ async function collectCoverage(targetPath) {
|
|
|
109
112
|
if (isCoverageExecDisabled()) {
|
|
110
113
|
return { collected: buildEstimatedCoverage(target), ranTests: false, projectRoot };
|
|
111
114
|
}
|
|
112
|
-
const
|
|
115
|
+
const pathFilter = packageFilterForTarget(target, projectRoot);
|
|
116
|
+
let run = await runJsCoverage(projectRoot, {
|
|
117
|
+
timeoutMs: coverageTimeoutMs(),
|
|
118
|
+
pathFilter,
|
|
119
|
+
});
|
|
120
|
+
// A workspace config may deliberately include only root-level tests. If it
|
|
121
|
+
// found no tests for this package, restore the nearest-package behavior. The
|
|
122
|
+
// same fallback permits isolated package installs with no runner at the root.
|
|
123
|
+
// Do not retry timeouts, crashes or nonempty failing suites: their failures
|
|
124
|
+
// must remain visible. Only the fallback run's actual report can be measured.
|
|
125
|
+
const rootRunnerMissing = run.missing && run.numTotalTests === null;
|
|
126
|
+
const rootHadNoTests = !run.missing && run.numTotalTests === 0
|
|
127
|
+
&& testRunStatus(run) === 'passed' && (run.exitCode === 0 || run.exitCode === 1);
|
|
128
|
+
if (pathFilter && !run.timedOut && (rootRunnerMissing || rootHadNoTests)) {
|
|
129
|
+
projectRoot = path.resolve(projectRoot, pathFilter);
|
|
130
|
+
run = await runJsCoverage(projectRoot, { timeoutMs: coverageTimeoutMs() });
|
|
131
|
+
}
|
|
113
132
|
// An EMPTY report (`{}`) from a run that reported its tests means "the run
|
|
114
133
|
// instrumented nothing under the target" → unmeasured, never an estimate
|
|
115
134
|
// (#995 review BL2). An empty report from a run that crashed before
|
|
@@ -182,8 +201,16 @@ export function registerCoverageHandlers(ctx) {
|
|
|
182
201
|
ctx.registerHandler('analyze-coverage', async (task) => {
|
|
183
202
|
const payload = task.payload;
|
|
184
203
|
try {
|
|
204
|
+
// #1126: collect coverage (which may run the tests) only inside the
|
|
205
|
+
// project. A missing target keeps its own message below.
|
|
206
|
+
let targetPath = payload.target || process.cwd();
|
|
207
|
+
if (payload.target && payload.target !== '.') {
|
|
208
|
+
const confined = await requirePayloadPath('analyze-coverage', 'target', payload.target, { allowDirectory: true, allowMissing: true });
|
|
209
|
+
if (!confined.success)
|
|
210
|
+
return confined;
|
|
211
|
+
targetPath = confined.value;
|
|
212
|
+
}
|
|
185
213
|
const analyzer = ctx.getCoverageAnalyzer();
|
|
186
|
-
const targetPath = payload.target || process.cwd();
|
|
187
214
|
const threshold = payload.threshold || 80;
|
|
188
215
|
const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun } = await collectCoverage(targetPath);
|
|
189
216
|
// #995 review N5: say so plainly instead of "no coverage data found".
|
|
@@ -96,7 +96,7 @@ export declare function runnerBinDirs(projectRoot: string): string[];
|
|
|
96
96
|
* Pick the runner and its argv. No shell is involved: `command` is the Node
|
|
97
97
|
* binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
|
|
98
98
|
*/
|
|
99
|
-
export declare function buildJsCoverageInvocation(projectRoot: string, reportDir: string): JsCoverageInvocation;
|
|
99
|
+
export declare function buildJsCoverageInvocation(projectRoot: string, reportDir: string, pathFilter?: string | null): JsCoverageInvocation;
|
|
100
100
|
/**
|
|
101
101
|
* Synchronously kill every live coverage run and remove its temp dir. Runs from
|
|
102
102
|
* `process.on('exit')`, where only synchronous work is possible.
|
|
@@ -134,6 +134,7 @@ export declare function runProcessTree(command: string, args: string[], options:
|
|
|
134
134
|
*/
|
|
135
135
|
export declare function runJsCoverage(projectRoot: string, options?: {
|
|
136
136
|
timeoutMs?: number;
|
|
137
|
+
pathFilter?: string | null;
|
|
137
138
|
}): Promise<JsCoverageRun>;
|
|
138
139
|
/**
|
|
139
140
|
* One-line, caller-facing explanation of why a run produced no usable report.
|
|
@@ -174,7 +174,7 @@ function usesPlugNPlay(projectRoot) {
|
|
|
174
174
|
* Pick the runner and its argv. No shell is involved: `command` is the Node
|
|
175
175
|
* binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
|
|
176
176
|
*/
|
|
177
|
-
export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
177
|
+
export function buildJsCoverageInvocation(projectRoot, reportDir, pathFilter) {
|
|
178
178
|
const resultsFile = path.join(reportDir, RESULTS_FILE);
|
|
179
179
|
const deps = readRunnerDeps(projectRoot);
|
|
180
180
|
let runner = 'vitest';
|
|
@@ -200,6 +200,13 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
|
|
|
200
200
|
runnerArgs = ['run', '--coverage', `--coverage.reportsDirectory=${reportDir}`,
|
|
201
201
|
'--coverage.reporter=json', '--coverage.reportOnFailure=true', '--reporter=json', `--outputFile=${resultsFile}`];
|
|
202
202
|
}
|
|
203
|
+
// A package target run from the workspace root: restrict the run to that
|
|
204
|
+
// package's tests (vitest/jest positional filter) so a slow sibling cannot
|
|
205
|
+
// time the run out. nyc/mocha take no such filter.
|
|
206
|
+
// jest reads the positional as a regex, so escape the directory's metacharacters.
|
|
207
|
+
if (pathFilter && runner !== 'nyc') {
|
|
208
|
+
runnerArgs.push(runner === 'jest' ? pathFilter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') : pathFilter);
|
|
209
|
+
}
|
|
203
210
|
const bin = findPackageBin(projectRoot, runner === 'jest' ? 'jest' : runner);
|
|
204
211
|
return {
|
|
205
212
|
runner,
|
|
@@ -392,7 +399,7 @@ export async function runJsCoverage(projectRoot, options = {}) {
|
|
|
392
399
|
const timeoutMs = options.timeoutMs ?? 120000;
|
|
393
400
|
const reportDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aqe-js-cov-'));
|
|
394
401
|
try {
|
|
395
|
-
const inv = buildJsCoverageInvocation(projectRoot, reportDir);
|
|
402
|
+
const inv = buildJsCoverageInvocation(projectRoot, reportDir, options.pathFilter);
|
|
396
403
|
if (!inv.command) {
|
|
397
404
|
return {
|
|
398
405
|
runner: inv.runner, missing: true, exitCode: null, exitedCleanly: false, timedOut: false,
|
|
@@ -22,9 +22,11 @@ import type { CoverageData, FileCoverage } from '../../domains/coverage-analysis
|
|
|
22
22
|
/**
|
|
23
23
|
* Walk up from a target to the nearest directory that holds a project marker.
|
|
24
24
|
*
|
|
25
|
-
* NEAREST rather than topmost: in a monorepo, `packages/core/src`
|
|
26
|
-
* `packages/core`
|
|
27
|
-
*
|
|
25
|
+
* Normally NEAREST rather than topmost: in a monorepo, `packages/core/src`
|
|
26
|
+
* belongs to `packages/core` when it has its own runner config. When only the
|
|
27
|
+
* enclosing workspace has a runner config, use that workspace so test execution
|
|
28
|
+
* and existing coverage reports use the same configured root (#1005). This
|
|
29
|
+
* intentionally differs from `kernel/findProjectRoot`, which locates
|
|
28
30
|
* the AQE data root (honouring AQE_PROJECT_ROOT and `.agentic-qe`).
|
|
29
31
|
*
|
|
30
32
|
* Returns `null` when the target does not exist (a typo must not silently
|
|
@@ -32,6 +34,14 @@ import type { CoverageData, FileCoverage } from '../../domains/coverage-analysis
|
|
|
32
34
|
* found below the home directory / filesystem root within `maxDepth` levels.
|
|
33
35
|
*/
|
|
34
36
|
export declare function findCoverageProjectRoot(target: string, maxDepth?: number): string | null;
|
|
37
|
+
/**
|
|
38
|
+
* When `projectRoot` was adopted as a workspace root for a target inside a
|
|
39
|
+
* nested package, the directory (relative to the root, with a trailing `/`) of
|
|
40
|
+
* that package, for use as a test-runner path filter so sibling packages' tests
|
|
41
|
+
* are not run too. `null` when the target is the root itself or no nested
|
|
42
|
+
* package manifest sits between the target and the root.
|
|
43
|
+
*/
|
|
44
|
+
export declare function packageFilterForTarget(target: string, projectRoot: string): string | null;
|
|
35
45
|
/** Is this path (by name) a coverage report rather than source code? */
|
|
36
46
|
export declare function isCoverageReportFile(filePath: string): boolean;
|
|
37
47
|
/**
|
|
@@ -23,6 +23,7 @@ import * as os from 'os';
|
|
|
23
23
|
import * as path from 'path';
|
|
24
24
|
import { loadCoverageData, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
|
|
25
25
|
import { isTestPath } from './coverage-collection.js';
|
|
26
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
26
27
|
// ============================================================================
|
|
27
28
|
// Project root
|
|
28
29
|
// ============================================================================
|
|
@@ -38,12 +39,180 @@ const PROJECT_ROOT_MARKERS = [
|
|
|
38
39
|
'pom.xml', 'build.gradle', 'build.gradle.kts',
|
|
39
40
|
'.git',
|
|
40
41
|
];
|
|
42
|
+
const JS_RUNNER_CONFIGS = [
|
|
43
|
+
'vitest.config.ts', 'vitest.config.js', 'vitest.config.mts', 'vitest.config.mjs',
|
|
44
|
+
'vitest.config.cts', 'vitest.config.cjs',
|
|
45
|
+
'vitest.workspace.ts', 'vitest.workspace.js', 'vitest.workspace.mts',
|
|
46
|
+
'vitest.workspace.mjs', 'vitest.workspace.json',
|
|
47
|
+
'vite.config.ts', 'vite.config.js', 'vite.config.mts', 'vite.config.mjs',
|
|
48
|
+
'jest.config.ts', 'jest.config.js', 'jest.config.mts', 'jest.config.mjs',
|
|
49
|
+
'jest.config.cts', 'jest.config.cjs', 'jest.config.json',
|
|
50
|
+
];
|
|
51
|
+
function hasJsRunnerConfig(dir) {
|
|
52
|
+
if (JS_RUNNER_CONFIGS.some(name => fs.existsSync(path.join(dir, name))))
|
|
53
|
+
return true;
|
|
54
|
+
// Jest also accepts inline configuration: `"jest": { ... }` in package.json.
|
|
55
|
+
return readPackageJson(dir)?.jest !== undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The runner a package.json declares through its dependencies, mirroring the
|
|
59
|
+
* precedence of the coverage runner (jest, then mocha/nyc, then vitest).
|
|
60
|
+
* `null` when it declares none. Jest and vitest run with no config file at all,
|
|
61
|
+
* so a dependency is as good a declaration as a config.
|
|
62
|
+
*/
|
|
63
|
+
function declaredRunner(dir) {
|
|
64
|
+
const pkg = readPackageJson(dir);
|
|
65
|
+
if (!pkg)
|
|
66
|
+
return null;
|
|
67
|
+
const deps = {
|
|
68
|
+
...pkg.devDependencies,
|
|
69
|
+
...pkg.dependencies,
|
|
70
|
+
};
|
|
71
|
+
if (deps['jest'] || deps['@jest/core'])
|
|
72
|
+
return 'jest';
|
|
73
|
+
if (deps['mocha'] || deps['nyc'])
|
|
74
|
+
return 'nyc';
|
|
75
|
+
if (deps['vitest'])
|
|
76
|
+
return 'vitest';
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/** mocha/nyc are configured by dotfiles rather than a runner config module. */
|
|
80
|
+
function hasMochaOrNycConfig(dir) {
|
|
81
|
+
try {
|
|
82
|
+
return fs.readdirSync(dir).some(name => /^\.(mocharc|nycrc)(\.|$)/.test(name));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* May a package inherit the runner config of workspace `rootDir`? Only when it
|
|
90
|
+
* does not bring its own runner: a package that declares a different runner
|
|
91
|
+
* (e.g. jest under a vitest root) must keep running that one, from its own
|
|
92
|
+
* directory. With no runner declared at the root the runner defaults to vitest.
|
|
93
|
+
*/
|
|
94
|
+
function packageCanUseRootRunner(pkgDir, rootDir) {
|
|
95
|
+
if (hasMochaOrNycConfig(pkgDir))
|
|
96
|
+
return (declaredRunner(rootDir) ?? 'vitest') === 'nyc';
|
|
97
|
+
const own = declaredRunner(pkgDir);
|
|
98
|
+
return own === null || own === (declaredRunner(rootDir) ?? 'vitest');
|
|
99
|
+
}
|
|
100
|
+
function readPackageJson(dir) {
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
|
|
103
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : null;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The workspace patterns a root declares: npm/yarn `workspaces` (array or
|
|
111
|
+
* `{ packages: [...] }`) or pnpm's `packages:` list. `null` = not a workspace
|
|
112
|
+
* root. Patterns are returned as written (negations keep their `!`).
|
|
113
|
+
*/
|
|
114
|
+
function readWorkspacePatterns(dir) {
|
|
115
|
+
const patterns = [];
|
|
116
|
+
let isRoot = false;
|
|
117
|
+
const pkg = readPackageJson(dir);
|
|
118
|
+
const ws = pkg?.workspaces;
|
|
119
|
+
const fromPkg = Array.isArray(ws)
|
|
120
|
+
? ws
|
|
121
|
+
: (typeof ws === 'object' && ws !== null && Array.isArray(ws.packages)
|
|
122
|
+
? ws.packages
|
|
123
|
+
: null);
|
|
124
|
+
if (ws !== undefined && ws !== null && typeof ws === 'object')
|
|
125
|
+
isRoot = true;
|
|
126
|
+
if (fromPkg)
|
|
127
|
+
patterns.push(...fromPkg.filter((p) => typeof p === 'string'));
|
|
128
|
+
// Only the block-list `packages:` form is read; the flow form gives no
|
|
129
|
+
// patterns, so the root is not adopted (fails safe).
|
|
130
|
+
try {
|
|
131
|
+
const yaml = fs.readFileSync(path.join(dir, 'pnpm-workspace.yaml'), 'utf-8');
|
|
132
|
+
isRoot = true;
|
|
133
|
+
let inPackages = false;
|
|
134
|
+
for (const raw of yaml.split(/\r?\n/)) {
|
|
135
|
+
const line = raw.replace(/\s+#.*$/, '').trimEnd();
|
|
136
|
+
if (/^packages\s*:/.test(line)) {
|
|
137
|
+
inPackages = true;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (inPackages) {
|
|
141
|
+
const m = /^\s+-\s+(.+)$/.exec(line);
|
|
142
|
+
if (m)
|
|
143
|
+
patterns.push(m[1].trim().replace(/^['"]|['"]$/g, ''));
|
|
144
|
+
else if (/^\S/.test(line))
|
|
145
|
+
inPackages = false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch { /* no pnpm-workspace.yaml */ }
|
|
150
|
+
return isRoot ? patterns : null;
|
|
151
|
+
}
|
|
152
|
+
function workspaceGlobToRegExp(pattern) {
|
|
153
|
+
const DEEP_DIR = '\u0000';
|
|
154
|
+
const DEEP_ANY = '\u0001';
|
|
155
|
+
const body = pattern.replace(/^\.\//, '').replace(/\/+$/, '')
|
|
156
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
157
|
+
.replace(/\*\*\//g, DEEP_DIR)
|
|
158
|
+
.replace(/\*\*/g, DEEP_ANY)
|
|
159
|
+
.replace(/\*/g, '[^/]*')
|
|
160
|
+
.replace(/\?/g, '[^/]')
|
|
161
|
+
.split(DEEP_DIR).join('(?:.*/)?')
|
|
162
|
+
.split(DEEP_ANY).join('.*');
|
|
163
|
+
return new RegExp(`^${body}$`);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Is `pkgDir` a member of the workspace declared at `rootDir`? Patterns are
|
|
167
|
+
* resolved relative to the root; a pattern containing a `..` segment or an
|
|
168
|
+
* absolute path is ignored (it could point outside the root), and `!`
|
|
169
|
+
* patterns exclude.
|
|
170
|
+
*/
|
|
171
|
+
function isWorkspaceMember(rootDir, pkgDir) {
|
|
172
|
+
const patterns = readWorkspacePatterns(rootDir);
|
|
173
|
+
if (!patterns)
|
|
174
|
+
return false;
|
|
175
|
+
const rel = path.relative(rootDir, pkgDir).split(path.sep).join('/');
|
|
176
|
+
if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel))
|
|
177
|
+
return false;
|
|
178
|
+
let member = false;
|
|
179
|
+
for (const raw of patterns) {
|
|
180
|
+
const negated = raw.startsWith('!');
|
|
181
|
+
const pattern = negated ? raw.slice(1) : raw;
|
|
182
|
+
if (path.isAbsolute(pattern) || /^[A-Za-z]:/.test(pattern) || pattern.split(/[\\/]/).includes('..'))
|
|
183
|
+
continue;
|
|
184
|
+
if (workspaceGlobToRegExp(pattern).test(rel))
|
|
185
|
+
member = !negated;
|
|
186
|
+
}
|
|
187
|
+
return member;
|
|
188
|
+
}
|
|
189
|
+
/** True when `child` is `parent` or inside it (path-segment aware). */
|
|
190
|
+
function within(child, parent) {
|
|
191
|
+
const rel = path.relative(parent, child);
|
|
192
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The AQE project root, as the ceiling for workspace-root adoption. Runner
|
|
196
|
+
* configuration is code that gets executed, so it must never be picked up from
|
|
197
|
+
* above the project (`AQE_PROJECT_ROOT` or the discovered root). `null` when it
|
|
198
|
+
* cannot be resolved, which disables adoption.
|
|
199
|
+
*/
|
|
200
|
+
function aqeProjectCeiling(start) {
|
|
201
|
+
try {
|
|
202
|
+
return fs.realpathSync(path.resolve(findProjectRoot(start)));
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
41
208
|
/**
|
|
42
209
|
* Walk up from a target to the nearest directory that holds a project marker.
|
|
43
210
|
*
|
|
44
|
-
* NEAREST rather than topmost: in a monorepo, `packages/core/src`
|
|
45
|
-
* `packages/core`
|
|
46
|
-
*
|
|
211
|
+
* Normally NEAREST rather than topmost: in a monorepo, `packages/core/src`
|
|
212
|
+
* belongs to `packages/core` when it has its own runner config. When only the
|
|
213
|
+
* enclosing workspace has a runner config, use that workspace so test execution
|
|
214
|
+
* and existing coverage reports use the same configured root (#1005). This
|
|
215
|
+
* intentionally differs from `kernel/findProjectRoot`, which locates
|
|
47
216
|
* the AQE data root (honouring AQE_PROJECT_ROOT and `.agentic-qe`).
|
|
48
217
|
*
|
|
49
218
|
* Returns `null` when the target does not exist (a typo must not silently
|
|
@@ -70,18 +239,66 @@ export function findCoverageProjectRoot(target, maxDepth = 12) {
|
|
|
70
239
|
home = null;
|
|
71
240
|
}
|
|
72
241
|
const start = dir;
|
|
242
|
+
let nearestRoot = null;
|
|
243
|
+
let ceiling = null;
|
|
73
244
|
for (let depth = 0; depth <= maxDepth; depth++) {
|
|
74
245
|
// A stray manifest in $HOME must not claim every directory beneath it.
|
|
75
246
|
// $HOME is still a valid root when it is the target itself.
|
|
76
247
|
if (home !== null && dir === home && dir !== start)
|
|
77
|
-
return
|
|
78
|
-
if (PROJECT_ROOT_MARKERS.some(m => fs.existsSync(path.join(dir, m))))
|
|
79
|
-
|
|
248
|
+
return nearestRoot;
|
|
249
|
+
if (!nearestRoot && PROJECT_ROOT_MARKERS.some(m => fs.existsSync(path.join(dir, m)))) {
|
|
250
|
+
nearestRoot = dir;
|
|
251
|
+
if (hasJsRunnerConfig(dir))
|
|
252
|
+
return dir;
|
|
253
|
+
// Only a nested JS package can inherit the workspace's runner config.
|
|
254
|
+
// Other project types keep the nearest-marker semantics.
|
|
255
|
+
if (!fs.existsSync(path.join(dir, 'package.json')))
|
|
256
|
+
return dir;
|
|
257
|
+
}
|
|
258
|
+
else if (nearestRoot && readWorkspacePatterns(dir) !== null) {
|
|
259
|
+
// Adopt this workspace root (and run its config) only when it is inside
|
|
260
|
+
// the AQE project and actually lists the nearest package as a member.
|
|
261
|
+
ceiling ??= aqeProjectCeiling(start) ?? '';
|
|
262
|
+
if (ceiling && within(dir, ceiling) && within(nearestRoot, ceiling)
|
|
263
|
+
&& isWorkspaceMember(dir, nearestRoot) && hasJsRunnerConfig(dir)
|
|
264
|
+
&& packageCanUseRootRunner(nearestRoot, dir)) {
|
|
265
|
+
return dir;
|
|
266
|
+
}
|
|
267
|
+
return nearestRoot;
|
|
268
|
+
}
|
|
269
|
+
// Do not adopt configuration from a different repository.
|
|
270
|
+
if (nearestRoot && fs.existsSync(path.join(dir, '.git')))
|
|
271
|
+
return nearestRoot;
|
|
80
272
|
const parent = path.dirname(dir);
|
|
81
273
|
if (parent === dir)
|
|
82
|
-
return
|
|
274
|
+
return nearestRoot;
|
|
83
275
|
dir = parent;
|
|
84
276
|
}
|
|
277
|
+
return nearestRoot;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* When `projectRoot` was adopted as a workspace root for a target inside a
|
|
281
|
+
* nested package, the directory (relative to the root, with a trailing `/`) of
|
|
282
|
+
* that package, for use as a test-runner path filter so sibling packages' tests
|
|
283
|
+
* are not run too. `null` when the target is the root itself or no nested
|
|
284
|
+
* package manifest sits between the target and the root.
|
|
285
|
+
*/
|
|
286
|
+
export function packageFilterForTarget(target, projectRoot) {
|
|
287
|
+
try {
|
|
288
|
+
const root = fs.realpathSync(projectRoot);
|
|
289
|
+
const real = fs.realpathSync(path.resolve(target));
|
|
290
|
+
let dir = fs.statSync(real).isDirectory() ? real : path.dirname(real);
|
|
291
|
+
while (dir !== root && within(dir, root)) {
|
|
292
|
+
if (fs.existsSync(path.join(dir, 'package.json'))) {
|
|
293
|
+
return `${path.relative(root, dir).split(path.sep).join('/')}/`;
|
|
294
|
+
}
|
|
295
|
+
const parent = path.dirname(dir);
|
|
296
|
+
if (parent === dir)
|
|
297
|
+
break;
|
|
298
|
+
dir = parent;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch { /* fall through */ }
|
|
85
302
|
return null;
|
|
86
303
|
}
|
|
87
304
|
// ============================================================================
|