agentic-qe 3.15.9 → 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 +251 -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/audit/witness-chain.d.ts +1 -1
- 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-RIYHTHVZ.js → agent-handler-SVXSHEET.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WSUCUHOO.js → agent-memory-branch-WKQH36XL.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +2 -0
- package/dist/cli/chunks/{arena-KRIBMIXX.js → arena-EKOOFVST.js} +2 -2
- package/dist/cli/chunks/{arena-YAJZX6MC.js → arena-OPS36NFZ.js} +4 -4
- package/dist/cli/chunks/{audit-7ZNOXWP3.js → audit-AO5NDZRI.js} +3 -3
- package/dist/cli/chunks/base-GTB6POYE.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-ZQAT4I6H.js → better-sqlite3-TFLVEMMY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-452WCPZC.js → brain-handler-ADBBJPYW.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IJFXJRPN.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-UOJBR4J3.js → chunk-2SXBBUM6.js} +2 -2
- package/dist/cli/chunks/{chunk-7JKB3Q7O.js → chunk-2T7RRL6G.js} +1 -1
- package/dist/cli/chunks/{chunk-HCYQHWI2.js → chunk-2XGVTYVX.js} +2 -2
- package/dist/cli/chunks/{chunk-3LYU7BLY.js → chunk-2ZI5FKSF.js} +2 -2
- package/dist/cli/chunks/chunk-2ZMF4NCF.js +4 -0
- package/dist/cli/chunks/{chunk-F3PQZX44.js → chunk-37OWRCUN.js} +1 -1
- package/dist/cli/chunks/{chunk-YRBBBUJX.js → chunk-3P34JFQH.js} +4 -4
- package/dist/cli/chunks/{chunk-ICP2ORGI.js → chunk-3Y7SPD72.js} +2 -2
- package/dist/cli/chunks/{chunk-WGDR2KIR.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-OXTFSIGN.js → chunk-5LPYV3TK.js} +1 -1
- package/dist/cli/chunks/{chunk-XWIUFYM3.js → chunk-62OAY5KJ.js} +1 -1
- package/dist/cli/chunks/{chunk-VCMINU7K.js → chunk-6C3II5OM.js} +2 -2
- package/dist/cli/chunks/{chunk-EFBLP43U.js → chunk-6GP6W46M.js} +2 -2
- package/dist/cli/chunks/{chunk-4JCY45KV.js → chunk-6KIL6CMD.js} +2 -2
- package/dist/cli/chunks/{chunk-CTZJUV5I.js → chunk-6MVVSSID.js} +1 -1
- package/dist/cli/chunks/{chunk-JEP4ULR6.js → chunk-6P7424AO.js} +2 -2
- package/dist/cli/chunks/{chunk-SVHUYVUR.js → chunk-6PX4OXQO.js} +2 -2
- package/dist/cli/chunks/{chunk-LEAKYZ37.js → chunk-6S3WJGUV.js} +2 -2
- package/dist/cli/chunks/{chunk-7X2Y727E.js → chunk-6TB6YOCZ.js} +1 -1
- package/dist/cli/chunks/{chunk-VU2EL424.js → chunk-6X5DHU6Q.js} +1 -1
- package/dist/cli/chunks/{chunk-DDPPSSHW.js → chunk-6XCMKIZN.js} +1 -1
- package/dist/cli/chunks/{chunk-ZANDSVCK.js → chunk-7LFZ4CHM.js} +2 -2
- package/dist/cli/chunks/{chunk-UYLYMWV5.js → chunk-7OZVZIBE.js} +2 -2
- package/dist/cli/chunks/{chunk-32UTLDNY.js → chunk-7PJIR4ST.js} +2 -2
- package/dist/cli/chunks/{chunk-DINZR5CF.js → chunk-7TB6FK4B.js} +1 -1
- package/dist/cli/chunks/{chunk-KVBEGOJE.js → chunk-7ZCDZHDB.js} +2 -2
- package/dist/cli/chunks/{chunk-55HRSNGN.js → chunk-A55QKKT2.js} +2 -2
- package/dist/cli/chunks/{chunk-LCJTEUDC.js → chunk-ABFFWZPC.js} +428 -433
- package/dist/cli/chunks/{chunk-PVIA2FPD.js → chunk-ACWFKES2.js} +2 -2
- package/dist/cli/chunks/{chunk-2BA45H64.js → chunk-AH3ZD3NJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OG2UI6A3.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-TSYQDRNK.js → chunk-B6LTH6YV.js} +2 -2
- package/dist/cli/chunks/chunk-BQUAE3CP.js +3 -0
- package/dist/cli/chunks/{chunk-OCESWNAZ.js → chunk-C522H7XR.js} +54 -33
- package/dist/cli/chunks/{chunk-TUYJ53V4.js → chunk-CESIR27V.js} +2 -2
- package/dist/cli/chunks/{chunk-PBZI2ZPV.js → chunk-CFBEBXLO.js} +3 -3
- package/dist/cli/chunks/{chunk-FJ4VTLLK.js → chunk-CMBLM26R.js} +2 -2
- package/dist/cli/chunks/{chunk-YZYDTABJ.js → chunk-CZ2IF6MC.js} +1 -1
- package/dist/cli/chunks/{chunk-GKPQ2GRR.js → chunk-CZGOSJQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-FL3OYGCS.js → chunk-D6DA2KFD.js} +2 -2
- package/dist/cli/chunks/{chunk-37BIGMJI.js → chunk-DBMNJSBV.js} +1 -1
- package/dist/cli/chunks/{chunk-BHKXMIWX.js → chunk-DE4YJQJF.js} +2 -2
- package/dist/cli/chunks/{chunk-3CJCROMW.js → chunk-DEF34AFL.js} +2 -2
- package/dist/cli/chunks/chunk-DKAC3E3B.js +3 -0
- package/dist/cli/chunks/{chunk-AOFO4N32.js → chunk-DMFTELBS.js} +2 -2
- package/dist/cli/chunks/{chunk-KLGYIEJK.js → chunk-DNRWGATA.js} +10 -10
- package/dist/cli/chunks/{chunk-JWGRWMZP.js → chunk-DT7SIJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-6PXA2BQJ.js → chunk-DURHK377.js} +67 -67
- package/dist/cli/chunks/{chunk-HAROIAJE.js → chunk-EAU5KDFO.js} +1 -1
- package/dist/cli/chunks/{chunk-L42JPFCC.js → chunk-EDLFX4ZB.js} +2 -2
- package/dist/cli/chunks/{chunk-6OOYIO3W.js → chunk-EN2QSKFF.js} +2 -2
- package/dist/cli/chunks/{chunk-UNUTC6TX.js → chunk-ERQKYIP7.js} +2 -2
- package/dist/cli/chunks/{chunk-KFUUIAR4.js → chunk-ESUO3GTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-4V27J6YN.js → chunk-EWFECZ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-4W4DYVSH.js → chunk-FAUCT5KR.js} +3 -3
- package/dist/cli/chunks/{chunk-IFEIY3NQ.js → chunk-FB6TI3BH.js} +2 -2
- package/dist/cli/chunks/{chunk-2TDIS6YK.js → chunk-FBXTQNRH.js} +2 -2
- package/dist/cli/chunks/{chunk-XOLDMK23.js → chunk-FESZBPUB.js} +2 -2
- package/dist/cli/chunks/chunk-FFTPAWM6.js +141 -0
- package/dist/cli/chunks/{chunk-A6YIH4C4.js → chunk-FKL3R5JQ.js} +2 -2
- package/dist/cli/chunks/{chunk-N5PDFGCQ.js → chunk-FPUDRSFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-7QGYJ5OY.js → chunk-FZOWULMH.js} +1 -1
- package/dist/cli/chunks/{chunk-AVB5QY2Q.js → chunk-G3CZCUPM.js} +2 -2
- package/dist/cli/chunks/{chunk-FV3NHVC7.js → chunk-G5I6KGMW.js} +3 -3
- package/dist/cli/chunks/{chunk-N3KEY4XJ.js → chunk-GHBNRMSJ.js} +2 -2
- package/dist/cli/chunks/{chunk-2YH62JCN.js → chunk-GJHWY3ZX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXBCCO2H.js → chunk-GJMLK5UT.js} +2 -2
- package/dist/cli/chunks/{chunk-NHZIWIQZ.js → chunk-GRCIBCJ2.js} +2 -2
- package/dist/cli/chunks/{chunk-J3DTDJDT.js → chunk-GWZZ7DAO.js} +2 -2
- package/dist/cli/chunks/{chunk-4SUOVLJ6.js → chunk-GZLZCZ42.js} +2 -2
- package/dist/cli/chunks/{chunk-MZS32SYS.js → chunk-H2PYU7MN.js} +1 -1
- package/dist/cli/chunks/{chunk-ABFDB4X3.js → chunk-H32EPIR2.js} +1 -1
- package/dist/cli/chunks/{chunk-KIXYKUCI.js → chunk-H74Q7TJN.js} +1 -1
- package/dist/cli/chunks/chunk-HOZUDE4C.js +2 -0
- package/dist/cli/chunks/{chunk-PMCRCEW5.js → chunk-I33O4BRQ.js} +2 -2
- package/dist/cli/chunks/{chunk-N3NP6PTT.js → chunk-IKISCIGH.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3JVJRVJ.js → chunk-IPJ7Q3AJ.js} +1 -1
- package/dist/cli/chunks/{chunk-WRRCQ2UE.js → chunk-IU2IV4NE.js} +1 -1
- package/dist/cli/chunks/{chunk-QQ5SZH4D.js → chunk-JHIY4VCC.js} +2 -2
- package/dist/cli/chunks/{chunk-W32YU3VI.js → chunk-KG336OV3.js} +2 -2
- package/dist/cli/chunks/{chunk-W5VJRDDG.js → chunk-KI73QCR5.js} +2 -2
- package/dist/cli/chunks/{chunk-HGTWAZWU.js → chunk-KNQ2ERFX.js} +2 -2
- package/dist/cli/chunks/{chunk-SNBYYO6F.js → chunk-KOBVYY6H.js} +2 -2
- package/dist/cli/chunks/{chunk-VQHVHVSF.js → chunk-KSIWGGJI.js} +8 -8
- package/dist/cli/chunks/{chunk-REUFWGMA.js → chunk-LMS3Y7JD.js} +2 -2
- package/dist/cli/chunks/{chunk-LMU5DUDK.js → chunk-LQEURY7C.js} +1 -1
- package/dist/cli/chunks/{chunk-AJ4YDSOI.js → chunk-LRZY4KS2.js} +2 -2
- package/dist/cli/chunks/{chunk-KIKWJM6J.js → chunk-M2QV7PT7.js} +2 -2
- package/dist/cli/chunks/{chunk-TNMQVG4A.js → chunk-MA7JIQ6U.js} +2 -2
- package/dist/cli/chunks/{chunk-I6S35FRO.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-XOVNZT7F.js → chunk-NGKNYIQZ.js} +1 -1
- package/dist/cli/chunks/chunk-NNFZUTDH.js +2 -0
- package/dist/cli/chunks/{chunk-ZVSLCEVC.js → chunk-NPPHWFA2.js} +3 -3
- package/dist/cli/chunks/{chunk-JNNZK7KH.js → chunk-NSHU347M.js} +1 -1
- package/dist/cli/chunks/{chunk-PX2B5TS2.js → chunk-NVYIZCSR.js} +2 -2
- package/dist/cli/chunks/{chunk-5NS3USRW.js → chunk-NW5JUCCG.js} +1 -1
- package/dist/cli/chunks/{chunk-KR3M44CF.js → chunk-NZYLNXT6.js} +3 -3
- package/dist/cli/chunks/{chunk-5D2I7JUP.js → chunk-OBAREPDC.js} +2 -2
- package/dist/cli/chunks/{chunk-F4JYIRW2.js → chunk-ODJNUMV3.js} +2 -2
- package/dist/cli/chunks/{chunk-K5DJXMAA.js → chunk-OEKP73MC.js} +2 -2
- package/dist/cli/chunks/{chunk-2URBI52G.js → chunk-OPFGRS5S.js} +2 -2
- package/dist/cli/chunks/{chunk-HZ5NC6U5.js → chunk-OY2AHLSF.js} +1 -1
- package/dist/cli/chunks/{chunk-GII5WVAK.js → chunk-OY3NJNP2.js} +1 -1
- package/dist/cli/chunks/{chunk-P73W2K7T.js → chunk-PCEW6Q2C.js} +1 -1
- package/dist/cli/chunks/{chunk-7QTB5VJZ.js → chunk-PFG6VQ5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-7KII4CQG.js → chunk-PGYMKGOE.js} +2 -2
- package/dist/cli/chunks/{chunk-BXO536GT.js → chunk-PPSAMXYN.js} +3 -3
- package/dist/cli/chunks/chunk-RK73HB2F.js +2 -0
- package/dist/cli/chunks/{chunk-ZBDRLF43.js → chunk-RPHY2DU6.js} +2 -2
- package/dist/cli/chunks/{chunk-XDBD4GXO.js → chunk-RWWOHCMG.js} +25 -20
- package/dist/cli/chunks/{chunk-J5KNRVXR.js → chunk-S75EYIJG.js} +1 -1
- package/dist/cli/chunks/{chunk-ETG7O5E5.js → chunk-SKQUUE4F.js} +5 -5
- package/dist/cli/chunks/chunk-SO45NA4D.js +180 -0
- package/dist/cli/chunks/{chunk-47V7FQGX.js → chunk-SU5H66SD.js} +2 -2
- package/dist/cli/chunks/{chunk-NTAD5UX4.js → chunk-SY2IB442.js} +2 -2
- package/dist/cli/chunks/{chunk-D6XVGFTI.js → chunk-TBLI254A.js} +2 -2
- package/dist/cli/chunks/{chunk-47TYABPD.js → chunk-TNMBRDCA.js} +3 -3
- package/dist/cli/chunks/{chunk-P2CXVNKK.js → chunk-TYFZXDGZ.js} +2 -2
- package/dist/cli/chunks/{chunk-2XITOPYV.js → chunk-U4OICXV2.js} +2 -2
- package/dist/cli/chunks/{chunk-JAV5WPSY.js → chunk-U53ZB4IX.js} +2 -2
- package/dist/cli/chunks/chunk-UARKIZAS.js +2 -0
- package/dist/cli/chunks/{chunk-2HL3UM5P.js → chunk-UCJMVXO4.js} +2 -2
- package/dist/cli/chunks/{chunk-HWK5L7IJ.js → chunk-UHTTW3IT.js} +2 -2
- package/dist/cli/chunks/{chunk-OXZLKP6C.js → chunk-V2M2XCR5.js} +1 -1
- package/dist/cli/chunks/{chunk-YZGSJG34.js → chunk-V2RSNVMW.js} +1 -1
- package/dist/cli/chunks/{chunk-5JWGCIQW.js → chunk-V6JBOIMX.js} +1 -1
- package/dist/cli/chunks/{chunk-JUVHZG7I.js → chunk-VFKF2XO7.js} +1 -1
- package/dist/cli/chunks/{chunk-XQ3DDY7X.js → chunk-VFSYMOAL.js} +2 -2
- package/dist/cli/chunks/{chunk-V5PXQSFS.js → chunk-VJQYDYAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-A4RU67VX.js → chunk-VKRTTFB6.js} +2 -2
- package/dist/cli/chunks/{chunk-H3KBIWTO.js → chunk-VWNFAW2M.js} +2 -2
- package/dist/cli/chunks/{chunk-72AMFDC7.js → chunk-WBM6N6IM.js} +1 -1
- package/dist/cli/chunks/{chunk-XUIA5KMS.js → chunk-WDQ7IEZY.js} +2 -2
- package/dist/cli/chunks/{chunk-FLASM2XB.js → chunk-WDVRE6GN.js} +2 -2
- package/dist/cli/chunks/{chunk-FV7VAG74.js → chunk-WQ4PYWSW.js} +1 -1
- package/dist/cli/chunks/{chunk-DGTLJNJH.js → chunk-WSF24I3D.js} +2 -2
- package/dist/cli/chunks/{chunk-6YL6JOQB.js → chunk-XBVUVFJK.js} +2 -2
- package/dist/cli/chunks/{chunk-VRGCKBF7.js → chunk-XEB3NLJR.js} +2 -2
- package/dist/cli/chunks/{chunk-XYCKHYBM.js → chunk-XFVTGAAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-2I2UPJS7.js → chunk-XLZYRTNO.js} +2 -2
- package/dist/cli/chunks/{chunk-AR2E4B7K.js → chunk-XUZDBQ5X.js} +5 -5
- package/dist/cli/chunks/{chunk-AQTVVLNP.js → chunk-Y76IAYQD.js} +1 -1
- package/dist/cli/chunks/{chunk-UOWHE77F.js → chunk-YAKGBHO4.js} +2 -2
- package/dist/cli/chunks/{chunk-JK2ME6IT.js → chunk-YBSBABOS.js} +2 -2
- package/dist/cli/chunks/{chunk-NDKLQW6N.js → chunk-YCGP5VFP.js} +2 -2
- package/dist/cli/chunks/{chunk-GBUIG3FS.js → chunk-YDAQK5UF.js} +1 -1
- package/dist/cli/chunks/{chunk-HTZJSQ3C.js → chunk-YK3BVZY6.js} +2 -2
- package/dist/cli/chunks/{chunk-GCWSX2NY.js → chunk-YK7JN5N7.js} +4 -4
- package/dist/cli/chunks/{chunk-C6RTMTEH.js → chunk-YKMU4LBV.js} +1 -1
- package/dist/cli/chunks/{chunk-JP4P3P3D.js → chunk-YYTGXD3R.js} +2 -2
- package/dist/cli/chunks/{chunk-763SUL4B.js → chunk-Z2O2YJAF.js} +2 -2
- package/dist/cli/chunks/{chunk-QTVWUQTB.js → chunk-Z7IYW5U7.js} +1 -1
- package/dist/cli/chunks/{chunk-XZJ2O3VC.js → chunk-ZG5666GJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6EPHNJTL.js → chunk-ZXPY654C.js} +1 -1
- package/dist/cli/chunks/{ci-7SGRCFPS.js → ci-MSKMVH5X.js} +2 -2
- package/dist/cli/chunks/{ci-config-MX3URPZA.js → ci-config-7ODMNAUM.js} +2 -2
- package/dist/cli/chunks/{ci-output-M47NJY6D.js → ci-output-FXZ7ZZW3.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5GAK45SW.js → circuit-breaker-4VOUEPOX.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-YXYSRH4Y.js → claude-flow-setup-7D4SGLM4.js} +2 -2
- package/dist/cli/chunks/client-POSVREVS.js +2 -0
- package/dist/cli/chunks/{cline-installer-DLJ5QD5N.js → cline-installer-WRRT7BGQ.js} +2 -2
- package/dist/cli/chunks/{code-ONKLMVQ2.js → code-ZDJRIL3S.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-2232LGZN.js → code-index-extractor-4S4SHM56.js} +2 -2
- package/dist/cli/chunks/{codex-installer-UOWLYCMH.js → codex-installer-YTRHNDWR.js} +2 -2
- package/dist/cli/chunks/{completions-MHX7GCC7.js → completions-6N64JUXJ.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-43ZUJKZU.js → complexity-analyzer-I4A26VCJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-6Q5JR4FF.js → continuedev-installer-IIDR66LB.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-CZUMVHSI.js → copilot-installer-SVVFY3S2.js} +2 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VS5ZW3XN.js → cost-tracker-VGFS6IBX.js} +2 -2
- package/dist/cli/chunks/{coverage-VWKTWZ6D.js → coverage-B7MCGNTE.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +2 -0
- package/dist/cli/chunks/{cursor-installer-YIFEMORH.js → cursor-installer-UPETT57E.js} +2 -2
- package/dist/cli/chunks/daemon-7BDJHEIJ.js +18 -0
- package/dist/cli/chunks/{daemon-SHWJSJW5.js → daemon-CQFNZLXU.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-TCC2WM46.js → dag-attention-scheduler-PJVABHON.js} +2 -2
- package/dist/cli/chunks/{detect-IGTWSQMA.js → detect-56SKAGWX.js} +2 -2
- package/dist/cli/chunks/{dist-node-TCOTJVQX.js → dist-node-UYTYUMLN.js} +2 -2
- package/dist/cli/chunks/{domain-handler-55ZVYODR.js → domain-handler-YOYLBYJE.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GJRWOHQP.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-XAMNIKQL.js → embed-and-insert-pattern-IS6HSR66.js} +2 -2
- package/dist/cli/chunks/{eval-GO22R4OZ.js → eval-GNB574IM.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-F2BRMJ3Y.js → experience-capture-middleware-RCAOCKM7.js} +3 -3
- package/dist/cli/chunks/{fast-paths-6RGPYALD.js → fast-paths-KTZ5SF54.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ZGS3KLPH.js → feature-flags-ITX5LQ57.js} +2 -2
- package/dist/cli/chunks/{feature-flags-MIWQIOHU.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-ALBJVW6T.js → gnn-wrapper-RLFW3GSX.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-ZMM53NDY.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-RYUJPA7B.js → hnsw-legacy-bridge-JMHEOIBH.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-XM6XF3YV.js → hnswlib-node-CBP73QHY.js} +2 -2
- package/dist/cli/chunks/{hooks-X62O7TJO.js → hooks-IP7XE34Z.js} +34 -34
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ZBWUPTVD.js → hypergraph-engine-ONAYHU25.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-DUMF6SJV.js → hypergraph-handler-VINJRAID.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +2 -0
- package/dist/cli/chunks/{init-guard-S4I2R46S.js → init-guard-RYVV5R3Z.js} +2 -2
- package/dist/cli/chunks/{init-handler-L4KJHVWS.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-GNNB5FCZ.js → kilocode-installer-OPD7JBRL.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-HR6ZAH7T.js → kiro-installer-M4OPUNK2.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +2 -0
- package/dist/cli/chunks/{learning-4IEEOHJS.js → learning-4UWTQLMF.js} +24 -24
- package/dist/cli/chunks/{llm-router-ZFMORP36.js → llm-router-SQ56FF6Z.js} +4 -4
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +2 -0
- package/dist/cli/chunks/{load-ZM43WGDO.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-W5FZGVAD.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-SXXGAQ2G.js → multi-model-executor-3VDRX6TZ.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-PIRBUAB5.js → opencode-installer-PJ576R63.js} +2 -2
- package/dist/cli/chunks/{orchestrator-H5SQCQTB.js → orchestrator-72QP4UU7.js} +63 -19
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-XZTWDI2T.js → pattern-usage-recorder-754YQW7C.js} +2 -2
- package/dist/cli/chunks/pipeline-AVXY4MVB.js +19 -0
- package/dist/cli/chunks/{platform-KJDABL5C.js → platform-3E3DXLYB.js} +2 -2
- package/dist/cli/chunks/{plugin-V4KSBVVM.js → plugin-7FUQAKRE.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-JDHTKQAT.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-BNRONTQV.js → protocol-handler-BQRYMUTG.js} +2 -2
- package/dist/cli/chunks/{prove-ELLL6XMX.js → prove-H52QGC6B.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +2 -0
- package/dist/cli/chunks/{quality-NH2QA4D4.js → quality-QO4XPAUM.js} +2 -2
- package/dist/cli/chunks/{quality-gate-JTKLF7GW.js → quality-gate-FBKE5E6F.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +2 -0
- package/dist/cli/chunks/{real-embeddings-J3KCKLPB.js → real-embeddings-RWGOVOXO.js} +2 -2
- package/dist/cli/chunks/{ref-validation-HNXQRP4F.js → ref-validation-LF76ZOBD.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-COJ6CX6S.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-WM33ZILE.js → routing-handler-DST7BVCU.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-BBLXEA7A.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-P7H6HCAG.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-R5SPVRFP.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-AUDTRX3I.js → security-VSPNKCDS.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-PVDGBGI2.js → shared-rvf-adapter-HX6AHL3P.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-LZ2GMSS2.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-XNOAI4G4.js → standalone-memory-O4QUTK6L.js} +2 -2
- package/dist/cli/chunks/{status-handler-K72XZE4T.js → status-handler-Z2BP6EOG.js} +2 -2
- package/dist/cli/chunks/{structural-health-NF3YY7U5.js → structural-health-R36WNLQG.js} +2 -2
- package/dist/cli/chunks/sync-2ELWUFQU.js +2 -0
- package/dist/cli/chunks/{sync-VBD5Y3E2.js → sync-QF5Y3EMZ.js} +2 -2
- package/dist/cli/chunks/{task-handler-24S3WFVJ.js → task-handler-43PYE75J.js} +2 -2
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +9 -0
- package/dist/cli/chunks/{test-XFSGQELD.js → test-UWA377D4.js} +16 -16
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +2 -0
- package/dist/cli/chunks/{test-scheduling-VYUQ4CDE.js → test-scheduling-YQZPJRRN.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-F7C6UKTC.js +2 -0
- package/dist/cli/chunks/{token-usage-VLQ6WO2L.js → token-usage-DO6WLMXP.js} +2 -2
- package/dist/cli/chunks/{transformers-TOFMWWNM.js → transformers-H5RGFKVO.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +2 -0
- package/dist/cli/chunks/{types-JTWLBAZJ.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-4ABM72T4.js → upgrade-4IC4F6AB.js} +2 -2
- package/dist/cli/chunks/{validate-UDJCWKXI.js → validate-DHUWW7PF.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-TODOUWNN.js → validate-swarm-OERQNOX5.js} +2 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-WBMAJPM5.js → web-tree-sitter-TV7DMKES.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-BTT53TUL.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-FRY3LMGH.js → witness-chain-verifier-YXENHB42.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-X7QHQQWL.js → witness-key-manager-HL26AGFO.js} +2 -2
- package/dist/cli/chunks/{workflow-QMZPAWQW.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/fleet.js +19 -12
- 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/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 +60 -5
- package/dist/coordination/handlers/coverage-handlers.js +10 -1
- 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 +25 -7
- 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 +2 -6
- package/dist/coordination/protocols/learning-consolidation-archive.js +4 -27
- package/dist/coordination/protocols/learning-consolidation.d.ts +24 -0
- package/dist/coordination/protocols/learning-consolidation.js +71 -22
- package/dist/coordination/queen-coordinator.d.ts +1 -1
- package/dist/coordination/queen-coordinator.js +19 -7
- package/dist/coordination/queen-event-handlers.js +13 -0
- package/dist/coordination/queen-task-management.d.ts +18 -24
- package/dist/coordination/queen-task-management.js +62 -168
- 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 +1 -1
- 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/yaml-pipeline-loader.js +5 -2
- package/dist/domains/code-intelligence/index-path-guard.d.ts +5 -2
- package/dist/domains/code-intelligence/index-path-guard.js +20 -50
- package/dist/domains/code-intelligence/plugin.js +5 -1
- 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/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 +25 -10
- 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 +2 -2
- package/dist/domains/learning-optimization/active-patterns.js +2 -2
- package/dist/domains/learning-optimization/coordinator.js +9 -5
- package/dist/domains/learning-optimization/interfaces.d.ts +6 -2
- 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/reward-source.d.ts +13 -0
- package/dist/domains/learning-optimization/reward-source.js +8 -1
- package/dist/domains/learning-optimization/services/learning-coordinator.d.ts +5 -3
- package/dist/domains/learning-optimization/services/learning-coordinator.js +45 -58
- 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 +25 -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 +11 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +20 -2
- package/dist/domains/test-execution/services/test-executor.js +8 -8
- 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/phases/10-workers.js +50 -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/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 +9 -3
- package/dist/learning/dream/dream-insights-pruner.js +16 -30
- 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/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 +17 -3
- package/dist/mcp/bundle.js +607 -580
- package/dist/mcp/handlers/core-handlers.js +11 -0
- package/dist/mcp/handlers/domain-handler-configs.d.ts +5 -0
- package/dist/mcp/handlers/domain-handler-configs.js +11 -3
- package/dist/mcp/handlers/handler-factory.d.ts +2 -1
- package/dist/mcp/handlers/handler-factory.js +36 -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 +35 -8
- package/dist/mcp/handlers/validation-pipeline-handler.js +6 -2
- package/dist/mcp/protocol-server.js +2 -0
- 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 +18 -2
- package/dist/mcp/tools/learning-optimization/optimize.js +58 -10
- package/dist/mcp/tools/quality-assessment/gate.js +12 -1
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +9 -2
- 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/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/router/agent-router-config.js +2 -1
- package/dist/shared/llm/translation/tool-translator.js +2 -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 +6 -0
- package/dist/shared/test-runner-process.js +14 -0
- package/dist/shared/test-runner-verdict.d.ts +9 -1
- package/dist/shared/test-runner-verdict.js +15 -4
- package/dist/shared/utils/namespaced-search.d.ts +14 -0
- package/dist/shared/utils/namespaced-search.js +19 -1
- package/dist/shared/utils/safe-expression-evaluator.js +4 -3
- package/dist/strange-loop/infra-healing/recovery-playbook.js +13 -3
- package/dist/validation/gate-reexecute.js +7 -4
- package/dist/workers/daemon.js +13 -1
- package/dist/workers/quality-daemon/git-watcher.js +9 -9
- 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 +2 -0
- package/dist/workers/workers/learning-consolidation.js +12 -1
- package/dist/workflows/browser/workflow-loader.js +8 -5
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-R2Q4QGXQ.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-427FRKWG.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-3RENLQWP.js +0 -2
- package/dist/cli/chunks/base-67DXSAYM.js +0 -2
- package/dist/cli/chunks/browser-CT3MTV6G.js +0 -4
- package/dist/cli/chunks/browser-workflow-NDXRROWZ.js +0 -2
- package/dist/cli/chunks/chunk-4URT6JO2.js +0 -2
- package/dist/cli/chunks/chunk-5LAAZLUC.js +0 -4
- package/dist/cli/chunks/chunk-7DMA5NYL.js +0 -4
- package/dist/cli/chunks/chunk-F2SQPP6U.js +0 -4
- package/dist/cli/chunks/chunk-G3BKZNFL.js +0 -120
- package/dist/cli/chunks/chunk-GR3JYE5A.js +0 -2
- package/dist/cli/chunks/chunk-J3WGK22W.js +0 -2
- package/dist/cli/chunks/chunk-KHSRIPBP.js +0 -180
- package/dist/cli/chunks/chunk-KTSLTZSG.js +0 -2
- package/dist/cli/chunks/chunk-O3JLOVZX.js +0 -4
- package/dist/cli/chunks/chunk-THAY7WHO.js +0 -12
- package/dist/cli/chunks/chunk-VXZJOKOX.js +0 -2
- package/dist/cli/chunks/chunk-VYLM2YV5.js +0 -12
- package/dist/cli/chunks/client-ZP3CTVRF.js +0 -2
- package/dist/cli/chunks/core-handlers-JSRXQWPE.js +0 -2
- package/dist/cli/chunks/cross-domain-router-7UKODQWG.js +0 -2
- package/dist/cli/chunks/daemon-YIFT46FH.js +0 -34
- package/dist/cli/chunks/domain-transfer-6EF75EKU.js +0 -2
- package/dist/cli/chunks/dream-UDLM6M55.js +0 -2
- package/dist/cli/chunks/file-discovery-THWOUQ7Z.js +0 -2
- package/dist/cli/chunks/fleet-ADL57COA.js +0 -44
- package/dist/cli/chunks/heartbeat-scheduler-HGOC5KH3.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-EPSA6AP7.js +0 -2
- package/dist/cli/chunks/hnsw-index-RMFOPYGY.js +0 -2
- package/dist/cli/chunks/hybrid-backend-NZ3G4WBX.js +0 -2
- package/dist/cli/chunks/impact-analyzer-WZC6NHFP.js +0 -2
- package/dist/cli/chunks/init-wizard-422UZYQ5.js +0 -2
- package/dist/cli/chunks/kernel-N7PJ6FCE.js +0 -2
- package/dist/cli/chunks/knowledge-graph-SZCVQF37.js +0 -2
- package/dist/cli/chunks/llm-router-service-4DE5WDUZ.js +0 -2
- package/dist/cli/chunks/load-test-POMIF4Q4.js +0 -2
- package/dist/cli/chunks/mcp-CRZKZE37.js +0 -2
- package/dist/cli/chunks/memory-backend-4P6AHSOY.js +0 -2
- package/dist/cli/chunks/memory-handlers-NK6NV3GE.js +0 -2
- package/dist/cli/chunks/pattern-null-store-CCHQHGQG.js +0 -2
- package/dist/cli/chunks/pipeline-5LMLBIJ7.js +0 -19
- package/dist/cli/chunks/project-root-X72FSM2F.js +0 -2
- package/dist/cli/chunks/protocol-executor-QW6XN6QN.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-ZD3WF647.js +0 -2
- package/dist/cli/chunks/queen-coordinator-S4U4MKK2.js +0 -2
- package/dist/cli/chunks/router-CXZKOOTR.js +0 -2
- package/dist/cli/chunks/routing-feedback-IYFANYY5.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-HCLQ5WUQ.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-XCLUWOO3.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-MRT5H3IP.js +0 -2
- package/dist/cli/chunks/safe-db-WFODRGVZ.js +0 -2
- package/dist/cli/chunks/schedule-RO55OQXG.js +0 -2
- package/dist/cli/chunks/scheduler-XXMJCH24.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-AWRIS4MK.js +0 -2
- package/dist/cli/chunks/sync-UVXA6CT2.js +0 -2
- package/dist/cli/chunks/task-handlers-GUYW2EPJ.js +0 -9
- package/dist/cli/chunks/token-bootstrap-EDK6FNQ3.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-MI3NZKUD.js +0 -2
- package/dist/cli/chunks/unified-memory-6JWHV6EF.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-4UANU6NU.js +0 -2
- package/dist/cli/chunks/unified-persistence-KGGNA46H.js +0 -2
- package/dist/cli/chunks/visual-security-6VZNQLH7.js +0 -2
- package/dist/cli/chunks/witness-chain-AKKHWEWU.js +0 -2
- package/dist/cli/chunks/witness-chain-TATPXQRK.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-2HGJGE7O.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-4GAW7HNZ.js +0 -2
- package/dist/cli/chunks/wrappers-ZD5NBHYI.js +0 -2
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* - Code age calculation
|
|
9
9
|
* - Bug history from commit messages
|
|
10
10
|
*/
|
|
11
|
-
import { execFileSync } from 'child_process';
|
|
12
11
|
import * as path from 'path';
|
|
13
12
|
import { assertSafeGitRef } from './ref-validation.js';
|
|
13
|
+
import { GitTimeoutError, runGit } from './git-process.js';
|
|
14
14
|
/**
|
|
15
15
|
* Sanitize a string for safe use in git arguments
|
|
16
16
|
* Removes shell metacharacters that could enable injection
|
|
@@ -19,13 +19,22 @@ function sanitizeGitArg(arg) {
|
|
|
19
19
|
// Remove characters that could be used for command injection
|
|
20
20
|
return arg.replace(/[;&|`$(){}[\]<>\\'"!\n\r]/g, '');
|
|
21
21
|
}
|
|
22
|
+
/** A git `%at` epoch-seconds line as a Date, or null when it is not one. */
|
|
23
|
+
function timestampToDate(line) {
|
|
24
|
+
const timestamp = parseInt(line ?? '', 10);
|
|
25
|
+
return isNaN(timestamp) ? null : new Date(timestamp * 1000);
|
|
26
|
+
}
|
|
22
27
|
const DEFAULT_CONFIG = {
|
|
23
28
|
repoRoot: process.cwd(),
|
|
24
29
|
maxCommits: 100,
|
|
25
30
|
bugKeywords: ['fix', 'bug', 'patch', 'issue', 'error', 'defect', 'problem'],
|
|
26
31
|
enableCache: true,
|
|
27
32
|
cacheTtl: 5 * 60 * 1000, // 5 minutes
|
|
33
|
+
gitTimeoutMs: 30 * 1000,
|
|
34
|
+
fileTimeoutMs: 60 * 1000,
|
|
28
35
|
};
|
|
36
|
+
/** Room for `git blame --line-porcelain` on large files (execFileSync allowed 1 MiB). */
|
|
37
|
+
const GIT_MAX_BUFFER = 64 * 1024 * 1024;
|
|
29
38
|
/**
|
|
30
39
|
* Git Analyzer for defect prediction metrics
|
|
31
40
|
*/
|
|
@@ -33,6 +42,11 @@ export class GitAnalyzer {
|
|
|
33
42
|
config;
|
|
34
43
|
cache = new Map();
|
|
35
44
|
isGitRepo = null;
|
|
45
|
+
/** After a rev-parse timeout, when to ask git again (until then: "timeout"). */
|
|
46
|
+
repoRetryAt = 0;
|
|
47
|
+
timedOutFiles = new Set();
|
|
48
|
+
/** Files inside withFileDeadline() and when their git time runs out. */
|
|
49
|
+
fileDeadlines = new Map();
|
|
36
50
|
constructor(config = {}) {
|
|
37
51
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
38
52
|
}
|
|
@@ -40,19 +54,30 @@ export class GitAnalyzer {
|
|
|
40
54
|
* Check if current directory is a git repository
|
|
41
55
|
*/
|
|
42
56
|
async isGitRepository() {
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
return (await this.repoState()) === true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* True when git timed out while analysing `filePath` since the last call, so
|
|
61
|
+
* the analysis returned its "git unavailable" default rather than a result.
|
|
62
|
+
*/
|
|
63
|
+
consumeTimeout(filePath) {
|
|
64
|
+
return this.timedOutFiles.delete(filePath);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Run `work`, during which every analysis of `filePath` also stops at one
|
|
68
|
+
* shared `fileTimeoutMs` deadline. One file's analyses then wait for git at
|
|
69
|
+
* most that long together, rather than `gitTimeoutMs` each (#1115).
|
|
70
|
+
*/
|
|
71
|
+
async withFileDeadline(filePath, work) {
|
|
72
|
+
if (this.fileDeadlines.has(filePath))
|
|
73
|
+
return work();
|
|
74
|
+
this.fileDeadlines.set(filePath, Date.now() + this.config.fileTimeoutMs);
|
|
45
75
|
try {
|
|
46
|
-
|
|
47
|
-
cwd: this.config.repoRoot,
|
|
48
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
49
|
-
});
|
|
50
|
-
this.isGitRepo = true;
|
|
76
|
+
return await work();
|
|
51
77
|
}
|
|
52
|
-
|
|
53
|
-
this.
|
|
78
|
+
finally {
|
|
79
|
+
this.fileDeadlines.delete(filePath);
|
|
54
80
|
}
|
|
55
|
-
return this.isGitRepo;
|
|
56
81
|
}
|
|
57
82
|
/**
|
|
58
83
|
* Get file change frequency (commits in last 90 days / 3)
|
|
@@ -63,28 +88,15 @@ export class GitAnalyzer {
|
|
|
63
88
|
const cached = this.getFromCache(cacheKey);
|
|
64
89
|
if (cached !== undefined)
|
|
65
90
|
return cached;
|
|
66
|
-
|
|
67
|
-
return 0.4; // Default when not in git repo
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const relativePath = this.getRelativePath(filePath);
|
|
91
|
+
return this.analyze(filePath, 0.4, async (git, relativePath) => {
|
|
71
92
|
// Literal pathspecs preserve route filenames such as app/[id].tsx.
|
|
72
|
-
//
|
|
73
|
-
const output =
|
|
74
|
-
'--literal-pathspecs', 'log', '--oneline', '--since=90 days ago', '--', relativePath
|
|
75
|
-
], {
|
|
76
|
-
cwd: this.config.repoRoot,
|
|
77
|
-
encoding: 'utf-8',
|
|
78
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
79
|
-
}).trim();
|
|
93
|
+
// Arguments go to git directly, without shell interpretation.
|
|
94
|
+
const output = (await git.text(['--literal-pathspecs', 'log', '--oneline', '--since=90 days ago', '--', relativePath])).trim();
|
|
80
95
|
const commits = output ? output.split('\n').length : 0;
|
|
81
96
|
const frequency = Math.min(1, commits / 30); // Normalize: 30+ commits in 90 days = 1.0
|
|
82
97
|
this.setCache(cacheKey, frequency);
|
|
83
98
|
return frequency;
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
return 0.4; // Default on error
|
|
87
|
-
}
|
|
99
|
+
});
|
|
88
100
|
}
|
|
89
101
|
/**
|
|
90
102
|
* Get developer experience score for a file based on git blame
|
|
@@ -95,42 +107,24 @@ export class GitAnalyzer {
|
|
|
95
107
|
const cached = this.getFromCache(cacheKey);
|
|
96
108
|
if (cached !== undefined)
|
|
97
109
|
return cached;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const relativePath = this.getRelativePath(filePath);
|
|
103
|
-
// Get blame info using execFileSync with argument array
|
|
104
|
-
const blameOutput = execFileSync('git', [
|
|
105
|
-
'--literal-pathspecs', 'blame', '--line-porcelain', '--', relativePath
|
|
106
|
-
], {
|
|
107
|
-
cwd: this.config.repoRoot,
|
|
108
|
-
encoding: 'utf-8',
|
|
109
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
110
|
-
});
|
|
110
|
+
return this.analyze(filePath, 0.5, async (git, relativePath) => {
|
|
111
|
+
const blameOutput = await git.text(['--literal-pathspecs', 'blame', '--line-porcelain', '--', relativePath]);
|
|
111
112
|
// Parse blame output - count authors manually instead of piping through shell
|
|
112
113
|
const authorCounts = new Map();
|
|
113
|
-
const
|
|
114
|
-
for (const line of lines) {
|
|
114
|
+
for (const line of blameOutput.split('\n')) {
|
|
115
115
|
if (line.startsWith('author ')) {
|
|
116
116
|
const author = line.substring(7).trim();
|
|
117
117
|
authorCounts.set(author, (authorCounts.get(author) || 0) + 1);
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
const totalLines = Array.from(authorCounts.values()).reduce((a, b) => a + b, 0);
|
|
121
|
-
const uniqueAuthors = authorCounts.size;
|
|
122
|
-
// Score based on code ownership concentration
|
|
123
|
-
// High concentration by few authors = more experience = lower risk
|
|
124
121
|
if (totalLines === 0)
|
|
125
122
|
return 0.5;
|
|
126
123
|
// More authors touching the file = higher risk (less concentrated ownership)
|
|
127
|
-
const riskScore = Math.min(1,
|
|
124
|
+
const riskScore = Math.min(1, authorCounts.size / 10);
|
|
128
125
|
this.setCache(cacheKey, riskScore);
|
|
129
126
|
return riskScore;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
return 0.5; // Default on error
|
|
133
|
-
}
|
|
127
|
+
});
|
|
134
128
|
}
|
|
135
129
|
/**
|
|
136
130
|
* Get code age - how old is the file
|
|
@@ -141,49 +135,16 @@ export class GitAnalyzer {
|
|
|
141
135
|
const cached = this.getFromCache(cacheKey);
|
|
142
136
|
if (cached !== undefined)
|
|
143
137
|
return cached;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
let firstCommitTimestamp = NaN;
|
|
151
|
-
try {
|
|
152
|
-
const firstCommitOutput = execFileSync('git', [
|
|
153
|
-
'--literal-pathspecs', 'log', '--format=%at', '--follow', '--diff-filter=A', '--', relativePath
|
|
154
|
-
], {
|
|
155
|
-
cwd: this.config.repoRoot,
|
|
156
|
-
encoding: 'utf-8',
|
|
157
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
158
|
-
}).trim();
|
|
159
|
-
// Get last line (oldest commit)
|
|
160
|
-
const lines = firstCommitOutput.split('\n').filter(Boolean);
|
|
161
|
-
if (lines.length > 0) {
|
|
162
|
-
firstCommitTimestamp = parseInt(lines[lines.length - 1], 10);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
catch {
|
|
166
|
-
// File may not have been added yet
|
|
167
|
-
}
|
|
168
|
-
// Get last commit date using execFileSync with argument array
|
|
169
|
-
let lastCommitTimestamp = NaN;
|
|
170
|
-
try {
|
|
171
|
-
const lastCommitOutput = execFileSync('git', [
|
|
172
|
-
'--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath
|
|
173
|
-
], {
|
|
174
|
-
cwd: this.config.repoRoot,
|
|
175
|
-
encoding: 'utf-8',
|
|
176
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
177
|
-
}).trim();
|
|
178
|
-
lastCommitTimestamp = parseInt(lastCommitOutput, 10);
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
// File may not be in git
|
|
182
|
-
}
|
|
183
|
-
const now = Date.now() / 1000;
|
|
138
|
+
return this.analyze(filePath, 0.4, async (git, relativePath) => {
|
|
139
|
+
// First commit: the last line (oldest) of the commits that added the file
|
|
140
|
+
const added = await git.lines(['--literal-pathspecs', 'log', '--format=%at', '--follow', '--diff-filter=A', '--', relativePath]);
|
|
141
|
+
const firstCommitTimestamp = parseInt(added[added.length - 1] ?? '', 10);
|
|
142
|
+
const [lastLine] = await git.lines(['--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath]);
|
|
143
|
+
const lastCommitTimestamp = parseInt(lastLine ?? '', 10);
|
|
184
144
|
if (isNaN(lastCommitTimestamp)) {
|
|
185
145
|
return 0.4; // File not in git
|
|
186
146
|
}
|
|
147
|
+
const now = Date.now() / 1000;
|
|
187
148
|
const daysSinceLastChange = (now - lastCommitTimestamp) / (60 * 60 * 24);
|
|
188
149
|
const totalAgeDays = isNaN(firstCommitTimestamp)
|
|
189
150
|
? daysSinceLastChange
|
|
@@ -200,10 +161,7 @@ export class GitAnalyzer {
|
|
|
200
161
|
}
|
|
201
162
|
this.setCache(cacheKey, riskScore);
|
|
202
163
|
return riskScore;
|
|
203
|
-
}
|
|
204
|
-
catch {
|
|
205
|
-
return 0.4; // Default on error
|
|
206
|
-
}
|
|
164
|
+
});
|
|
207
165
|
}
|
|
208
166
|
/**
|
|
209
167
|
* Get bug history - how many bug fix commits have touched this file
|
|
@@ -214,48 +172,12 @@ export class GitAnalyzer {
|
|
|
214
172
|
const cached = this.getFromCache(cacheKey);
|
|
215
173
|
if (cached !== undefined)
|
|
216
174
|
return cached;
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
const relativePath = this.getRelativePath(filePath);
|
|
222
|
-
// Search for each keyword separately and count unique commits
|
|
223
|
-
// This avoids shell injection from keywords config
|
|
224
|
-
let bugCommits = 0;
|
|
225
|
-
const seenCommits = new Set();
|
|
226
|
-
for (const keyword of this.config.bugKeywords) {
|
|
227
|
-
const sanitizedKeyword = sanitizeGitArg(keyword);
|
|
228
|
-
try {
|
|
229
|
-
const output = execFileSync('git', [
|
|
230
|
-
'--literal-pathspecs', 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
|
|
231
|
-
], {
|
|
232
|
-
cwd: this.config.repoRoot,
|
|
233
|
-
encoding: 'utf-8',
|
|
234
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
235
|
-
}).trim();
|
|
236
|
-
if (output) {
|
|
237
|
-
// Track unique commit hashes to avoid double-counting
|
|
238
|
-
const lines = output.split('\n');
|
|
239
|
-
for (const line of lines) {
|
|
240
|
-
const hash = line.split(' ')[0];
|
|
241
|
-
if (hash && !seenCommits.has(hash)) {
|
|
242
|
-
seenCommits.add(hash);
|
|
243
|
-
bugCommits++;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
catch {
|
|
249
|
-
// Keyword search failed, continue with next
|
|
250
|
-
}
|
|
251
|
-
}
|
|
175
|
+
return this.analyze(filePath, 0.2, async (git, relativePath) => {
|
|
176
|
+
const bugCommits = await this.countBugFixCommits(git, relativePath);
|
|
252
177
|
const riskScore = Math.min(1, bugCommits / 10); // Normalize: 10+ bug fixes = 1.0
|
|
253
178
|
this.setCache(cacheKey, riskScore);
|
|
254
179
|
return riskScore;
|
|
255
|
-
}
|
|
256
|
-
catch {
|
|
257
|
-
return 0.2; // Default on error
|
|
258
|
-
}
|
|
180
|
+
});
|
|
259
181
|
}
|
|
260
182
|
/**
|
|
261
183
|
* Get comprehensive file history analysis
|
|
@@ -265,87 +187,15 @@ export class GitAnalyzer {
|
|
|
265
187
|
const cached = this.getFromCache(cacheKey);
|
|
266
188
|
if (cached)
|
|
267
189
|
return cached;
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
'--literal-pathspecs', 'log', '--oneline', '--', relativePath
|
|
278
|
-
], {
|
|
279
|
-
cwd: this.config.repoRoot,
|
|
280
|
-
encoding: 'utf-8',
|
|
281
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
282
|
-
}).trim();
|
|
283
|
-
totalCommits = commitCountOutput ? commitCountOutput.split('\n').length : 0;
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
286
|
-
// File may not be in git
|
|
287
|
-
}
|
|
288
|
-
// Get unique authors - parse output manually instead of piping through sort/wc
|
|
289
|
-
let uniqueAuthors = 0;
|
|
290
|
-
try {
|
|
291
|
-
const authorsOutput = execFileSync('git', [
|
|
292
|
-
'--literal-pathspecs', 'log', '--format=%ae', '--', relativePath
|
|
293
|
-
], {
|
|
294
|
-
cwd: this.config.repoRoot,
|
|
295
|
-
encoding: 'utf-8',
|
|
296
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
297
|
-
}).trim();
|
|
298
|
-
if (authorsOutput) {
|
|
299
|
-
const authorSet = new Set(authorsOutput.split('\n').filter(Boolean));
|
|
300
|
-
uniqueAuthors = authorSet.size;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
catch {
|
|
304
|
-
// File may not be in git
|
|
305
|
-
}
|
|
306
|
-
// Get first commit date
|
|
307
|
-
let firstCommit = null;
|
|
308
|
-
try {
|
|
309
|
-
const firstCommitOutput = execFileSync('git', [
|
|
310
|
-
'--literal-pathspecs', 'log', '--format=%at', '--follow', '--', relativePath
|
|
311
|
-
], {
|
|
312
|
-
cwd: this.config.repoRoot,
|
|
313
|
-
encoding: 'utf-8',
|
|
314
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
315
|
-
}).trim();
|
|
316
|
-
if (firstCommitOutput) {
|
|
317
|
-
const lines = firstCommitOutput.split('\n').filter(Boolean);
|
|
318
|
-
if (lines.length > 0) {
|
|
319
|
-
const timestamp = parseInt(lines[lines.length - 1], 10);
|
|
320
|
-
if (!isNaN(timestamp)) {
|
|
321
|
-
firstCommit = new Date(timestamp * 1000);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
catch {
|
|
327
|
-
// File may not be in git
|
|
328
|
-
}
|
|
329
|
-
// Get last commit date
|
|
330
|
-
let lastCommit = null;
|
|
331
|
-
try {
|
|
332
|
-
const lastCommitOutput = execFileSync('git', [
|
|
333
|
-
'--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath
|
|
334
|
-
], {
|
|
335
|
-
cwd: this.config.repoRoot,
|
|
336
|
-
encoding: 'utf-8',
|
|
337
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
338
|
-
}).trim();
|
|
339
|
-
if (lastCommitOutput) {
|
|
340
|
-
const timestamp = parseInt(lastCommitOutput, 10);
|
|
341
|
-
if (!isNaN(timestamp)) {
|
|
342
|
-
lastCommit = new Date(timestamp * 1000);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
catch {
|
|
347
|
-
// File may not be in git
|
|
348
|
-
}
|
|
190
|
+
return this.analyze(filePath, this.getDefaultFileHistory(filePath), async (git, relativePath) => {
|
|
191
|
+
// Each query yields no lines when the file is not in git
|
|
192
|
+
const totalCommits = (await git.lines(['--literal-pathspecs', 'log', '--oneline', '--', relativePath])).length;
|
|
193
|
+
// Parse authors here instead of piping through sort/wc
|
|
194
|
+
const uniqueAuthors = new Set(await git.lines(['--literal-pathspecs', 'log', '--format=%ae', '--', relativePath])).size;
|
|
195
|
+
const followed = await git.lines(['--literal-pathspecs', 'log', '--format=%at', '--follow', '--', relativePath]);
|
|
196
|
+
const firstCommit = timestampToDate(followed[followed.length - 1]);
|
|
197
|
+
const [lastLine] = await git.lines(['--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath]);
|
|
198
|
+
const lastCommit = timestampToDate(lastLine);
|
|
349
199
|
// Calculate change frequency (commits per month)
|
|
350
200
|
let changeFrequency = 0;
|
|
351
201
|
if (firstCommit && lastCommit && totalCommits > 0) {
|
|
@@ -356,34 +206,6 @@ export class GitAnalyzer {
|
|
|
356
206
|
const isRecentlyModified = lastCommit
|
|
357
207
|
? Date.now() - lastCommit.getTime() < 7 * 24 * 60 * 60 * 1000
|
|
358
208
|
: false;
|
|
359
|
-
// Count bug fix commits - search each keyword separately to avoid injection
|
|
360
|
-
let bugFixCommits = 0;
|
|
361
|
-
const seenBugCommits = new Set();
|
|
362
|
-
for (const keyword of this.config.bugKeywords) {
|
|
363
|
-
const sanitizedKeyword = sanitizeGitArg(keyword);
|
|
364
|
-
try {
|
|
365
|
-
const bugFixOutput = execFileSync('git', [
|
|
366
|
-
'--literal-pathspecs', 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
|
|
367
|
-
], {
|
|
368
|
-
cwd: this.config.repoRoot,
|
|
369
|
-
encoding: 'utf-8',
|
|
370
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
371
|
-
}).trim();
|
|
372
|
-
if (bugFixOutput) {
|
|
373
|
-
const lines = bugFixOutput.split('\n');
|
|
374
|
-
for (const line of lines) {
|
|
375
|
-
const hash = line.split(' ')[0];
|
|
376
|
-
if (hash && !seenBugCommits.has(hash)) {
|
|
377
|
-
seenBugCommits.add(hash);
|
|
378
|
-
bugFixCommits++;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
catch {
|
|
384
|
-
// Keyword search failed, continue with next
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
209
|
const history = {
|
|
388
210
|
filePath: relativePath,
|
|
389
211
|
totalCommits,
|
|
@@ -392,44 +214,25 @@ export class GitAnalyzer {
|
|
|
392
214
|
lastCommit,
|
|
393
215
|
changeFrequency,
|
|
394
216
|
isRecentlyModified,
|
|
395
|
-
bugFixCommits,
|
|
217
|
+
bugFixCommits: await this.countBugFixCommits(git, relativePath),
|
|
396
218
|
};
|
|
397
219
|
this.setCache(cacheKey, history);
|
|
398
220
|
return history;
|
|
399
|
-
}
|
|
400
|
-
catch {
|
|
401
|
-
return this.getDefaultFileHistory(filePath);
|
|
402
|
-
}
|
|
221
|
+
});
|
|
403
222
|
}
|
|
404
223
|
/**
|
|
405
224
|
* Get files changed since a specific date
|
|
406
225
|
* @param since - Date to check changes from (default: 24 hours ago)
|
|
407
226
|
* @returns Array of changed file paths relative to repo root
|
|
227
|
+
* @throws GitTimeoutError when git does not answer within `gitTimeoutMs`
|
|
408
228
|
*/
|
|
409
229
|
async getChangedFiles(since) {
|
|
410
230
|
if (!(await this.isGitRepository())) {
|
|
411
231
|
return [];
|
|
412
232
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
// Get files changed since the date using execFileSync with argument array
|
|
417
|
-
const output = execFileSync('git', [
|
|
418
|
-
'log', `--since=${sinceStr}`, '--name-only', '-z', '--format='
|
|
419
|
-
], {
|
|
420
|
-
cwd: this.config.repoRoot,
|
|
421
|
-
encoding: 'utf-8',
|
|
422
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
423
|
-
});
|
|
424
|
-
if (!output)
|
|
425
|
-
return [];
|
|
426
|
-
// NUL records preserve whitespace, newlines and Git-quoted Unicode paths.
|
|
427
|
-
const files = output.split('\0').filter(Boolean);
|
|
428
|
-
return Array.from(new Set(files));
|
|
429
|
-
}
|
|
430
|
-
catch {
|
|
431
|
-
return [];
|
|
432
|
-
}
|
|
233
|
+
const sinceDate = since || new Date(Date.now() - 24 * 60 * 60 * 1000);
|
|
234
|
+
const files = await this.query().paths(['log', `--since=${sinceDate.toISOString()}`, '--name-only', '-z', '--format=']);
|
|
235
|
+
return Array.from(new Set(files));
|
|
433
236
|
}
|
|
434
237
|
/**
|
|
435
238
|
* Get files changed in a specific commit
|
|
@@ -438,78 +241,115 @@ export class GitAnalyzer {
|
|
|
438
241
|
* @throws Error when `commitHash` is option-shaped (starts with "-") or otherwise
|
|
439
242
|
* not a safe revision argument; git would otherwise parse it as an option
|
|
440
243
|
* (e.g. `--output=<path>` writes an arbitrary file). See issue #960.
|
|
244
|
+
* @throws GitTimeoutError when git does not answer within `gitTimeoutMs`
|
|
441
245
|
*/
|
|
442
246
|
async getCommitFiles(commitHash = 'HEAD') {
|
|
443
|
-
// Validate before touching git:
|
|
247
|
+
// Validate before touching git: there is no shell, so stripping
|
|
444
248
|
// metacharacters does not help, but a leading "-" is still parsed as an option.
|
|
445
249
|
assertSafeGitRef(commitHash, 'commit hash');
|
|
446
250
|
if (!(await this.isGitRepository())) {
|
|
447
251
|
return [];
|
|
448
252
|
}
|
|
449
|
-
|
|
450
|
-
const output = execFileSync('git', [
|
|
451
|
-
'diff-tree', '--root', '--no-commit-id', '--name-only', '-z', '-r', commitHash
|
|
452
|
-
], {
|
|
453
|
-
cwd: this.config.repoRoot,
|
|
454
|
-
encoding: 'utf-8',
|
|
455
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
456
|
-
});
|
|
457
|
-
if (!output)
|
|
458
|
-
return [];
|
|
459
|
-
return output.split('\0').filter(Boolean);
|
|
460
|
-
}
|
|
461
|
-
catch {
|
|
462
|
-
return [];
|
|
463
|
-
}
|
|
253
|
+
return this.query().paths(['diff-tree', '--root', '--no-commit-id', '--name-only', '-z', '-r', commitHash]);
|
|
464
254
|
}
|
|
465
255
|
/**
|
|
466
256
|
* Get files with uncommitted changes (staged + unstaged)
|
|
467
257
|
* @returns Array of modified file paths relative to repo root
|
|
258
|
+
* @throws GitTimeoutError when git does not answer within `gitTimeoutMs`
|
|
468
259
|
*/
|
|
469
260
|
async getUncommittedFiles() {
|
|
470
261
|
if (!(await this.isGitRepository())) {
|
|
471
262
|
return [];
|
|
472
263
|
}
|
|
264
|
+
// `diff HEAD` fails before the first commit; `--cached` still lists staged files.
|
|
265
|
+
const git = this.query();
|
|
266
|
+
const unstaged = await git.paths(['diff', '--name-only', '-z', 'HEAD']);
|
|
267
|
+
const staged = await git.paths(['diff', '--name-only', '-z', '--cached']);
|
|
268
|
+
return Array.from(new Set([...unstaged, ...staged]));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Count commits whose message matches any bug keyword, in one `git log`
|
|
272
|
+
* (repeated --grep patterns are OR-ed). Keywords are sanitized arguments and
|
|
273
|
+
* never reach a shell.
|
|
274
|
+
*/
|
|
275
|
+
async countBugFixCommits(git, relativePath) {
|
|
276
|
+
if (this.config.bugKeywords.length === 0)
|
|
277
|
+
return 0;
|
|
278
|
+
const greps = this.config.bugKeywords.flatMap((keyword) => ['--grep', sanitizeGitArg(keyword)]);
|
|
279
|
+
const lines = await git.lines(['--literal-pathspecs', 'log', '--oneline', '-i', ...greps, '--', relativePath]);
|
|
280
|
+
return new Set(lines.map((line) => line.split(' ')[0]).filter(Boolean)).size;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Run one file's analysis with every git call sharing one `gitTimeoutMs`
|
|
284
|
+
* deadline (#1115). When git is unavailable or times out, the analysis
|
|
285
|
+
* returns its default, which callers treat as "no git data", and a timeout
|
|
286
|
+
* is recorded for consumeTimeout(). A timeout never yields a measured 0.
|
|
287
|
+
*/
|
|
288
|
+
async analyze(filePath, fallback, work) {
|
|
289
|
+
const repo = await this.repoState();
|
|
290
|
+
if (repo !== true) {
|
|
291
|
+
if (repo === 'timeout')
|
|
292
|
+
this.timedOutFiles.add(filePath);
|
|
293
|
+
return fallback;
|
|
294
|
+
}
|
|
473
295
|
try {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
296
|
+
return await work(this.query(this.fileDeadlines.get(filePath)), this.getRelativePath(filePath));
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
if (error instanceof GitTimeoutError)
|
|
300
|
+
this.timedOutFiles.add(filePath);
|
|
301
|
+
return fallback;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Whether the repo root is a git work tree. A timeout is not an answer: it
|
|
306
|
+
* is remembered for `cacheTtl` so a hung git is not waited on for every
|
|
307
|
+
* file, and then git is asked again.
|
|
308
|
+
*/
|
|
309
|
+
async repoState() {
|
|
310
|
+
if (this.isGitRepo !== null)
|
|
311
|
+
return this.isGitRepo;
|
|
312
|
+
if (Date.now() < this.repoRetryAt)
|
|
313
|
+
return 'timeout';
|
|
314
|
+
try {
|
|
315
|
+
await this.query().text(['rev-parse', '--is-inside-work-tree']);
|
|
316
|
+
this.isGitRepo = true;
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
if (error instanceof GitTimeoutError) {
|
|
320
|
+
this.repoRetryAt = Date.now() + this.config.cacheTtl;
|
|
321
|
+
return 'timeout';
|
|
490
322
|
}
|
|
491
|
-
|
|
323
|
+
this.isGitRepo = false;
|
|
324
|
+
}
|
|
325
|
+
return this.isGitRepo;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Git queries in the repo root that share a deadline of `gitTimeoutMs` from
|
|
329
|
+
* now, or `fileDeadline` when that comes first. Git runs asynchronously in its own process group, so a slow or hung
|
|
330
|
+
* git (a network filesystem, a credential prompt) neither blocks the MCP
|
|
331
|
+
* server's event loop nor outlives its deadline (#1115).
|
|
332
|
+
*/
|
|
333
|
+
query(fileDeadline = Infinity) {
|
|
334
|
+
const deadline = Math.min(Date.now() + this.config.gitTimeoutMs, fileDeadline);
|
|
335
|
+
const text = (args) => runGit(args, {
|
|
336
|
+
cwd: this.config.repoRoot, timeout: deadline - Date.now(), maxBuffer: GIT_MAX_BUFFER,
|
|
337
|
+
});
|
|
338
|
+
const orNothing = async (args, separator) => {
|
|
492
339
|
try {
|
|
493
|
-
|
|
494
|
-
'diff', '--name-only', '-z', '--cached'
|
|
495
|
-
], {
|
|
496
|
-
cwd: this.config.repoRoot,
|
|
497
|
-
encoding: 'utf-8',
|
|
498
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
499
|
-
});
|
|
500
|
-
if (stagedOutput) {
|
|
501
|
-
files.push(...stagedOutput.split('\0').filter(Boolean));
|
|
502
|
-
}
|
|
340
|
+
return (await text(args)).split(separator);
|
|
503
341
|
}
|
|
504
|
-
catch {
|
|
505
|
-
|
|
342
|
+
catch (error) {
|
|
343
|
+
if (error instanceof GitTimeoutError)
|
|
344
|
+
throw error;
|
|
345
|
+
return [];
|
|
506
346
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
}
|
|
347
|
+
};
|
|
348
|
+
return {
|
|
349
|
+
text,
|
|
350
|
+
lines: async (args) => (await orNothing(args, '\n')).map((line) => line.trim()).filter(Boolean),
|
|
351
|
+
paths: async (args) => (await orNothing(args, '\0')).filter(Boolean),
|
|
352
|
+
};
|
|
513
353
|
}
|
|
514
354
|
/**
|
|
515
355
|
* Get relative path from repo root
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run git without blocking the event loop (#1115).
|
|
3
|
+
*
|
|
4
|
+
* Git runs in its own process group, so a timeout stops it together with any
|
|
5
|
+
* wrapper, credential helper or fsmonitor child it started.
|
|
6
|
+
*/
|
|
7
|
+
/** Git did not finish before its deadline; its result is unknown, not empty. */
|
|
8
|
+
export declare class GitTimeoutError extends Error {
|
|
9
|
+
constructor(args: readonly string[], timeoutMs: number);
|
|
10
|
+
}
|
|
11
|
+
export interface RunGitOptions {
|
|
12
|
+
cwd: string;
|
|
13
|
+
/** Milliseconds before the git process group is stopped. */
|
|
14
|
+
timeout: number;
|
|
15
|
+
maxBuffer?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve with git's stdout. Rejects with GitTimeoutError when the deadline
|
|
19
|
+
* passes, and with a plain Error when git cannot start or exits non-zero.
|
|
20
|
+
*/
|
|
21
|
+
export declare function runGit(args: readonly string[], options: RunGitOptions): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=git-process.d.ts.map
|