agentic-qe 3.14.7 → 3.14.8
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/helpers/.helpers-version +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +18 -9
- package/.claude/helpers/helpers.manifest.json +6 -5
- package/.claude/helpers/hook-handler.cjs +40 -12
- package/.claude/helpers/memory.cjs +86 -0
- package/.claude/helpers/router.cjs +105 -0
- package/.claude/helpers/session.cjs +166 -0
- package/.claude/helpers/statusline.cjs +73 -621
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +130 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/notifications/retry-queue.js +5 -0
- package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
- package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-XYCOXQCC.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-AK2W76RG.js → agent-booster-wasm-67OKGDGZ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-MGZCWHIY.js → agent-handler-4HZEQ3WQ.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-JZ54MCSP.js → agent-memory-branch-IBHZQSRN.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +2 -0
- package/dist/cli/chunks/{arena-CUVH3V7H.js → arena-EJBIGSF4.js} +2 -2
- package/dist/cli/chunks/{arena-YSWTKBCL.js → arena-LCLRGUIK.js} +4 -4
- package/dist/cli/chunks/{audit-LVU76QGA.js → audit-PY4JNDQQ.js} +3 -3
- package/dist/cli/chunks/base-5TQ34GMD.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-DB3LOJQU.js → better-sqlite3-2JG5K6XT.js} +2 -2
- package/dist/cli/chunks/{brain-handler-SD63KOQ6.js → brain-handler-3UYK55GA.js} +4 -4
- package/dist/cli/chunks/{branch-enumerator-4MNOPUC7.js → branch-enumerator-GOSWOX46.js} +2 -2
- package/dist/cli/chunks/{browser-OLPNTWQE.js → browser-DC2JV47Z.js} +2 -2
- package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +2 -0
- package/dist/cli/chunks/{chunk-QQFQDEUE.js → chunk-25EEIAHS.js} +2 -2
- package/dist/cli/chunks/{chunk-DOBKEXMJ.js → chunk-3576QGPP.js} +1 -1
- package/dist/cli/chunks/{chunk-3M7J4U74.js → chunk-3EKG7HFV.js} +4 -4
- package/dist/cli/chunks/{chunk-DYTQHRUS.js → chunk-3FCHH4VP.js} +1 -1
- package/dist/cli/chunks/{chunk-EJ6MMYLK.js → chunk-3S5IIK32.js} +1 -1
- package/dist/cli/chunks/{chunk-NOHWJOBS.js → chunk-3X2JSW3R.js} +1 -1
- package/dist/cli/chunks/{chunk-7EZ2Z2CK.js → chunk-4HXFPBAA.js} +1 -1
- package/dist/cli/chunks/{chunk-XBYQ2BS4.js → chunk-4PY44TKH.js} +2 -2
- package/dist/cli/chunks/{chunk-5FSLMYAC.js → chunk-4RNCVSVN.js} +2 -2
- package/dist/cli/chunks/{chunk-X7ADKL7T.js → chunk-56M4QNXU.js} +2 -2
- package/dist/cli/chunks/{chunk-JHJUSSAU.js → chunk-5X4HDW5W.js} +2 -2
- package/dist/cli/chunks/{chunk-7MIOK72I.js → chunk-673XJBGW.js} +7 -7
- package/dist/cli/chunks/{chunk-77QZHIVX.js → chunk-6F7MFHTY.js} +2 -2
- package/dist/cli/chunks/{chunk-Q6NTEICT.js → chunk-6GJWT2OY.js} +2 -2
- package/dist/cli/chunks/{chunk-GV4DYPJP.js → chunk-6GNWVPMR.js} +2 -2
- package/dist/cli/chunks/{chunk-V5AK56DA.js → chunk-6VTC3OHD.js} +2 -2
- package/dist/cli/chunks/{chunk-MM56VPNE.js → chunk-775WGWLL.js} +3 -3
- package/dist/cli/chunks/{chunk-A3DK3XNZ.js → chunk-77WL5HQW.js} +1 -1
- package/dist/cli/chunks/chunk-7STWD4KJ.js +3 -0
- package/dist/cli/chunks/{chunk-RC2A4JZ5.js → chunk-7TNCEVWX.js} +2 -2
- package/dist/cli/chunks/{chunk-XL5KIYE3.js → chunk-7X3LMTRA.js} +2 -2
- package/dist/cli/chunks/{chunk-VW6FRMLW.js → chunk-A53MMSGC.js} +2 -2
- package/dist/cli/chunks/{chunk-UFSVUBTR.js → chunk-A5CLVZC3.js} +2 -2
- package/dist/cli/chunks/{chunk-4INST4ZL.js → chunk-AEYJ4ZLA.js} +1 -1
- package/dist/cli/chunks/{chunk-5U6N4V5M.js → chunk-AJ5PCJQ2.js} +4 -4
- package/dist/cli/chunks/{chunk-OAZX6WFU.js → chunk-AJMAKUS3.js} +2 -2
- package/dist/cli/chunks/{chunk-74IOEOMH.js → chunk-AOD2ES44.js} +2 -2
- package/dist/cli/chunks/chunk-AR2S4DOB.js +2 -0
- package/dist/cli/chunks/{chunk-PYKY22GC.js → chunk-AUFV2G2J.js} +5 -5
- package/dist/cli/chunks/{chunk-KD2BLA5Y.js → chunk-B2QKBQYD.js} +1 -1
- package/dist/cli/chunks/{chunk-6EGS77BB.js → chunk-BCCSV3RH.js} +1 -1
- package/dist/cli/chunks/{chunk-JOZ47MV6.js → chunk-BFIXUKOR.js} +1 -1
- package/dist/cli/chunks/chunk-BHPTHC5O.js +4 -0
- package/dist/cli/chunks/{chunk-OIDWDGLG.js → chunk-BITFGVZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-ONR2NXXD.js → chunk-BL6273KR.js} +3 -3
- package/dist/cli/chunks/{chunk-BLG7SH4A.js → chunk-BOIUENWW.js} +1 -1
- package/dist/cli/chunks/{chunk-T77GZF4B.js → chunk-BT3MI2BW.js} +1 -1
- package/dist/cli/chunks/{chunk-UYUJT6QO.js → chunk-BTBJ2NLH.js} +2 -2
- package/dist/cli/chunks/{chunk-YMW57PEL.js → chunk-BUVJIVFG.js} +1 -1
- package/dist/cli/chunks/{chunk-QUORH2MG.js → chunk-BZIPW2PA.js} +8 -8
- package/dist/cli/chunks/{chunk-GVVFTFMB.js → chunk-C647D42G.js} +2 -2
- package/dist/cli/chunks/{chunk-AJUBT4NP.js → chunk-CBWM5NOO.js} +3 -3
- package/dist/cli/chunks/{chunk-F2OPFVQH.js → chunk-CIEXUYY7.js} +1 -1
- package/dist/cli/chunks/{chunk-QGOWNVVG.js → chunk-CLUHGBLN.js} +4 -4
- package/dist/cli/chunks/{chunk-WOV6XI3A.js → chunk-CQEWL32R.js} +1 -1
- package/dist/cli/chunks/{chunk-3QJU4Q4R.js → chunk-CXUC7YKA.js} +2 -2
- package/dist/cli/chunks/{chunk-HZY42OVU.js → chunk-D2Y36V5J.js} +2 -2
- package/dist/cli/chunks/{chunk-WF6UISKW.js → chunk-DSJJHPPS.js} +4 -4
- package/dist/cli/chunks/{chunk-FYPX5WBJ.js → chunk-DZHXCOSK.js} +1 -1
- package/dist/cli/chunks/{chunk-TXSPBLBT.js → chunk-EBV3WFIR.js} +2 -2
- package/dist/cli/chunks/{chunk-Y6AKKQIQ.js → chunk-EKO5QL2B.js} +1 -1
- package/dist/cli/chunks/{chunk-MZB2UV2O.js → chunk-EMOZ5O5S.js} +1 -1
- package/dist/cli/chunks/{chunk-23CX7JNL.js → chunk-ES7TAJRJ.js} +2 -2
- package/dist/cli/chunks/{chunk-Z4Q5PCRZ.js → chunk-EXQGHTPD.js} +4 -4
- package/dist/cli/chunks/{chunk-A2VUCUTT.js → chunk-F2WAB4WK.js} +2 -2
- package/dist/cli/chunks/{chunk-CQNMGK6Y.js → chunk-F57FTFWS.js} +2 -2
- package/dist/cli/chunks/{chunk-OEPNNLR4.js → chunk-F6JJNBE5.js} +1 -1
- package/dist/cli/chunks/{chunk-UBJG3IHT.js → chunk-FRC7AFB4.js} +2 -2
- package/dist/cli/chunks/{chunk-2G63VIJE.js → chunk-G36RZF2Y.js} +1 -1
- package/dist/cli/chunks/{chunk-YRHTQZU4.js → chunk-G3C7Z6FO.js} +2 -2
- package/dist/cli/chunks/{chunk-B4I43GE2.js → chunk-GA63ESNT.js} +2 -2
- package/dist/cli/chunks/{chunk-7QYOTUOX.js → chunk-GHMJFICO.js} +2 -2
- package/dist/cli/chunks/{chunk-HYOPJHHW.js → chunk-GK5WLUX3.js} +1 -1
- package/dist/cli/chunks/{chunk-A5MA7A23.js → chunk-GQJ4QDEN.js} +6 -6
- package/dist/cli/chunks/{chunk-UA7TDVL7.js → chunk-GVLRE3BV.js} +4 -4
- package/dist/cli/chunks/{chunk-25P6JA6V.js → chunk-H5UH234L.js} +1 -1
- package/dist/cli/chunks/{chunk-BE4KALTE.js → chunk-HBAFXWSO.js} +1 -1
- package/dist/cli/chunks/{chunk-EGOIIUBD.js → chunk-HE3BDBAO.js} +2 -2
- package/dist/cli/chunks/{chunk-P2UPYSDJ.js → chunk-HHANMCD2.js} +1 -1
- package/dist/cli/chunks/{chunk-ZUOVNFXK.js → chunk-HPVYJ6JH.js} +2 -2
- package/dist/cli/chunks/{chunk-RKI3IQKQ.js → chunk-I6NZFBT3.js} +3 -3
- package/dist/cli/chunks/{chunk-QVH5Y7AP.js → chunk-ISBOHF6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-IWFFO6VT.js → chunk-J24AJEDE.js} +2 -2
- package/dist/cli/chunks/{chunk-5GFKTJ65.js → chunk-J5HTQHJK.js} +2 -2
- package/dist/cli/chunks/{chunk-LY7MFGBD.js → chunk-JDOVO4E4.js} +150 -149
- package/dist/cli/chunks/chunk-JQAJUXRE.js +2 -0
- package/dist/cli/chunks/{chunk-HXXHMLJ5.js → chunk-JRK5GX56.js} +1 -1
- package/dist/cli/chunks/{chunk-36VKMAMN.js → chunk-JRLZ7LZ3.js} +2 -2
- package/dist/cli/chunks/{chunk-6PJPQGF4.js → chunk-JTOFLDU7.js} +2 -2
- package/dist/cli/chunks/{chunk-CVOQ6ESD.js → chunk-K6EOHGKS.js} +2 -2
- package/dist/cli/chunks/{chunk-LU2EDWQK.js → chunk-KKXH25IH.js} +2 -2
- package/dist/cli/chunks/{chunk-EYXE2XKP.js → chunk-KNSQWM2E.js} +2 -2
- package/dist/cli/chunks/{chunk-IEJ7ZV3M.js → chunk-L5T32SRF.js} +1 -1
- package/dist/cli/chunks/{chunk-BEFTQVEW.js → chunk-LKFBW2QM.js} +2 -2
- package/dist/cli/chunks/{chunk-C3FXFU2T.js → chunk-LMAI74EP.js} +1 -1
- package/dist/cli/chunks/{chunk-P7XSPP5D.js → chunk-LQVS5IWH.js} +2 -2
- package/dist/cli/chunks/{chunk-4EKV7PHB.js → chunk-LRGTPUJA.js} +2 -2
- package/dist/cli/chunks/{chunk-MT7UNBZ7.js → chunk-LTHV4PIG.js} +2 -2
- package/dist/cli/chunks/{chunk-B2YGVSOP.js → chunk-M7QKCHLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-H5RQPO3X.js → chunk-N3ASALOL.js} +2 -2
- package/dist/cli/chunks/{chunk-MQZ53OR3.js → chunk-NEXBTLN6.js} +2 -2
- package/dist/cli/chunks/{chunk-BD7FEUN3.js → chunk-NJEEKYEP.js} +3 -3
- package/dist/cli/chunks/{chunk-UOI6ULCH.js → chunk-NWUFTLSF.js} +2 -2
- package/dist/cli/chunks/{chunk-RT6O2HW2.js → chunk-O4QB2GFL.js} +2 -2
- package/dist/cli/chunks/{chunk-MZMG6CUJ.js → chunk-OA75C4HY.js} +2 -2
- package/dist/cli/chunks/{chunk-HYFQUWNB.js → chunk-OVMG6EEF.js} +2 -2
- package/dist/cli/chunks/{chunk-FSSR6WBE.js → chunk-OX7MJFLC.js} +2 -2
- package/dist/cli/chunks/{chunk-ENK44A6Q.js → chunk-OZJQN7YE.js} +2 -2
- package/dist/cli/chunks/{chunk-LXZMP3VX.js → chunk-PFXCRRR6.js} +25 -25
- package/dist/cli/chunks/{chunk-WIH522AP.js → chunk-PVJLQ2YZ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZUB5YOCM.js → chunk-QDRFLM77.js} +2 -2
- package/dist/cli/chunks/{chunk-NHUGHAY6.js → chunk-QH7C4PTX.js} +1 -1
- package/dist/cli/chunks/{chunk-VXKWNRGA.js → chunk-QKM4XT2F.js} +2 -2
- package/dist/cli/chunks/{chunk-ON2UTP2U.js → chunk-QP7EKLWU.js} +2 -2
- package/dist/cli/chunks/{chunk-KUHLTVWC.js → chunk-QPACHVDI.js} +1 -1
- package/dist/cli/chunks/{chunk-PCJQCEBA.js → chunk-QQVE65ER.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3NSU24F.js → chunk-QYCZYJH7.js} +2 -2
- package/dist/cli/chunks/{chunk-AEUEMVJK.js → chunk-R6I5I724.js} +2 -2
- package/dist/cli/chunks/{chunk-5D7ZFWDS.js → chunk-RJJIPTVH.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWEKAEEV.js → chunk-RM6OC35G.js} +1 -1
- package/dist/cli/chunks/{chunk-ZELWDJXT.js → chunk-RTD4U7IW.js} +2 -2
- package/dist/cli/chunks/{chunk-O5V7RHVG.js → chunk-SKJQKOFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-6RD44SCE.js → chunk-SMBGK7XI.js} +1 -1
- package/dist/cli/chunks/{chunk-ND4QTZOL.js → chunk-SPS472C5.js} +2 -2
- package/dist/cli/chunks/{chunk-TFK2AYIN.js → chunk-SUNXA2UR.js} +2 -2
- package/dist/cli/chunks/{chunk-RDGPXENG.js → chunk-SVP3BP52.js} +2 -2
- package/dist/cli/chunks/{chunk-NBLDBVAW.js → chunk-T4WQPE77.js} +1 -1
- package/dist/cli/chunks/{chunk-ZS4XVJGV.js → chunk-T53ZN4NO.js} +2 -2
- package/dist/cli/chunks/chunk-T6W2EYHC.js +2 -0
- package/dist/cli/chunks/{chunk-JZT7BU44.js → chunk-T7YCNOW5.js} +2 -2
- package/dist/cli/chunks/{chunk-EADSQN5T.js → chunk-TCQWVVSR.js} +1 -1
- package/dist/cli/chunks/{chunk-XYLQZWF6.js → chunk-TGRHO4ES.js} +2 -2
- package/dist/cli/chunks/{chunk-QPLSYEWJ.js → chunk-TP7L4EX6.js} +2 -2
- package/dist/cli/chunks/{chunk-N5XOXPHZ.js → chunk-TT45RCLN.js} +2 -2
- package/dist/cli/chunks/{chunk-OZGIOKEA.js → chunk-TUZNWRYC.js} +1 -1
- package/dist/cli/chunks/{chunk-53BXTTRO.js → chunk-U2QTL5T2.js} +3 -3
- package/dist/cli/chunks/chunk-U64QORFO.js +2 -0
- package/dist/cli/chunks/{chunk-SRPLERER.js → chunk-UHLZKH6B.js} +4 -4
- package/dist/cli/chunks/{chunk-HPWWYT67.js → chunk-UIWXKRTK.js} +2 -2
- package/dist/cli/chunks/{chunk-XWYELBZS.js → chunk-UNFE4RPV.js} +1 -1
- package/dist/cli/chunks/{chunk-FW4DJ4FJ.js → chunk-UQGIC5OX.js} +1 -1
- package/dist/cli/chunks/{chunk-GLGKQX2V.js → chunk-VAXTPLO3.js} +2 -2
- package/dist/cli/chunks/{chunk-VYDVI6FZ.js → chunk-VCSNNLWL.js} +2 -2
- package/dist/cli/chunks/{chunk-J7AQZLIH.js → chunk-VSPNIDQK.js} +4 -4
- package/dist/cli/chunks/{chunk-EIGRV3J6.js → chunk-VV2JVYOI.js} +2 -2
- package/dist/cli/chunks/{chunk-CBONQM5D.js → chunk-VW7AXJQS.js} +2 -2
- package/dist/cli/chunks/{chunk-O6MO5KMR.js → chunk-W7JUD4EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-QFETNCNN.js → chunk-WFKE7NZ5.js} +2 -2
- package/dist/cli/chunks/{chunk-ROVZSZCS.js → chunk-WVEHKAIH.js} +3 -3
- package/dist/cli/chunks/{chunk-YO4ESCB4.js → chunk-XAESN54Q.js} +1 -1
- package/dist/cli/chunks/{chunk-RKUAWQOF.js → chunk-XECZYQT5.js} +2 -2
- package/dist/cli/chunks/{chunk-RLW25X66.js → chunk-XFT4FYTC.js} +2 -2
- package/dist/cli/chunks/{chunk-SM2YJ2AL.js → chunk-YHX74M7C.js} +2 -2
- package/dist/cli/chunks/chunk-YIWBJ637.js +2 -0
- package/dist/cli/chunks/{chunk-IAENZ2DR.js → chunk-Z5UZOYQS.js} +2 -2
- package/dist/cli/chunks/{chunk-G367W7XR.js → chunk-Z6G3QVZ4.js} +12 -12
- package/dist/cli/chunks/ci-5LIV2HW5.js +82 -0
- package/dist/cli/chunks/{ci-output-RLS32FUY.js → ci-output-UO5BDFU4.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-MRCC7WCM.js → circuit-breaker-UQDPXYRD.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-LIZCEKDF.js → claude-flow-setup-62QES3QX.js} +2 -2
- package/dist/cli/chunks/client-AJZKCP4I.js +2 -0
- package/dist/cli/chunks/{cline-installer-T7H6R2RC.js → cline-installer-X7VZTSZG.js} +2 -2
- package/dist/cli/chunks/{code-XMBLI7OF.js → code-H3BF4L4H.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-QS7BYLEX.js → code-index-extractor-BJGFZGGL.js} +2 -2
- package/dist/cli/chunks/{codex-installer-6PGT5FM6.js → codex-installer-KVZWKU6S.js} +2 -2
- package/dist/cli/chunks/{completions-2A3WRXY2.js → completions-YMILE6V7.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-23HOOGJ7.js → complexity-analyzer-J26N2PWG.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-4FSF7B3N.js → continuedev-installer-MAR42OV7.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-A5GRQQUU.js → copilot-installer-CVOJF6OT.js} +2 -2
- package/dist/cli/chunks/core-handlers-MQHEMGDV.js +2 -0
- package/dist/cli/chunks/{cost-tracker-Z4STQ5VB.js → cost-tracker-SXLWXE55.js} +2 -2
- package/dist/cli/chunks/{coverage-NUPP6KZZ.js → coverage-D7HCHFP3.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +2 -0
- package/dist/cli/chunks/{cursor-installer-FVJ7ROPJ.js → cursor-installer-X37VHIKW.js} +2 -2
- package/dist/cli/chunks/{daemon-D662EX5N.js → daemon-JN7SOH6F.js} +4 -4
- package/dist/cli/chunks/{daemon-7ZZA2MMN.js → daemon-LIW47IDM.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-IB4TQ2KA.js → dag-attention-scheduler-QCHHIZBT.js} +2 -2
- package/dist/cli/chunks/{detect-LGLBZN4I.js → detect-WRFCWAX5.js} +2 -2
- package/dist/cli/chunks/{dist-node-Z3OL42YE.js → dist-node-6FWT4XZO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-L3CLNL7U.js → domain-handler-SNFPNMRT.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GQ3V5X6L.js → domain-plugins-MXKHH62P.js} +2 -2
- package/dist/cli/chunks/domain-transfer-47UJNERX.js +2 -0
- package/dist/cli/chunks/dream-OSWAITPT.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-UGD6USYH.js → embed-and-insert-pattern-LZFAUNBQ.js} +2 -2
- package/dist/cli/chunks/{eval-3B7UIYGY.js → eval-AMUXTMJB.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-3RQ4NYY3.js → experience-capture-middleware-3D65TR2C.js} +4 -4
- package/dist/cli/chunks/{fast-paths-QOSAEPYD.js → fast-paths-Y7BBMM56.js} +2 -2
- package/dist/cli/chunks/{feature-flags-TLF4NKOH.js → feature-flags-JMQQ7JW4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-3S5TH6P4.js → feature-flags-VESRRQ6V.js} +2 -2
- package/dist/cli/chunks/{file-discovery-AEVMJRNB.js → file-discovery-JJKQQUV6.js} +2 -2
- package/dist/cli/chunks/{fleet-E6WTXWFL.js → fleet-WIGHICJF.js} +4 -4
- package/dist/cli/chunks/{gnn-wrapper-MCKH3AUU.js → gnn-wrapper-BFNPETTT.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-U7XENHRR.js → heartbeat-handler-HDXKTGUI.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +2 -0
- package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-5GW4SAEI.js → hnsw-legacy-bridge-6A7OTAPT.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-7BLZBK5T.js → hnswlib-node-LKV2H47B.js} +2 -2
- package/dist/cli/chunks/{hooks-F3O2SB6H.js → hooks-KDSFYQQG.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-PV4EKXHB.js → hypergraph-engine-GDLPEPUC.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VOWO5ZTW.js → hypergraph-handler-4UMFA2EW.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +2 -0
- package/dist/cli/chunks/{init-handler-ENJ5ONJX.js → init-handler-4GCHPQHD.js} +6 -6
- package/dist/cli/chunks/init-wizard-TAOPXHHD.js +2 -0
- package/dist/cli/chunks/kernel-6I6VZUWY.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-HNNJOOPE.js → kilocode-installer-HJZMT2G5.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-UZBIQ3IC.js → kiro-installer-WUPY67HG.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +2 -0
- package/dist/cli/chunks/{learning-YMLCVFUT.js → learning-AXKIS7IG.js} +4 -4
- package/dist/cli/chunks/{llm-router-YWTARCCT.js → llm-router-HUDPNZLJ.js} +4 -4
- package/dist/cli/chunks/llm-router-service-2D74XVM3.js +2 -0
- package/dist/cli/chunks/{load-DKE3F3IP.js → load-RM44POD7.js} +2 -2
- package/dist/cli/chunks/load-test-53FWOWNS.js +2 -0
- package/dist/cli/chunks/{mcp-5PSGIUCW.js → mcp-5JVQRBOP.js} +2 -2
- package/dist/cli/chunks/{memory-3L3O6JMM.js → memory-VGZ2V6PL.js} +5 -5
- package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +2 -0
- package/dist/cli/chunks/memory-handlers-EI537Z32.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-AEEO7IA4.js → multi-model-executor-WPRKCSCM.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-ABBO355U.js → opencode-installer-YAJMRCQO.js} +2 -2
- package/dist/cli/chunks/{orchestrator-E36Q7MKE.js → orchestrator-MUGWBUYP.js} +6 -6
- package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-H4XKSID4.js → pattern-usage-recorder-ZQJJ2YNG.js} +2 -2
- package/dist/cli/chunks/{pipeline-BGFEHXIN.js → pipeline-F4DXDUDC.js} +2 -2
- package/dist/cli/chunks/{platform-GK7ZVDJI.js → platform-HI3A3OWF.js} +2 -2
- package/dist/cli/chunks/{plugin-CAH2CKI6.js → plugin-XRITPTR7.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-M5EYRONA.js → prime-radiant-advanced-wasm-HHNJP7CQ.js} +2 -2
- package/dist/cli/chunks/{project-root-BSNZC243.js → project-root-2VN4WO2A.js} +2 -2
- package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +2 -0
- package/dist/cli/chunks/{protocol-handler-JDSSC2SF.js → protocol-handler-ZEVHSEBG.js} +2 -2
- package/dist/cli/chunks/{prove-ANPTOZJE.js → prove-C4BLZWBS.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +2 -0
- package/dist/cli/chunks/{quality-SXWGYRQR.js → quality-M3DTE4KK.js} +2 -2
- package/dist/cli/chunks/quality-gate-V6KS7ML3.js +7 -0
- package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +2 -0
- package/dist/cli/chunks/{real-embeddings-WSRYAOZM.js → real-embeddings-YWSE3IRT.js} +2 -2
- package/dist/cli/chunks/{ref-validation-AZ3LRWEK.js → ref-validation-ZWOTFA3T.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-2QKGFIEU.js → roocode-installer-GJBIWETD.js} +2 -2
- package/dist/cli/chunks/router-ZD4LXAWA.js +2 -0
- package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +2 -0
- package/dist/cli/chunks/{routing-handler-UYDC5MMD.js → routing-handler-CFYLGNAR.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-QXADPVEY.js → ruvector-commands-EDKG456B.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-GD4NBFKT.js → rvf-migration-coordinator-ZMEYMAI6.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-7SXG66IL.js → rvf-store-integrity-AH6PNJP6.js} +2 -2
- package/dist/cli/chunks/safe-db-F6TRB5KZ.js +2 -0
- package/dist/cli/chunks/schedule-HBD4BYTE.js +2 -0
- package/dist/cli/chunks/scheduler-6FYWPMQC.js +2 -0
- package/dist/cli/chunks/{security-YKB622PK.js → security-ZU2GW3ZM.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-KMLAV7JK.js → shared-rvf-adapter-5FOVSL3T.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-OYY27DFV.js → shared-rvf-dual-writer-IO4DC4XV.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +2 -0
- package/dist/cli/chunks/{standalone-memory-2DOABVLC.js → standalone-memory-3UXDZ7HI.js} +2 -2
- package/dist/cli/chunks/{status-handler-EXRKETV7.js → status-handler-264CHTWS.js} +2 -2
- package/dist/cli/chunks/{structural-health-2SKK6DU6.js → structural-health-E2QPUOZE.js} +2 -2
- package/dist/cli/chunks/{sync-UW7SX7GO.js → sync-2ACMWM7D.js} +2 -2
- package/dist/cli/chunks/{sync-DQ2YUNI6.js → sync-N2L2OST4.js} +2 -2
- package/dist/cli/chunks/{task-handler-LYQ6WYUY.js → task-handler-IB5CVOTY.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DIJO232S.js → task-handlers-QBMYNJHE.js} +3 -3
- package/dist/cli/chunks/{test-WRHZMUCW.js → test-7RGLRDSP.js} +6 -6
- package/dist/cli/chunks/{test-scheduling-HI23RXFK.js → test-scheduling-RJABJT2W.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-23SA6SWZ.js → token-bootstrap-JVHMHB72.js} +2 -2
- package/dist/cli/chunks/{token-usage-M7RRDPXO.js → token-usage-3ECHQVCY.js} +2 -2
- package/dist/cli/chunks/{transformers-4TC35KKS.js → transformers-KJH3IJWI.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-F4LTKAWD.js → tree-sitter-wasm-parser-XN6PFI32.js} +2 -2
- package/dist/cli/chunks/{types-NBXV6LXQ.js → types-5BAPXOLS.js} +2 -2
- package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +2 -0
- package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +2 -0
- package/dist/cli/chunks/{upgrade-4BGOU5RM.js → upgrade-S5NFQZID.js} +2 -2
- package/dist/cli/chunks/{validate-EDWAR63H.js → validate-BIBWOLJD.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-VI72CPR7.js → validate-swarm-WAA3LBHH.js} +2 -2
- package/dist/cli/chunks/visual-security-APOXJ3Q3.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-Y5XBRQXF.js → web-tree-sitter-OTBQTHAV.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VEX23WAF.js → windsurf-installer-NNQ22EW6.js} +2 -2
- package/dist/cli/chunks/witness-chain-7IP5IJGT.js +2 -0
- package/dist/cli/chunks/{witness-chain-3YNL6YGY.js → witness-chain-E7MUBOJW.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-MJZGZRWT.js → witness-chain-repair-FW4QSN4C.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-TTJYXTBE.js → witness-chain-verifier-YMROEBVL.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-EM6YXYOY.js → witness-key-manager-4CGRNDMJ.js} +2 -2
- package/dist/cli/chunks/{workflow-2RBDOM7V.js → workflow-4VRSTRAN.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +2 -0
- package/dist/cli/chunks/{wrappers-5OTAVVOV.js → wrappers-4M4UTGEU.js} +2 -2
- package/dist/cli/commands/ci.js +17 -6
- package/dist/cli/commands/quality-gate.js +6 -1
- package/dist/cli/index.js +7 -2
- package/dist/cli/process-store-cleanup.d.ts +7 -0
- package/dist/cli/process-store-cleanup.js +27 -0
- package/dist/cli/utils/ci-config.d.ts +3 -3
- package/dist/cli/utils/ci-config.js +202 -68
- package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
- package/dist/domains/quality-assessment/quality-evidence.js +7 -2
- package/dist/domains/test-execution/services/retry-handler.js +32 -13
- package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
- package/dist/domains/test-execution/services/test-executor.js +66 -22
- package/dist/init/fleet-integration.js +3 -2
- package/dist/init/init-wizard-steps.js +3 -2
- package/dist/init/phases/06-code-intelligence.js +6 -4
- package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
- package/dist/integrations/ruvector/sona-persistence.js +74 -20
- package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
- package/dist/integrations/ruvector/sona-wrapper.js +13 -0
- package/dist/kernel/memory-backend.js +5 -4
- package/dist/kernel/unified-memory.js +3 -2
- package/dist/learning/aqe-learning-engine.js +3 -2
- package/dist/mcp/bundle.js +440 -439
- package/dist/mcp/connection-pool.d.ts +2 -0
- package/dist/mcp/connection-pool.js +13 -2
- package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
- package/dist/mcp/handlers/memory-handlers.js +16 -6
- package/dist/mcp/protocol-server.js +29 -8
- package/dist/mcp/types.d.ts +2 -0
- package/dist/optimization/session-cache.js +13 -11
- package/dist/plugins/cache.js +10 -3
- package/dist/shared/embeddings/embedding-cache.js +4 -4
- package/dist/shared/llm/cache.js +7 -10
- package/dist/shared/retry-engine.js +4 -0
- package/dist/shared/test-runner-process.d.ts +10 -0
- package/dist/shared/test-runner-process.js +210 -0
- package/dist/validation/quality-verdict.js +3 -2
- package/dist/workers/quality-daemon/priority-queue.js +4 -1
- package/package.json +4 -4
- package/dist/cli/chunks/adapter-TVQKH65T.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-ULGTVVWE.js +0 -2
- package/dist/cli/chunks/base-W42BURDL.js +0 -2
- package/dist/cli/chunks/browser-workflow-HKGHFFFT.js +0 -2
- package/dist/cli/chunks/chunk-2IMSJ7IO.js +0 -2
- package/dist/cli/chunks/chunk-FBZC4IGB.js +0 -2
- package/dist/cli/chunks/chunk-MNQN7UZX.js +0 -4
- package/dist/cli/chunks/chunk-OXHF3L2T.js +0 -2
- package/dist/cli/chunks/chunk-PELENDDQ.js +0 -2
- package/dist/cli/chunks/chunk-TW3SR4TS.js +0 -2
- package/dist/cli/chunks/chunk-V6RE4YRQ.js +0 -2
- package/dist/cli/chunks/chunk-ZQZD55MN.js +0 -3
- package/dist/cli/chunks/ci-J3TDK5RA.js +0 -81
- package/dist/cli/chunks/client-3BD2DI4N.js +0 -2
- package/dist/cli/chunks/core-handlers-C3H2ZCS2.js +0 -2
- package/dist/cli/chunks/cross-domain-router-JCQ7SWDP.js +0 -2
- package/dist/cli/chunks/domain-transfer-MFCI76IY.js +0 -2
- package/dist/cli/chunks/dream-FTP33IJB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-HXBJVJL2.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-TU6WG2ME.js +0 -2
- package/dist/cli/chunks/hnsw-index-MS5KODD7.js +0 -2
- package/dist/cli/chunks/hybrid-backend-HT45LBHC.js +0 -2
- package/dist/cli/chunks/impact-analyzer-AP4AGTG5.js +0 -2
- package/dist/cli/chunks/init-wizard-I5DFZUQL.js +0 -2
- package/dist/cli/chunks/kernel-MISPSPPA.js +0 -2
- package/dist/cli/chunks/knowledge-graph-L26JESGE.js +0 -2
- package/dist/cli/chunks/llm-router-service-MWGC43ZA.js +0 -2
- package/dist/cli/chunks/load-test-H5ISNNM5.js +0 -2
- package/dist/cli/chunks/memory-backend-HWDNOBKW.js +0 -2
- package/dist/cli/chunks/memory-handlers-ZFDVQZM5.js +0 -2
- package/dist/cli/chunks/pattern-null-store-GQP6ICWK.js +0 -2
- package/dist/cli/chunks/protocol-executor-AD5A4DAI.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-W3Z2PKTR.js +0 -2
- package/dist/cli/chunks/quality-gate-GYNCA4ZY.js +0 -7
- package/dist/cli/chunks/queen-coordinator-HQRHLIJX.js +0 -2
- package/dist/cli/chunks/router-MTP5LH4H.js +0 -2
- package/dist/cli/chunks/routing-feedback-GWETVB4L.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-4UE5S7WP.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-PHH3HF4Q.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-KTLZBUWV.js +0 -2
- package/dist/cli/chunks/safe-db-FWWGAPVE.js +0 -2
- package/dist/cli/chunks/schedule-TPA4V4D5.js +0 -2
- package/dist/cli/chunks/scheduler-5ZTEPNDD.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-HPTT624C.js +0 -2
- package/dist/cli/chunks/unified-memory-OVFEPRPS.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-KKRSCZHR.js +0 -2
- package/dist/cli/chunks/unified-persistence-7GLR4RI3.js +0 -2
- package/dist/cli/chunks/visual-security-2FUM5GLI.js +0 -2
- package/dist/cli/chunks/witness-chain-MH6GA5L6.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-H6G65YKU.js +0 -2
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs';
|
|
8
8
|
import * as path from 'path';
|
|
9
|
-
import {
|
|
9
|
+
import { isCollection, isScalar, parseDocument, visit } from 'yaml';
|
|
10
10
|
// ============================================================================
|
|
11
11
|
// Default Config
|
|
12
12
|
// ============================================================================
|
|
@@ -100,89 +100,223 @@ export function parseCIConfigFile(filePath) {
|
|
|
100
100
|
}
|
|
101
101
|
return parseCIConfigContent(content, filePath);
|
|
102
102
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
const YAML_MAX_LINES = 10000;
|
|
104
|
+
const YAML_MAX_LINE_LENGTH = 10000;
|
|
105
|
+
const YAML_MAX_DEPTH = 20;
|
|
106
|
+
const UNSAFE_YAML_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
107
|
+
function isRecord(value) {
|
|
108
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) &&
|
|
109
|
+
(Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
110
|
+
}
|
|
111
|
+
/** Keep the previous parser's input bounds; reject unsafe expanded aliases too. */
|
|
112
|
+
function parseCIYAML(content) {
|
|
113
|
+
const lines = content.split('\n');
|
|
114
|
+
if (lines.length > YAML_MAX_LINES)
|
|
115
|
+
throw new Error(`YAML exceeds maximum allowed lines (${YAML_MAX_LINES})`);
|
|
116
|
+
if (lines.some(line => line.length > YAML_MAX_LINE_LENGTH)) {
|
|
117
|
+
throw new Error(`YAML exceeds maximum line length (${YAML_MAX_LINE_LENGTH})`);
|
|
118
|
+
}
|
|
119
|
+
const document = parseDocument(content, { prettyErrors: false, merge: true });
|
|
120
|
+
if (document.errors.length)
|
|
121
|
+
throw new Error(document.errors.map(error => error.message).join('; '));
|
|
122
|
+
visit(document, {
|
|
123
|
+
Collection: (_key, _node, ancestry) => {
|
|
124
|
+
if (ancestry.filter(isCollection).length >= YAML_MAX_DEPTH) {
|
|
125
|
+
throw new Error(`YAML exceeds maximum depth (${YAML_MAX_DEPTH})`);
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
Pair: (_key, pair) => {
|
|
129
|
+
if (isScalar(pair.key) && UNSAFE_YAML_KEYS.has(String(pair.key.value))) {
|
|
130
|
+
throw new Error(`Unsafe YAML key: ${pair.key.value}`);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
const parsed = document.contents === null ? {} : document.toJS({ maxAliasCount: 100 });
|
|
135
|
+
// Alias references may add nesting or cycles that the syntax tree does not show.
|
|
136
|
+
function checkExpanded(value, depth, ancestors) {
|
|
137
|
+
if (value === null || typeof value !== 'object')
|
|
138
|
+
return;
|
|
139
|
+
if (depth > YAML_MAX_DEPTH)
|
|
140
|
+
throw new Error(`YAML exceeds maximum depth (${YAML_MAX_DEPTH})`);
|
|
141
|
+
if (ancestors.has(value))
|
|
142
|
+
throw new Error('Cyclic YAML aliases are not supported');
|
|
143
|
+
ancestors.add(value);
|
|
144
|
+
for (const child of Object.values(value))
|
|
145
|
+
checkExpanded(child, depth + 1, ancestors);
|
|
146
|
+
ancestors.delete(value);
|
|
147
|
+
}
|
|
148
|
+
checkExpanded(parsed, 0, new Set());
|
|
149
|
+
if (!isRecord(parsed))
|
|
150
|
+
throw new Error('CI config must be a YAML mapping');
|
|
151
|
+
return parsed;
|
|
152
|
+
}
|
|
153
|
+
/** Parse CI YAML faithfully, validating typed fields before any phase executes. */
|
|
106
154
|
export function parseCIConfigContent(content, sourcePath) {
|
|
107
|
-
const errors = [];
|
|
108
155
|
let parsed;
|
|
109
156
|
try {
|
|
110
|
-
parsed =
|
|
157
|
+
parsed = parseCIYAML(content);
|
|
111
158
|
}
|
|
112
159
|
catch (err) {
|
|
113
160
|
return { success: false, errors: [`Invalid YAML: ${err}`] };
|
|
114
161
|
}
|
|
115
|
-
|
|
116
|
-
const config =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (parsed.output && typeof parsed.output === 'object') {
|
|
125
|
-
const out = parsed.output;
|
|
126
|
-
if (out.format)
|
|
127
|
-
config.output.format = out.format;
|
|
128
|
-
if (out.directory)
|
|
129
|
-
config.output.directory = out.directory;
|
|
130
|
-
if (out.combined_report !== undefined)
|
|
131
|
-
config.output.combinedReport = out.combined_report;
|
|
132
|
-
}
|
|
133
|
-
// Parse quality_gate section
|
|
134
|
-
if (parsed.quality_gate && typeof parsed.quality_gate === 'object') {
|
|
135
|
-
const qg = parsed.quality_gate;
|
|
136
|
-
if (qg.enforced !== undefined)
|
|
137
|
-
config.qualityGate.enforced = qg.enforced;
|
|
138
|
-
if (qg.thresholds && typeof qg.thresholds === 'object') {
|
|
139
|
-
const th = qg.thresholds;
|
|
140
|
-
if (th.coverage !== undefined)
|
|
141
|
-
config.qualityGate.thresholds.coverage = th.coverage;
|
|
142
|
-
if (th.security !== undefined)
|
|
143
|
-
config.qualityGate.thresholds.security = th.security;
|
|
144
|
-
if (th.quality !== undefined)
|
|
145
|
-
config.qualityGate.thresholds.quality = th.quality;
|
|
162
|
+
const errors = [];
|
|
163
|
+
const config = getDefaultCIConfig();
|
|
164
|
+
function readString(record, key, fallback, label) {
|
|
165
|
+
const value = record[key];
|
|
166
|
+
if (value === undefined)
|
|
167
|
+
return fallback;
|
|
168
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
169
|
+
errors.push(`${label} must be a non-empty string`);
|
|
170
|
+
return fallback;
|
|
146
171
|
}
|
|
172
|
+
return value;
|
|
147
173
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
174
|
+
function readBoolean(record, key, fallback, label) {
|
|
175
|
+
const value = record[key];
|
|
176
|
+
if (value === undefined)
|
|
177
|
+
return fallback;
|
|
178
|
+
if (typeof value !== 'boolean') {
|
|
179
|
+
errors.push(`${label} must be a boolean`);
|
|
180
|
+
return fallback;
|
|
181
|
+
}
|
|
182
|
+
return value;
|
|
183
|
+
}
|
|
184
|
+
if (parsed.version !== undefined) {
|
|
185
|
+
if (typeof parsed.version === 'number' && Number.isFinite(parsed.version))
|
|
186
|
+
config.version = String(parsed.version);
|
|
187
|
+
else
|
|
188
|
+
config.version = readString(parsed, 'version', config.version, 'version');
|
|
189
|
+
}
|
|
190
|
+
config.name = readString(parsed, 'name', config.name, 'name');
|
|
191
|
+
if (parsed.output !== undefined) {
|
|
192
|
+
if (!isRecord(parsed.output))
|
|
193
|
+
errors.push('output must be a mapping');
|
|
194
|
+
else {
|
|
195
|
+
config.output.format = readString(parsed.output, 'format', config.output.format, 'output.format');
|
|
196
|
+
config.output.directory = readString(parsed.output, 'directory', config.output.directory, 'output.directory');
|
|
197
|
+
config.output.combinedReport = readBoolean(parsed.output, 'combined_report', config.output.combinedReport, 'output.combined_report');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (parsed.quality_gate !== undefined) {
|
|
201
|
+
if (!isRecord(parsed.quality_gate))
|
|
202
|
+
errors.push('quality_gate must be a mapping');
|
|
203
|
+
else {
|
|
204
|
+
const gate = parsed.quality_gate;
|
|
205
|
+
config.qualityGate.enforced = readBoolean(gate, 'enforced', config.qualityGate.enforced, 'quality_gate.enforced');
|
|
206
|
+
if (gate.thresholds !== undefined) {
|
|
207
|
+
if (!isRecord(gate.thresholds))
|
|
208
|
+
errors.push('quality_gate.thresholds must be a mapping');
|
|
209
|
+
else {
|
|
210
|
+
for (const key of ['coverage', 'quality']) {
|
|
211
|
+
const value = gate.thresholds[key];
|
|
212
|
+
if (value === undefined)
|
|
213
|
+
continue;
|
|
214
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 100) {
|
|
215
|
+
errors.push(`quality_gate.thresholds.${key} must be a finite number between 0 and 100`);
|
|
216
|
+
}
|
|
217
|
+
else
|
|
218
|
+
config.qualityGate.thresholds[key] = value;
|
|
219
|
+
}
|
|
220
|
+
if (gate.thresholds.security !== undefined) {
|
|
221
|
+
const value = gate.thresholds.security;
|
|
222
|
+
if (typeof value !== 'string' || !['none', 'low', 'medium', 'high'].includes(value)) {
|
|
223
|
+
errors.push('quality_gate.thresholds.security must be none, low, medium or high');
|
|
224
|
+
}
|
|
225
|
+
else
|
|
226
|
+
config.qualityGate.thresholds.security = value;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
164
229
|
}
|
|
165
|
-
const phase = {
|
|
166
|
-
name: p.name,
|
|
167
|
-
type: p.type,
|
|
168
|
-
enabled: p.enabled !== false,
|
|
169
|
-
config: p.config || {},
|
|
170
|
-
continueOnFailure: p.continue_on_failure || false,
|
|
171
|
-
timeout: p.timeout || 300,
|
|
172
|
-
};
|
|
173
|
-
config.phases.push(phase);
|
|
174
230
|
}
|
|
175
231
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
232
|
+
if (parsed.phases !== undefined) {
|
|
233
|
+
config.phases = [];
|
|
234
|
+
if (!Array.isArray(parsed.phases))
|
|
235
|
+
errors.push('phases must be a sequence');
|
|
236
|
+
else
|
|
237
|
+
for (const [index, value] of parsed.phases.entries()) {
|
|
238
|
+
if (!isRecord(value)) {
|
|
239
|
+
errors.push(`Phase ${index + 1} must be a mapping`);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (value.name === undefined)
|
|
243
|
+
errors.push(`Phase ${index + 1} must have a name`);
|
|
244
|
+
const name = readString(value, 'name', '', `Phase ${index + 1} name`);
|
|
245
|
+
const validTypes = ['test', 'coverage', 'security', 'quality-gate', 'code-intelligence', 'custom'];
|
|
246
|
+
if (!validTypes.includes(value.type)) {
|
|
247
|
+
errors.push(`Phase "${name}" has invalid type "${value.type}". Valid: ${validTypes.join(', ')}`);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
let timeout = 300;
|
|
251
|
+
if (value.timeout !== undefined) {
|
|
252
|
+
if (typeof value.timeout !== 'number' || !Number.isFinite(value.timeout) || value.timeout <= 0) {
|
|
253
|
+
errors.push(`Phase "${name}" timeout must be a positive finite number`);
|
|
254
|
+
}
|
|
255
|
+
else
|
|
256
|
+
timeout = value.timeout;
|
|
257
|
+
}
|
|
258
|
+
if (value.config !== undefined && !isRecord(value.config))
|
|
259
|
+
errors.push(`Phase "${name}" config must be a mapping`);
|
|
260
|
+
config.phases.push({
|
|
261
|
+
name, type: value.type, timeout,
|
|
262
|
+
enabled: readBoolean(value, 'enabled', true, `Phase "${name}" enabled`),
|
|
263
|
+
continueOnFailure: readBoolean(value, 'continue_on_failure', false, `Phase "${name}" continue_on_failure`),
|
|
264
|
+
config: isRecord(value.config) ? { ...value.config } : {},
|
|
265
|
+
});
|
|
266
|
+
}
|
|
179
267
|
}
|
|
180
|
-
if (config.phases.length === 0)
|
|
268
|
+
if (config.phases.length === 0)
|
|
181
269
|
errors.push('Config must have at least one phase');
|
|
270
|
+
// Paths in a file are relative to that file's project, not the caller's cwd.
|
|
271
|
+
// Resolve existing ancestors too so a symlink cannot bypass containment.
|
|
272
|
+
const root = path.resolve(sourcePath ? path.dirname(sourcePath) : process.cwd());
|
|
273
|
+
function canonicalAncestor(candidate) {
|
|
274
|
+
let ancestor = candidate;
|
|
275
|
+
const suffix = [];
|
|
276
|
+
while (!fs.existsSync(ancestor)) {
|
|
277
|
+
const parent = path.dirname(ancestor);
|
|
278
|
+
if (parent === ancestor)
|
|
279
|
+
break;
|
|
280
|
+
suffix.unshift(path.basename(ancestor));
|
|
281
|
+
ancestor = parent;
|
|
282
|
+
}
|
|
283
|
+
return path.resolve(fs.realpathSync(ancestor), ...suffix);
|
|
182
284
|
}
|
|
183
|
-
|
|
184
|
-
|
|
285
|
+
function containedPath(value, label) {
|
|
286
|
+
if (typeof value !== 'string' || !value.trim() || value.includes('\0')) {
|
|
287
|
+
errors.push(`${label} must be a non-empty relative path`);
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
const resolved = path.resolve(root, value);
|
|
291
|
+
const relative = path.relative(root, resolved);
|
|
292
|
+
if (path.isAbsolute(value) || path.win32.isAbsolute(value) ||
|
|
293
|
+
relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
294
|
+
errors.push(`${label} must stay inside the project and use a relative path`);
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
const realRelative = path.relative(canonicalAncestor(root), canonicalAncestor(resolved));
|
|
299
|
+
if (realRelative === '..' || realRelative.startsWith(`..${path.sep}`) || path.isAbsolute(realRelative)) {
|
|
300
|
+
errors.push(`${label} must stay inside the project (symlink escapes are not allowed)`);
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
errors.push(`${label} cannot be resolved safely: ${error}`);
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
return sourcePath ? resolved : value;
|
|
309
|
+
}
|
|
310
|
+
config.output.directory = containedPath(config.output.directory, 'output.directory') ?? config.output.directory;
|
|
311
|
+
for (const phase of config.phases) {
|
|
312
|
+
if (phase.config.target !== undefined) {
|
|
313
|
+
const target = containedPath(phase.config.target, `Phase "${phase.name}" config.target`);
|
|
314
|
+
if (target !== undefined)
|
|
315
|
+
phase.config.target = target;
|
|
316
|
+
}
|
|
185
317
|
}
|
|
318
|
+
if (errors.length > 0)
|
|
319
|
+
return { success: false, config, errors };
|
|
186
320
|
return { success: true, config, errors: [], configPath: sourcePath };
|
|
187
321
|
}
|
|
188
322
|
/**
|
|
@@ -33,7 +33,9 @@ export declare function loadQualityEvidence(memory: MemoryBackend, options?: {
|
|
|
33
33
|
now?: number;
|
|
34
34
|
maxAgeMs?: number;
|
|
35
35
|
}): Promise<QualityEvidenceValues>;
|
|
36
|
-
export declare function evaluateQualityEvidence(values: QualityEvidenceValues
|
|
36
|
+
export declare function evaluateQualityEvidence(values: QualityEvidenceValues, thresholds?: {
|
|
37
|
+
coverage?: number;
|
|
38
|
+
}): {
|
|
37
39
|
passed: boolean;
|
|
38
40
|
checks: EvaluatedQualityCheck[];
|
|
39
41
|
recommendations: string[];
|
|
@@ -91,9 +91,14 @@ export async function loadQualityEvidence(memory, options = {}) {
|
|
|
91
91
|
}
|
|
92
92
|
return values;
|
|
93
93
|
}
|
|
94
|
-
export function evaluateQualityEvidence(values) {
|
|
94
|
+
export function evaluateQualityEvidence(values, thresholds = {}) {
|
|
95
|
+
if (thresholds.coverage !== undefined && (!Number.isFinite(thresholds.coverage) || thresholds.coverage < 0 || thresholds.coverage > 100)) {
|
|
96
|
+
throw new Error('Coverage quality threshold must be a finite number between 0 and 100.');
|
|
97
|
+
}
|
|
95
98
|
const checks = QUALITY_METRICS.map((name) => {
|
|
96
|
-
const threshold =
|
|
99
|
+
const threshold = name === 'coverage' && thresholds.coverage !== undefined
|
|
100
|
+
? { ...DEFAULT_QUALITY_THRESHOLDS[name], value: thresholds.coverage }
|
|
101
|
+
: DEFAULT_QUALITY_THRESHOLDS[name];
|
|
97
102
|
const value = values[name];
|
|
98
103
|
return {
|
|
99
104
|
name,
|
|
@@ -11,6 +11,7 @@ import { TEST_EXECUTION_CONSTANTS, RETRY_CONSTANTS } from '../../constants.js';
|
|
|
11
11
|
import { toError } from '../../../shared/error-utils.js';
|
|
12
12
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
13
13
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
14
|
+
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
14
15
|
const DEFAULT_RETRY_CONFIG = {
|
|
15
16
|
simulateForTesting: false,
|
|
16
17
|
simulatedRetrySuccessRate: RETRY_CONSTANTS.DEFAULT_FLAKY_PASS_RATE,
|
|
@@ -379,6 +380,8 @@ export class RetryHandlerService {
|
|
|
379
380
|
let stdout = '';
|
|
380
381
|
let stderr = '';
|
|
381
382
|
let timedOut = false;
|
|
383
|
+
let termination;
|
|
384
|
+
const timeoutError = new Error(`Test execution timed out after ${timeout}ms for command: ${command} ${args.join(' ')}`);
|
|
382
385
|
const settle = (fn, value) => {
|
|
383
386
|
report?.cleanup();
|
|
384
387
|
fn(value);
|
|
@@ -387,13 +390,20 @@ export class RetryHandlerService {
|
|
|
387
390
|
// Arguments are passed as array to avoid shell interpretation
|
|
388
391
|
const proc = spawn(command, args, {
|
|
389
392
|
cwd,
|
|
393
|
+
detached: process.platform !== 'win32',
|
|
390
394
|
env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
|
|
391
395
|
});
|
|
396
|
+
const untrackExit = trackTestRunnerExit(proc);
|
|
392
397
|
const timeoutHandle = setTimeout(() => {
|
|
393
398
|
timedOut = true;
|
|
394
|
-
proc
|
|
395
|
-
|
|
396
|
-
|
|
399
|
+
termination = terminateTestRunner(proc);
|
|
400
|
+
termination.catch(error => {
|
|
401
|
+
logger.warn(`Retry runner cleanup failed: ${toError(error).message}`);
|
|
402
|
+
// A denied cleanup can leave the root alive: preserve the timeout
|
|
403
|
+
// outcome immediately, keeping artifacts because settlement is unknown.
|
|
404
|
+
reject(timeoutError);
|
|
405
|
+
});
|
|
406
|
+
termination.then(untrackExit, () => undefined);
|
|
397
407
|
}, timeout);
|
|
398
408
|
proc.stdout?.on('data', (data) => {
|
|
399
409
|
stdout += data.toString();
|
|
@@ -404,9 +414,10 @@ export class RetryHandlerService {
|
|
|
404
414
|
proc.on('close', (code) => {
|
|
405
415
|
clearTimeout(timeoutHandle);
|
|
406
416
|
if (timedOut) {
|
|
407
|
-
settle(reject,
|
|
417
|
+
termination?.then(() => settle(reject, timeoutError), () => reject(timeoutError));
|
|
408
418
|
return;
|
|
409
419
|
}
|
|
420
|
+
untrackExit();
|
|
410
421
|
// Parse result based on exit code and output (Vitest writes the JSON
|
|
411
422
|
// report to the --outputFile; read it back rather than trusting stdout).
|
|
412
423
|
try {
|
|
@@ -422,6 +433,7 @@ export class RetryHandlerService {
|
|
|
422
433
|
});
|
|
423
434
|
proc.on('error', (err) => {
|
|
424
435
|
clearTimeout(timeoutHandle);
|
|
436
|
+
untrackExit();
|
|
425
437
|
report?.cleanup();
|
|
426
438
|
reject(new Error(`Failed to spawn test process: ${err.message}. ` +
|
|
427
439
|
`Command: ${command} ${args.join(' ')}. ` +
|
|
@@ -433,20 +445,23 @@ export class RetryHandlerService {
|
|
|
433
445
|
* Parse test runner output to determine pass/fail status
|
|
434
446
|
*/
|
|
435
447
|
parseTestResult(exitCode, stdout, stderr) {
|
|
436
|
-
// A
|
|
448
|
+
// A retry can clear a prior failure only when the report proves a test
|
|
449
|
+
// actually passed. Empty/fully skipped selections can also exit zero.
|
|
437
450
|
try {
|
|
438
451
|
// Vitest JSON output
|
|
439
452
|
const vitestMatch = stdout.match(/\{[\s\S]*"testResults"[\s\S]*\}/);
|
|
440
453
|
if (vitestMatch) {
|
|
441
454
|
const result = safeJsonParse(vitestMatch[0]);
|
|
442
455
|
if (exitCode === 0 && result.success !== false
|
|
443
|
-
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
456
|
+
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
457
|
+
&& Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
|
|
444
458
|
return { passed: true };
|
|
445
459
|
}
|
|
446
460
|
const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
|
|
447
461
|
return {
|
|
448
462
|
passed: false,
|
|
449
|
-
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
463
|
+
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
464
|
+
|| (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
|
|
450
465
|
};
|
|
451
466
|
}
|
|
452
467
|
// Jest JSON output
|
|
@@ -454,34 +469,38 @@ export class RetryHandlerService {
|
|
|
454
469
|
if (jestMatch) {
|
|
455
470
|
const result = safeJsonParse(jestMatch[0]);
|
|
456
471
|
if (exitCode === 0 && result.success !== false
|
|
457
|
-
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
472
|
+
&& result.numFailedTests === 0 && result.numFailedTestSuites === 0
|
|
473
|
+
&& Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
|
|
458
474
|
return { passed: true };
|
|
459
475
|
}
|
|
460
476
|
const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
|
|
461
477
|
return {
|
|
462
478
|
passed: false,
|
|
463
|
-
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
479
|
+
error: failedTest?.failureMessages?.join('\n') || stderr
|
|
480
|
+
|| (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
|
|
464
481
|
};
|
|
465
482
|
}
|
|
466
483
|
// Mocha JSON output
|
|
467
484
|
const mochaMatch = stdout.match(/\{[\s\S]*"stats"[\s\S]*"failures"[\s\S]*\}/);
|
|
468
485
|
if (mochaMatch) {
|
|
469
486
|
const result = safeJsonParse(mochaMatch[0]);
|
|
470
|
-
if (exitCode === 0 && result.stats?.failures === 0
|
|
487
|
+
if (exitCode === 0 && result.stats?.failures === 0
|
|
488
|
+
&& Number.isFinite(result.stats?.passes) && result.stats.passes > 0) {
|
|
471
489
|
return { passed: true };
|
|
472
490
|
}
|
|
473
491
|
const failure = result.failures?.[0];
|
|
474
492
|
return {
|
|
475
493
|
passed: false,
|
|
476
|
-
error: failure?.err?.message || stderr
|
|
494
|
+
error: failure?.err?.message || stderr
|
|
495
|
+
|| (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
|
|
477
496
|
};
|
|
478
497
|
}
|
|
479
498
|
}
|
|
480
499
|
catch {
|
|
481
|
-
//
|
|
500
|
+
// Unreadable output cannot prove that the retry executed a passing test.
|
|
482
501
|
}
|
|
483
502
|
if (exitCode === 0)
|
|
484
|
-
return { passed:
|
|
503
|
+
return { passed: false, error: 'Retry runner did not report any passing tests.' };
|
|
485
504
|
// Non-zero exit code means failure
|
|
486
505
|
const errorOutput = stderr || stdout || `Test failed with exit code ${exitCode}`;
|
|
487
506
|
return {
|
|
@@ -170,9 +170,9 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
170
170
|
*/
|
|
171
171
|
private extractCoverageFromJson;
|
|
172
172
|
/**
|
|
173
|
-
* Read coverage from
|
|
174
|
-
*
|
|
175
|
-
*
|
|
173
|
+
* Read coverage from the private output directory of a completed runner.
|
|
174
|
+
* Setting the directory does not enable coverage; project configuration
|
|
175
|
+
* still decides whether coverage is collected.
|
|
176
176
|
*/
|
|
177
177
|
private readCoverageFromDisk;
|
|
178
178
|
private storeResults;
|