agentic-qe 3.13.0 → 3.13.1
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/.agents/skills/aqe-plan-quality/SKILL.md +25 -0
- package/.agents/skills/aqe-plan-quality/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-plan-quality/references/qe-routing.md +22 -0
- package/.agents/skills/aqe-review-quality/SKILL.md +24 -0
- package/.agents/skills/aqe-review-quality/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-review-quality/references/quality-gates.md +20 -0
- package/.agents/skills/aqe-test-change/SKILL.md +26 -0
- package/.agents/skills/aqe-test-change/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-test-change/references/test-specialties.md +23 -0
- package/.claude/helpers/ruflo-hook.cjs +5 -1
- package/.claude/skills/skills-manifest.json +1 -1
- package/.codex/hooks/aqe-codex-hook.cjs +69 -0
- package/.codex/hooks/ruflo-codex-hook.cjs +94 -0
- package/.codex/hooks.json +169 -0
- package/CHANGELOG.md +94 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-VRZNL53W.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-ACX2DK7Y.js → agent-booster-wasm-4VM3DE42.js} +2 -2
- package/dist/cli/chunks/{agent-handler-B45WP4ZJ.js → agent-handler-ZDLMZQQX.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-QQLZDE56.js → agent-memory-branch-P72MDHHV.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-XCNMNERX.js +2 -0
- package/dist/cli/chunks/{arena-G3IKZAG5.js → arena-55FZGKEV.js} +4 -4
- package/dist/cli/chunks/{arena-SDB7723R.js → arena-GCRBQ26R.js} +2 -2
- package/dist/cli/chunks/{audit-GY46XUZA.js → audit-VYAYVLIV.js} +3 -3
- package/dist/cli/chunks/base-VZZNR4UR.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-RJPBJU2Q.js → better-sqlite3-JDDFYVCX.js} +2 -2
- package/dist/cli/chunks/{brain-handler-347CYMPN.js → brain-handler-IUKMRGWO.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-Z3ULBFSM.js → branch-enumerator-TUI3RWLX.js} +2 -2
- package/dist/cli/chunks/{browser-OYEIHD7F.js → browser-NBQTZYX2.js} +2 -2
- package/dist/cli/chunks/browser-workflow-5DZNIFUY.js +2 -0
- package/dist/cli/chunks/{chunk-2NRZYQSF.js → chunk-23MT7OBY.js} +2 -2
- package/dist/cli/chunks/{chunk-7UNY32PU.js → chunk-2CQAWYYE.js} +1 -1
- package/dist/cli/chunks/{chunk-ZLXBNNNT.js → chunk-2D2XFUKI.js} +2 -2
- package/dist/cli/chunks/{chunk-SHCTEXNH.js → chunk-2G2QWV7B.js} +2 -2
- package/dist/cli/chunks/{chunk-TZ73SXQ5.js → chunk-2ISLQU3G.js} +1 -1
- package/dist/cli/chunks/{chunk-VLNPJAVH.js → chunk-2OM3TDC4.js} +1 -1
- package/dist/cli/chunks/{chunk-JGM6XCCP.js → chunk-2XZ4BHWS.js} +1 -1
- package/dist/cli/chunks/{chunk-32ZGV4Q4.js → chunk-3F4XH4ZA.js} +1 -1
- package/dist/cli/chunks/{chunk-RDU4WTV2.js → chunk-3K4YC3GC.js} +2 -2
- package/dist/cli/chunks/chunk-3KGCBAUH.js +2 -0
- package/dist/cli/chunks/{chunk-DYUC7WFA.js → chunk-3Y6CHW67.js} +1 -1
- package/dist/cli/chunks/{chunk-3JVUWKCO.js → chunk-4QMWWYNU.js} +2 -2
- package/dist/cli/chunks/{chunk-L4LLA5U7.js → chunk-4WGSMODQ.js} +1 -1
- package/dist/cli/chunks/{chunk-KUA4HHU6.js → chunk-55WDVSCM.js} +2 -2
- package/dist/cli/chunks/{chunk-RVJPWRV6.js → chunk-5BB5DUL4.js} +2 -2
- package/dist/cli/chunks/{chunk-ZOXWASCC.js → chunk-6C3MZLYW.js} +2 -2
- package/dist/cli/chunks/{chunk-CFVEDUTW.js → chunk-6QKQFHS7.js} +2 -2
- package/dist/cli/chunks/{chunk-YFGAHNCG.js → chunk-6XZXMEK4.js} +3 -3
- package/dist/cli/chunks/{chunk-Z6QCOZ2H.js → chunk-7D7XFZZI.js} +2 -2
- package/dist/cli/chunks/{chunk-AO7AHX6K.js → chunk-7WEHZCSK.js} +2 -2
- package/dist/cli/chunks/{chunk-K5N6SLHO.js → chunk-A2MG3YXO.js} +1 -1
- package/dist/cli/chunks/{chunk-LXPB7H2P.js → chunk-AHTOWWSE.js} +1 -1
- package/dist/cli/chunks/{chunk-U2SW6KK5.js → chunk-AOMXMFDH.js} +2 -2
- package/dist/cli/chunks/{chunk-VSNRPMAZ.js → chunk-ARTLSAXO.js} +2 -2
- package/dist/cli/chunks/{chunk-FBBZHATF.js → chunk-AY7S7AWN.js} +1 -1
- package/dist/cli/chunks/{chunk-CYL2FV23.js → chunk-AYYDO52G.js} +2 -2
- package/dist/cli/chunks/chunk-BBLWZT5I.js +2 -0
- package/dist/cli/chunks/{chunk-QTU3CVOB.js → chunk-BF5BKSDU.js} +2 -2
- package/dist/cli/chunks/{chunk-CWUBOLKY.js → chunk-BOCEOLLJ.js} +2 -2
- package/dist/cli/chunks/{chunk-FL3BM54K.js → chunk-CE6LYEHT.js} +1 -1
- package/dist/cli/chunks/{chunk-THBTN7XB.js → chunk-CWP4RMOM.js} +2 -2
- package/dist/cli/chunks/{chunk-Q7PBGNUD.js → chunk-CWXDL7AH.js} +1 -1
- package/dist/cli/chunks/{chunk-RVRBTOWX.js → chunk-DTRFZD7N.js} +2 -2
- package/dist/cli/chunks/{chunk-IZRLIWFN.js → chunk-DVPGQG4W.js} +2 -2
- package/dist/cli/chunks/{chunk-3NOCK6ED.js → chunk-E4D47QTF.js} +2 -2
- package/dist/cli/chunks/{chunk-FQLWQWRU.js → chunk-EAKHU5YX.js} +3 -3
- package/dist/cli/chunks/{chunk-56WZFXTQ.js → chunk-EGMGOWCE.js} +2 -2
- package/dist/cli/chunks/{chunk-OXXMVQDF.js → chunk-ELMUHNXN.js} +2 -2
- package/dist/cli/chunks/{chunk-SNTUKW4Q.js → chunk-EVDYFGVH.js} +2 -2
- package/dist/cli/chunks/{chunk-RLCWR7TS.js → chunk-FDUSWM6O.js} +98 -88
- package/dist/cli/chunks/{chunk-D3MPV5G7.js → chunk-FM272B4O.js} +2 -2
- package/dist/cli/chunks/{chunk-DRIJYTSK.js → chunk-FQUUMC57.js} +2 -2
- package/dist/cli/chunks/{chunk-5KAT6WBQ.js → chunk-FQXQJMSF.js} +2 -2
- package/dist/cli/chunks/{chunk-BCKTBGDM.js → chunk-FRAGSKXQ.js} +3 -3
- package/dist/cli/chunks/{chunk-SRQ3CPJE.js → chunk-GASOBSNB.js} +4 -4
- package/dist/cli/chunks/{chunk-GTUFX7AR.js → chunk-GJEEPKAT.js} +2 -2
- package/dist/cli/chunks/{chunk-5EIOQCGN.js → chunk-GOV2MHLV.js} +2 -2
- package/dist/cli/chunks/{chunk-QI4CGJNK.js → chunk-GTPZVLL6.js} +1 -1
- package/dist/cli/chunks/chunk-H7YZ2YF2.js +3 -0
- package/dist/cli/chunks/{chunk-ANIDFJCT.js → chunk-HFI5PHG5.js} +3 -3
- package/dist/cli/chunks/{chunk-2VQVEQS4.js → chunk-HUMQU4ES.js} +2 -2
- package/dist/cli/chunks/{chunk-VHYMSZNF.js → chunk-HYIRFJDB.js} +2 -2
- package/dist/cli/chunks/{chunk-A4QLGPYO.js → chunk-IBSBOHUX.js} +2 -2
- package/dist/cli/chunks/{chunk-6SXKCIN5.js → chunk-IJA4WS7B.js} +1 -1
- package/dist/cli/chunks/{chunk-3GSYD5SL.js → chunk-IJP42OGW.js} +2 -2
- package/dist/cli/chunks/{chunk-PERJO2DY.js → chunk-IMQKEFW6.js} +1 -1
- package/dist/cli/chunks/{chunk-ZEIG5IQ4.js → chunk-INYS35DV.js} +2 -2
- package/dist/cli/chunks/{chunk-J3L52EA4.js → chunk-IV2VCR75.js} +5 -5
- package/dist/cli/chunks/{chunk-TVMFH5N2.js → chunk-IZO6TPGX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJG6N2OK.js → chunk-J45DX3IK.js} +1 -1
- package/dist/cli/chunks/{chunk-HL2QMM4M.js → chunk-J4T6D2OQ.js} +2 -2
- package/dist/cli/chunks/{chunk-5ICQL42E.js → chunk-JAPOMPFD.js} +2 -2
- package/dist/cli/chunks/{chunk-L2SFGFE6.js → chunk-JELNVHBF.js} +1 -1
- package/dist/cli/chunks/{chunk-RSFIOR2I.js → chunk-JOTNKZ7A.js} +87 -87
- package/dist/cli/chunks/{chunk-34PEINFS.js → chunk-KNWDXI3I.js} +2 -2
- package/dist/cli/chunks/{chunk-FUU32QY5.js → chunk-KW5NBORV.js} +2 -2
- package/dist/cli/chunks/{chunk-N5MMBA35.js → chunk-L7IOTWWY.js} +1 -1
- package/dist/cli/chunks/{chunk-RJZRWVL4.js → chunk-LJQ27PUE.js} +1 -1
- package/dist/cli/chunks/{chunk-QQB55ZJJ.js → chunk-LSKQUUUN.js} +2 -2
- package/dist/cli/chunks/{chunk-NETN3OUG.js → chunk-LSZZQ7H6.js} +1 -1
- package/dist/cli/chunks/{chunk-IYDYJ33J.js → chunk-LTKNCYMO.js} +2 -2
- package/dist/cli/chunks/{chunk-6DTOGSDV.js → chunk-LTWT4GZD.js} +4 -4
- package/dist/cli/chunks/{chunk-NQNKKVNO.js → chunk-LVHMXGDI.js} +3 -3
- package/dist/cli/chunks/{chunk-3UHEZ5HZ.js → chunk-M3T6FB54.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJIX5FGQ.js → chunk-MAYZTGJ2.js} +2 -2
- package/dist/cli/chunks/{chunk-3K4SF57Q.js → chunk-MCIO7BDK.js} +1 -1
- package/dist/cli/chunks/{chunk-A7GLWWSE.js → chunk-MPD7RR4P.js} +1 -1
- package/dist/cli/chunks/{chunk-FAQLI3P5.js → chunk-MUFYDKVC.js} +2 -2
- package/dist/cli/chunks/{chunk-XFCWYQHW.js → chunk-MX5ZDKRR.js} +2 -2
- package/dist/cli/chunks/{chunk-MBCGI3M2.js → chunk-MXKHIZVM.js} +5 -5
- package/dist/cli/chunks/chunk-MY47CR27.js +2 -0
- package/dist/cli/chunks/chunk-N7WAZ2Y6.js +2 -0
- package/dist/cli/chunks/{chunk-VC6EXDGY.js → chunk-NHV4PTG6.js} +2 -2
- package/dist/cli/chunks/{chunk-LBE2P6UC.js → chunk-NP4CP3LR.js} +2 -2
- package/dist/cli/chunks/{chunk-6AOBLBR4.js → chunk-OCKTPTQ7.js} +2 -2
- package/dist/cli/chunks/{chunk-ES7WCYOU.js → chunk-OE4B6LDZ.js} +1 -1
- package/dist/cli/chunks/{chunk-IPHLXAMX.js → chunk-OPQY2333.js} +2 -2
- package/dist/cli/chunks/{chunk-7DMXCCSD.js → chunk-ORDH4VPL.js} +1 -1
- package/dist/cli/chunks/{chunk-HTPM3URI.js → chunk-P4Y3G6OB.js} +2 -2
- package/dist/cli/chunks/{chunk-TNRIGQ6U.js → chunk-PIOO2M4W.js} +2 -2
- package/dist/cli/chunks/{chunk-BGYLNCL6.js → chunk-PKMCZFET.js} +2 -2
- package/dist/cli/chunks/{chunk-G7FMYFTN.js → chunk-QES4QHQW.js} +1 -1
- package/dist/cli/chunks/{chunk-UIPPJKON.js → chunk-QG6BXSNJ.js} +2 -2
- package/dist/cli/chunks/{chunk-7YXT6BXN.js → chunk-QLOOW23R.js} +3 -3
- package/dist/cli/chunks/{chunk-CQFT7H3F.js → chunk-RSCGBHLM.js} +2 -2
- package/dist/cli/chunks/{chunk-QCEW4ZDW.js → chunk-RZ6CO3RZ.js} +2 -2
- package/dist/cli/chunks/{chunk-OETDMOOE.js → chunk-S6F3IJMK.js} +1 -1
- package/dist/cli/chunks/{chunk-KVL63BSU.js → chunk-S6VNPKHO.js} +1 -1
- package/dist/cli/chunks/{chunk-BUGWPTMF.js → chunk-SHWXADCI.js} +2 -2
- package/dist/cli/chunks/{chunk-FQY3UTGA.js → chunk-SPJQJWGK.js} +2 -2
- package/dist/cli/chunks/{chunk-BOVH6WSM.js → chunk-SS6K4FBH.js} +2 -2
- package/dist/cli/chunks/{chunk-4BESADKE.js → chunk-SXADKQJN.js} +2 -2
- package/dist/cli/chunks/{chunk-USMDIIHY.js → chunk-TBQTGQ75.js} +2 -2
- package/dist/cli/chunks/{chunk-4BDLD7V2.js → chunk-TDGE52HJ.js} +1 -1
- package/dist/cli/chunks/{chunk-JPIBPKBP.js → chunk-THFLRJT6.js} +3 -3
- package/dist/cli/chunks/{chunk-ZCFZ4USU.js → chunk-TQ2MA3SR.js} +1 -1
- package/dist/cli/chunks/{chunk-G5DFYX3J.js → chunk-UCQ66N6M.js} +2 -2
- package/dist/cli/chunks/{chunk-CPH5JP4L.js → chunk-UHGMS2PJ.js} +1 -1
- package/dist/cli/chunks/{chunk-ANYYTWOQ.js → chunk-UHKXKWMD.js} +2 -2
- package/dist/cli/chunks/{chunk-YRQLVGCI.js → chunk-UJ6TMZC6.js} +2 -2
- package/dist/cli/chunks/{chunk-EECM5XKY.js → chunk-UKBDH27A.js} +1 -1
- package/dist/cli/chunks/{chunk-VLBV2VL3.js → chunk-UMCEEXQN.js} +1 -1
- package/dist/cli/chunks/{chunk-LOXVVMS4.js → chunk-USUFTHHT.js} +3 -3
- package/dist/cli/chunks/{chunk-HOKON5EL.js → chunk-V32MDID3.js} +2 -2
- package/dist/cli/chunks/{chunk-KZTBNDNE.js → chunk-VAJT6QWX.js} +1 -1
- package/dist/cli/chunks/{chunk-UNIBND6A.js → chunk-VLUJWI56.js} +1 -1
- package/dist/cli/chunks/{chunk-QWYISZTN.js → chunk-WINA3XUT.js} +2 -2
- package/dist/cli/chunks/{chunk-YPTGE5NJ.js → chunk-WWCH5SSF.js} +2 -2
- package/dist/cli/chunks/{chunk-W5YEIHIO.js → chunk-WWP2VXYJ.js} +2 -2
- package/dist/cli/chunks/{chunk-GFBLWFRV.js → chunk-WZROSTQZ.js} +1 -1
- package/dist/cli/chunks/{chunk-UMG5URNV.js → chunk-XFUF654L.js} +1 -1
- package/dist/cli/chunks/{chunk-54MFKCLT.js → chunk-XN2CD5S6.js} +2 -2
- package/dist/cli/chunks/{chunk-IHQTXJAQ.js → chunk-XOQQGZFY.js} +1 -1
- package/dist/cli/chunks/{chunk-WRYT4HTZ.js → chunk-XSCOEY4C.js} +2 -2
- package/dist/cli/chunks/{chunk-R3GEXYO4.js → chunk-Y734CWHJ.js} +2 -2
- package/dist/cli/chunks/{chunk-NUQBJGGF.js → chunk-YBPCBFEE.js} +2 -2
- package/dist/cli/chunks/{chunk-GUEZQOHL.js → chunk-YLAEIS6F.js} +1 -1
- package/dist/cli/chunks/{chunk-EFRESRLB.js → chunk-YMMVCOPF.js} +3 -3
- package/dist/cli/chunks/{chunk-N7VOOI3U.js → chunk-YQCAXYBF.js} +2 -2
- package/dist/cli/chunks/{chunk-5FLTZ3KT.js → chunk-YRVUYM62.js} +2 -2
- package/dist/cli/chunks/{chunk-GJMZR7WU.js → chunk-YVKMHXQK.js} +3 -3
- package/dist/cli/chunks/{chunk-TZPKTRJB.js → chunk-ZCLFAOVT.js} +2 -2
- package/dist/cli/chunks/{chunk-L4S722JD.js → chunk-ZH6ZBDVV.js} +1 -1
- package/dist/cli/chunks/{chunk-KSYLRM4Q.js → chunk-ZHEKGB4A.js} +2 -2
- package/dist/cli/chunks/{chunk-E3B5XTXJ.js → chunk-ZIBW7CB4.js} +1 -1
- package/dist/cli/chunks/{chunk-2DIT5AUU.js → chunk-ZLCATRXI.js} +2 -2
- package/dist/cli/chunks/{chunk-LWYLW7RX.js → chunk-ZXX2VFMA.js} +2 -2
- package/dist/cli/chunks/{chunk-XKFE3FLI.js → chunk-ZYPESQ4M.js} +2 -2
- package/dist/cli/chunks/{ci-74ZUCO5V.js → ci-HHL5WQXQ.js} +2 -2
- package/dist/cli/chunks/{ci-output-HD6IZNJA.js → ci-output-HVOJC2KN.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-USZVMA42.js → circuit-breaker-HRXMIY2G.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-S4XKNCD5.js → claude-flow-setup-3I7WVMZN.js} +2 -2
- package/dist/cli/chunks/client-EY2IYQDL.js +2 -0
- package/dist/cli/chunks/{cline-installer-6EW4CHAR.js → cline-installer-NBREL4QT.js} +2 -2
- package/dist/cli/chunks/{code-TOLWD2XL.js → code-TX4E2RWU.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-UA4QQ7B3.js → code-index-extractor-YELOFLSL.js} +2 -2
- package/dist/cli/chunks/codex-installer-HEX3KFRB.js +10 -0
- package/dist/cli/chunks/{completions-KVUMQQ4K.js → completions-72GGFRGG.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-DFH6LMK2.js → complexity-analyzer-WRAKDYUK.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-LYDQSAU7.js → continuedev-installer-UGYKSKTI.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-7USXLZHZ.js → copilot-installer-RPCRUKIJ.js} +2 -2
- package/dist/cli/chunks/core-handlers-G4GLA4DT.js +2 -0
- package/dist/cli/chunks/{cost-tracker-JBDIUMKZ.js → cost-tracker-CNHJ7G4M.js} +2 -2
- package/dist/cli/chunks/{coverage-RGO3K357.js → coverage-RHIQ4XEX.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-P3K4IH5H.js +2 -0
- package/dist/cli/chunks/{cursor-installer-YEZGD37F.js → cursor-installer-KSRVA4V2.js} +2 -2
- package/dist/cli/chunks/{daemon-FVETQ3LL.js → daemon-IT4AAFBW.js} +3 -3
- package/dist/cli/chunks/{daemon-LPEXHNYG.js → daemon-QBXSJABV.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-UKYE2FII.js → dag-attention-scheduler-F7WCQTLY.js} +2 -2
- package/dist/cli/chunks/{detect-WBG5P7ER.js → detect-2IYU332U.js} +2 -2
- package/dist/cli/chunks/{dist-node-YW6YRBCU.js → dist-node-CIYNYCYN.js} +2 -2
- package/dist/cli/chunks/{domain-handler-HH7J4A32.js → domain-handler-QRYQO2QK.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-V34GXD5I.js → domain-transfer-2OQDOD3G.js} +2 -2
- package/dist/cli/chunks/dream-IT4ZQGEO.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-WYLRS3CL.js → embed-and-insert-pattern-P2IFC7JL.js} +2 -2
- package/dist/cli/chunks/{eval-EIMVXY5J.js → eval-SBPK37IB.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-QMZHRUKM.js → experience-capture-middleware-3GMFND3F.js} +3 -3
- package/dist/cli/chunks/{fast-paths-NHLW6XS6.js → fast-paths-4OYYII2F.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NE3MBL3P.js → feature-flags-BM6QTMMC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-N3UHMSZ3.js → feature-flags-NFCAYUWO.js} +2 -2
- package/dist/cli/chunks/{file-discovery-SI44X4YS.js → file-discovery-2M3ZUAGC.js} +2 -2
- package/dist/cli/chunks/{fleet-MMYUXRRM.js → fleet-QMGGVIDV.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-RLYXYU2Q.js → gnn-wrapper-WGMAGZMO.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-6EDRUYLV.js → heartbeat-handler-5RSMEZGG.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-UUWSPHF2.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-YUJVSFPD.js +2 -0
- package/dist/cli/chunks/hnsw-index-FQZ47RSJ.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-RVM7EAIH.js → hnsw-legacy-bridge-TYPQ2T6P.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-DUZ6FFAH.js → hnswlib-node-GMRPPMDM.js} +2 -2
- package/dist/cli/chunks/{hooks-ZF4VKHEO.js → hooks-NUC5P3OJ.js} +10 -10
- package/dist/cli/chunks/hybrid-router-T5MF73NF.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-YWS66PGO.js → hypergraph-engine-OIB7WK54.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-OQHVRPWB.js → hypergraph-handler-XX2N75QC.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-AEGELYMD.js +2 -0
- package/dist/cli/chunks/{init-handler-YW74YF2V.js → init-handler-AKSTJMZY.js} +6 -6
- package/dist/cli/chunks/init-wizard-WKX3OGWM.js +2 -0
- package/dist/cli/chunks/kernel-5CVWFIGR.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-APWB2GMA.js → kilocode-installer-375V5ZZB.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-DICKFVNC.js → kiro-installer-GKY5GB5Q.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-EGPMNDMT.js +2 -0
- package/dist/cli/chunks/{learning-MXHNYW5D.js → learning-2CQE3QP6.js} +3 -3
- package/dist/cli/chunks/{llm-router-LTFIX7NY.js → llm-router-FTQNRF45.js} +4 -4
- package/dist/cli/chunks/llm-router-service-H4LXOARB.js +2 -0
- package/dist/cli/chunks/{load-JUMIQ4LZ.js → load-3DBAO5ZG.js} +2 -2
- package/dist/cli/chunks/load-test-OOOGITSN.js +2 -0
- package/dist/cli/chunks/{mcp-WHIARJGO.js → mcp-AWR6TDXM.js} +2 -2
- package/dist/cli/chunks/{memory-KAHS6Z5A.js → memory-GI4LCNXY.js} +5 -5
- package/dist/cli/chunks/memory-backend-O2YOT4LW.js +2 -0
- package/dist/cli/chunks/{memory-handlers-DG3RRXB6.js → memory-handlers-MALKG7GP.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-E3Y2RHMX.js → multi-model-executor-SWFT5U72.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-3RKGNGGE.js → opencode-installer-EYXGYJX5.js} +2 -2
- package/dist/cli/chunks/{orchestrator-TXITUKWD.js → orchestrator-MP3EAZVC.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-WBOHE2XL.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-EE2BUFZT.js → pattern-usage-recorder-25P3R3W7.js} +2 -2
- package/dist/cli/chunks/{pipeline-AXTT6KZB.js → pipeline-LSAFL25D.js} +2 -2
- package/dist/cli/chunks/{platform-TICPVKE2.js → platform-IJ6DJ2PG.js} +2 -2
- package/dist/cli/chunks/{plugin-VQKNV3EM.js → plugin-OXOZRZW2.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6GY5YY7D.js → prime-radiant-advanced-wasm-HJNJQQ3R.js} +2 -2
- package/dist/cli/chunks/protocol-executor-JCNTPW5J.js +2 -0
- package/dist/cli/chunks/{protocol-handler-YFWDR7UZ.js → protocol-handler-TCMUH2HL.js} +2 -2
- package/dist/cli/chunks/{prove-FUMRCXAA.js → prove-ADXQ2GOX.js} +2 -2
- package/dist/cli/chunks/provider-manager-LPGQ5GOO.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-FWVYVSPP.js +2 -0
- package/dist/cli/chunks/{quality-2APISBW5.js → quality-EWP36ORX.js} +2 -2
- package/dist/cli/chunks/{quality-gate-MCC3E5TM.js → quality-gate-3BIG7PVU.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-UXNALRVD.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CC5TNOTI.js → real-embeddings-D4NBT7W5.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-YAHTEVPI.js → roocode-installer-DOPWH6YV.js} +2 -2
- package/dist/cli/chunks/router-C6LUIQYY.js +2 -0
- package/dist/cli/chunks/routing-feedback-KMSGGDVD.js +2 -0
- package/dist/cli/chunks/{routing-handler-6NQBW4TQ.js → routing-handler-5ADEFOHS.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-ZHXLHUPG.js → ruvector-commands-PLMEIHSN.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-5KF2DGCW.js → rvf-dual-writer-EQWKVNQB.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-BBU57BGF.js → rvf-migration-adapter-2OWFUUCG.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-VN4VRZA4.js → rvf-migration-coordinator-URAETAPU.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-K54BELUE.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-XCY2XQZA.js → rvf-store-integrity-4AWPW4TF.js} +2 -2
- package/dist/cli/chunks/safe-db-NGOZWF2D.js +2 -0
- package/dist/cli/chunks/schedule-B3Y5P64E.js +2 -0
- package/dist/cli/chunks/scheduler-Z6QVRMTB.js +2 -0
- package/dist/cli/chunks/{security-PYP4H3KN.js → security-HDLZVM62.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-3CJHRNX6.js → shared-rvf-adapter-YQT7PF7X.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-MKSLKWDI.js → shared-rvf-dual-writer-N5D3NSJ7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-PLOUGATS.js +2 -0
- package/dist/cli/chunks/{status-handler-VYIZ3VJF.js → status-handler-KLYRJ2MR.js} +2 -2
- package/dist/cli/chunks/{structural-health-MVV4OWXP.js → structural-health-6LKVRP6Y.js} +2 -2
- package/dist/cli/chunks/{sync-VNX6L3TI.js → sync-7VMFPBVB.js} +2 -2
- package/dist/cli/chunks/{sync-G47OYIQ3.js → sync-YYOW6L6W.js} +2 -2
- package/dist/cli/chunks/{task-handler-GOWF2GEH.js → task-handler-RKQDGFN2.js} +2 -2
- package/dist/cli/chunks/{task-handlers-J2WC6J37.js → task-handlers-6YJ4QTEP.js} +3 -3
- package/dist/cli/chunks/{test-DMCJ3BXS.js → test-ASPUIUJH.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-TRFHHKFM.js → test-scheduling-I7ABQBBU.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-KEQ7AHFF.js → token-bootstrap-2XZBTODN.js} +2 -2
- package/dist/cli/chunks/{token-usage-B54FOFOF.js → token-usage-TMUE6PTF.js} +2 -2
- package/dist/cli/chunks/{transformers-IACZG7IV.js → transformers-FDHHH4SL.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-N7H4X37E.js → tree-sitter-wasm-parser-G7PGZA5C.js} +2 -2
- package/dist/cli/chunks/{types-B3SHT4OD.js → types-JGT57UFP.js} +2 -2
- package/dist/cli/chunks/unified-memory-P5YVLMFI.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-7HI43A2O.js +2 -0
- package/dist/cli/chunks/unified-persistence-U26YP3N3.js +2 -0
- package/dist/cli/chunks/{upgrade-A2PQ5EWK.js → upgrade-V6UQODJF.js} +2 -2
- package/dist/cli/chunks/{validate-UXV7UQUT.js → validate-UBZAE5RW.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-MMBU4FPP.js → validate-swarm-TSO2MI5X.js} +2 -2
- package/dist/cli/chunks/{vibium-R4GUVADA.js → vibium-7G3VYSQA.js} +2 -2
- package/dist/cli/chunks/visual-security-6FCDY5FF.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-MP6E6CJB.js → web-tree-sitter-MIYJSF2L.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-Z6BWMUUO.js → windsurf-installer-5TLZSQIJ.js} +2 -2
- package/dist/cli/chunks/witness-chain-I3K3WQID.js +2 -0
- package/dist/cli/chunks/{witness-chain-EFLTABBA.js → witness-chain-LTV7H2HM.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-PN36TV43.js → witness-key-manager-PAJ2J4AL.js} +2 -2
- package/dist/cli/chunks/{workflow-A2AX3RJU.js → workflow-DL3ESR2H.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-MAALP4WA.js +2 -0
- package/dist/cli/chunks/{wrappers-NA6FHA63.js → wrappers-5HSU665E.js} +2 -2
- package/dist/cli/handlers/init-handler.js +1 -1
- package/dist/coordination/handlers/coverage-collection.d.ts +161 -0
- package/dist/coordination/handlers/coverage-collection.js +639 -0
- package/dist/coordination/handlers/coverage-handlers.js +199 -146
- package/dist/coordination/handlers/handler-types.d.ts +6 -1
- package/dist/coordination/handlers/handler-utils.js +10 -3
- package/dist/coordination/handlers/security-handlers.js +17 -2
- package/dist/coordination/handlers/test-execution-handlers.js +16 -1
- package/dist/coordination/result-saver.js +119 -97
- package/dist/coordination/task-executor.d.ts +26 -1
- package/dist/coordination/task-executor.js +52 -4
- package/dist/domains/code-intelligence/services/knowledge-graph.js +8 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +4 -0
- package/dist/domains/coverage-analysis/services/gap-detector.js +4 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +4 -0
- package/dist/domains/defect-intelligence/services/root-cause-analyzer.js +4 -0
- package/dist/domains/quality-assessment/services/deployment-advisor.js +4 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.js +4 -0
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -0
- package/dist/domains/test-generation/index.js +17 -2
- package/dist/domains/test-generation/services/test-generator.js +31 -9
- package/dist/init/codex-installer.d.ts +13 -0
- package/dist/init/codex-installer.js +122 -1
- package/dist/init/phases/09-assets.js +4 -0
- package/dist/init/phases/phase-interface.d.ts +1 -1
- package/dist/learning/real-embeddings.js +15 -1
- package/dist/mcp/bundle.js +429 -419
- package/dist/mcp/handlers/domain-handler-configs.js +79 -14
- package/dist/mcp/types.d.ts +42 -4
- package/dist/optimization/session-cache.d.ts +13 -1
- package/dist/optimization/session-cache.js +27 -2
- package/dist/shared/llm/llm-router-service.js +59 -4
- package/dist/shared/llm/router/agent-router-config.d.ts +46 -2
- package/dist/shared/llm/router/agent-router-config.js +124 -2
- package/dist/shared/llm/router/config-store.d.ts +17 -1
- package/dist/shared/llm/router/config-store.js +103 -0
- package/dist/shared/llm/router/index.d.ts +2 -2
- package/dist/shared/llm/router/index.js +2 -0
- package/dist/shared/llm/router/types.d.ts +44 -0
- package/dist/shared/llm/router/types.js +1 -0
- package/package.json +9 -6
- package/dist/cli/chunks/adapter-CWIMFWAI.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-OTXT2DLN.js +0 -2
- package/dist/cli/chunks/base-O3SPSWBA.js +0 -2
- package/dist/cli/chunks/browser-workflow-MXS3ZKY2.js +0 -2
- package/dist/cli/chunks/chunk-G4GTE3RJ.js +0 -2
- package/dist/cli/chunks/chunk-HVB2L52I.js +0 -2
- package/dist/cli/chunks/chunk-MVI2QMRW.js +0 -2
- package/dist/cli/chunks/chunk-OZR25R7W.js +0 -2
- package/dist/cli/chunks/chunk-PP2RYSHT.js +0 -3
- package/dist/cli/chunks/client-33PGO5FA.js +0 -2
- package/dist/cli/chunks/codex-installer-C2CUP4FW.js +0 -8
- package/dist/cli/chunks/core-handlers-CSNZIM3A.js +0 -2
- package/dist/cli/chunks/cross-domain-router-DRIBR5L3.js +0 -2
- package/dist/cli/chunks/dream-WUNO723O.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-VAFQDJLL.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-TIRPA7XE.js +0 -2
- package/dist/cli/chunks/hnsw-index-SSQBRQCQ.js +0 -2
- package/dist/cli/chunks/hybrid-router-AKBWZOQ3.js +0 -2
- package/dist/cli/chunks/impact-analyzer-46FQIZ6Y.js +0 -2
- package/dist/cli/chunks/init-wizard-U3NHGYSS.js +0 -2
- package/dist/cli/chunks/kernel-ZDXHT6QF.js +0 -2
- package/dist/cli/chunks/knowledge-graph-6XTW6WO6.js +0 -2
- package/dist/cli/chunks/llm-router-service-3F4E64SY.js +0 -2
- package/dist/cli/chunks/load-test-SWZNGEIY.js +0 -2
- package/dist/cli/chunks/memory-backend-PR74ZPBA.js +0 -2
- package/dist/cli/chunks/pattern-null-store-EPE36BVT.js +0 -2
- package/dist/cli/chunks/protocol-executor-IELENNST.js +0 -2
- package/dist/cli/chunks/provider-manager-3R3KOBHG.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-S2R2PCBS.js +0 -2
- package/dist/cli/chunks/queen-coordinator-2E23NEV4.js +0 -2
- package/dist/cli/chunks/router-3FVLWO6S.js +0 -2
- package/dist/cli/chunks/routing-feedback-ZQLRNNR7.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-YFGLQNEB.js +0 -2
- package/dist/cli/chunks/safe-db-4SBLBTW7.js +0 -2
- package/dist/cli/chunks/schedule-5Y3BGVAA.js +0 -2
- package/dist/cli/chunks/scheduler-DOID3QF3.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-M4JEQO57.js +0 -2
- package/dist/cli/chunks/unified-memory-WNYWTGVX.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-YPAV7U4E.js +0 -2
- package/dist/cli/chunks/unified-persistence-TJ252S7L.js +0 -2
- package/dist/cli/chunks/visual-security-VKYXEGJB.js +0 -2
- package/dist/cli/chunks/witness-chain-WVXRXKQP.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-GOWSPR3G.js +0 -2
|
@@ -177,14 +177,24 @@ export class ResultSaver {
|
|
|
177
177
|
}
|
|
178
178
|
async saveCoverage(result, prefix, options) {
|
|
179
179
|
const files = [];
|
|
180
|
+
// #569: branch/function coverage are nullable — `null` means the metric was
|
|
181
|
+
// never collected, which the report must render as "n/a" rather than crash
|
|
182
|
+
// on (or, worse, print as 0.0%).
|
|
180
183
|
const data = result;
|
|
181
184
|
const coverageDir = path.join(this.resultsDir, 'coverage');
|
|
182
185
|
// Save JSON
|
|
183
186
|
const jsonPath = path.join(coverageDir, `${prefix}_coverage.json`);
|
|
184
187
|
await fs.writeFile(jsonPath, JSON.stringify(data, null, 2));
|
|
185
188
|
files.push(await this.createFileEntry(jsonPath, 'json'));
|
|
186
|
-
// Save LCOV format
|
|
187
|
-
|
|
189
|
+
// Save LCOV format — ONLY for genuinely measured coverage.
|
|
190
|
+
//
|
|
191
|
+
// #569/ADR-126: LCOV has nowhere to record provenance. Emitting it for an
|
|
192
|
+
// estimated (or absent) result hands downstream tools a file that is
|
|
193
|
+
// indistinguishable from instrumented output — `null` would serialize as
|
|
194
|
+
// `DA:1,0 / LF:100 / LH:0`, asserting a measured 0% over 100 lines that
|
|
195
|
+
// nothing ever measured. The JSON artifact above keeps the full result with
|
|
196
|
+
// its provenance; the lossy format is simply not written when it would lie.
|
|
197
|
+
if (options.includeSecondary !== false && data.measured === true) {
|
|
188
198
|
const lcovPath = path.join(coverageDir, `${prefix}_coverage.lcov`);
|
|
189
199
|
const lcovContent = this.generateLcov(data);
|
|
190
200
|
await fs.writeFile(lcovPath, lcovContent);
|
|
@@ -299,12 +309,13 @@ export class ResultSaver {
|
|
|
299
309
|
// ==========================================================================
|
|
300
310
|
generateLcov(data) {
|
|
301
311
|
// Simplified LCOV - real implementation would have per-file data
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
312
|
+
const line = Math.round(data.lineCoverage ?? 0);
|
|
313
|
+
return `TN:agentic-qe-coverage
|
|
314
|
+
SF:summary
|
|
315
|
+
DA:1,${line}
|
|
316
|
+
LF:100
|
|
317
|
+
LH:${line}
|
|
318
|
+
end_of_record
|
|
308
319
|
`;
|
|
309
320
|
}
|
|
310
321
|
generateSarif(data) {
|
|
@@ -334,104 +345,115 @@ end_of_record
|
|
|
334
345
|
}, null, 2);
|
|
335
346
|
}
|
|
336
347
|
generateTestReport(data, options) {
|
|
337
|
-
return `# Test Generation Report
|
|
338
|
-
|
|
339
|
-
**Generated:** ${new Date().toISOString()}
|
|
340
|
-
**Language:** ${options.language || 'typescript'}
|
|
341
|
-
**Framework:** ${options.framework || 'vitest'}
|
|
342
|
-
|
|
343
|
-
## Summary
|
|
344
|
-
|
|
345
|
-
| Metric | Value |
|
|
346
|
-
|--------|-------|
|
|
347
|
-
| Tests Generated | ${data.testsGenerated} |
|
|
348
|
-
| Coverage Estimate | ${data.coverageEstimate}% |
|
|
349
|
-
| Patterns Used | ${data.patternsUsed.length} |
|
|
350
|
-
|
|
351
|
-
## Patterns Applied
|
|
352
|
-
|
|
353
|
-
${data.patternsUsed.map(p => `- ${p}`).join('\n')}
|
|
354
|
-
|
|
355
|
-
## Generated Tests
|
|
356
|
-
|
|
357
|
-
${data.tests.map(t => `### ${t.name}
|
|
358
|
-
- **File:** ${t.file}
|
|
359
|
-
- **Type:** ${t.type}
|
|
360
|
-
`).join('\n')}
|
|
348
|
+
return `# Test Generation Report
|
|
349
|
+
|
|
350
|
+
**Generated:** ${new Date().toISOString()}
|
|
351
|
+
**Language:** ${options.language || 'typescript'}
|
|
352
|
+
**Framework:** ${options.framework || 'vitest'}
|
|
353
|
+
|
|
354
|
+
## Summary
|
|
355
|
+
|
|
356
|
+
| Metric | Value |
|
|
357
|
+
|--------|-------|
|
|
358
|
+
| Tests Generated | ${data.testsGenerated} |
|
|
359
|
+
| Coverage Estimate | ${data.coverageEstimate}% |
|
|
360
|
+
| Patterns Used | ${data.patternsUsed.length} |
|
|
361
|
+
|
|
362
|
+
## Patterns Applied
|
|
363
|
+
|
|
364
|
+
${data.patternsUsed.map(p => `- ${p}`).join('\n')}
|
|
365
|
+
|
|
366
|
+
## Generated Tests
|
|
367
|
+
|
|
368
|
+
${data.tests.map(t => `### ${t.name}
|
|
369
|
+
- **File:** ${t.file}
|
|
370
|
+
- **Type:** ${t.type}
|
|
371
|
+
`).join('\n')}
|
|
361
372
|
`;
|
|
362
373
|
}
|
|
363
374
|
generateCoverageReport(data) {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
375
|
+
// #569: a metric that was never collected renders as "not collected", not
|
|
376
|
+
// as a number. Rendering `null` as 0.0% is how "no branch data" became
|
|
377
|
+
// "0% branch coverage" — and the inverse formula made it 100%.
|
|
378
|
+
const metric = (value) => value === null ? '_not collected_' : `${value.toFixed(1)}%`;
|
|
379
|
+
const provenanceBanner = data.estimated
|
|
380
|
+
? `\n> ⚠️ **ESTIMATED — NOT MEASURED.** No instrumentation ran; these figures are a\n` +
|
|
381
|
+
`> static estimate derived from source shape. Do not treat them as coverage\n` +
|
|
382
|
+
`> measurements or act on individual gaps without running real instrumentation.\n` +
|
|
383
|
+
(data.warning ? `>\n> ${data.warning}\n` : '')
|
|
384
|
+
: '';
|
|
385
|
+
return `# Coverage Analysis Report
|
|
386
|
+
|
|
387
|
+
**Generated:** ${new Date().toISOString()}
|
|
388
|
+
**Algorithm:** Sublinear O(log n)
|
|
389
|
+
**Method:** ${data.coverageMethod ?? 'unknown'}${provenanceBanner}
|
|
390
|
+
|
|
391
|
+
## Summary
|
|
392
|
+
|
|
393
|
+
| Metric | Coverage |
|
|
394
|
+
|--------|----------|
|
|
395
|
+
| Line Coverage | ${metric(data.lineCoverage)} |
|
|
396
|
+
| Branch Coverage | ${metric(data.branchCoverage)} |
|
|
397
|
+
| Function Coverage | ${metric(data.functionCoverage)} |
|
|
398
|
+
| Statement Coverage | ${metric(data.statementCoverage)} |
|
|
399
|
+
| Total Files | ${data.totalFiles} |
|
|
400
|
+
|
|
401
|
+
## Coverage Gaps
|
|
402
|
+
|
|
403
|
+
${data.gaps.length === 0 ? 'No significant gaps detected.' : data.gaps.map(g => `### ${g.file}
|
|
404
|
+
- **Risk:** ${g.risk}
|
|
405
|
+
- **Uncovered Lines:** ${g.lines.join(', ')}
|
|
406
|
+
`).join('\n')}
|
|
385
407
|
`;
|
|
386
408
|
}
|
|
387
409
|
generateSecurityReport(data) {
|
|
388
|
-
return `# Security Scan Report
|
|
389
|
-
|
|
390
|
-
**Generated:** ${new Date().toISOString()}
|
|
391
|
-
**Scanner:** Agentic QE v3 Security
|
|
392
|
-
|
|
393
|
-
## Summary
|
|
394
|
-
|
|
395
|
-
| Severity | Count |
|
|
396
|
-
|----------|-------|
|
|
397
|
-
| Critical | ${data.critical} |
|
|
398
|
-
| High | ${data.high} |
|
|
399
|
-
| Medium | ${data.medium} |
|
|
400
|
-
| Low | ${data.low} |
|
|
401
|
-
| **Total** | **${data.vulnerabilities}** |
|
|
402
|
-
|
|
403
|
-
## Top Vulnerabilities
|
|
404
|
-
|
|
405
|
-
${data.topVulnerabilities.map(v => `### ${v.type}
|
|
406
|
-
- **Severity:** ${v.severity.toUpperCase()}
|
|
407
|
-
- **File:** ${v.file}
|
|
408
|
-
- **Line:** ${v.line}
|
|
409
|
-
`).join('\n')}
|
|
410
|
-
|
|
411
|
-
## Recommendations
|
|
412
|
-
|
|
413
|
-
${data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
|
|
410
|
+
return `# Security Scan Report
|
|
411
|
+
|
|
412
|
+
**Generated:** ${new Date().toISOString()}
|
|
413
|
+
**Scanner:** Agentic QE v3 Security
|
|
414
|
+
|
|
415
|
+
## Summary
|
|
416
|
+
|
|
417
|
+
| Severity | Count |
|
|
418
|
+
|----------|-------|
|
|
419
|
+
| Critical | ${data.critical} |
|
|
420
|
+
| High | ${data.high} |
|
|
421
|
+
| Medium | ${data.medium} |
|
|
422
|
+
| Low | ${data.low} |
|
|
423
|
+
| **Total** | **${data.vulnerabilities}** |
|
|
424
|
+
|
|
425
|
+
## Top Vulnerabilities
|
|
426
|
+
|
|
427
|
+
${data.topVulnerabilities.map(v => `### ${v.type}
|
|
428
|
+
- **Severity:** ${v.severity.toUpperCase()}
|
|
429
|
+
- **File:** ${v.file}
|
|
430
|
+
- **Line:** ${v.line}
|
|
431
|
+
`).join('\n')}
|
|
432
|
+
|
|
433
|
+
## Recommendations
|
|
434
|
+
|
|
435
|
+
${data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
|
|
414
436
|
`;
|
|
415
437
|
}
|
|
416
438
|
generateQualityReport(data) {
|
|
417
|
-
return `# Quality Assessment Report
|
|
418
|
-
|
|
419
|
-
**Generated:** ${new Date().toISOString()}
|
|
420
|
-
**Status:** ${data.passed ? 'PASSED' : 'FAILED'}
|
|
421
|
-
|
|
422
|
-
## Quality Score
|
|
423
|
-
|
|
424
|
-
**${data.qualityScore.toFixed(1)}** / 100
|
|
425
|
-
|
|
426
|
-
## Metrics
|
|
427
|
-
|
|
428
|
-
| Metric | Score |
|
|
429
|
-
|--------|-------|
|
|
430
|
-
${Object.entries(data.metrics).map(([k, v]) => `| ${k} | ${v.toFixed(1)} |`).join('\n')}
|
|
431
|
-
|
|
432
|
-
## Recommendations
|
|
433
|
-
|
|
434
|
-
${data.recommendations.length === 0 ? 'No recommendations - all quality gates passed.' : data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
|
|
439
|
+
return `# Quality Assessment Report
|
|
440
|
+
|
|
441
|
+
**Generated:** ${new Date().toISOString()}
|
|
442
|
+
**Status:** ${data.passed ? 'PASSED' : 'FAILED'}
|
|
443
|
+
|
|
444
|
+
## Quality Score
|
|
445
|
+
|
|
446
|
+
**${data.qualityScore.toFixed(1)}** / 100
|
|
447
|
+
|
|
448
|
+
## Metrics
|
|
449
|
+
|
|
450
|
+
| Metric | Score |
|
|
451
|
+
|--------|-------|
|
|
452
|
+
${Object.entries(data.metrics).map(([k, v]) => `| ${k} | ${v.toFixed(1)} |`).join('\n')}
|
|
453
|
+
|
|
454
|
+
## Recommendations
|
|
455
|
+
|
|
456
|
+
${data.recommendations.length === 0 ? 'No recommendations - all quality gates passed.' : data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
|
|
435
457
|
`;
|
|
436
458
|
}
|
|
437
459
|
// ==========================================================================
|
|
@@ -53,6 +53,8 @@ export declare class DomainTaskExecutor implements TaskHandlerContext {
|
|
|
53
53
|
private coverageAnalyzer;
|
|
54
54
|
private securityScanner;
|
|
55
55
|
private testGenerator;
|
|
56
|
+
/** #567: router-free instance for callers that opt out of LLM enhancement. */
|
|
57
|
+
private deterministicTestGenerator;
|
|
56
58
|
private knowledgeGraph;
|
|
57
59
|
private qualityAnalyzer;
|
|
58
60
|
private agentBooster;
|
|
@@ -72,7 +74,30 @@ export declare class DomainTaskExecutor implements TaskHandlerContext {
|
|
|
72
74
|
setQualityFeedbackLoop(loop: QualityFeedbackLoop | null): void;
|
|
73
75
|
getCoverageAnalyzer(): CoverageAnalyzerService;
|
|
74
76
|
getSecurityScanner(): SecurityScannerService;
|
|
75
|
-
|
|
77
|
+
/**
|
|
78
|
+
* Issue #567: async so the ADR-043 LLM router can be resolved before the
|
|
79
|
+
* generator is constructed. `TestGeneratorService` captures `llmRouter` in its
|
|
80
|
+
* constructor, so a router obtained after construction would never be seen —
|
|
81
|
+
* the service must not be built until we know whether one exists.
|
|
82
|
+
*
|
|
83
|
+
* Router resolution order:
|
|
84
|
+
* 1. `kernel.llmRouter` — set during `QEKernelImpl.initialize()`.
|
|
85
|
+
* 2. the shared MCP singleton — same instance the kernel registers via
|
|
86
|
+
* `setSharedLLMRouter()`, and the lazily-built one in standalone MCP mode.
|
|
87
|
+
*
|
|
88
|
+
* Both may be absent (no provider keys, no llm-config.json, or the
|
|
89
|
+
* `AQE_LLM_ROUTER_DISABLED` kill-switch). That is not an error: the generator
|
|
90
|
+
* falls back to deterministic template generation exactly as before.
|
|
91
|
+
*/
|
|
92
|
+
getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
|
|
93
|
+
/**
|
|
94
|
+
* Best-effort LLM router lookup. Never throws — a missing or failed router
|
|
95
|
+
* degrades to `undefined` so deterministic generation still runs.
|
|
96
|
+
*
|
|
97
|
+
* The import is dynamic: `mcp/tools/base` transitively reaches back into
|
|
98
|
+
* coordination, so a static import here would be circular.
|
|
99
|
+
*/
|
|
100
|
+
private resolveLLMRouter;
|
|
76
101
|
getKnowledgeGraph(): KnowledgeGraphService;
|
|
77
102
|
getQualityAnalyzer(): QualityAnalyzerService;
|
|
78
103
|
private registerHandlers;
|
|
@@ -40,9 +40,9 @@ function resolveSecurityScannerService(memory) {
|
|
|
40
40
|
const factory = DomainServiceRegistry.resolve(ServiceKeys.SecurityScannerService);
|
|
41
41
|
return factory(memory);
|
|
42
42
|
}
|
|
43
|
-
function resolveTestGeneratorService(memory) {
|
|
43
|
+
function resolveTestGeneratorService(memory, llmRouter) {
|
|
44
44
|
const factory = DomainServiceRegistry.resolve(ServiceKeys.createTestGeneratorService);
|
|
45
|
-
return factory(memory);
|
|
45
|
+
return factory(memory, llmRouter);
|
|
46
46
|
}
|
|
47
47
|
function resolveKnowledgeGraphService(memory) {
|
|
48
48
|
const factory = DomainServiceRegistry.resolve(ServiceKeys.KnowledgeGraphService);
|
|
@@ -119,6 +119,8 @@ export class DomainTaskExecutor {
|
|
|
119
119
|
coverageAnalyzer = null;
|
|
120
120
|
securityScanner = null;
|
|
121
121
|
testGenerator = null;
|
|
122
|
+
/** #567: router-free instance for callers that opt out of LLM enhancement. */
|
|
123
|
+
deterministicTestGenerator = null;
|
|
122
124
|
knowledgeGraph = null;
|
|
123
125
|
qualityAnalyzer = null;
|
|
124
126
|
// ADR-051: Lazy-initialized Agent Booster and Task Router (instance-level)
|
|
@@ -175,12 +177,58 @@ export class DomainTaskExecutor {
|
|
|
175
177
|
}
|
|
176
178
|
return this.securityScanner;
|
|
177
179
|
}
|
|
178
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Issue #567: async so the ADR-043 LLM router can be resolved before the
|
|
182
|
+
* generator is constructed. `TestGeneratorService` captures `llmRouter` in its
|
|
183
|
+
* constructor, so a router obtained after construction would never be seen —
|
|
184
|
+
* the service must not be built until we know whether one exists.
|
|
185
|
+
*
|
|
186
|
+
* Router resolution order:
|
|
187
|
+
* 1. `kernel.llmRouter` — set during `QEKernelImpl.initialize()`.
|
|
188
|
+
* 2. the shared MCP singleton — same instance the kernel registers via
|
|
189
|
+
* `setSharedLLMRouter()`, and the lazily-built one in standalone MCP mode.
|
|
190
|
+
*
|
|
191
|
+
* Both may be absent (no provider keys, no llm-config.json, or the
|
|
192
|
+
* `AQE_LLM_ROUTER_DISABLED` kill-switch). That is not an error: the generator
|
|
193
|
+
* falls back to deterministic template generation exactly as before.
|
|
194
|
+
*/
|
|
195
|
+
async getTestGenerator(useLLM = true) {
|
|
196
|
+
// Two cached instances, because the router is a constructor-captured
|
|
197
|
+
// dependency: callers passing `aiEnhancement: false` must get a service
|
|
198
|
+
// that was never handed a router, not one that merely declines to use it.
|
|
199
|
+
if (!useLLM) {
|
|
200
|
+
if (!this.deterministicTestGenerator) {
|
|
201
|
+
this.deterministicTestGenerator = resolveTestGeneratorService(this.kernel.memory);
|
|
202
|
+
}
|
|
203
|
+
return this.deterministicTestGenerator;
|
|
204
|
+
}
|
|
179
205
|
if (!this.testGenerator) {
|
|
180
|
-
this.testGenerator = resolveTestGeneratorService(this.kernel.memory);
|
|
206
|
+
this.testGenerator = resolveTestGeneratorService(this.kernel.memory, await this.resolveLLMRouter());
|
|
181
207
|
}
|
|
182
208
|
return this.testGenerator;
|
|
183
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Best-effort LLM router lookup. Never throws — a missing or failed router
|
|
212
|
+
* degrades to `undefined` so deterministic generation still runs.
|
|
213
|
+
*
|
|
214
|
+
* The import is dynamic: `mcp/tools/base` transitively reaches back into
|
|
215
|
+
* coordination, so a static import here would be circular.
|
|
216
|
+
*/
|
|
217
|
+
async resolveLLMRouter() {
|
|
218
|
+
if (this.kernel.llmRouter) {
|
|
219
|
+
return this.kernel.llmRouter;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const { getSharedLLMRouter } = await import('../mcp/tools/base.js');
|
|
223
|
+
return (await getSharedLLMRouter()) ?? undefined;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
logger.debug('LLM router unavailable; using deterministic generation', {
|
|
227
|
+
error: toErrorMessage(error),
|
|
228
|
+
});
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
184
232
|
getKnowledgeGraph() {
|
|
185
233
|
if (!this.knowledgeGraph) {
|
|
186
234
|
this.knowledgeGraph = resolveKnowledgeGraphService(this.kernel.memory);
|
|
@@ -384,6 +384,10 @@ Be precise and only report high-confidence findings.`,
|
|
|
384
384
|
model: modelId,
|
|
385
385
|
maxTokens: this.config.llmMaxTokens ?? 2048,
|
|
386
386
|
temperature: 0.2, // Low temperature for consistent analysis
|
|
387
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
388
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
389
|
+
// this agent never fires.
|
|
390
|
+
agentType: 'qe-code-intelligence',
|
|
387
391
|
});
|
|
388
392
|
if (response.content) {
|
|
389
393
|
return this.parseLLMRelationshipResponse(response.content);
|
|
@@ -472,6 +476,10 @@ Return JSON: { "rankedIds": ["id1", "id2", ...], "insights": ["insight1", "insig
|
|
|
472
476
|
model: modelId,
|
|
473
477
|
maxTokens: 1024,
|
|
474
478
|
temperature: 0.3,
|
|
479
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
480
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
481
|
+
// this agent never fires.
|
|
482
|
+
agentType: 'qe-code-intelligence',
|
|
475
483
|
});
|
|
476
484
|
if (response.content) {
|
|
477
485
|
try {
|
|
@@ -245,6 +245,10 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
245
245
|
model: modelId,
|
|
246
246
|
maxTokens: this.config.llmMaxTokens ?? 2048,
|
|
247
247
|
temperature: 0.3, // Low temperature for consistent analysis
|
|
248
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
249
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
250
|
+
// this agent never fires.
|
|
251
|
+
agentType: 'qe-coverage-specialist',
|
|
248
252
|
});
|
|
249
253
|
if (response.content && response.content.length > 0) {
|
|
250
254
|
return this.parseInsightsResponse(response.content);
|
|
@@ -116,6 +116,10 @@ Return JSON in this exact format:
|
|
|
116
116
|
model: modelId,
|
|
117
117
|
maxTokens: this.config.llmMaxTokens ?? 2048,
|
|
118
118
|
temperature: 0.3, // Low temperature for consistent analysis
|
|
119
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
120
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
121
|
+
// this agent never fires.
|
|
122
|
+
agentType: 'qe-gap-detector',
|
|
119
123
|
});
|
|
120
124
|
if (response.content) {
|
|
121
125
|
const analysis = this.parseGapAnalysisResponse(response.content, gaps);
|
|
@@ -160,6 +160,10 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
160
160
|
model: modelId,
|
|
161
161
|
maxTokens: this.config.llmMaxTokens ?? 2048,
|
|
162
162
|
temperature: 0.3, // Low temperature for consistent analysis
|
|
163
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
164
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
165
|
+
// this agent never fires.
|
|
166
|
+
agentType: 'qe-defect-predictor',
|
|
163
167
|
});
|
|
164
168
|
if (response.content && response.content.length > 0) {
|
|
165
169
|
return this.parseLLMDefectAnalysis(response.content);
|
|
@@ -243,6 +243,10 @@ Return your analysis as JSON with this structure:
|
|
|
243
243
|
model: modelId,
|
|
244
244
|
maxTokens: this.config.llmMaxTokens ?? 2048,
|
|
245
245
|
temperature: 0.3, // Low temperature for consistent analysis
|
|
246
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
247
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
248
|
+
// this agent never fires.
|
|
249
|
+
agentType: 'qe-root-cause-analyzer',
|
|
246
250
|
});
|
|
247
251
|
if (response.content && response.content.length > 0) {
|
|
248
252
|
return this.parseLLMAnalysisResponse(response.content);
|
|
@@ -134,6 +134,10 @@ Provide deployment advice specific to these metrics.`,
|
|
|
134
134
|
model: modelId,
|
|
135
135
|
maxTokens: 2048,
|
|
136
136
|
temperature: 0.3, // Low temperature for consistent advice
|
|
137
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
138
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
139
|
+
// this agent never fires.
|
|
140
|
+
agentType: 'qe-deployment-advisor',
|
|
137
141
|
});
|
|
138
142
|
if (response.content) {
|
|
139
143
|
try {
|
|
@@ -131,6 +131,10 @@ Focus on:
|
|
|
131
131
|
model: modelId,
|
|
132
132
|
maxTokens: this.config.llmMaxTokens ?? 2048,
|
|
133
133
|
temperature: 0.3, // Low temperature for consistent analysis
|
|
134
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
135
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
136
|
+
// this agent never fires.
|
|
137
|
+
agentType: 'qe-quality-gate',
|
|
134
138
|
});
|
|
135
139
|
if (response.content && response.content.length > 0) {
|
|
136
140
|
return this.parseQualityInsightsResponse(response.content);
|
|
@@ -538,6 +538,10 @@ Provide detailed remediation advice specific to this code.`,
|
|
|
538
538
|
model: modelId,
|
|
539
539
|
maxTokens: 1500,
|
|
540
540
|
temperature: 0.2,
|
|
541
|
+
// Issue #568: per-agent routing rules (including the user's on-disk
|
|
542
|
+
// `agentOverrides`) match on `agentType`; without it an override for
|
|
543
|
+
// this agent never fires.
|
|
544
|
+
agentType: 'qe-security-scanner',
|
|
541
545
|
});
|
|
542
546
|
if (response.content) {
|
|
543
547
|
try {
|
|
@@ -29,6 +29,21 @@ export { TestGenerationCoherenceGate, createTestGenerationCoherenceGate, Coheren
|
|
|
29
29
|
// so coordination/ can resolve them without importing from domains/.
|
|
30
30
|
// ============================================================================
|
|
31
31
|
import { DomainServiceRegistry, ServiceKeys } from '../../shared/domain-service-registry';
|
|
32
|
-
import { createTestGeneratorService as _createTestGeneratorService } from './services/test-generator';
|
|
33
|
-
|
|
32
|
+
import { createTestGeneratorService as _createTestGeneratorService, createTestGeneratorServiceWithDependencies as _createTestGeneratorServiceWithDependencies, } from './services/test-generator';
|
|
33
|
+
/**
|
|
34
|
+
* Issue #567: the factory MUST accept an optional `llmRouter`.
|
|
35
|
+
*
|
|
36
|
+
* The flat MCP tool `test_generate_enhanced` and the CLI both reach the
|
|
37
|
+
* generator through the task-executor, which resolves it from this registry.
|
|
38
|
+
* When the factory dropped `llmRouter` on the floor,
|
|
39
|
+
* `TestGeneratorService.isLLMEnhancementAvailable()` was permanently false and
|
|
40
|
+
* the ADR-051 LLM branch was unreachable on those paths — the tool silently
|
|
41
|
+
* returned generic template scaffolding no matter how the provider was
|
|
42
|
+
* configured. Keep the second parameter optional so the router stays a
|
|
43
|
+
* degradation-friendly dependency: no router => deterministic templates, same
|
|
44
|
+
* as before.
|
|
45
|
+
*/
|
|
46
|
+
DomainServiceRegistry.register(ServiceKeys.createTestGeneratorService, (memory, llmRouter) => llmRouter
|
|
47
|
+
? _createTestGeneratorServiceWithDependencies({ memory, llmRouter })
|
|
48
|
+
: _createTestGeneratorService(memory));
|
|
34
49
|
//# sourceMappingURL=index.js.map
|
|
@@ -12,6 +12,7 @@ import * as fs from 'fs';
|
|
|
12
12
|
import * as path from 'path';
|
|
13
13
|
import ts from 'typescript';
|
|
14
14
|
import { ok, err } from '../../../shared/types';
|
|
15
|
+
import { toErrorMessage } from '../../../shared/error-utils.js';
|
|
15
16
|
import { TestGeneratorFactory } from '../factories/test-generator-factory';
|
|
16
17
|
import { TDDGeneratorService } from './tdd-generator';
|
|
17
18
|
import { PropertyTestGeneratorService } from './property-test-generator';
|
|
@@ -128,7 +129,7 @@ export class TestGeneratorService {
|
|
|
128
129
|
*/
|
|
129
130
|
async enhanceTestWithLLM(testCode, sourceCode, analysis, context) {
|
|
130
131
|
if (!this.llmRouter)
|
|
131
|
-
return testCode;
|
|
132
|
+
return { code: testCode, enhanced: false };
|
|
132
133
|
try {
|
|
133
134
|
let prompt = this.buildTestEnhancementPrompt(testCode, sourceCode, analysis);
|
|
134
135
|
// Prepend historical edge case patterns if injector is available (loki-mode Item 5)
|
|
@@ -189,6 +190,10 @@ Return ONLY the enhanced test code, no explanations.`,
|
|
|
189
190
|
model: modelId,
|
|
190
191
|
maxTokens: this.config.llmMaxTokens,
|
|
191
192
|
temperature: 0.3, // Low temperature for consistent code generation
|
|
193
|
+
// Issue #568: the router's per-agent routing rules (including the user's
|
|
194
|
+
// on-disk `agentOverrides`) match on `agentType`. Without it, an override
|
|
195
|
+
// for `qe-test-architect` silently never fires on this call.
|
|
196
|
+
agentType: 'qe-test-architect',
|
|
192
197
|
});
|
|
193
198
|
if (response.content && response.content.length > 0) {
|
|
194
199
|
// Extract code from response, handling potential markdown fences
|
|
@@ -197,13 +202,22 @@ Return ONLY the enhanced test code, no explanations.`,
|
|
|
197
202
|
if (codeMatch) {
|
|
198
203
|
enhancedCode = codeMatch[1].trim();
|
|
199
204
|
}
|
|
200
|
-
|
|
205
|
+
// #567: only claim enhancement when the model actually returned code.
|
|
206
|
+
// An empty/unusable response falls back to the template, and the caller
|
|
207
|
+
// must be told that is what happened.
|
|
208
|
+
return enhancedCode
|
|
209
|
+
? { code: enhancedCode, enhanced: true }
|
|
210
|
+
: { code: testCode, enhanced: false };
|
|
201
211
|
}
|
|
202
|
-
return testCode;
|
|
212
|
+
return { code: testCode, enhanced: false };
|
|
203
213
|
}
|
|
204
214
|
catch (error) {
|
|
205
|
-
|
|
206
|
-
|
|
215
|
+
// #567: a configured-but-broken provider (401, timeout, wrong model) used
|
|
216
|
+
// to fall back to the template while the result still reported
|
|
217
|
+
// `llmEnhanced: true` — the exact "silently receives non-LLM scaffolding"
|
|
218
|
+
// failure this issue is about, just one layer deeper. Report the truth.
|
|
219
|
+
logger.warn(`LLM enhancement failed, using deterministic template: ${toErrorMessage(error)}`);
|
|
220
|
+
return { code: testCode, enhanced: false };
|
|
207
221
|
}
|
|
208
222
|
}
|
|
209
223
|
/**
|
|
@@ -261,6 +275,8 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
261
275
|
model: modelId,
|
|
262
276
|
maxTokens: 1024,
|
|
263
277
|
temperature: 0.5,
|
|
278
|
+
// Issue #568: see above — required for per-agent routing to apply.
|
|
279
|
+
agentType: 'qe-test-architect',
|
|
264
280
|
});
|
|
265
281
|
if (response.content) {
|
|
266
282
|
try {
|
|
@@ -443,9 +459,15 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
443
459
|
similarCode,
|
|
444
460
|
};
|
|
445
461
|
let testCode = generator.generateTests(context);
|
|
446
|
-
// ADR-051: Enhance with LLM if enabled and available
|
|
462
|
+
// ADR-051: Enhance with LLM if enabled and available.
|
|
463
|
+
// #567: `llmEnhanced` reflects whether the LLM actually produced the code,
|
|
464
|
+
// not merely whether a router was configured — a broken provider must not
|
|
465
|
+
// report AI-enhanced output it did not produce.
|
|
466
|
+
let llmEnhanced = false;
|
|
447
467
|
if (this.isLLMEnhancementAvailable() && sourceContent) {
|
|
448
|
-
|
|
468
|
+
const result = await this.enhanceTestWithLLM(testCode, sourceContent, codeAnalysis, context);
|
|
469
|
+
testCode = result.code;
|
|
470
|
+
llmEnhanced = result.enhanced;
|
|
449
471
|
}
|
|
450
472
|
const test = {
|
|
451
473
|
id: uuidv4(),
|
|
@@ -458,8 +480,8 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
458
480
|
// ADR-078: Include detected language and framework
|
|
459
481
|
language: effectiveLanguage,
|
|
460
482
|
framework: framework,
|
|
461
|
-
// ADR-051:
|
|
462
|
-
llmEnhanced
|
|
483
|
+
// ADR-051 / #567: true only when the LLM actually produced this code.
|
|
484
|
+
llmEnhanced,
|
|
463
485
|
};
|
|
464
486
|
// ADR-077: Compilation validation if requested
|
|
465
487
|
if (originalRequest?.compileValidation && effectiveLanguage) {
|
|
@@ -18,9 +18,13 @@ export interface CodexInstallResult {
|
|
|
18
18
|
success: boolean;
|
|
19
19
|
mcpConfigured: boolean;
|
|
20
20
|
agentsMdInstalled: boolean;
|
|
21
|
+
hooksConfigured: boolean;
|
|
22
|
+
skillsInstalled: number;
|
|
21
23
|
errors: string[];
|
|
22
24
|
configPath: string;
|
|
23
25
|
agentsMdPath: string;
|
|
26
|
+
hooksPath: string;
|
|
27
|
+
skillsPath: string;
|
|
24
28
|
}
|
|
25
29
|
export declare class CodexInstaller {
|
|
26
30
|
private projectRoot;
|
|
@@ -29,6 +33,15 @@ export declare class CodexInstaller {
|
|
|
29
33
|
private generator;
|
|
30
34
|
constructor(options: CodexInstallerOptions);
|
|
31
35
|
install(): Promise<CodexInstallResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Install Codex-native lifecycle adapters and merge AQE/ruflo hook groups
|
|
38
|
+
* without removing user-defined hooks.
|
|
39
|
+
*/
|
|
40
|
+
private installCodexHooks;
|
|
41
|
+
/** Install the curated repo-scoped AQE skills Codex discovers automatically. */
|
|
42
|
+
private installCodexSkills;
|
|
43
|
+
private copyDirectory;
|
|
44
|
+
private resolvePackageRoot;
|
|
32
45
|
/**
|
|
33
46
|
* Merge AQE MCP server config into existing TOML.
|
|
34
47
|
* Simple approach: if [mcp_servers.agentic-qe] already exists, skip.
|