agentic-qe 3.11.2 → 3.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/.validation/templates/eval.template.yaml +36 -0
- package/.claude/skills/qe-quality-assessment/SKILL.md +25 -0
- package/.claude/skills/qe-test-generation/SKILL.md +58 -20
- package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +37 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +36 -0
- package/assets/skills/.validation/templates/eval.template.yaml +36 -0
- package/assets/skills/enterprise-integration-testing/SKILL.md +1 -1
- package/assets/skills/pentest-validation/SKILL.md +1 -1
- package/assets/skills/qcsd-development-swarm/SKILL.md +27 -6
- package/assets/skills/qe-quality-assessment/SKILL.md +25 -0
- package/assets/skills/qe-test-generation/SKILL.md +58 -20
- package/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +37 -0
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-IU3H3MD7.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-FNCVODUJ.js → agent-booster-wasm-BFRW7HEU.js} +2 -2
- package/dist/cli/chunks/{agent-handler-JK7VK37B.js → agent-handler-ZVC3VFPC.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-EPVVJNNA.js → agent-memory-branch-3WU3CVSX.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-BGOC63IN.js +2 -0
- package/dist/cli/chunks/{arena-NTHVDZTJ.js → arena-JMVTWWG5.js} +2 -2
- package/dist/cli/chunks/{arena-EH2IMSRW.js → arena-QMRLNQUC.js} +4 -4
- package/dist/cli/chunks/{audit-ODZV2T2B.js → audit-TTWAAV7P.js} +2 -2
- package/dist/cli/chunks/base-DVPRE3WO.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-2KL54YUA.js → better-sqlite3-QNZJOJAB.js} +2 -2
- package/dist/cli/chunks/{brain-handler-NVB6OJ25.js → brain-handler-FXPLJCPV.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-BIXSELMY.js → branch-enumerator-CJJG6X3I.js} +2 -2
- package/dist/cli/chunks/{browser-S2Y2W33Z.js → browser-LI2CDWVR.js} +2 -2
- package/dist/cli/chunks/browser-workflow-MP5P7KZF.js +2 -0
- package/dist/cli/chunks/{chunk-OFUF3APC.js → chunk-22CUJA33.js} +2 -2
- package/dist/cli/chunks/{chunk-CUDGKSFX.js → chunk-242B625Q.js} +2 -2
- package/dist/cli/chunks/{chunk-X36TZXDK.js → chunk-26KHL4VO.js} +1 -1
- package/dist/cli/chunks/{chunk-SE4S23C7.js → chunk-27MMZQ7X.js} +1 -1
- package/dist/cli/chunks/{chunk-Z2QNTRUX.js → chunk-2OUXYSQV.js} +2 -2
- package/dist/cli/chunks/{chunk-K3YM2Z3E.js → chunk-2SZQDTI5.js} +1 -1
- package/dist/cli/chunks/{chunk-AINAWVGD.js → chunk-36HTS4EP.js} +2 -2
- package/dist/cli/chunks/{chunk-ZBJMVWQR.js → chunk-3BREKEL5.js} +2 -2
- package/dist/cli/chunks/{chunk-YGR54EAA.js → chunk-3CBYKKRW.js} +2 -2
- package/dist/cli/chunks/{chunk-XRDPGJNW.js → chunk-3E3PSEC5.js} +2 -2
- package/dist/cli/chunks/{chunk-6VAFRS5N.js → chunk-3FOFPGHH.js} +2 -2
- package/dist/cli/chunks/{chunk-O3IIAIXB.js → chunk-3XLGXCSX.js} +1 -1
- package/dist/cli/chunks/{chunk-HDBJORV7.js → chunk-4ITHKHR5.js} +2 -2
- package/dist/cli/chunks/{chunk-P2RR4SW5.js → chunk-54TDOQAH.js} +3 -3
- package/dist/cli/chunks/{chunk-EDH4H55B.js → chunk-5746QYRF.js} +2 -2
- package/dist/cli/chunks/{chunk-CAUTOCLZ.js → chunk-5EW36WTI.js} +2 -2
- package/dist/cli/chunks/{chunk-ZH6HYT7C.js → chunk-6F43POT6.js} +1 -1
- package/dist/cli/chunks/{chunk-75C5GX7D.js → chunk-6GVRP64A.js} +2 -2
- package/dist/cli/chunks/{chunk-KFE6LB4I.js → chunk-6IHB3T6M.js} +2 -2
- package/dist/cli/chunks/{chunk-BGVEBYV4.js → chunk-6JR2RSY2.js} +2 -2
- package/dist/cli/chunks/{chunk-PFDILSVO.js → chunk-6KKKPVOF.js} +1 -1
- package/dist/cli/chunks/{chunk-KEJEZY2R.js → chunk-6WWNK67C.js} +8 -8
- package/dist/cli/chunks/{chunk-XY2B2BEJ.js → chunk-77QJQRL2.js} +2 -2
- package/dist/cli/chunks/{chunk-Y4M2HMPR.js → chunk-7FVWETN4.js} +2 -2
- package/dist/cli/chunks/{chunk-CZYSCUJ4.js → chunk-7PDUD7FF.js} +2 -2
- package/dist/cli/chunks/{chunk-XNREA3FG.js → chunk-7QIYYYUE.js} +1 -1
- package/dist/cli/chunks/{chunk-NZNXEEZR.js → chunk-7S7QF4HJ.js} +1 -1
- package/dist/cli/chunks/{chunk-IO7ZUP2G.js → chunk-7SBMTSGY.js} +3 -3
- package/dist/cli/chunks/{chunk-5BDVFFYF.js → chunk-7UOH55UT.js} +2 -2
- package/dist/cli/chunks/{chunk-TOGZ37RL.js → chunk-A43MKBSX.js} +2 -2
- package/dist/cli/chunks/{chunk-S6BWEZKK.js → chunk-A4NYOH7P.js} +2 -2
- package/dist/cli/chunks/{chunk-A4ZDKF5F.js → chunk-ABD6JBNO.js} +1 -1
- package/dist/cli/chunks/{chunk-PPD5ZLNA.js → chunk-AC6OZTY4.js} +2 -2
- package/dist/cli/chunks/{chunk-6LQIVIZB.js → chunk-AKOGQT3A.js} +2 -2
- package/dist/cli/chunks/{chunk-WEBHFIWS.js → chunk-ATFADWGD.js} +2 -2
- package/dist/cli/chunks/{chunk-VNFL2TPU.js → chunk-B65CRJN6.js} +1 -1
- package/dist/cli/chunks/{chunk-AYXRT2ND.js → chunk-B6USJW5E.js} +1 -1
- package/dist/cli/chunks/{chunk-3J3QXLWP.js → chunk-B7XPSXK6.js} +2 -2
- package/dist/cli/chunks/{chunk-JCH2FHJ7.js → chunk-BA7PJS3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-42DCMEUM.js → chunk-BFBZFUBP.js} +1 -1
- package/dist/cli/chunks/{chunk-P5SGBQLY.js → chunk-BHZI6PDR.js} +1 -1
- package/dist/cli/chunks/{chunk-JELN5XTK.js → chunk-BQ5EJPK3.js} +1 -1
- package/dist/cli/chunks/{chunk-WZC4HKGZ.js → chunk-CCDGNJZX.js} +2 -2
- package/dist/cli/chunks/{chunk-3ATEYGVD.js → chunk-CGKHG46K.js} +2 -2
- package/dist/cli/chunks/{chunk-RHSUXQNF.js → chunk-CLZ5RQVA.js} +2 -2
- package/dist/cli/chunks/{chunk-YJUJCLXV.js → chunk-CYJ6O5VZ.js} +2 -2
- package/dist/cli/chunks/{chunk-AZQ6HDPM.js → chunk-DNOBN3IR.js} +2 -2
- package/dist/cli/chunks/{chunk-YDPBCN7H.js → chunk-DPYNXEBC.js} +2 -2
- package/dist/cli/chunks/{chunk-LRJWKFGY.js → chunk-DS7AZD26.js} +2 -2
- package/dist/cli/chunks/{chunk-QZ2GQGJX.js → chunk-DZ7PWB6E.js} +2 -2
- package/dist/cli/chunks/{chunk-KO3WB4SU.js → chunk-DZZ4AJQI.js} +2 -2
- package/dist/cli/chunks/{chunk-H5TM4KIB.js → chunk-EBCUWMLX.js} +2 -2
- package/dist/cli/chunks/{chunk-7VM4ZUHT.js → chunk-ECGASTG7.js} +2 -2
- package/dist/cli/chunks/{chunk-LAY35POY.js → chunk-ED7MD6OI.js} +3 -3
- package/dist/cli/chunks/{chunk-CEMROADY.js → chunk-EHEFI6LR.js} +1 -1
- package/dist/cli/chunks/{chunk-XXCSJMSR.js → chunk-EXCU4J7T.js} +1 -1
- package/dist/cli/chunks/{chunk-27KNLVOY.js → chunk-EZ4GKHSI.js} +2 -2
- package/dist/cli/chunks/{chunk-G6LIQFT2.js → chunk-FJRRXCIS.js} +1 -1
- package/dist/cli/chunks/{chunk-ZP2GE6DM.js → chunk-FPKKKUWF.js} +1 -1
- package/dist/cli/chunks/{chunk-XY4JS3IZ.js → chunk-FZLCKIPP.js} +2 -2
- package/dist/cli/chunks/{chunk-LY6PTRVL.js → chunk-G6MPXBCD.js} +2 -2
- package/dist/cli/chunks/{chunk-YWG4LHFU.js → chunk-GBCDJJWH.js} +2 -2
- package/dist/cli/chunks/{chunk-DMUQV2YU.js → chunk-GCIL7PK7.js} +2 -2
- package/dist/cli/chunks/{chunk-H6MBRYA7.js → chunk-H2YOWAEB.js} +2 -2
- package/dist/cli/chunks/{chunk-I7UWFV6N.js → chunk-H6YFMUFG.js} +1 -1
- package/dist/cli/chunks/{chunk-WARFZ626.js → chunk-H7Y43HBQ.js} +1 -1
- package/dist/cli/chunks/{chunk-FV53RMVB.js → chunk-HRD5I7ES.js} +1 -1
- package/dist/cli/chunks/{chunk-C6UTRG66.js → chunk-IJHPZMEQ.js} +2 -2
- package/dist/cli/chunks/{chunk-4PYJCIRO.js → chunk-JVXPKHND.js} +2 -2
- package/dist/cli/chunks/{chunk-ZQYEBLTL.js → chunk-JWTMVC6E.js} +2 -2
- package/dist/cli/chunks/{chunk-NPT7BYGF.js → chunk-KHUN65Q3.js} +1 -1
- package/dist/cli/chunks/{chunk-CMVNYVKL.js → chunk-KTYESESI.js} +2 -2
- package/dist/cli/chunks/{chunk-AKZK46TQ.js → chunk-KULBMV6K.js} +2 -2
- package/dist/cli/chunks/{chunk-DU4GQKTH.js → chunk-KXRI4MR3.js} +2 -2
- package/dist/cli/chunks/{chunk-7XIQR6VU.js → chunk-L44XXD3X.js} +2 -2
- package/dist/cli/chunks/{chunk-WKIYYF3G.js → chunk-L6PH7JIE.js} +2 -2
- package/dist/cli/chunks/{chunk-FYY7OJ6Y.js → chunk-LGEZ3ZJX.js} +2 -2
- package/dist/cli/chunks/{chunk-I3AD523O.js → chunk-LKLWIP4Z.js} +1 -1
- package/dist/cli/chunks/{chunk-JDFF2QMZ.js → chunk-LMA6KEZH.js} +1 -1
- package/dist/cli/chunks/{chunk-QFJDR4HC.js → chunk-LW5TUN5F.js} +2 -2
- package/dist/cli/chunks/{chunk-FPZLOVEF.js → chunk-MU36VPXV.js} +1 -1
- package/dist/cli/chunks/{chunk-JSZNI3AO.js → chunk-MX5FMAY5.js} +1 -1
- package/dist/cli/chunks/{chunk-UQ6WB4N2.js → chunk-N2K2EQFH.js} +2 -2
- package/dist/cli/chunks/{chunk-P7MIOTVP.js → chunk-NBOEXSV2.js} +1 -1
- package/dist/cli/chunks/{chunk-2Q65LTJN.js → chunk-NJ2RY4OL.js} +2 -2
- package/dist/cli/chunks/{chunk-7KHZZVF2.js → chunk-NWUVXLBB.js} +4 -4
- package/dist/cli/chunks/{chunk-P3VRXQ3H.js → chunk-O7ZDQ5FF.js} +3 -3
- package/dist/cli/chunks/{chunk-7HYO76F2.js → chunk-OCACCUFO.js} +2 -2
- package/dist/cli/chunks/{chunk-MAXOIEUG.js → chunk-OFMVC6P3.js} +1 -1
- package/dist/cli/chunks/{chunk-NGE5YNKC.js → chunk-OQGELUM2.js} +2 -2
- package/dist/cli/chunks/{chunk-NIW4CLN2.js → chunk-OVEG5MEL.js} +2 -2
- package/dist/cli/chunks/{chunk-H3LGBH4Y.js → chunk-P4UGVVVX.js} +1 -1
- package/dist/cli/chunks/{chunk-UCXW24HY.js → chunk-PLQADRA6.js} +2 -2
- package/dist/cli/chunks/{chunk-5AFO7ZZG.js → chunk-PMHSTMHV.js} +3 -3
- package/dist/cli/chunks/{chunk-K426HTEQ.js → chunk-PSL53AQ4.js} +10 -10
- package/dist/cli/chunks/{chunk-LIEA5EON.js → chunk-PUK5NE47.js} +1 -1
- package/dist/cli/chunks/{chunk-K6IQBVD7.js → chunk-PUUGIBFF.js} +2 -2
- package/dist/cli/chunks/{chunk-G4CQBQBV.js → chunk-PW4GGJMP.js} +1 -1
- package/dist/cli/chunks/{chunk-527U4AHC.js → chunk-PY2Q6MN3.js} +6 -6
- package/dist/cli/chunks/{chunk-YGRY2TVI.js → chunk-Q2A2XQGF.js} +2 -2
- package/dist/cli/chunks/{chunk-OU52V67H.js → chunk-QCCXH5DK.js} +4 -4
- package/dist/cli/chunks/{chunk-UQBGA4UA.js → chunk-QPMISAWB.js} +1 -1
- package/dist/cli/chunks/{chunk-QZLTIGLB.js → chunk-REZ2GZQ3.js} +1 -1
- package/dist/cli/chunks/{chunk-3NCVUFAL.js → chunk-RRSUW2TK.js} +2 -2
- package/dist/cli/chunks/{chunk-LI3T5YNC.js → chunk-RWUGXU2K.js} +3 -3
- package/dist/cli/chunks/{chunk-H4ZPPHOI.js → chunk-RXN5DWVM.js} +2 -2
- package/dist/cli/chunks/{chunk-26ZMIYSK.js → chunk-S2T2BXUL.js} +2 -2
- package/dist/cli/chunks/{chunk-5KMGG3QW.js → chunk-S7KDHA6P.js} +4 -4
- package/dist/cli/chunks/{chunk-CAVBEZV4.js → chunk-SFDBIO64.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWMXF6AX.js → chunk-SFGBC5RP.js} +2 -2
- package/dist/cli/chunks/{chunk-AK5Q2WCJ.js → chunk-SIAJP3YA.js} +2 -2
- package/dist/cli/chunks/{chunk-IQOCTGA2.js → chunk-SLU35IDJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZU3V4CJ4.js → chunk-SMHYPPO6.js} +2 -2
- package/dist/cli/chunks/{chunk-DPFLJMEI.js → chunk-SWRGPCZ2.js} +3 -3
- package/dist/cli/chunks/{chunk-76RO2RHG.js → chunk-UFZCHVLH.js} +1 -1
- package/dist/cli/chunks/{chunk-3KTOM7NN.js → chunk-UMWYL37S.js} +2 -2
- package/dist/cli/chunks/chunk-UNH2DE2G.js +2 -0
- package/dist/cli/chunks/{chunk-IXYF5BZY.js → chunk-UTGW75AZ.js} +2 -2
- package/dist/cli/chunks/{chunk-OC2W7KIW.js → chunk-VFEU4JM4.js} +2 -2
- package/dist/cli/chunks/{chunk-AAVUZVM6.js → chunk-VTDWQ7WI.js} +2 -2
- package/dist/cli/chunks/{chunk-XN4G3SRU.js → chunk-VUEYLW5P.js} +2 -2
- package/dist/cli/chunks/{chunk-JC4Z2ADP.js → chunk-WCVZHXWL.js} +2 -2
- package/dist/cli/chunks/{chunk-MN6W7ZNL.js → chunk-WLLGPGQY.js} +1 -1
- package/dist/cli/chunks/{chunk-7MKF52GT.js → chunk-WTKT2AD3.js} +2 -2
- package/dist/cli/chunks/{chunk-6SOGYNJG.js → chunk-WV66MXJI.js} +2 -2
- package/dist/cli/chunks/{chunk-4FTVTAMN.js → chunk-WYJFVSEB.js} +2 -2
- package/dist/cli/chunks/{chunk-ZRU3OZEU.js → chunk-XCSEJQXR.js} +2 -2
- package/dist/cli/chunks/{chunk-EIWZDVMT.js → chunk-XKUN5PDH.js} +3 -3
- package/dist/cli/chunks/{chunk-IMPSB5WW.js → chunk-YPRM6ZFL.js} +2 -2
- package/dist/cli/chunks/{chunk-ARUXFZDY.js → chunk-ZDPQB67L.js} +1 -1
- package/dist/cli/chunks/{chunk-LFXXA325.js → chunk-ZM7WOA3K.js} +1 -1
- package/dist/cli/chunks/{ci-SM3EVLZ4.js → ci-JW4O2J3W.js} +2 -2
- package/dist/cli/chunks/{ci-output-YYXICZBC.js → ci-output-JNXJV4B2.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-CV5UGKXT.js → circuit-breaker-XDD4KUGR.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-BSBUZ4B7.js → claude-flow-setup-L6IZOGYZ.js} +2 -2
- package/dist/cli/chunks/client-ADCDBTEE.js +2 -0
- package/dist/cli/chunks/{cline-installer-P2O6STIC.js → cline-installer-PK5SMN2B.js} +2 -2
- package/dist/cli/chunks/{code-M7DDLBGS.js → code-ZDVX3SQH.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-3QZIUYOG.js → code-index-extractor-VXZNKEU5.js} +2 -2
- package/dist/cli/chunks/{codex-installer-5JVZCCTC.js → codex-installer-OXKSIX7H.js} +2 -2
- package/dist/cli/chunks/{completions-EM7IL2BJ.js → completions-VRFFK223.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-VJXVB2CV.js → complexity-analyzer-FTIMV74J.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RCKJIAEC.js → continuedev-installer-KTYBBPN4.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-DZ7LTDOZ.js → copilot-installer-WDC3YNUR.js} +2 -2
- package/dist/cli/chunks/core-handlers-HCACMLUW.js +2 -0
- package/dist/cli/chunks/{cost-tracker-QLOLXVAM.js → cost-tracker-6MH4H33B.js} +2 -2
- package/dist/cli/chunks/{coverage-LYHTLWRV.js → coverage-NHATLNS4.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-HXFQAU4M.js +2 -0
- package/dist/cli/chunks/{cursor-installer-PSIZ3Y53.js → cursor-installer-VQSUJDFB.js} +2 -2
- package/dist/cli/chunks/{daemon-YLOAXM4X.js → daemon-3VAOEKQW.js} +3 -3
- package/dist/cli/chunks/{daemon-IYDTMA5M.js → daemon-ZSK6CLQR.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-I2UIO3Z7.js → dag-attention-scheduler-HZ6OGYIH.js} +2 -2
- package/dist/cli/chunks/{detect-ZXQ7X7GZ.js → detect-CGU3SC63.js} +2 -2
- package/dist/cli/chunks/{dist-node-GK6OZX4H.js → dist-node-DIBQ7PTA.js} +2 -2
- package/dist/cli/chunks/{domain-handler-NS3IBLRQ.js → domain-handler-DCMGAYXS.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-5G4RZEWF.js → domain-transfer-UWFKBZTJ.js} +2 -2
- package/dist/cli/chunks/dream-SVWQH62A.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-V4JJUFR6.js → embed-and-insert-pattern-7247LAU3.js} +2 -2
- package/dist/cli/chunks/{eval-7Q6PPYKR.js → eval-6KR7TFOK.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-DUBKSYFM.js → experience-capture-middleware-IIOR6RVV.js} +3 -3
- package/dist/cli/chunks/{fast-paths-IDPPMBUW.js → fast-paths-M7OGD4ZI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-EPTMAAKA.js → feature-flags-GGUXHRJI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KXI6FDY7.js → feature-flags-U75KFIGH.js} +2 -2
- package/dist/cli/chunks/{file-discovery-EDX2OJO7.js → file-discovery-V52AYEB7.js} +2 -2
- package/dist/cli/chunks/{fleet-67BO3LJ4.js → fleet-2UH72CK4.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-YARORYT7.js → gnn-wrapper-J2GDLT3P.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-K3JGPBYR.js → heartbeat-handler-QIDQHRXT.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-QW5TW5QS.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-D6EJWYAL.js +2 -0
- package/dist/cli/chunks/hnsw-index-4MWR4U5W.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-CDDRSV5E.js → hnsw-legacy-bridge-IU62PIY5.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-5JTP47LA.js → hnswlib-node-EBRXKEX5.js} +2 -2
- package/dist/cli/chunks/{hooks-6SCAE6LC.js → hooks-ZI4D3ATS.js} +10 -10
- package/dist/cli/chunks/hybrid-router-BYVUBHER.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-I3LUMO7I.js → hypergraph-engine-6JEERAGA.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-YAKAIVCN.js → hypergraph-handler-YMDGYCB6.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-OK2UIMSG.js +2 -0
- package/dist/cli/chunks/{init-handler-NBKCZD7Q.js → init-handler-N57NW3QI.js} +6 -6
- package/dist/cli/chunks/init-wizard-6NNPNS6J.js +2 -0
- package/dist/cli/chunks/kernel-F4A4GRNO.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-YGPJCPU3.js → kilocode-installer-7ABTGXJ5.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-JV3ONVMN.js → kiro-installer-2JFOHLVI.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-MSJDEZCF.js +2 -0
- package/dist/cli/chunks/{learning-2FEZJ5CX.js → learning-3P3ZXRGD.js} +3 -3
- package/dist/cli/chunks/{llm-router-SILI4KLU.js → llm-router-AWB2KHDW.js} +4 -4
- package/dist/cli/chunks/llm-router-service-27IQAO7G.js +2 -0
- package/dist/cli/chunks/{load-EGXLQVR3.js → load-GGVBCBGX.js} +2 -2
- package/dist/cli/chunks/load-test-TT5VLAN7.js +2 -0
- package/dist/cli/chunks/{mcp-OJH775TL.js → mcp-33NHIBN3.js} +2 -2
- package/dist/cli/chunks/{memory-FNEOK4FW.js → memory-IVAQS4OW.js} +5 -5
- package/dist/cli/chunks/memory-backend-FVSK53IM.js +2 -0
- package/dist/cli/chunks/{memory-handlers-6LDUH3JZ.js → memory-handlers-OPUDOZNT.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-ORTFWLLE.js → multi-model-executor-NWQY6IN2.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-UAQLW6XX.js → opencode-installer-FBB4JOEV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-VE5KJ2V4.js → orchestrator-GDAXR7DH.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-7MVEDWCY.js +2 -0
- package/dist/cli/chunks/{pipeline-FNMDRWTU.js → pipeline-VIKAOIBE.js} +2 -2
- package/dist/cli/chunks/{platform-MGAKRUQN.js → platform-FFVP36LH.js} +2 -2
- package/dist/cli/chunks/{plugin-YX7THX3I.js → plugin-TI6QOLXH.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-XJV4RLMK.js → prime-radiant-advanced-wasm-AZRNI2OL.js} +2 -2
- package/dist/cli/chunks/protocol-executor-BLDDYEJ4.js +2 -0
- package/dist/cli/chunks/{protocol-handler-QFET442Y.js → protocol-handler-J4EA34B3.js} +2 -2
- package/dist/cli/chunks/{prove-QBAESCOC.js → prove-ADVRMAWS.js} +2 -2
- package/dist/cli/chunks/provider-manager-ZYCFRYZQ.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-P66CCPHM.js +2 -0
- package/dist/cli/chunks/{quality-ZTNRL6EG.js → quality-GB5SJFSD.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-LPHT3SX5.js +2 -0
- package/dist/cli/chunks/{real-embeddings-ZFFDV6HC.js → real-embeddings-GDRJ4XSH.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-J4LFL4AE.js → roocode-installer-Q6EISUDV.js} +2 -2
- package/dist/cli/chunks/router-XQ2TERUT.js +2 -0
- package/dist/cli/chunks/routing-feedback-K52O752B.js +2 -0
- package/dist/cli/chunks/{routing-handler-A5QG2TP2.js → routing-handler-RO4RTRAG.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-J5JL5WX5.js → ruvector-commands-FFIHCGVQ.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-H7442GMO.js → rvf-dual-writer-JGEK3A5Y.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-PTFQUYKC.js → rvf-migration-adapter-OVYC4QM6.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-RSNROYRX.js → rvf-migration-coordinator-U6L77QTS.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-G4DV7FK3.js +2 -0
- package/dist/cli/chunks/safe-db-TMSEITES.js +2 -0
- package/dist/cli/chunks/schedule-RWFLA43O.js +2 -0
- package/dist/cli/chunks/scheduler-2V55MJJR.js +2 -0
- package/dist/cli/chunks/{security-LHHLMCBA.js → security-QPQIDAIL.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-NPSHVUTM.js → shared-rvf-adapter-JRJTI4UD.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-INQDY5WE.js → shared-rvf-dual-writer-DSHGURDA.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-L7QM6IWF.js +2 -0
- package/dist/cli/chunks/{status-handler-R2KIAMAE.js → status-handler-SBT3MZTX.js} +2 -2
- package/dist/cli/chunks/{structural-health-2VPPIOZX.js → structural-health-UVECCN7U.js} +2 -2
- package/dist/cli/chunks/{sync-ASZ3T5GT.js → sync-XXIGTGCG.js} +2 -2
- package/dist/cli/chunks/{sync-NLASP7AK.js → sync-ZLZ4CZFJ.js} +2 -2
- package/dist/cli/chunks/{task-handler-UV5R6LJG.js → task-handler-73YAVOKJ.js} +2 -2
- package/dist/cli/chunks/{task-handlers-I6YJXPYP.js → task-handlers-PKECV27D.js} +3 -3
- package/dist/cli/chunks/{test-TE43TNTI.js → test-U3SXW4SV.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WWWWF2TZ.js → test-scheduling-POJND3GV.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HEWP7KKS.js → token-bootstrap-ICX6SIXJ.js} +2 -2
- package/dist/cli/chunks/{token-usage-3FVHUAW6.js → token-usage-WCHJUVGT.js} +2 -2
- package/dist/cli/chunks/{transformers-O5OFM4XM.js → transformers-L77UIHIY.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YOYWFW63.js → tree-sitter-wasm-parser-CVAXURQP.js} +2 -2
- package/dist/cli/chunks/{types-42GR6PLO.js → types-LNVJBDM2.js} +2 -2
- package/dist/cli/chunks/unified-memory-ZSULA46X.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-SQEWFUBN.js +2 -0
- package/dist/cli/chunks/unified-persistence-EDCTT6SE.js +2 -0
- package/dist/cli/chunks/{upgrade-BU6DJ4LT.js → upgrade-4ND5RQFY.js} +2 -2
- package/dist/cli/chunks/{validate-MPTBARGN.js → validate-ZA4XT6K2.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-5LUQYHPP.js → validate-swarm-FNK3GCJ4.js} +2 -2
- package/dist/cli/chunks/{vibium-MJJDANDL.js → vibium-E2CK2GBQ.js} +2 -2
- package/dist/cli/chunks/visual-security-SOGAETFP.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-5TF4UGB3.js → web-tree-sitter-63VRNKZV.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-NQAOSVCN.js → windsurf-installer-5BTCVOLH.js} +2 -2
- package/dist/cli/chunks/{witness-chain-23UWK2JT.js → witness-chain-6CUUGISD.js} +2 -2
- package/dist/cli/chunks/witness-chain-AJCECBH5.js +2 -0
- package/dist/cli/chunks/{workflow-3QOLXRJC.js → workflow-V7ED22XT.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UXRUCOZR.js +2 -0
- package/dist/cli/chunks/{wrappers-S6EUZBCX.js → wrappers-7S3NTTLW.js} +2 -2
- package/dist/feedback/regenerability-gate.d.ts +70 -0
- package/dist/feedback/regenerability-gate.js +91 -0
- package/dist/mcp/bundle.js +5 -5
- package/dist/shared/llm/providers/gemini.js +16 -10
- package/dist/shared/llm/providers/openrouter.js +20 -20
- package/dist/validation/conservation-guard.d.ts +39 -0
- package/dist/validation/conservation-guard.js +54 -0
- package/dist/validation/oracle-eval.d.ts +46 -0
- package/dist/validation/oracle-eval.js +108 -0
- package/dist/validation/skill-parity.d.ts +58 -0
- package/dist/validation/skill-parity.js +94 -0
- package/dist/validation/test-gen-prompt.d.ts +10 -0
- package/dist/validation/test-gen-prompt.js +26 -0
- package/package.json +8 -1
- package/dist/cli/chunks/adapter-LDNYC4GH.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-CA4CT5Q7.js +0 -2
- package/dist/cli/chunks/base-TSDAEMT4.js +0 -2
- package/dist/cli/chunks/browser-workflow-3HCTJBLR.js +0 -2
- package/dist/cli/chunks/chunk-72VVTMEL.js +0 -2
- package/dist/cli/chunks/client-WRDYZGM2.js +0 -2
- package/dist/cli/chunks/core-handlers-O6E5DNHT.js +0 -2
- package/dist/cli/chunks/cross-domain-router-EV7LQMDO.js +0 -2
- package/dist/cli/chunks/dream-E4C236UL.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-WMADLDKT.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-STRDGJ65.js +0 -2
- package/dist/cli/chunks/hnsw-index-DBHX3TSC.js +0 -2
- package/dist/cli/chunks/hybrid-router-L2K55I4T.js +0 -2
- package/dist/cli/chunks/impact-analyzer-WMO7ZGS7.js +0 -2
- package/dist/cli/chunks/init-wizard-ZAB7UZZS.js +0 -2
- package/dist/cli/chunks/kernel-4MUFDEQI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-GZRFGXLX.js +0 -2
- package/dist/cli/chunks/llm-router-service-5ODLU5U5.js +0 -2
- package/dist/cli/chunks/load-test-ZDQFS5XS.js +0 -2
- package/dist/cli/chunks/memory-backend-UK7SQ6ZM.js +0 -2
- package/dist/cli/chunks/pattern-null-store-LO2QTIBU.js +0 -2
- package/dist/cli/chunks/protocol-executor-JWMYQEOI.js +0 -2
- package/dist/cli/chunks/provider-manager-PEXOHGNB.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-7B2G4UGQ.js +0 -2
- package/dist/cli/chunks/queen-coordinator-6OF4HT3S.js +0 -2
- package/dist/cli/chunks/router-GMWRF6DU.js +0 -2
- package/dist/cli/chunks/routing-feedback-XKJSQK3I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-YEA6TMXB.js +0 -2
- package/dist/cli/chunks/safe-db-5DOP2J3V.js +0 -2
- package/dist/cli/chunks/schedule-SUWTOBHP.js +0 -2
- package/dist/cli/chunks/scheduler-P4VTC5SQ.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-5Z2RAXH7.js +0 -2
- package/dist/cli/chunks/unified-memory-HCKOPFAY.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-6NQPYA5C.js +0 -2
- package/dist/cli/chunks/unified-persistence-NIMKNAFR.js +0 -2
- package/dist/cli/chunks/visual-security-HFGHA57Z.js +0 -2
- package/dist/cli/chunks/witness-chain-VZGGJ7TJ.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-45L7D4SN.js +0 -2
|
@@ -61,7 +61,7 @@ export const OPENROUTER_PRICING = {
|
|
|
61
61
|
* OpenRouter LLM provider implementation
|
|
62
62
|
*/
|
|
63
63
|
export class OpenRouterProvider {
|
|
64
|
-
type = '
|
|
64
|
+
type = 'openrouter';
|
|
65
65
|
name = 'OpenRouter';
|
|
66
66
|
config;
|
|
67
67
|
requestId = 0;
|
|
@@ -138,7 +138,7 @@ export class OpenRouterProvider {
|
|
|
138
138
|
async generate(input, options) {
|
|
139
139
|
const apiKey = this.getApiKey();
|
|
140
140
|
if (!apiKey) {
|
|
141
|
-
throw createLLMError('OpenRouter API key not configured', 'API_KEY_MISSING', { provider: '
|
|
141
|
+
throw createLLMError('OpenRouter API key not configured', 'API_KEY_MISSING', { provider: 'openrouter', retryable: false });
|
|
142
142
|
}
|
|
143
143
|
const messages = this.formatMessages(input, options?.systemPrompt);
|
|
144
144
|
const model = options?.model ?? this.config.model;
|
|
@@ -193,7 +193,7 @@ export class OpenRouterProvider {
|
|
|
193
193
|
return {
|
|
194
194
|
content,
|
|
195
195
|
model: data.model,
|
|
196
|
-
provider: '
|
|
196
|
+
provider: 'openrouter',
|
|
197
197
|
usage,
|
|
198
198
|
cost,
|
|
199
199
|
latencyMs,
|
|
@@ -206,7 +206,7 @@ export class OpenRouterProvider {
|
|
|
206
206
|
if (error instanceof Error && 'code' in error) {
|
|
207
207
|
throw error; // Re-throw LLM errors
|
|
208
208
|
}
|
|
209
|
-
throw createLLMError(error instanceof Error ? error.message : 'Request failed', 'NETWORK_ERROR', { provider: '
|
|
209
|
+
throw createLLMError(error instanceof Error ? error.message : 'Request failed', 'NETWORK_ERROR', { provider: 'openrouter', model, retryable: true, cause: error });
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
/**
|
|
@@ -216,7 +216,7 @@ export class OpenRouterProvider {
|
|
|
216
216
|
async *generateStream(input, options) {
|
|
217
217
|
const apiKey = this.getApiKey();
|
|
218
218
|
if (!apiKey) {
|
|
219
|
-
throw createLLMError('OpenRouter API key not configured', 'API_KEY_MISSING', { provider: '
|
|
219
|
+
throw createLLMError('OpenRouter API key not configured', 'API_KEY_MISSING', { provider: 'openrouter', retryable: false });
|
|
220
220
|
}
|
|
221
221
|
const messages = this.formatMessages(input, options?.systemPrompt);
|
|
222
222
|
const model = options?.model ?? this.config.model;
|
|
@@ -246,7 +246,7 @@ export class OpenRouterProvider {
|
|
|
246
246
|
throw this.handleApiError(response.status, errorData, model);
|
|
247
247
|
}
|
|
248
248
|
if (!response.body) {
|
|
249
|
-
throw createLLMError('No response body for streaming', 'NETWORK_ERROR', { provider: '
|
|
249
|
+
throw createLLMError('No response body for streaming', 'NETWORK_ERROR', { provider: 'openrouter', model, retryable: true });
|
|
250
250
|
}
|
|
251
251
|
let fullContent = '';
|
|
252
252
|
let finishReason = 'stop';
|
|
@@ -311,7 +311,7 @@ export class OpenRouterProvider {
|
|
|
311
311
|
return {
|
|
312
312
|
content: fullContent,
|
|
313
313
|
model: responseModel,
|
|
314
|
-
provider: '
|
|
314
|
+
provider: 'openrouter',
|
|
315
315
|
usage,
|
|
316
316
|
cost,
|
|
317
317
|
latencyMs,
|
|
@@ -327,7 +327,7 @@ export class OpenRouterProvider {
|
|
|
327
327
|
async embed(text, options) {
|
|
328
328
|
const apiKey = this.getApiKey();
|
|
329
329
|
if (!apiKey) {
|
|
330
|
-
throw createLLMError('OpenRouter API key not configured', 'API_KEY_MISSING', { provider: '
|
|
330
|
+
throw createLLMError('OpenRouter API key not configured', 'API_KEY_MISSING', { provider: 'openrouter', retryable: false });
|
|
331
331
|
}
|
|
332
332
|
const model = options?.model ?? 'openai/text-embedding-3-small';
|
|
333
333
|
const start = Date.now();
|
|
@@ -351,7 +351,7 @@ export class OpenRouterProvider {
|
|
|
351
351
|
return {
|
|
352
352
|
embedding: data.data[0].embedding,
|
|
353
353
|
model: data.model,
|
|
354
|
-
provider: '
|
|
354
|
+
provider: 'openrouter',
|
|
355
355
|
tokenCount: data.usage.total_tokens,
|
|
356
356
|
latencyMs,
|
|
357
357
|
cached: false,
|
|
@@ -361,7 +361,7 @@ export class OpenRouterProvider {
|
|
|
361
361
|
if (error instanceof Error && 'code' in error) {
|
|
362
362
|
throw error;
|
|
363
363
|
}
|
|
364
|
-
throw createLLMError(error instanceof Error ? error.message : 'Embedding request failed', 'NETWORK_ERROR', { provider: '
|
|
364
|
+
throw createLLMError(error instanceof Error ? error.message : 'Embedding request failed', 'NETWORK_ERROR', { provider: 'openrouter', model, retryable: true, cause: error });
|
|
365
365
|
}
|
|
366
366
|
}
|
|
367
367
|
/**
|
|
@@ -378,7 +378,7 @@ export class OpenRouterProvider {
|
|
|
378
378
|
return {
|
|
379
379
|
completion: response.content,
|
|
380
380
|
model: response.model,
|
|
381
|
-
provider: '
|
|
381
|
+
provider: 'openrouter',
|
|
382
382
|
usage: response.usage,
|
|
383
383
|
latencyMs: response.latencyMs,
|
|
384
384
|
cached: response.cached,
|
|
@@ -525,19 +525,19 @@ export class OpenRouterProvider {
|
|
|
525
525
|
switch (status) {
|
|
526
526
|
case 401:
|
|
527
527
|
throw createLLMError(message, 'API_KEY_INVALID', {
|
|
528
|
-
provider: '
|
|
528
|
+
provider: 'openrouter',
|
|
529
529
|
model,
|
|
530
530
|
retryable: false,
|
|
531
531
|
});
|
|
532
532
|
case 402:
|
|
533
533
|
throw createLLMError(message, 'COST_LIMIT_EXCEEDED', {
|
|
534
|
-
provider: '
|
|
534
|
+
provider: 'openrouter',
|
|
535
535
|
model,
|
|
536
536
|
retryable: false,
|
|
537
537
|
});
|
|
538
538
|
case 429:
|
|
539
539
|
throw createLLMError(message, 'RATE_LIMITED', {
|
|
540
|
-
provider: '
|
|
540
|
+
provider: 'openrouter',
|
|
541
541
|
model,
|
|
542
542
|
retryable: true,
|
|
543
543
|
retryAfterMs: 60000,
|
|
@@ -545,19 +545,19 @@ export class OpenRouterProvider {
|
|
|
545
545
|
case 400:
|
|
546
546
|
if (errorCode === 'context_length_exceeded' || errorType === 'invalid_request_error') {
|
|
547
547
|
throw createLLMError(message, 'CONTEXT_LENGTH_EXCEEDED', {
|
|
548
|
-
provider: '
|
|
548
|
+
provider: 'openrouter',
|
|
549
549
|
model,
|
|
550
550
|
retryable: false,
|
|
551
551
|
});
|
|
552
552
|
}
|
|
553
553
|
throw createLLMError(message, 'UNKNOWN', {
|
|
554
|
-
provider: '
|
|
554
|
+
provider: 'openrouter',
|
|
555
555
|
model,
|
|
556
556
|
retryable: false,
|
|
557
557
|
});
|
|
558
558
|
case 404:
|
|
559
559
|
throw createLLMError(message, 'MODEL_NOT_FOUND', {
|
|
560
|
-
provider: '
|
|
560
|
+
provider: 'openrouter',
|
|
561
561
|
model,
|
|
562
562
|
retryable: false,
|
|
563
563
|
});
|
|
@@ -565,14 +565,14 @@ export class OpenRouterProvider {
|
|
|
565
565
|
case 502:
|
|
566
566
|
case 503:
|
|
567
567
|
throw createLLMError(message, 'PROVIDER_UNAVAILABLE', {
|
|
568
|
-
provider: '
|
|
568
|
+
provider: 'openrouter',
|
|
569
569
|
model,
|
|
570
570
|
retryable: true,
|
|
571
571
|
retryAfterMs: 5000,
|
|
572
572
|
});
|
|
573
573
|
default:
|
|
574
574
|
throw createLLMError(message, 'UNKNOWN', {
|
|
575
|
-
provider: '
|
|
575
|
+
provider: 'openrouter',
|
|
576
576
|
model,
|
|
577
577
|
retryable: false,
|
|
578
578
|
});
|
|
@@ -594,7 +594,7 @@ export class OpenRouterProvider {
|
|
|
594
594
|
catch (error) {
|
|
595
595
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
596
596
|
throw createLLMError('Request timed out', 'TIMEOUT', {
|
|
597
|
-
provider: '
|
|
597
|
+
provider: 'openrouter',
|
|
598
598
|
retryable: true,
|
|
599
599
|
});
|
|
600
600
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conservation Guard (Phoenix essay 14 "UI Is a Conservation Layer", ADR-114)
|
|
3
|
+
*
|
|
4
|
+
* AQE's human/agent-facing surfaces — CLI commands, output schemas, MCP tools,
|
|
5
|
+
* the dashboard — are its conservation layer: users and CI pipelines build muscle
|
|
6
|
+
* memory and scripts around them. Internals may regenerate freely; these surfaces
|
|
7
|
+
* must change slowly and ADDITIVELY. This module diffs a captured baseline against
|
|
8
|
+
* the current surface and flags breaking removals/renames that are not in the
|
|
9
|
+
* deprecation registry.
|
|
10
|
+
*
|
|
11
|
+
* Pure functions only — extraction + I/O live in scripts/conservation-guard.ts.
|
|
12
|
+
*/
|
|
13
|
+
export interface SurfaceDiff {
|
|
14
|
+
surface: string;
|
|
15
|
+
/** Entries present now but not in the baseline — additive, always allowed. */
|
|
16
|
+
added: string[];
|
|
17
|
+
/** Entries removed from the baseline and NOT in the deprecation registry — breaking. */
|
|
18
|
+
removedBreaking: string[];
|
|
19
|
+
/** Entries removed but listed as deprecated — an allowed, deliberate removal. */
|
|
20
|
+
removedDeprecated: string[];
|
|
21
|
+
/** True when there are no breaking removals. */
|
|
22
|
+
clean: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Diff one surface. Additive changes pass; a removal/rename is breaking unless the
|
|
26
|
+
* removed entry appears in `deprecated` (the deprecation window has been honored).
|
|
27
|
+
*/
|
|
28
|
+
export declare function diffSurface(surface: string, baseline: string[], current: string[], deprecated?: string[]): SurfaceDiff;
|
|
29
|
+
export interface ConservationReport {
|
|
30
|
+
diffs: SurfaceDiff[];
|
|
31
|
+
clean: boolean;
|
|
32
|
+
/** Total breaking removals across all surfaces. */
|
|
33
|
+
breakingCount: number;
|
|
34
|
+
}
|
|
35
|
+
/** Aggregate per-surface diffs into an overall verdict. */
|
|
36
|
+
export declare function aggregate(diffs: SurfaceDiff[]): ConservationReport;
|
|
37
|
+
/** Human-readable report (used by the CLI guard and CI logs). */
|
|
38
|
+
export declare function formatReport(report: ConservationReport): string;
|
|
39
|
+
//# sourceMappingURL=conservation-guard.d.ts.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conservation Guard (Phoenix essay 14 "UI Is a Conservation Layer", ADR-114)
|
|
3
|
+
*
|
|
4
|
+
* AQE's human/agent-facing surfaces — CLI commands, output schemas, MCP tools,
|
|
5
|
+
* the dashboard — are its conservation layer: users and CI pipelines build muscle
|
|
6
|
+
* memory and scripts around them. Internals may regenerate freely; these surfaces
|
|
7
|
+
* must change slowly and ADDITIVELY. This module diffs a captured baseline against
|
|
8
|
+
* the current surface and flags breaking removals/renames that are not in the
|
|
9
|
+
* deprecation registry.
|
|
10
|
+
*
|
|
11
|
+
* Pure functions only — extraction + I/O live in scripts/conservation-guard.ts.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Diff one surface. Additive changes pass; a removal/rename is breaking unless the
|
|
15
|
+
* removed entry appears in `deprecated` (the deprecation window has been honored).
|
|
16
|
+
*/
|
|
17
|
+
export function diffSurface(surface, baseline, current, deprecated = []) {
|
|
18
|
+
const cur = new Set(current);
|
|
19
|
+
const dep = new Set(deprecated);
|
|
20
|
+
const added = current.filter((e) => !baseline.includes(e)).sort();
|
|
21
|
+
const removed = baseline.filter((e) => !cur.has(e));
|
|
22
|
+
const removedBreaking = removed.filter((e) => !dep.has(e)).sort();
|
|
23
|
+
const removedDeprecated = removed.filter((e) => dep.has(e)).sort();
|
|
24
|
+
return {
|
|
25
|
+
surface,
|
|
26
|
+
added,
|
|
27
|
+
removedBreaking,
|
|
28
|
+
removedDeprecated,
|
|
29
|
+
clean: removedBreaking.length === 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Aggregate per-surface diffs into an overall verdict. */
|
|
33
|
+
export function aggregate(diffs) {
|
|
34
|
+
const breakingCount = diffs.reduce((n, d) => n + d.removedBreaking.length, 0);
|
|
35
|
+
return { diffs, clean: breakingCount === 0, breakingCount };
|
|
36
|
+
}
|
|
37
|
+
/** Human-readable report (used by the CLI guard and CI logs). */
|
|
38
|
+
export function formatReport(report) {
|
|
39
|
+
const lines = [];
|
|
40
|
+
for (const d of report.diffs) {
|
|
41
|
+
const status = d.clean ? '✓' : '✗ BREAKING';
|
|
42
|
+
lines.push(`${status} ${d.surface}: +${d.added.length} added, -${d.removedBreaking.length} breaking, -${d.removedDeprecated.length} deprecated`);
|
|
43
|
+
for (const r of d.removedBreaking)
|
|
44
|
+
lines.push(` REMOVED (breaking): ${r}`);
|
|
45
|
+
for (const r of d.removedDeprecated)
|
|
46
|
+
lines.push(` removed (deprecated, ok): ${r}`);
|
|
47
|
+
}
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push(report.clean
|
|
50
|
+
? '✓ conservation guard: no breaking surface changes'
|
|
51
|
+
: `✗ conservation guard: ${report.breakingCount} breaking surface change(s) — add to the deprecation registry (with a deprecation window) or restore them. To intentionally rebaseline: --update.`);
|
|
52
|
+
return lines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=conservation-guard.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Oracle Evaluator for skill evals (Oracle-Evals plan, Phase 0/1)
|
|
3
|
+
*
|
|
4
|
+
* Turns a skill eval from a keyword grep into a real ORACLE: it RUNS a
|
|
5
|
+
* generated test against a reference implementation (must pass) and against
|
|
6
|
+
* first-order operator mutants of that implementation (each surviving mutant
|
|
7
|
+
* is a bug the test failed to catch). The mutation kill rate is the eval's
|
|
8
|
+
* pass signal — a test that asserts nothing scores 0 and fails.
|
|
9
|
+
*
|
|
10
|
+
* Reuses the proven qe-arena primitives (ADR-104): the deterministic operator
|
|
11
|
+
* mutator and the real `node --test` fixture runner. Nothing is simulated.
|
|
12
|
+
*/
|
|
13
|
+
export interface OracleSpec {
|
|
14
|
+
/** Base name (no extension) for the module under test, e.g. "inRange". */
|
|
15
|
+
moduleName: string;
|
|
16
|
+
/** ESM source of the correct implementation, e.g. `export function inRange(...) {...}`. */
|
|
17
|
+
referenceImpl: string;
|
|
18
|
+
/** Generated test source. Imports the impl as `../src/<moduleName>.mjs`. */
|
|
19
|
+
generatedTest: string;
|
|
20
|
+
/** Cap on mutants evaluated (deterministic prefix of the position-sorted list). */
|
|
21
|
+
maxMutants?: number;
|
|
22
|
+
/** Minimum mutation kill rate required to pass. Default 0.5. */
|
|
23
|
+
threshold?: number;
|
|
24
|
+
/** Per-`node --test` timeout in ms. Default 30s (evals run many subprocesses). */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface OracleResult {
|
|
28
|
+
/** Did the generated test pass against the unmutated reference implementation? */
|
|
29
|
+
baselinePassed: boolean;
|
|
30
|
+
mutantsTotal: number;
|
|
31
|
+
mutantsKilled: number;
|
|
32
|
+
/** killed / total, rounded to 4dp (0 when there are no mutants). */
|
|
33
|
+
mutationScore: number;
|
|
34
|
+
/** Mutant ids the test failed to catch (bugs it would let through). */
|
|
35
|
+
survivedMutantIds: string[];
|
|
36
|
+
/** baselinePassed AND mutationScore >= threshold AND at least one mutant existed. */
|
|
37
|
+
passed: boolean;
|
|
38
|
+
/** Human-readable explanation of the verdict. */
|
|
39
|
+
reason: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Evaluate a generated test as an oracle against a reference implementation.
|
|
43
|
+
* Real `node --test` runs; deterministic mutant enumeration.
|
|
44
|
+
*/
|
|
45
|
+
export declare function evaluateOracle(spec: OracleSpec): OracleResult;
|
|
46
|
+
//# sourceMappingURL=oracle-eval.d.ts.map
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Oracle Evaluator for skill evals (Oracle-Evals plan, Phase 0/1)
|
|
3
|
+
*
|
|
4
|
+
* Turns a skill eval from a keyword grep into a real ORACLE: it RUNS a
|
|
5
|
+
* generated test against a reference implementation (must pass) and against
|
|
6
|
+
* first-order operator mutants of that implementation (each surviving mutant
|
|
7
|
+
* is a bug the test failed to catch). The mutation kill rate is the eval's
|
|
8
|
+
* pass signal — a test that asserts nothing scores 0 and fails.
|
|
9
|
+
*
|
|
10
|
+
* Reuses the proven qe-arena primitives (ADR-104): the deterministic operator
|
|
11
|
+
* mutator and the real `node --test` fixture runner. Nothing is simulated.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { enumerateMutants, applyMutant } from '../arena/mutator.js';
|
|
16
|
+
import { runNodeTest, makeTmpRoot, cleanupTmpRoot } from '../arena/runner.js';
|
|
17
|
+
/** Write a throwaway { src/<m>.mjs, tests/<m>.test.mjs } workspace and return its dir. */
|
|
18
|
+
function materialize(tmpRoot, moduleName, impl, test) {
|
|
19
|
+
const dir = fs.mkdtempSync(path.join(tmpRoot, 'oracle-ws-'));
|
|
20
|
+
fs.mkdirSync(path.join(dir, 'src'), { recursive: true });
|
|
21
|
+
fs.mkdirSync(path.join(dir, 'tests'), { recursive: true });
|
|
22
|
+
fs.writeFileSync(path.join(dir, 'src', `${moduleName}.mjs`), impl);
|
|
23
|
+
fs.writeFileSync(path.join(dir, 'tests', `${moduleName}.test.mjs`), test);
|
|
24
|
+
return dir;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Evaluate a generated test as an oracle against a reference implementation.
|
|
28
|
+
* Real `node --test` runs; deterministic mutant enumeration.
|
|
29
|
+
*/
|
|
30
|
+
export function evaluateOracle(spec) {
|
|
31
|
+
const threshold = spec.threshold ?? 0.5;
|
|
32
|
+
const timeoutMs = spec.timeoutMs ?? 30_000;
|
|
33
|
+
const tmpRoot = makeTmpRoot();
|
|
34
|
+
try {
|
|
35
|
+
// 0. Sanity: reject output that is not a runnable, asserting test. An empty
|
|
36
|
+
// or assertion-less file passes `node --test` (exit 0) but proves nothing —
|
|
37
|
+
// catch it here so the verdict is honest rather than relying on a 0 kill rate.
|
|
38
|
+
if (!/assert\s*[.(]|expect\s*\(|\.(toBe|toEqual|toThrow|toMatch)\b/.test(spec.generatedTest)) {
|
|
39
|
+
return {
|
|
40
|
+
baselinePassed: false,
|
|
41
|
+
mutantsTotal: 0,
|
|
42
|
+
mutantsKilled: 0,
|
|
43
|
+
mutationScore: 0,
|
|
44
|
+
survivedMutantIds: [],
|
|
45
|
+
passed: false,
|
|
46
|
+
reason: 'generated output contains no assertions — not a runnable test',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// 1. Baseline: the test must pass against the correct implementation.
|
|
50
|
+
const baselineDir = materialize(tmpRoot, spec.moduleName, spec.referenceImpl, spec.generatedTest);
|
|
51
|
+
const baseline = runNodeTest(baselineDir, { timeoutMs });
|
|
52
|
+
if (!baseline.ok) {
|
|
53
|
+
return {
|
|
54
|
+
baselinePassed: false,
|
|
55
|
+
mutantsTotal: 0,
|
|
56
|
+
mutantsKilled: 0,
|
|
57
|
+
mutationScore: 0,
|
|
58
|
+
survivedMutantIds: [],
|
|
59
|
+
passed: false,
|
|
60
|
+
reason: 'generated test does not pass against the reference implementation',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// 2. Mutants: each one the test fails to fail-on is a missed bug.
|
|
64
|
+
let mutants = enumerateMutants(spec.referenceImpl, spec.moduleName);
|
|
65
|
+
if (spec.maxMutants !== undefined && mutants.length > spec.maxMutants) {
|
|
66
|
+
mutants = mutants.slice(0, spec.maxMutants);
|
|
67
|
+
}
|
|
68
|
+
if (mutants.length === 0) {
|
|
69
|
+
return {
|
|
70
|
+
baselinePassed: true,
|
|
71
|
+
mutantsTotal: 0,
|
|
72
|
+
mutantsKilled: 0,
|
|
73
|
+
mutationScore: 0,
|
|
74
|
+
survivedMutantIds: [],
|
|
75
|
+
passed: false,
|
|
76
|
+
reason: 'no operator mutants could be generated for the reference implementation (cannot prove the test catches anything)',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
let killed = 0;
|
|
80
|
+
const survived = [];
|
|
81
|
+
for (const mutant of mutants) {
|
|
82
|
+
const dir = materialize(tmpRoot, spec.moduleName, applyMutant(spec.referenceImpl, mutant), spec.generatedTest);
|
|
83
|
+
const run = runNodeTest(dir, { timeoutMs });
|
|
84
|
+
if (!run.ok)
|
|
85
|
+
killed++;
|
|
86
|
+
else
|
|
87
|
+
survived.push(mutant.id);
|
|
88
|
+
}
|
|
89
|
+
const total = mutants.length;
|
|
90
|
+
const score = Math.round((killed / total) * 10000) / 10000;
|
|
91
|
+
const passed = score >= threshold;
|
|
92
|
+
return {
|
|
93
|
+
baselinePassed: true,
|
|
94
|
+
mutantsTotal: total,
|
|
95
|
+
mutantsKilled: killed,
|
|
96
|
+
mutationScore: score,
|
|
97
|
+
survivedMutantIds: survived,
|
|
98
|
+
passed,
|
|
99
|
+
reason: passed
|
|
100
|
+
? `killed ${killed}/${total} mutants (score ${(score * 100).toFixed(0)}%)`
|
|
101
|
+
: `mutation score ${(score * 100).toFixed(0)}% < threshold ${(threshold * 100).toFixed(0)}% — ${survived.length} mutant(s) survived`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
cleanupTmpRoot(tmpRoot);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=oracle-eval.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tree Parity (ADR-113, P4)
|
|
3
|
+
*
|
|
4
|
+
* AQE skills are duplicated across trees (.claude/skills is canonical; assets/skills
|
|
5
|
+
* is the npm-distributed mirror; plugins/ and .kiro/ are independent distributions
|
|
6
|
+
* with their own frontmatter conventions). The mirror has silently drifted from
|
|
7
|
+
* canonical before — this module detects that drift so CI can fail loud.
|
|
8
|
+
*
|
|
9
|
+
* Comparison is frontmatter-AGNOSTIC: only the markdown body (after the YAML block)
|
|
10
|
+
* is compared, because legitimate per-tree frontmatter (allowed-tools, inclusion)
|
|
11
|
+
* differs by design. Pure functions — fs walking lives in scripts/check-skill-parity.ts.
|
|
12
|
+
*/
|
|
13
|
+
export type ParityStatus = 'match' | 'drift' | 'absent';
|
|
14
|
+
export interface ParityEntry {
|
|
15
|
+
skill: string;
|
|
16
|
+
status: ParityStatus;
|
|
17
|
+
}
|
|
18
|
+
export interface ParityReport {
|
|
19
|
+
/** Mirror tree compared against canonical, e.g. "assets/skills". */
|
|
20
|
+
mirror: string;
|
|
21
|
+
total: number;
|
|
22
|
+
match: number;
|
|
23
|
+
drift: number;
|
|
24
|
+
absent: number;
|
|
25
|
+
entries: ParityEntry[];
|
|
26
|
+
/** True when no skill in the mirror has drifted (absent is allowed). */
|
|
27
|
+
clean: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Remove a leading YAML frontmatter block (between the first two `---` lines)
|
|
31
|
+
* and normalize trailing whitespace. Body-only so frontmatter may differ per tree.
|
|
32
|
+
*/
|
|
33
|
+
export declare function stripFrontmatter(markdown: string): string;
|
|
34
|
+
/** True when two skill docs share the same body (ignoring frontmatter + edge whitespace). */
|
|
35
|
+
export declare function bodiesMatch(canonical: string, copy: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Split a skill doc into its leading YAML frontmatter block (including the `---`
|
|
38
|
+
* delimiters) and the markdown body. When there is no frontmatter, `frontmatter`
|
|
39
|
+
* is empty and `body` is the whole document.
|
|
40
|
+
*/
|
|
41
|
+
export declare function splitFrontmatter(markdown: string): {
|
|
42
|
+
frontmatter: string;
|
|
43
|
+
body: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Reconcile a mirror copy to canonical: keep the MIRROR's frontmatter (per-tree
|
|
47
|
+
* conventions like allowed-tools / inclusion) but replace its body with canonical's.
|
|
48
|
+
* This is how a faithful mirror is resynced without losing its frontmatter.
|
|
49
|
+
*/
|
|
50
|
+
export declare function reconcileBody(mirrorContent: string, canonicalContent: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Build a parity report from already-read file contents.
|
|
53
|
+
* `canonical` maps skill name → SKILL.md content (the source of truth).
|
|
54
|
+
* `mirror` maps skill name → SKILL.md content (undefined when absent in the mirror).
|
|
55
|
+
* Only skills present in canonical are evaluated.
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildParityReport(mirror: string, canonical: Record<string, string>, mirrorContents: Record<string, string | undefined>): ParityReport;
|
|
58
|
+
//# sourceMappingURL=skill-parity.d.ts.map
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tree Parity (ADR-113, P4)
|
|
3
|
+
*
|
|
4
|
+
* AQE skills are duplicated across trees (.claude/skills is canonical; assets/skills
|
|
5
|
+
* is the npm-distributed mirror; plugins/ and .kiro/ are independent distributions
|
|
6
|
+
* with their own frontmatter conventions). The mirror has silently drifted from
|
|
7
|
+
* canonical before — this module detects that drift so CI can fail loud.
|
|
8
|
+
*
|
|
9
|
+
* Comparison is frontmatter-AGNOSTIC: only the markdown body (after the YAML block)
|
|
10
|
+
* is compared, because legitimate per-tree frontmatter (allowed-tools, inclusion)
|
|
11
|
+
* differs by design. Pure functions — fs walking lives in scripts/check-skill-parity.ts.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Remove a leading YAML frontmatter block (between the first two `---` lines)
|
|
15
|
+
* and normalize trailing whitespace. Body-only so frontmatter may differ per tree.
|
|
16
|
+
*/
|
|
17
|
+
export function stripFrontmatter(markdown) {
|
|
18
|
+
const lines = markdown.split('\n');
|
|
19
|
+
if (lines[0]?.trim() === '---') {
|
|
20
|
+
for (let i = 1; i < lines.length; i++) {
|
|
21
|
+
if (lines[i].trim() === '---') {
|
|
22
|
+
return lines.slice(i + 1).join('\n').trim();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return markdown.trim();
|
|
27
|
+
}
|
|
28
|
+
/** True when two skill docs share the same body (ignoring frontmatter + edge whitespace). */
|
|
29
|
+
export function bodiesMatch(canonical, copy) {
|
|
30
|
+
return stripFrontmatter(canonical) === stripFrontmatter(copy);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Split a skill doc into its leading YAML frontmatter block (including the `---`
|
|
34
|
+
* delimiters) and the markdown body. When there is no frontmatter, `frontmatter`
|
|
35
|
+
* is empty and `body` is the whole document.
|
|
36
|
+
*/
|
|
37
|
+
export function splitFrontmatter(markdown) {
|
|
38
|
+
const lines = markdown.split('\n');
|
|
39
|
+
if (lines[0]?.trim() === '---') {
|
|
40
|
+
for (let i = 1; i < lines.length; i++) {
|
|
41
|
+
if (lines[i].trim() === '---') {
|
|
42
|
+
return {
|
|
43
|
+
frontmatter: lines.slice(0, i + 1).join('\n'),
|
|
44
|
+
body: lines.slice(i + 1).join('\n'),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { frontmatter: '', body: markdown };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reconcile a mirror copy to canonical: keep the MIRROR's frontmatter (per-tree
|
|
53
|
+
* conventions like allowed-tools / inclusion) but replace its body with canonical's.
|
|
54
|
+
* This is how a faithful mirror is resynced without losing its frontmatter.
|
|
55
|
+
*/
|
|
56
|
+
export function reconcileBody(mirrorContent, canonicalContent) {
|
|
57
|
+
const mirror = splitFrontmatter(mirrorContent);
|
|
58
|
+
const canon = splitFrontmatter(canonicalContent);
|
|
59
|
+
if (!mirror.frontmatter)
|
|
60
|
+
return canonicalContent; // no frontmatter to preserve
|
|
61
|
+
return `${mirror.frontmatter}\n${canon.body.replace(/^\n+/, '')}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build a parity report from already-read file contents.
|
|
65
|
+
* `canonical` maps skill name → SKILL.md content (the source of truth).
|
|
66
|
+
* `mirror` maps skill name → SKILL.md content (undefined when absent in the mirror).
|
|
67
|
+
* Only skills present in canonical are evaluated.
|
|
68
|
+
*/
|
|
69
|
+
export function buildParityReport(mirror, canonical, mirrorContents) {
|
|
70
|
+
const entries = [];
|
|
71
|
+
for (const skill of Object.keys(canonical).sort()) {
|
|
72
|
+
const copy = mirrorContents[skill];
|
|
73
|
+
if (copy === undefined) {
|
|
74
|
+
entries.push({ skill, status: 'absent' });
|
|
75
|
+
}
|
|
76
|
+
else if (bodiesMatch(canonical[skill], copy)) {
|
|
77
|
+
entries.push({ skill, status: 'match' });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
entries.push({ skill, status: 'drift' });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const drift = entries.filter((e) => e.status === 'drift').length;
|
|
84
|
+
return {
|
|
85
|
+
mirror,
|
|
86
|
+
total: entries.length,
|
|
87
|
+
match: entries.filter((e) => e.status === 'match').length,
|
|
88
|
+
drift,
|
|
89
|
+
absent: entries.filter((e) => e.status === 'absent').length,
|
|
90
|
+
entries,
|
|
91
|
+
clean: drift === 0,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=skill-parity.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable-first test-generation prompt (ADR-113).
|
|
3
|
+
*
|
|
4
|
+
* Builds the instruction sent to a model when generating a test for oracle
|
|
5
|
+
* grading: the test must import the module under test from `../src/<name>.mjs`
|
|
6
|
+
* and assert boundaries/branches (durable), not a single happy path — so the
|
|
7
|
+
* mutation oracle can actually measure fault detection. Pure + testable.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildTestGenPrompt(codeUnderTest: string, moduleName: string): string;
|
|
10
|
+
//# sourceMappingURL=test-gen-prompt.d.ts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable-first test-generation prompt (ADR-113).
|
|
3
|
+
*
|
|
4
|
+
* Builds the instruction sent to a model when generating a test for oracle
|
|
5
|
+
* grading: the test must import the module under test from `../src/<name>.mjs`
|
|
6
|
+
* and assert boundaries/branches (durable), not a single happy path — so the
|
|
7
|
+
* mutation oracle can actually measure fault detection. Pure + testable.
|
|
8
|
+
*/
|
|
9
|
+
export function buildTestGenPrompt(codeUnderTest, moduleName) {
|
|
10
|
+
return `You are AQE's test generator. Write JavaScript tests for the function below using Node's built-in test runner.
|
|
11
|
+
|
|
12
|
+
Strict requirements:
|
|
13
|
+
- Use: import test from 'node:test';
|
|
14
|
+
- Use: import assert from 'node:assert/strict';
|
|
15
|
+
- Import the function under test EXACTLY as: import { ${moduleName} } from '../src/${moduleName}.mjs';
|
|
16
|
+
- Write DURABLE tests: assert boundary values and every branch/decision of the logic, not just one happy path. The tests should still pass if the function were reimplemented in another language.
|
|
17
|
+
- Every test must contain at least one assert.* call.
|
|
18
|
+
- Output ONLY the test code inside a single \`\`\`js code block. No prose, no explanation.
|
|
19
|
+
|
|
20
|
+
Function under test:
|
|
21
|
+
\`\`\`js
|
|
22
|
+
${codeUnderTest}
|
|
23
|
+
\`\`\`
|
|
24
|
+
`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=test-gen-prompt.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-qe",
|
|
3
|
-
"version": "3.11.
|
|
3
|
+
"version": "3.11.3",
|
|
4
4
|
"description": "Agentic Quality Engineering V3 - Domain-Driven Design Architecture with 13 Bounded Contexts, O(log n) coverage analysis, ReasoningBank learning, 60 specialized QE agents, mathematical Coherence verification, deep Claude Flow integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -85,6 +85,13 @@
|
|
|
85
85
|
"mcp:report": "echo 'MCP Report: uses vitest for test reporting' && exit 0",
|
|
86
86
|
"test:code-intelligence": "npm test -- --run tests/unit/domains/code-intelligence/ tests/unit/coordination/mincut/",
|
|
87
87
|
"verify:invariants": "tsx scripts/verify-shipped-invariants.ts",
|
|
88
|
+
"verify:skill-parity": "tsx scripts/check-skill-parity.ts",
|
|
89
|
+
"eval:live:claude": "EVAL_PROVIDER=claude tsx scripts/validate-live-oracle.ts",
|
|
90
|
+
"eval:live:ollama": "EVAL_PROVIDER=ollama tsx scripts/validate-live-oracle.ts",
|
|
91
|
+
"eval:models": "tsx scripts/oracle-model-bench.ts",
|
|
92
|
+
"eval:models:list": "tsx scripts/openrouter-models.ts",
|
|
93
|
+
"providers:health": "tsx scripts/provider-health.ts",
|
|
94
|
+
"verify:conservation": "tsx scripts/conservation-guard.ts --ci",
|
|
88
95
|
"verify:counts": "node -e \"const fs=require('fs'),g=require('glob'),p=require('path');const src=g.globSync('src/**/*.ts',{ignore:'src/**/*.test.ts'});const tests=g.globSync('tests/**/*.test.ts');const agents=g.globSync('.claude/agents/v3/qe-*.md');const skills=g.globSync('.claude/skills/**/*.md');const ok=src.length>500&&tests.length>300;const r={status:ok?'pass':'fail',srcFiles:src.length,testFiles:tests.length,agents:agents.length,skills:skills.length};fs.mkdirSync('reports',{recursive:true});fs.writeFileSync(p.join('reports','verification-counts.json'),JSON.stringify(r,null,2));console.log('Counts:',JSON.stringify(r));if(!ok)process.exit(1)\"",
|
|
89
96
|
"verify:agent-skills": "node -e \"const fs=require('fs'),g=require('glob'),p=require('path');const agents=g.globSync('.claude/agents/v3/qe-*.md');const skills=g.globSync('.claude/skills/**/*.md');const missing=[];for(const a of agents){const name=p.basename(a,'.md');const hasSkill=skills.some(s=>s.includes(name.replace('qe-','')));if(!hasSkill)missing.push(name)}const ok=missing.length<agents.length/2;const r={status:ok?'pass':'fail',agents:agents.length,skills:skills.length,unmatchedAgents:missing.length,missing:missing.slice(0,10)};fs.mkdirSync('reports',{recursive:true});fs.writeFileSync(p.join('reports','verification-agent-skills.json'),JSON.stringify(r,null,2));console.log('Agent-Skills:',JSON.stringify(r));if(!ok)process.exit(1)\"",
|
|
90
97
|
"verify:features": "node -e \"const fs=require('fs'),p=require('path');const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const hasBin=!!pkg.bin&&Object.keys(pkg.bin).length>=2;const hasExports=!!pkg.exports&&Object.keys(pkg.exports).length>=3;const cliBundleExists=fs.existsSync('dist/cli/bundle.js');const mcpBundleExists=fs.existsSync('dist/mcp/bundle.js');const ok=hasBin&&hasExports&&cliBundleExists&&mcpBundleExists;const r={status:ok?'pass':'fail',binCount:Object.keys(pkg.bin||{}).length,exportsCount:Object.keys(pkg.exports||{}).length,cliBundleExists,mcpBundleExists};fs.mkdirSync('reports',{recursive:true});fs.writeFileSync(p.join('reports','verification-features.json'),JSON.stringify(r,null,2));console.log('Features:',JSON.stringify(r));if(!ok)process.exit(1)\"",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.11.2");process.exit(0)}
|
|
2
|
-
import{a,b,c}from"./chunk-EIWZDVMT.js";import"./chunk-OC2W7KIW.js";import"./chunk-X36TZXDK.js";import"./chunk-LY6PTRVL.js";import"./chunk-FYY7OJ6Y.js";import"./chunk-LIEA5EON.js";export{a as AgentBoosterAdapter,b as createAgentBoosterAdapter,c as createAgentBoosterAdapterSync};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.11.2");process.exit(0)}
|
|
2
|
-
import{a,b,c,d,e,f}from"./chunk-LAY35POY.js";import"./chunk-2Q65LTJN.js";import"./chunk-IO7ZUP2G.js";import"./chunk-H3LGBH4Y.js";import"./chunk-7KHZZVF2.js";import"./chunk-K6IQBVD7.js";import"./chunk-I7UWFV6N.js";import"./chunk-P7MIOTVP.js";import"./chunk-VNFL2TPU.js";import"./chunk-AK5Q2WCJ.js";import"./chunk-H5TM4KIB.js";import"./chunk-IMPSB5WW.js";import"./chunk-ZWMXF6AX.js";import"./chunk-P3VRXQ3H.js";import"./chunk-4PYJCIRO.js";import"./chunk-Y4M2HMPR.js";import"./chunk-72VVTMEL.js";import"./chunk-5BDVFFYF.js";import"./chunk-JCH2FHJ7.js";import"./chunk-LY6PTRVL.js";import"./chunk-AKZK46TQ.js";import"./chunk-CUDGKSFX.js";import"./chunk-IXYF5BZY.js";import"./chunk-QZLTIGLB.js";import"./chunk-FYY7OJ6Y.js";import"./chunk-76RO2RHG.js";import"./chunk-AZQ6HDPM.js";import"./chunk-Z2QNTRUX.js";import"./chunk-6SOGYNJG.js";import"./chunk-7MKF52GT.js";import"./chunk-XY2B2BEJ.js";import"./chunk-AINAWVGD.js";import"./chunk-NIW4CLN2.js";import"./chunk-UCXW24HY.js";import"./chunk-WKIYYF3G.js";import"./chunk-LIEA5EON.js";export{b as AQELearningEngine,a as DEFAULT_ENGINE_CONFIG,c as DEFAULT_META_LEARNING_CONFIG,d as MetaLearningEngine,e as createAQELearningEngine,f as createDefaultLearningEngine};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.11.2");process.exit(0)}
|
|
2
|
-
import{a,b,c,d,e,f,g,h,i,j,k}from"./chunk-CZYSCUJ4.js";import"./chunk-DU4GQKTH.js";import"./chunk-4PYJCIRO.js";import"./chunk-Y4M2HMPR.js";import"./chunk-72VVTMEL.js";import"./chunk-5BDVFFYF.js";import"./chunk-JCH2FHJ7.js";import"./chunk-LY6PTRVL.js";import"./chunk-IXYF5BZY.js";import"./chunk-FYY7OJ6Y.js";import"./chunk-76RO2RHG.js";import"./chunk-EDH4H55B.js";import"./chunk-AZQ6HDPM.js";import"./chunk-Z2QNTRUX.js";import"./chunk-6SOGYNJG.js";import"./chunk-7MKF52GT.js";import"./chunk-XY2B2BEJ.js";import"./chunk-AINAWVGD.js";import"./chunk-NIW4CLN2.js";import"./chunk-UCXW24HY.js";import"./chunk-WKIYYF3G.js";import"./chunk-LIEA5EON.js";export{k as MCPToolBase,j as defaultToolLogger,i as getLLMRouter,e as getMemoryBackend,g as getSharedLLMRouter,c as getSharedMemoryBackend,a as isMemoryOnlyMode,b as registerRvfResetFn,h as resetSharedLLMRouter,d as resetSharedMemoryBackend,f as setSharedLLMRouter};
|