agentic-qe 3.15.8 → 3.15.9
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 +183 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/agents/claim-verifier/claim-verifier-service.js +13 -8
- package/dist/bridge/captured-experience-bridge.js +12 -13
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-R2Q4QGXQ.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-W3V5P7LE.js → agent-booster-wasm-427FRKWG.js} +2 -2
- package/dist/cli/chunks/{agent-handler-2NQFHAWE.js → agent-handler-RIYHTHVZ.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-457ECHHK.js → agent-memory-branch-WSUCUHOO.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-3RENLQWP.js +2 -0
- package/dist/cli/chunks/{arena-JV3WSEHU.js → arena-KRIBMIXX.js} +2 -2
- package/dist/cli/chunks/{arena-IYBQ3GPY.js → arena-YAJZX6MC.js} +4 -4
- package/dist/cli/chunks/{audit-5OS3T3K6.js → audit-7ZNOXWP3.js} +3 -3
- package/dist/cli/chunks/base-67DXSAYM.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-IQKBFVAO.js → better-sqlite3-ZQAT4I6H.js} +2 -2
- package/dist/cli/chunks/{brain-handler-KA3SGAFM.js → brain-handler-452WCPZC.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-QZDU2VOQ.js → branch-enumerator-IJFXJRPN.js} +2 -2
- package/dist/cli/chunks/{browser-ZL7OLKJQ.js → browser-CT3MTV6G.js} +2 -2
- package/dist/cli/chunks/browser-workflow-NDXRROWZ.js +2 -0
- package/dist/cli/chunks/{chunk-IJSFZO7P.js → chunk-2BA45H64.js} +2 -2
- package/dist/cli/chunks/{chunk-6GIC2263.js → chunk-2HL3UM5P.js} +2 -2
- package/dist/cli/chunks/{chunk-KVMKYUOE.js → chunk-2I2UPJS7.js} +2 -2
- package/dist/cli/chunks/{chunk-22DOS3PM.js → chunk-2TDIS6YK.js} +2 -2
- package/dist/cli/chunks/{chunk-5MBNRTT5.js → chunk-2URBI52G.js} +2 -2
- package/dist/cli/chunks/{chunk-A6GCO6ZU.js → chunk-2XITOPYV.js} +2 -2
- package/dist/cli/chunks/{chunk-I77D65X5.js → chunk-2YH62JCN.js} +2 -2
- package/dist/cli/chunks/{chunk-2JCLACCS.js → chunk-32UTLDNY.js} +2 -2
- package/dist/cli/chunks/{chunk-UTNKMPTC.js → chunk-37BIGMJI.js} +1 -1
- package/dist/cli/chunks/{chunk-767SR7WH.js → chunk-3CJCROMW.js} +2 -2
- package/dist/cli/chunks/{chunk-LVHZK7GW.js → chunk-3LYU7BLY.js} +2 -2
- package/dist/cli/chunks/{chunk-5DZDLOY6.js → chunk-47TYABPD.js} +3 -3
- package/dist/cli/chunks/{chunk-SWY6KGMF.js → chunk-47V7FQGX.js} +2 -2
- package/dist/cli/chunks/{chunk-KMZW2P3R.js → chunk-4JCY45KV.js} +2 -2
- package/dist/cli/chunks/{chunk-D4IBIMWI.js → chunk-4SUOVLJ6.js} +2 -2
- package/dist/cli/chunks/{chunk-J7RCI25Q.js → chunk-4URT6JO2.js} +1 -1
- package/dist/cli/chunks/{chunk-SHEVM5PF.js → chunk-4V27J6YN.js} +2 -2
- package/dist/cli/chunks/{chunk-JWPYMRIX.js → chunk-4W4DYVSH.js} +1 -1
- package/dist/cli/chunks/chunk-55HRSNGN.js +2 -0
- package/dist/cli/chunks/{chunk-R2NHGESM.js → chunk-5D2I7JUP.js} +2 -2
- package/dist/cli/chunks/{chunk-GGSTLKY5.js → chunk-5JWGCIQW.js} +1 -1
- package/dist/cli/chunks/chunk-5LAAZLUC.js +4 -0
- package/dist/cli/chunks/{chunk-YNQPHRUZ.js → chunk-5NS3USRW.js} +1 -1
- package/dist/cli/chunks/{chunk-4YUBWU3E.js → chunk-6EPHNJTL.js} +1 -1
- package/dist/cli/chunks/{chunk-ZBI7PJFX.js → chunk-6OOYIO3W.js} +2 -2
- package/dist/cli/chunks/{chunk-ST7ASEJO.js → chunk-6PXA2BQJ.js} +58 -58
- package/dist/cli/chunks/{chunk-LPSMVBB3.js → chunk-6YL6JOQB.js} +2 -2
- package/dist/cli/chunks/{chunk-DY37YMMQ.js → chunk-72AMFDC7.js} +1 -1
- package/dist/cli/chunks/{chunk-OWBFVAEH.js → chunk-763SUL4B.js} +2 -2
- package/dist/cli/chunks/{chunk-4GYFONJB.js → chunk-7DMA5NYL.js} +1 -1
- package/dist/cli/chunks/{chunk-4GUVVGJX.js → chunk-7JKB3Q7O.js} +1 -1
- package/dist/cli/chunks/{chunk-DN3AKAPY.js → chunk-7KII4CQG.js} +2 -2
- package/dist/cli/chunks/{chunk-VKFVJCIH.js → chunk-7QGYJ5OY.js} +1 -1
- package/dist/cli/chunks/{chunk-HNGNRIZZ.js → chunk-7QTB5VJZ.js} +2 -2
- package/dist/cli/chunks/{chunk-GSOK4M6V.js → chunk-7X2Y727E.js} +1 -1
- package/dist/cli/chunks/{chunk-PZ7FJ4UG.js → chunk-A4RU67VX.js} +2 -2
- package/dist/cli/chunks/{chunk-VWSGWYRB.js → chunk-A6YIH4C4.js} +2 -2
- package/dist/cli/chunks/{chunk-4I35ARWW.js → chunk-ABFDB4X3.js} +1 -1
- package/dist/cli/chunks/{chunk-NQDYOF35.js → chunk-AJ4YDSOI.js} +2 -2
- package/dist/cli/chunks/{chunk-CDLG3Q2O.js → chunk-AOFO4N32.js} +2 -2
- package/dist/cli/chunks/{chunk-WAWKAYPY.js → chunk-AQTVVLNP.js} +1 -1
- package/dist/cli/chunks/chunk-AR2E4B7K.js +6 -0
- package/dist/cli/chunks/{chunk-HXCGV5UJ.js → chunk-AVB5QY2Q.js} +2 -2
- package/dist/cli/chunks/{chunk-JFWQFB3S.js → chunk-BHKXMIWX.js} +2 -2
- package/dist/cli/chunks/{chunk-BEVWCF3Q.js → chunk-BXO536GT.js} +3 -3
- package/dist/cli/chunks/{chunk-IMSRWNWF.js → chunk-C6RTMTEH.js} +1 -1
- package/dist/cli/chunks/{chunk-UKKFZJME.js → chunk-CTZJUV5I.js} +1 -1
- package/dist/cli/chunks/{chunk-MV4S3TEC.js → chunk-D6XVGFTI.js} +2 -2
- package/dist/cli/chunks/{chunk-5YOO5QSE.js → chunk-DDPPSSHW.js} +1 -1
- package/dist/cli/chunks/{chunk-NHOMVBCI.js → chunk-DGTLJNJH.js} +2 -2
- package/dist/cli/chunks/{chunk-NWFBF3KT.js → chunk-DINZR5CF.js} +1 -1
- package/dist/cli/chunks/{chunk-RG42LDOB.js → chunk-EFBLP43U.js} +2 -2
- package/dist/cli/chunks/chunk-ETG7O5E5.js +5 -0
- package/dist/cli/chunks/{chunk-KNHLOANK.js → chunk-F2SQPP6U.js} +2 -2
- package/dist/cli/chunks/{chunk-62T7U25U.js → chunk-F3PQZX44.js} +1 -1
- package/dist/cli/chunks/{chunk-X3HM7SV4.js → chunk-F4JYIRW2.js} +2 -2
- package/dist/cli/chunks/{chunk-NZATJ2C6.js → chunk-FJ4VTLLK.js} +2 -2
- package/dist/cli/chunks/{chunk-TMNEK7TP.js → chunk-FL3OYGCS.js} +2 -2
- package/dist/cli/chunks/{chunk-HI6OBDDY.js → chunk-FLASM2XB.js} +2 -2
- package/dist/cli/chunks/{chunk-GENNJRNK.js → chunk-FV3NHVC7.js} +22 -22
- package/dist/cli/chunks/{chunk-PICEGWGB.js → chunk-FV7VAG74.js} +1 -1
- package/dist/cli/chunks/{chunk-PWA6XBW4.js → chunk-G3BKZNFL.js} +5 -5
- package/dist/cli/chunks/{chunk-T2TDTBFV.js → chunk-GBUIG3FS.js} +1 -1
- package/dist/cli/chunks/{chunk-QFYUZYRA.js → chunk-GCWSX2NY.js} +4 -4
- package/dist/cli/chunks/{chunk-KJNUETCB.js → chunk-GII5WVAK.js} +1 -1
- package/dist/cli/chunks/{chunk-YVWMJZ6O.js → chunk-GKPQ2GRR.js} +2 -2
- package/dist/cli/chunks/chunk-GR3JYE5A.js +2 -0
- package/dist/cli/chunks/{chunk-CQ5G64EA.js → chunk-H3KBIWTO.js} +2 -2
- package/dist/cli/chunks/{chunk-V4QJ3MMT.js → chunk-HAROIAJE.js} +1 -1
- package/dist/cli/chunks/{chunk-OJWEZYLR.js → chunk-HCYQHWI2.js} +2 -2
- package/dist/cli/chunks/{chunk-FAYXES7R.js → chunk-HGTWAZWU.js} +2 -2
- package/dist/cli/chunks/{chunk-LHRVSK44.js → chunk-HTZJSQ3C.js} +2 -2
- package/dist/cli/chunks/{chunk-DAFMHM64.js → chunk-HWK5L7IJ.js} +2 -2
- package/dist/cli/chunks/{chunk-K5R3WUJP.js → chunk-HZ5NC6U5.js} +1 -1
- package/dist/cli/chunks/{chunk-Y5ZBF7MA.js → chunk-I6S35FRO.js} +2 -2
- package/dist/cli/chunks/{chunk-UDCYQLTD.js → chunk-ICP2ORGI.js} +2 -2
- package/dist/cli/chunks/{chunk-KMVFBYJO.js → chunk-IFEIY3NQ.js} +2 -2
- package/dist/cli/chunks/{chunk-NW7HTOSN.js → chunk-J3DTDJDT.js} +2 -2
- package/dist/cli/chunks/chunk-J3WGK22W.js +2 -0
- package/dist/cli/chunks/{chunk-5ONJ7AV6.js → chunk-J5KNRVXR.js} +1 -1
- package/dist/cli/chunks/{chunk-G77Q22EN.js → chunk-JAV5WPSY.js} +2 -2
- package/dist/cli/chunks/{chunk-VVK4ECVJ.js → chunk-JEP4ULR6.js} +2 -2
- package/dist/cli/chunks/{chunk-TC52M542.js → chunk-JK2ME6IT.js} +2 -2
- package/dist/cli/chunks/chunk-JNNZK7KH.js +2 -0
- package/dist/cli/chunks/{chunk-NLYUC63R.js → chunk-JP4P3P3D.js} +2 -2
- package/dist/cli/chunks/{chunk-BTMEOZYY.js → chunk-JUVHZG7I.js} +1 -1
- package/dist/cli/chunks/{chunk-PUYQ6EKC.js → chunk-JWGRWMZP.js} +2 -2
- package/dist/cli/chunks/{chunk-OCLAMZJG.js → chunk-K5DJXMAA.js} +2 -2
- package/dist/cli/chunks/{chunk-X7ZQIFES.js → chunk-KFUUIAR4.js} +2 -2
- package/dist/cli/chunks/chunk-KHSRIPBP.js +180 -0
- package/dist/cli/chunks/{chunk-U3BWBP6B.js → chunk-KIKWJM6J.js} +2 -2
- package/dist/cli/chunks/{chunk-MUDBF2JC.js → chunk-KIXYKUCI.js} +1 -1
- package/dist/cli/chunks/{chunk-P4UT4LBE.js → chunk-KLGYIEJK.js} +3 -3
- package/dist/cli/chunks/{chunk-G6CLO74Q.js → chunk-KR3M44CF.js} +3 -3
- package/dist/cli/chunks/chunk-KTSLTZSG.js +2 -0
- package/dist/cli/chunks/{chunk-FJAO4UX2.js → chunk-KVBEGOJE.js} +2 -2
- package/dist/cli/chunks/{chunk-BLZEOGQE.js → chunk-L42JPFCC.js} +2 -2
- package/dist/cli/chunks/{chunk-ZOVAZTXE.js → chunk-LCJTEUDC.js} +370 -370
- package/dist/cli/chunks/{chunk-JLTGO5BB.js → chunk-LEAKYZ37.js} +2 -2
- package/dist/cli/chunks/{chunk-RSMPJWQH.js → chunk-LMU5DUDK.js} +1 -1
- package/dist/cli/chunks/{chunk-FEN2DHFM.js → chunk-MZS32SYS.js} +1 -1
- package/dist/cli/chunks/{chunk-J7FLNP5L.js → chunk-N3KEY4XJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZG7UKWBB.js → chunk-N3NP6PTT.js} +2 -2
- package/dist/cli/chunks/{chunk-2DPHFCMW.js → chunk-N5PDFGCQ.js} +2 -2
- package/dist/cli/chunks/{chunk-BQUIZ5QT.js → chunk-NDKLQW6N.js} +2 -2
- package/dist/cli/chunks/{chunk-52YRSWPS.js → chunk-NHZIWIQZ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZOHS32SI.js → chunk-NTAD5UX4.js} +2 -2
- package/dist/cli/chunks/{chunk-7H3GNRNA.js → chunk-O3JLOVZX.js} +2 -2
- package/dist/cli/chunks/{chunk-7XGM7Q2N.js → chunk-OCESWNAZ.js} +3 -3
- package/dist/cli/chunks/{chunk-7SLEUVPZ.js → chunk-OG2UI6A3.js} +2 -2
- package/dist/cli/chunks/{chunk-4TZLZRZ4.js → chunk-OXTFSIGN.js} +1 -1
- package/dist/cli/chunks/{chunk-2QRGIEQV.js → chunk-OXZLKP6C.js} +1 -1
- package/dist/cli/chunks/{chunk-FEPFXXI7.js → chunk-P2CXVNKK.js} +2 -2
- package/dist/cli/chunks/{chunk-P2EA62YS.js → chunk-P73W2K7T.js} +1 -1
- package/dist/cli/chunks/{chunk-V7VZSNDK.js → chunk-PBZI2ZPV.js} +3 -3
- package/dist/cli/chunks/{chunk-MMY52Y6R.js → chunk-PMCRCEW5.js} +2 -2
- package/dist/cli/chunks/{chunk-FWXNFPLS.js → chunk-PVIA2FPD.js} +2 -2
- package/dist/cli/chunks/{chunk-NF63NHJH.js → chunk-PX2B5TS2.js} +2 -2
- package/dist/cli/chunks/{chunk-SFPGLUXS.js → chunk-Q3JVJRVJ.js} +1 -1
- package/dist/cli/chunks/{chunk-XOOBLZXR.js → chunk-QQ5SZH4D.js} +2 -2
- package/dist/cli/chunks/{chunk-KITKQUBX.js → chunk-QTVWUQTB.js} +1 -1
- package/dist/cli/chunks/{chunk-2UN4JOTN.js → chunk-REUFWGMA.js} +2 -2
- package/dist/cli/chunks/{chunk-CQ3SBRDP.js → chunk-SNBYYO6F.js} +2 -2
- package/dist/cli/chunks/{chunk-A2UGPKCS.js → chunk-SVHUYVUR.js} +2 -2
- package/dist/cli/chunks/{chunk-PIEKGKW6.js → chunk-THAY7WHO.js} +2 -2
- package/dist/cli/chunks/{chunk-WLXGUQOZ.js → chunk-TNMQVG4A.js} +2 -2
- package/dist/cli/chunks/{chunk-2GSAAUW3.js → chunk-TSYQDRNK.js} +1 -1
- package/dist/cli/chunks/{chunk-7DHSHD5B.js → chunk-TUYJ53V4.js} +2 -2
- package/dist/cli/chunks/{chunk-U7CIY3YR.js → chunk-UNUTC6TX.js} +2 -2
- package/dist/cli/chunks/{chunk-CRUQ6RXU.js → chunk-UOJBR4J3.js} +2 -2
- package/dist/cli/chunks/{chunk-3LFLO2WK.js → chunk-UOWHE77F.js} +2 -2
- package/dist/cli/chunks/{chunk-O4RRVTXN.js → chunk-UYLYMWV5.js} +2 -2
- package/dist/cli/chunks/{chunk-D4O3TJI7.js → chunk-V5PXQSFS.js} +2 -2
- package/dist/cli/chunks/{chunk-VQRBBR27.js → chunk-VCMINU7K.js} +2 -2
- package/dist/cli/chunks/{chunk-3N627QRU.js → chunk-VQHVHVSF.js} +2 -2
- package/dist/cli/chunks/{chunk-J6LL25QJ.js → chunk-VRGCKBF7.js} +2 -2
- package/dist/cli/chunks/{chunk-VWRNG3UK.js → chunk-VU2EL424.js} +1 -1
- package/dist/cli/chunks/{chunk-KNQUHGNY.js → chunk-VXZJOKOX.js} +2 -2
- package/dist/cli/chunks/{chunk-EUVSSIGR.js → chunk-VYLM2YV5.js} +3 -3
- package/dist/cli/chunks/{chunk-PJGQ2TKN.js → chunk-W32YU3VI.js} +2 -2
- package/dist/cli/chunks/{chunk-YRH7KMTU.js → chunk-W5VJRDDG.js} +2 -2
- package/dist/cli/chunks/{chunk-PPIM7B5G.js → chunk-WGDR2KIR.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZRNXEVI.js → chunk-WRRCQ2UE.js} +1 -1
- package/dist/cli/chunks/{chunk-7C6FMLQR.js → chunk-XDBD4GXO.js} +2 -2
- package/dist/cli/chunks/{chunk-W5A36V3Z.js → chunk-XOLDMK23.js} +2 -2
- package/dist/cli/chunks/{chunk-DCYUHCPK.js → chunk-XOVNZT7F.js} +1 -1
- package/dist/cli/chunks/{chunk-4C7KE2EL.js → chunk-XQ3DDY7X.js} +2 -2
- package/dist/cli/chunks/{chunk-K4N2MBCE.js → chunk-XUIA5KMS.js} +2 -2
- package/dist/cli/chunks/{chunk-YUP3APSN.js → chunk-XWIUFYM3.js} +1 -1
- package/dist/cli/chunks/{chunk-SJMZZMHP.js → chunk-XYCKHYBM.js} +2 -2
- package/dist/cli/chunks/{chunk-4NTLGGXO.js → chunk-XZJ2O3VC.js} +1 -1
- package/dist/cli/chunks/{chunk-UQLAN5TX.js → chunk-YRBBBUJX.js} +5 -5
- package/dist/cli/chunks/{chunk-XZQVC3GD.js → chunk-YZGSJG34.js} +1 -1
- package/dist/cli/chunks/{chunk-7CVMT64N.js → chunk-YZYDTABJ.js} +1 -1
- package/dist/cli/chunks/{chunk-4C3RYBTT.js → chunk-ZANDSVCK.js} +2 -2
- package/dist/cli/chunks/{chunk-6E7EOHMN.js → chunk-ZBDRLF43.js} +2 -2
- package/dist/cli/chunks/{chunk-UTFMMZ57.js → chunk-ZVSLCEVC.js} +3 -3
- package/dist/cli/chunks/{chunk-DKFSCJEF.js → chunk-ZXBCCO2H.js} +2 -2
- package/dist/cli/chunks/{ci-7NUCRGWO.js → ci-7SGRCFPS.js} +2 -2
- package/dist/cli/chunks/{ci-config-VQVECCFI.js → ci-config-MX3URPZA.js} +2 -2
- package/dist/cli/chunks/{ci-output-P7GQ6TKF.js → ci-output-M47NJY6D.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5YP6N6HE.js → circuit-breaker-5GAK45SW.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W5H7CMU6.js → claude-flow-setup-YXYSRH4Y.js} +2 -2
- package/dist/cli/chunks/client-ZP3CTVRF.js +2 -0
- package/dist/cli/chunks/{cline-installer-OYANSZ54.js → cline-installer-DLJ5QD5N.js} +2 -2
- package/dist/cli/chunks/{code-OMT4UEZI.js → code-ONKLMVQ2.js} +25 -24
- package/dist/cli/chunks/{code-index-extractor-M2JEWKNF.js → code-index-extractor-2232LGZN.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YBS6N5O3.js → codex-installer-UOWLYCMH.js} +2 -2
- package/dist/cli/chunks/{completions-U7GS5RG6.js → completions-MHX7GCC7.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-QSXPIUIU.js → complexity-analyzer-43ZUJKZU.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-W5TTT743.js → continuedev-installer-6Q5JR4FF.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-KC2RT24C.js → copilot-installer-CZUMVHSI.js} +2 -2
- package/dist/cli/chunks/core-handlers-JSRXQWPE.js +2 -0
- package/dist/cli/chunks/{cost-tracker-OQPVR6V4.js → cost-tracker-VS5ZW3XN.js} +2 -2
- package/dist/cli/chunks/{coverage-TCO2A2NX.js → coverage-VWKTWZ6D.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-7UKODQWG.js +2 -0
- package/dist/cli/chunks/{cursor-installer-MH7GWD4L.js → cursor-installer-YIFEMORH.js} +2 -2
- package/dist/cli/chunks/{daemon-UJEARJZ2.js → daemon-SHWJSJW5.js} +7 -7
- package/dist/cli/chunks/daemon-YIFT46FH.js +34 -0
- package/dist/cli/chunks/{dag-attention-scheduler-F3SUJU5O.js → dag-attention-scheduler-TCC2WM46.js} +2 -2
- package/dist/cli/chunks/{detect-5QTCRB32.js → detect-IGTWSQMA.js} +2 -2
- package/dist/cli/chunks/{dist-node-XKZPHDBO.js → dist-node-TCOTJVQX.js} +2 -2
- package/dist/cli/chunks/{domain-handler-V3UEADKW.js → domain-handler-55ZVYODR.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-7PES4UHZ.js → domain-plugins-GJRWOHQP.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-NF7UJW7B.js → domain-transfer-6EF75EKU.js} +2 -2
- package/dist/cli/chunks/dream-UDLM6M55.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-D2HWORHF.js → embed-and-insert-pattern-XAMNIKQL.js} +2 -2
- package/dist/cli/chunks/{eval-UF2UBAUC.js → eval-GO22R4OZ.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-2OUCEHHM.js → experience-capture-middleware-F2BRMJ3Y.js} +3 -3
- package/dist/cli/chunks/{fast-paths-KV5DKKHC.js → fast-paths-6RGPYALD.js} +2 -2
- package/dist/cli/chunks/{feature-flags-6YWMTNO5.js → feature-flags-MIWQIOHU.js} +2 -2
- package/dist/cli/chunks/{feature-flags-MTW6NMR3.js → feature-flags-ZGS3KLPH.js} +2 -2
- package/dist/cli/chunks/file-discovery-THWOUQ7Z.js +2 -0
- package/dist/cli/chunks/fleet-ADL57COA.js +44 -0
- package/dist/cli/chunks/{gnn-wrapper-52V6ANOY.js → gnn-wrapper-ALBJVW6T.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-X7NHNRC7.js → heartbeat-handler-ZMM53NDY.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-HGOC5KH3.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-EPSA6AP7.js +2 -0
- package/dist/cli/chunks/hnsw-index-RMFOPYGY.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-DZBE3KMK.js → hnsw-legacy-bridge-RYUJPA7B.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-2AWWUJAZ.js → hnswlib-node-XM6XF3YV.js} +2 -2
- package/dist/cli/chunks/{hooks-XLPVROL3.js → hooks-X62O7TJO.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-NZ3G4WBX.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-6TI7YP6P.js → hypergraph-engine-ZBWUPTVD.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DBIBBOXS.js → hypergraph-handler-DUMF6SJV.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-WZC6NHFP.js +2 -0
- package/dist/cli/chunks/{init-guard-OSO6MIDD.js → init-guard-S4I2R46S.js} +2 -2
- package/dist/cli/chunks/{init-handler-7S7IHMUF.js → init-handler-L4KJHVWS.js} +6 -6
- package/dist/cli/chunks/init-wizard-422UZYQ5.js +2 -0
- package/dist/cli/chunks/kernel-N7PJ6FCE.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2KBRFXMA.js → kilocode-installer-GNNB5FCZ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-5VFR4OQZ.js → kiro-installer-HR6ZAH7T.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-SZCVQF37.js +2 -0
- package/dist/cli/chunks/{learning-G5NHL3DV.js → learning-4IEEOHJS.js} +3 -3
- package/dist/cli/chunks/{llm-router-4EAPPMHS.js → llm-router-ZFMORP36.js} +4 -4
- package/dist/cli/chunks/llm-router-service-4DE5WDUZ.js +2 -0
- package/dist/cli/chunks/{load-UYMZPEY6.js → load-ZM43WGDO.js} +2 -2
- package/dist/cli/chunks/load-test-POMIF4Q4.js +2 -0
- package/dist/cli/chunks/{mcp-NOTDZBW5.js → mcp-CRZKZE37.js} +2 -2
- package/dist/cli/chunks/{memory-QL53YIHP.js → memory-W5FZGVAD.js} +5 -5
- package/dist/cli/chunks/memory-backend-4P6AHSOY.js +2 -0
- package/dist/cli/chunks/memory-handlers-NK6NV3GE.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-PDDDXF2B.js → multi-model-executor-SXXGAQ2G.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-75D2SKOT.js → opencode-installer-PIRBUAB5.js} +2 -2
- package/dist/cli/chunks/{orchestrator-3WIZBV4T.js → orchestrator-H5SQCQTB.js} +11 -10
- package/dist/cli/chunks/pattern-null-store-CCHQHGQG.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-TEX2JGHA.js → pattern-usage-recorder-XZTWDI2T.js} +2 -2
- package/dist/cli/chunks/{pipeline-7ATPA6LU.js → pipeline-5LMLBIJ7.js} +2 -2
- package/dist/cli/chunks/{platform-WPSKRJE7.js → platform-KJDABL5C.js} +2 -2
- package/dist/cli/chunks/{plugin-UUFOVVMU.js → plugin-V4KSBVVM.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-PDFSYWKZ.js → prime-radiant-advanced-wasm-JDHTKQAT.js} +2 -2
- package/dist/cli/chunks/project-root-X72FSM2F.js +2 -0
- package/dist/cli/chunks/protocol-executor-QW6XN6QN.js +2 -0
- package/dist/cli/chunks/{protocol-handler-3VRYRIQB.js → protocol-handler-BNRONTQV.js} +2 -2
- package/dist/cli/chunks/{prove-2NAUROGF.js → prove-ELLL6XMX.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-ZD3WF647.js +2 -0
- package/dist/cli/chunks/{quality-ZIEI2WGA.js → quality-NH2QA4D4.js} +2 -2
- package/dist/cli/chunks/{quality-gate-KWJO4SWQ.js → quality-gate-JTKLF7GW.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-S4U4MKK2.js +2 -0
- package/dist/cli/chunks/{real-embeddings-TSZ4UIAE.js → real-embeddings-J3KCKLPB.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DWFFRETJ.js → ref-validation-HNXQRP4F.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-XTZHLUBO.js → roocode-installer-COJ6CX6S.js} +2 -2
- package/dist/cli/chunks/router-CXZKOOTR.js +2 -0
- package/dist/cli/chunks/routing-feedback-IYFANYY5.js +2 -0
- package/dist/cli/chunks/{routing-handler-GG525TDM.js → routing-handler-WM33ZILE.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-QKRJDM7Z.js → ruvector-commands-BBLXEA7A.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-HCLQ5WUQ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XCLUWOO3.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-FF52OS6Q.js → rvf-migration-coordinator-P7H6HCAG.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-MRT5H3IP.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-M6DXTAZ4.js → rvf-store-integrity-R5SPVRFP.js} +2 -2
- package/dist/cli/chunks/safe-db-WFODRGVZ.js +2 -0
- package/dist/cli/chunks/schedule-RO55OQXG.js +2 -0
- package/dist/cli/chunks/scheduler-XXMJCH24.js +2 -0
- package/dist/cli/chunks/{security-EHXSW22U.js → security-AUDTRX3I.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-6EH7UVJL.js → shared-rvf-adapter-PVDGBGI2.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-WML274E7.js → shared-rvf-dual-writer-LZ2GMSS2.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-AWRIS4MK.js +2 -0
- package/dist/cli/chunks/{standalone-memory-C7QKAXS4.js → standalone-memory-XNOAI4G4.js} +2 -2
- package/dist/cli/chunks/{status-handler-VLI7MRLM.js → status-handler-K72XZE4T.js} +2 -2
- package/dist/cli/chunks/{structural-health-3LPG6MQN.js → structural-health-NF3YY7U5.js} +2 -2
- package/dist/cli/chunks/{sync-4IMMQEPT.js → sync-UVXA6CT2.js} +2 -2
- package/dist/cli/chunks/{sync-JFJEJBVK.js → sync-VBD5Y3E2.js} +2 -2
- package/dist/cli/chunks/{task-handler-IED3K6E4.js → task-handler-24S3WFVJ.js} +13 -7
- package/dist/cli/chunks/task-handlers-GUYW2EPJ.js +9 -0
- package/dist/cli/chunks/{test-GPKT3CKZ.js → test-XFSGQELD.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-Z42XXZP6.js → test-scheduling-VYUQ4CDE.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HMM3AHXM.js → token-bootstrap-EDK6FNQ3.js} +2 -2
- package/dist/cli/chunks/{token-usage-6Y2ERYIY.js → token-usage-VLQ6WO2L.js} +2 -2
- package/dist/cli/chunks/{transformers-MB63T2XO.js → transformers-TOFMWWNM.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-56GDQCMR.js → tree-sitter-wasm-parser-MI3NZKUD.js} +2 -2
- package/dist/cli/chunks/{types-J4J6QV3I.js → types-JTWLBAZJ.js} +2 -2
- package/dist/cli/chunks/unified-memory-6JWHV6EF.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-4UANU6NU.js +2 -0
- package/dist/cli/chunks/unified-persistence-KGGNA46H.js +2 -0
- package/dist/cli/chunks/{upgrade-U4XU7LFM.js → upgrade-4ABM72T4.js} +2 -2
- package/dist/cli/chunks/{validate-B57HA4YK.js → validate-UDJCWKXI.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-UPPA4M6T.js → validate-swarm-TODOUWNN.js} +2 -2
- package/dist/cli/chunks/visual-security-6VZNQLH7.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-GDZMUKOZ.js → web-tree-sitter-WBMAJPM5.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VJRWCHXP.js → windsurf-installer-BTT53TUL.js} +2 -2
- package/dist/cli/chunks/witness-chain-AKKHWEWU.js +2 -0
- package/dist/cli/chunks/{witness-chain-LFASSMZK.js → witness-chain-TATPXQRK.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-TPHN4DXN.js → witness-chain-repair-2HGJGE7O.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-Z23FVABW.js → witness-chain-verifier-FRY3LMGH.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-745MJ7WO.js → witness-key-manager-X7QHQQWL.js} +2 -2
- package/dist/cli/chunks/{workflow-T245QNQM.js → workflow-QMZPAWQW.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-4GAW7HNZ.js +2 -0
- package/dist/cli/chunks/{wrappers-WCAYIQUX.js → wrappers-ZD5NBHYI.js} +2 -2
- package/dist/cli/commands/code.js +8 -0
- package/dist/cli/commands/daemon.js +8 -0
- package/dist/cli/commands/fleet.js +14 -9
- package/dist/cli/handlers/task-handler.js +21 -1
- package/dist/coordination/handlers/code-intelligence-handlers.js +14 -2
- package/dist/coordination/handlers/coverage-collection.js +9 -10
- package/dist/coordination/handlers/coverage-handlers.js +21 -3
- 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/test-execution-handlers.js +32 -5
- package/dist/coordination/index.d.ts +2 -2
- package/dist/coordination/index.js +1 -1
- package/dist/coordination/protocols/learning-consolidation-archive.d.ts +39 -0
- package/dist/coordination/protocols/learning-consolidation-archive.js +57 -0
- package/dist/coordination/protocols/learning-consolidation.d.ts +38 -3
- package/dist/coordination/protocols/learning-consolidation.js +128 -50
- package/dist/coordination/queen-coordinator.d.ts +12 -1
- package/dist/coordination/queen-coordinator.js +24 -1
- package/dist/coordination/queen-event-handlers.js +2 -1
- package/dist/coordination/queen-lifecycle.js +9 -0
- package/dist/coordination/queen-task-management.js +113 -40
- package/dist/coordination/queen-types.d.ts +10 -0
- package/dist/coordination/queen-types.js +8 -0
- 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/domains/code-intelligence/coordinator.js +35 -9
- package/dist/domains/code-intelligence/index-path-guard.d.ts +49 -0
- package/dist/domains/code-intelligence/index-path-guard.js +125 -0
- package/dist/domains/code-intelligence/interfaces.d.ts +12 -0
- 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/contract-testing/coordinator.js +3 -1
- package/dist/domains/defect-intelligence/services/defect-predictor.js +4 -2
- package/dist/domains/learning-optimization/active-patterns.d.ts +12 -12
- package/dist/domains/learning-optimization/active-patterns.js +15 -12
- 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 +43 -102
- package/dist/domains/learning-optimization/index.d.ts +1 -1
- package/dist/domains/learning-optimization/interfaces.d.ts +56 -4
- package/dist/domains/learning-optimization/plugin.js +11 -1
- package/dist/domains/learning-optimization/reward-source.d.ts +37 -0
- package/dist/domains/learning-optimization/reward-source.js +58 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.d.ts +4 -4
- package/dist/domains/learning-optimization/services/learning-coordinator.js +59 -23
- 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/test-execution/interfaces.d.ts +16 -0
- package/dist/domains/test-execution/services/runner-test-cases.d.ts +21 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +69 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.js +24 -2
- 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 +2 -1
- 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/learning/dream/dream-insights-pruner.d.ts +18 -4
- package/dist/learning/dream/dream-insights-pruner.js +99 -11
- package/dist/learning/skill-validation-learner.d.ts +2 -0
- package/dist/learning/skill-validation-learner.js +29 -21
- package/dist/mcp/background-workers.js +8 -2
- package/dist/mcp/bundle.js +507 -483
- package/dist/mcp/handlers/domain-handler-configs.d.ts +14 -0
- package/dist/mcp/handlers/domain-handler-configs.js +68 -30
- package/dist/mcp/handlers/handler-factory.js +1 -0
- package/dist/mcp/handlers/task-handlers.js +37 -1
- 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 +8 -3
- package/dist/mcp/tools/learning-optimization/optimize.d.ts +34 -3
- package/dist/mcp/tools/learning-optimization/optimize.js +106 -70
- package/dist/memory/crdt/lww-register.js +11 -1
- 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/llm/cache.js +4 -1
- package/dist/shared/security/compliance-patterns.js +3 -1
- package/dist/shared/test-runner-process.d.ts +26 -0
- package/dist/shared/test-runner-process.js +91 -0
- 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 +42 -0
- package/dist/shared/utils/namespaced-search.js +53 -0
- 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/workers/daemon.d.ts +2 -0
- package/dist/workers/daemon.js +10 -5
- 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/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/learning-consolidation.d.ts +1 -1
- package/dist/workers/workers/learning-consolidation.js +11 -8
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-FC4EY447.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-workflow-2IFEUAAK.js +0 -2
- package/dist/cli/chunks/chunk-6CKTLVYV.js +0 -2
- package/dist/cli/chunks/chunk-I4U7YCXG.js +0 -180
- package/dist/cli/chunks/chunk-LZWBUVCK.js +0 -5
- 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/chunk-ZWMFKZEQ.js +0 -3
- 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/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/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/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/task-handlers-FH6DNTHW.js +0 -9
- 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/workflow-orchestrator-ZNWEUYBN.js +0 -2
|
@@ -230,18 +230,25 @@ export function createFleetCommand(context, cleanupAndExit, ensureInitialized, r
|
|
|
230
230
|
if (!['test', 'analyze', 'scan'].includes(operation)) {
|
|
231
231
|
throw new Error(`Unsupported operation: ${operation}`);
|
|
232
232
|
}
|
|
233
|
+
const operationTasks = {
|
|
234
|
+
test: ['test-generation', 'generate-tests'],
|
|
235
|
+
analyze: ['coverage-analysis', 'analyze-coverage'],
|
|
236
|
+
scan: ['security-compliance', 'scan-security'],
|
|
237
|
+
};
|
|
238
|
+
const [domain, taskType] = operationTasks[operation];
|
|
239
|
+
// #1081: refuse an operation whose task no domain plugin executes,
|
|
240
|
+
// instead of submitting work that can only fail at dispatch.
|
|
241
|
+
const executable = context.queen.validateTaskExecutable(taskType, [domain]);
|
|
242
|
+
if (!executable.success) {
|
|
243
|
+
console.error(chalk.red(`\n Operation '${operation}' cannot run: ${executable.error.message}`));
|
|
244
|
+
return cleanupAndExit(1);
|
|
245
|
+
}
|
|
233
246
|
console.log(chalk.blue(`\n Fleet Operation: ${operation}\n`));
|
|
234
247
|
const progress = new FleetProgressManager({
|
|
235
248
|
title: `${operation.charAt(0).toUpperCase() + operation.slice(1)} Progress`,
|
|
236
249
|
showEta: true,
|
|
237
250
|
});
|
|
238
251
|
progress.start(parallelCount);
|
|
239
|
-
const domainMap = {
|
|
240
|
-
test: 'test-generation',
|
|
241
|
-
analyze: 'coverage-analysis',
|
|
242
|
-
scan: 'security-compliance',
|
|
243
|
-
};
|
|
244
|
-
const domain = domainMap[operation];
|
|
245
252
|
const agentOperations = Array.from({ length: parallelCount }, (_, i) => {
|
|
246
253
|
const agentId = `${operation}-agent-${i + 1}`;
|
|
247
254
|
return {
|
|
@@ -262,9 +269,7 @@ export function createFleetCommand(context, cleanupAndExit, ensureInitialized, r
|
|
|
262
269
|
progress.updateAgent(op.id, 0, { status: 'running' });
|
|
263
270
|
try {
|
|
264
271
|
const taskResult = await context.queen.submitTask({
|
|
265
|
-
type:
|
|
266
|
-
operation === 'analyze' ? 'analyze-coverage' :
|
|
267
|
-
'scan-security',
|
|
272
|
+
type: taskType,
|
|
268
273
|
priority: 'p1',
|
|
269
274
|
targetDomains: [domain],
|
|
270
275
|
payload: { target: options.target, workerId: op.id },
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import chalk from 'chalk';
|
|
7
7
|
import { getStatusColor, formatDuration, } from './interfaces.js';
|
|
8
|
-
import { ALL_DOMAINS, isDomainName } from '../../shared/types/index.js';
|
|
8
|
+
import { ALL_DOMAINS, invalidPriorityMessage, isDomainName, isPriority } from '../../shared/types/index.js';
|
|
9
9
|
import { createTimedSpinner } from '../utils/progress.js';
|
|
10
10
|
import { parseJsonOption } from '../helpers/safe-json.js';
|
|
11
|
+
import { validateIndexTaskPayload } from '../../domains/code-intelligence/index-path-guard.js';
|
|
11
12
|
import { writeOutput, toJSON } from '../utils/ci-output.js';
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Task Handler
|
|
@@ -75,6 +76,12 @@ export class TaskHandler {
|
|
|
75
76
|
console.error(chalk.gray(` Valid domains: ${ALL_DOMAINS.join(', ')}\n`));
|
|
76
77
|
return this.cleanupAndExit(1);
|
|
77
78
|
}
|
|
79
|
+
// #1108: reject a priority outside the allowed set. Parity with MCP
|
|
80
|
+
// `task_submit`.
|
|
81
|
+
if (!isPriority(options.priority)) {
|
|
82
|
+
console.error(chalk.red(`\n ${invalidPriorityMessage(options.priority)}\n`));
|
|
83
|
+
return this.cleanupAndExit(1);
|
|
84
|
+
}
|
|
78
85
|
// #734 C: a CLI-submitted task runs inside this process and is not
|
|
79
86
|
// persisted, so a detached submit would report an ID for work that is
|
|
80
87
|
// abandoned when the command exits. Refuse it rather than claim success.
|
|
@@ -93,6 +100,19 @@ export class TaskHandler {
|
|
|
93
100
|
const taskType = type;
|
|
94
101
|
const payload = parseJsonOption(options.payload, 'payload');
|
|
95
102
|
const targetDomains = options.domain ? [options.domain] : [];
|
|
103
|
+
// #1075: reject a type that no domain plugin executes instead of waiting
|
|
104
|
+
// out the timeout on a task that can never finish.
|
|
105
|
+
const executable = context.queen.validateTaskExecutable(taskType, targetDomains);
|
|
106
|
+
if (!executable.success) {
|
|
107
|
+
console.error(chalk.red(`\n ${executable.error.message}\n`));
|
|
108
|
+
return this.cleanupAndExit(1);
|
|
109
|
+
}
|
|
110
|
+
// #1096: same boundary check as MCP task_submit.
|
|
111
|
+
const payloadError = validateIndexTaskPayload(taskType, payload);
|
|
112
|
+
if (payloadError) {
|
|
113
|
+
console.error(chalk.red(`\n ${payloadError.message}\n`));
|
|
114
|
+
return this.cleanupAndExit(1);
|
|
115
|
+
}
|
|
96
116
|
console.log(chalk.blue(`\n Submitting task: ${taskType}\n`));
|
|
97
117
|
// Use spinner for submit operation
|
|
98
118
|
const spinner = options.progress !== false
|
|
@@ -10,6 +10,7 @@ import { ok, err } from '../../shared/types/index.js';
|
|
|
10
10
|
import { toError } from '../../shared/error-utils.js';
|
|
11
11
|
import { discoverSourceFiles } from './handler-utils.js';
|
|
12
12
|
import { resolveProjectRootFromPaths } from '../../domains/code-intelligence/project-root-resolver.js';
|
|
13
|
+
import { nothingIndexedError } from '../../domains/code-intelligence/index-path-guard.js';
|
|
13
14
|
import { createLogger } from '../../logging/logger-factory.js';
|
|
14
15
|
const logger = createLogger('CodeIntelligenceHandlers');
|
|
15
16
|
async function collectProjectMetricsForTarget(ctx, targetPath, indexedFiles) {
|
|
@@ -78,11 +79,21 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
78
79
|
return result;
|
|
79
80
|
}
|
|
80
81
|
const indexResult = result.value;
|
|
82
|
+
// #1096: files were found but none was indexed (e.g. the target is a
|
|
83
|
+
// symlink out of the project) - fail like the coordinator does.
|
|
84
|
+
if (indexResult.filesIndexed === 0) {
|
|
85
|
+
return err(nothingIndexedError(filesToIndex.length, indexResult.skipped ?? [], indexResult.errors));
|
|
86
|
+
}
|
|
87
|
+
const notIndexed = new Set([
|
|
88
|
+
...(indexResult.skipped ?? []).map((s) => s.path),
|
|
89
|
+
...indexResult.errors.map((e) => e.file),
|
|
90
|
+
]);
|
|
91
|
+
const indexedFiles = filesToIndex.filter((file) => !notIndexed.has(file));
|
|
81
92
|
// #999 MCP-CLI parity: `aqe code index` runs the coordinator's project
|
|
82
93
|
// metric step (LOC, tests, tools); run the same step here, rooted at the
|
|
83
94
|
// caller's target the way #997 resolves it. Best-effort: indexing has
|
|
84
95
|
// already succeeded, so a metric failure only omits projectMetrics.
|
|
85
|
-
const projectMetrics = await collectProjectMetricsForTarget(ctx, targetPath,
|
|
96
|
+
const projectMetrics = await collectProjectMetricsForTarget(ctx, targetPath, indexedFiles);
|
|
86
97
|
// Detect languages from files
|
|
87
98
|
const detectedLanguages = new Set();
|
|
88
99
|
const extToLang = {
|
|
@@ -95,7 +106,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
95
106
|
c: 'c', h: 'c', cpp: 'cpp', hpp: 'cpp', cc: 'cpp',
|
|
96
107
|
scala: 'scala',
|
|
97
108
|
};
|
|
98
|
-
for (const file of
|
|
109
|
+
for (const file of indexedFiles) {
|
|
99
110
|
const ext = path.extname(file).slice(1);
|
|
100
111
|
const lang = extToLang[ext];
|
|
101
112
|
if (lang)
|
|
@@ -116,6 +127,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
116
127
|
duration: indexResult.duration,
|
|
117
128
|
errors: indexResult.errors,
|
|
118
129
|
warnings: indexResult.warnings,
|
|
130
|
+
skipped: indexResult.skipped ?? [],
|
|
119
131
|
...(projectMetrics ? { projectMetrics } : {}),
|
|
120
132
|
});
|
|
121
133
|
}
|
|
@@ -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'));
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
import { ok, err } from '../../shared/types/index.js';
|
|
8
8
|
import { toError } from '../../shared/error-utils.js';
|
|
9
9
|
import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
|
|
10
|
-
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
10
|
+
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
11
11
|
import { randomUUID } from 'crypto';
|
|
12
|
+
import * as path from 'path';
|
|
12
13
|
import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
|
|
13
14
|
import { collectedMetrics } from '../../domains/coverage-analysis/collected-metrics.js';
|
|
14
15
|
/**
|
|
@@ -80,7 +81,8 @@ async function collectCoverage(targetPath) {
|
|
|
80
81
|
if (existing.status === 'evaluated') {
|
|
81
82
|
return fromEvaluation(existing.evaluation, false, existing.projectRoot);
|
|
82
83
|
}
|
|
83
|
-
const { target
|
|
84
|
+
const { target } = existing;
|
|
85
|
+
let projectRoot = existing.projectRoot;
|
|
84
86
|
// #569 work item 1: delegate to real instrumentation where available.
|
|
85
87
|
if (isRustProject(target)) {
|
|
86
88
|
const rust = await collectRustCoverage(target);
|
|
@@ -109,7 +111,23 @@ async function collectCoverage(targetPath) {
|
|
|
109
111
|
if (isCoverageExecDisabled()) {
|
|
110
112
|
return { collected: buildEstimatedCoverage(target), ranTests: false, projectRoot };
|
|
111
113
|
}
|
|
112
|
-
const
|
|
114
|
+
const pathFilter = packageFilterForTarget(target, projectRoot);
|
|
115
|
+
let run = await runJsCoverage(projectRoot, {
|
|
116
|
+
timeoutMs: coverageTimeoutMs(),
|
|
117
|
+
pathFilter,
|
|
118
|
+
});
|
|
119
|
+
// A workspace config may deliberately include only root-level tests. If it
|
|
120
|
+
// found no tests for this package, restore the nearest-package behavior. The
|
|
121
|
+
// same fallback permits isolated package installs with no runner at the root.
|
|
122
|
+
// Do not retry timeouts, crashes or nonempty failing suites: their failures
|
|
123
|
+
// must remain visible. Only the fallback run's actual report can be measured.
|
|
124
|
+
const rootRunnerMissing = run.missing && run.numTotalTests === null;
|
|
125
|
+
const rootHadNoTests = !run.missing && run.numTotalTests === 0
|
|
126
|
+
&& testRunStatus(run) === 'passed' && (run.exitCode === 0 || run.exitCode === 1);
|
|
127
|
+
if (pathFilter && !run.timedOut && (rootRunnerMissing || rootHadNoTests)) {
|
|
128
|
+
projectRoot = path.resolve(projectRoot, pathFilter);
|
|
129
|
+
run = await runJsCoverage(projectRoot, { timeoutMs: coverageTimeoutMs() });
|
|
130
|
+
}
|
|
113
131
|
// An EMPTY report (`{}`) from a run that reported its tests means "the run
|
|
114
132
|
// instrumented nothing under the target" → unmeasured, never an estimate
|
|
115
133
|
// (#995 review BL2). An empty report from a run that crashed before
|
|
@@ -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
|
// ============================================================================
|
|
@@ -43,6 +43,8 @@ export interface TaskHandlerContext {
|
|
|
43
43
|
*/
|
|
44
44
|
getCodeIntelligenceCoordinator?(): Promise<ProjectMetricsCollector | undefined>;
|
|
45
45
|
getQualityAnalyzer(): QualityAnalyzerService;
|
|
46
|
+
/** The domain execution owner also records run evidence and lifecycle events. */
|
|
47
|
+
getTestExecutionAPI?(): Promise<import('../../domains/test-execution/interfaces').ITestExecutionAPI | undefined>;
|
|
46
48
|
/** Executor configuration */
|
|
47
49
|
readonly config: {
|
|
48
50
|
defaultLanguage: string;
|
|
@@ -11,6 +11,8 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
11
11
|
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
|
|
12
12
|
import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
|
|
13
13
|
import { jestExactPathPattern, runnerFilePath } from '../../shared/test-runner-args.js';
|
|
14
|
+
import { testCasesFromRunnerReport } from '../../domains/test-execution/services/runner-test-cases.js';
|
|
15
|
+
import { runTestRunnerProcess } from '../../shared/test-runner-process.js';
|
|
14
16
|
function escapeRegExp(s) {
|
|
15
17
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
16
18
|
}
|
|
@@ -182,8 +184,28 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
182
184
|
if (testFiles.some(file => !safePathPattern.test(file))) {
|
|
183
185
|
return err(new TestRunnerExecutionError('Some test file paths contain invalid characters and were rejected. Provide concrete paths; expand glob patterns before calling.'));
|
|
184
186
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
+
// A caller-owned MCP task skips the Queen's plugin dispatch. Run through
|
|
188
|
+
// that same domain API here: it owns persistence, measured quality evidence
|
|
189
|
+
// and TestRunStarted/Completed events as well as the runner itself.
|
|
190
|
+
if (task.executionOwner === 'caller') {
|
|
191
|
+
const api = await ctx.getTestExecutionAPI?.();
|
|
192
|
+
if (!api)
|
|
193
|
+
return err(new TestRunnerExecutionError('Test-execution domain is unavailable.'));
|
|
194
|
+
const result = await api.runTests({
|
|
195
|
+
testFiles,
|
|
196
|
+
parallel: payload.parallel,
|
|
197
|
+
timeout: payload.timeout,
|
|
198
|
+
workers: payload.parallelism,
|
|
199
|
+
// The domain owns requested retries; Queen dispatch must not replay it.
|
|
200
|
+
retryCount: payload.retryCount ?? 0,
|
|
201
|
+
});
|
|
202
|
+
if (!result.success)
|
|
203
|
+
return result;
|
|
204
|
+
return ok({ ...result.value, coverage: result.value.coverage?.line ?? null });
|
|
205
|
+
}
|
|
206
|
+
// #1074: run the runner asynchronously so the MCP server keeps serving
|
|
207
|
+
// other requests (task_status, task_cancel, ...) during the test run.
|
|
208
|
+
const options = { cwd: process.cwd(), timeout: 120000 };
|
|
187
209
|
let runner = 'vitest';
|
|
188
210
|
// Vitest 5 writes the JSON report to a file rather than stdout; an explicit
|
|
189
211
|
// --outputFile gives Vitest 4 and 5 the same contract.
|
|
@@ -192,7 +214,7 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
192
214
|
let output;
|
|
193
215
|
try {
|
|
194
216
|
// #909: absolute paths cannot be read as flags (e.g. a "--watch" entry).
|
|
195
|
-
execution =
|
|
217
|
+
execution = await runTestRunnerProcess('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file, options.cwd)), '--reporter=json', ...report.args], options);
|
|
196
218
|
output = execution.error || execution.signal
|
|
197
219
|
? ''
|
|
198
220
|
: report.read(execution.stdout || '') ?? '';
|
|
@@ -203,7 +225,7 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
203
225
|
// Preserve the existing Jest fallback when Vitest cannot produce a report.
|
|
204
226
|
if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
|
|
205
227
|
runner = 'jest';
|
|
206
|
-
execution =
|
|
228
|
+
execution = await runTestRunnerProcess('npx', ['jest', ...testFiles.map(file => jestExactPathPattern(file, options.cwd)), '--json'], options);
|
|
207
229
|
output = execution.stdout || '';
|
|
208
230
|
}
|
|
209
231
|
const diagnostics = [execution.error?.message, execution.signal && `Terminated by ${execution.signal}`, execution.stderr, output].filter(Boolean).join('\n');
|
|
@@ -225,7 +247,12 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
225
247
|
// #1027 N5/NB5: this handler runs the tests without --coverage, so it has no
|
|
226
248
|
// coverage figure to return (null, never 0%). For test_execute_parallel the
|
|
227
249
|
// measured coverage + testsPassing are recorded by TestExecutorService.
|
|
228
|
-
|
|
250
|
+
// #1110: per-test entries come from the runner report itself, or are left out.
|
|
251
|
+
const testCases = testCasesFromRunnerReport(json, testFiles.join(', '));
|
|
252
|
+
return ok({
|
|
253
|
+
total, passed, failed, skipped, duration: 0, coverage: null, failedTests: [],
|
|
254
|
+
...(testCases && testCases.length === total ? { testCases } : {}),
|
|
255
|
+
});
|
|
229
256
|
}
|
|
230
257
|
}
|
|
231
258
|
}
|