agentic-qe 3.10.8 → 3.11.0
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/agents/v3/qe-learning-coordinator.md +1 -1
- package/.claude/skills/README.md +2 -2
- package/.claude/skills/agentic-quality-engineering/SKILL.md +6 -5
- package/.claude/skills/agentic-quality-engineering/schemas/output.json +7 -3
- package/.claude/skills/holistic-testing-pact/SKILL.md +50 -17
- package/.claude/skills/skills-manifest.json +6 -6
- package/.opencode/skills/qe-agentic-quality-engineering.yaml +5 -5
- package/.opencode/skills/qe-holistic-testing-pact.yaml +11 -11
- package/CHANGELOG.md +88 -1
- package/README.md +17 -0
- package/assets/agents/v3/qe-learning-coordinator.md +1 -1
- package/assets/skills/README.md +2 -2
- package/assets/skills/agentic-quality-engineering/SKILL.md +6 -5
- package/assets/skills/agentic-quality-engineering/schemas/output.json +7 -3
- package/assets/skills/holistic-testing-pact/SKILL.md +50 -17
- package/assets/skills/skills-manifest.json +6 -6
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-WLFT5VMV.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-4JSL6LF6.js → agent-booster-wasm-5CSKQB4O.js} +2 -2
- package/dist/cli/chunks/{agent-handler-6YOFH7KL.js → agent-handler-EBV3OKTE.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-O3IBK4BY.js → agent-memory-branch-RZ53YM2U.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-JBH4GZUM.js +2 -0
- package/dist/cli/chunks/{arena-BLCAZNAY.js → arena-QWYTIQ6I.js} +2 -2
- package/dist/cli/chunks/{arena-KLGRZTTU.js → arena-UCP74DRO.js} +4 -4
- package/dist/cli/chunks/{audit-FKKLR22S.js → audit-M4FNIX47.js} +2 -2
- package/dist/cli/chunks/base-A7JGM473.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-PNPV64M3.js → better-sqlite3-RIBLRHJL.js} +2 -2
- package/dist/cli/chunks/{brain-handler-YTGYC2QW.js → brain-handler-OY6Q2GY5.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-KIIBEJ5S.js → branch-enumerator-TQWN4NIX.js} +2 -2
- package/dist/cli/chunks/{browser-7YZLTV2C.js → browser-2EH3RXJ2.js} +2 -2
- package/dist/cli/chunks/browser-workflow-TIDJWULK.js +2 -0
- package/dist/cli/chunks/{chunk-4IGSL7CX.js → chunk-2BBKA5J4.js} +1 -1
- package/dist/cli/chunks/{chunk-LZVKR7HV.js → chunk-2QU6C3OS.js} +2 -2
- package/dist/cli/chunks/{chunk-B3B5QZYN.js → chunk-2TUVBEWK.js} +2 -2
- package/dist/cli/chunks/{chunk-W72CUJRB.js → chunk-2WVLFT2I.js} +1 -1
- package/dist/cli/chunks/{chunk-JZYXYHEE.js → chunk-2ZC7S4UG.js} +2 -2
- package/dist/cli/chunks/{chunk-PG7KISET.js → chunk-3GWSHRDA.js} +2 -2
- package/dist/cli/chunks/{chunk-VKLPSPPI.js → chunk-3J6LYF6I.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSMHQENA.js → chunk-3LP5GPGU.js} +1 -1
- package/dist/cli/chunks/{chunk-MWAEUJDC.js → chunk-453UDYD2.js} +229 -225
- package/dist/cli/chunks/{chunk-DI7REPYC.js → chunk-4OTA6KYJ.js} +2 -2
- package/dist/cli/chunks/{chunk-SDVL5TZK.js → chunk-5ASPEVVF.js} +1 -1
- package/dist/cli/chunks/{chunk-LCDMB5SP.js → chunk-5DG6H553.js} +1 -1
- package/dist/cli/chunks/{chunk-JFTRHS5V.js → chunk-5OJXVVTI.js} +2 -2
- package/dist/cli/chunks/{chunk-6B3COND2.js → chunk-6VQKNPGY.js} +2 -2
- package/dist/cli/chunks/{chunk-NKKDO5W4.js → chunk-72QNONO6.js} +2 -2
- package/dist/cli/chunks/{chunk-OZDRAKFF.js → chunk-73EWPVBJ.js} +2 -2
- package/dist/cli/chunks/{chunk-CP4CSI5R.js → chunk-7BD7DZCB.js} +2 -2
- package/dist/cli/chunks/{chunk-DNC27OP7.js → chunk-7E5NYLJT.js} +2 -2
- package/dist/cli/chunks/{chunk-CDNXXNQM.js → chunk-7MBF3S25.js} +1 -1
- package/dist/cli/chunks/{chunk-IFQPGBKQ.js → chunk-7PTA7AVW.js} +1 -1
- package/dist/cli/chunks/{chunk-QNNH5TDV.js → chunk-7Q6CMSMD.js} +3 -3
- package/dist/cli/chunks/{chunk-SDGRU6SG.js → chunk-ACV2WVMX.js} +1 -1
- package/dist/cli/chunks/{chunk-XRJH5KXF.js → chunk-AURDGQNB.js} +2 -2
- package/dist/cli/chunks/{chunk-LIOK7WBX.js → chunk-AVKGDS6F.js} +2 -2
- package/dist/cli/chunks/{chunk-DPSLJ6IW.js → chunk-AYOTODUV.js} +1 -1
- package/dist/cli/chunks/{chunk-OK6CSJOX.js → chunk-B4QA3YN6.js} +1 -1
- package/dist/cli/chunks/{chunk-MTWBYHMS.js → chunk-BA4WZIAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-RNJRKFMX.js → chunk-BEOGI5FC.js} +2 -2
- package/dist/cli/chunks/{chunk-XYXRO7VP.js → chunk-C33BMWYZ.js} +2 -2
- package/dist/cli/chunks/chunk-C4OYHUJV.js +2 -0
- package/dist/cli/chunks/{chunk-ON6C2OYG.js → chunk-CERSTEAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-YATW2RWQ.js → chunk-D3S4SRSA.js} +2 -2
- package/dist/cli/chunks/{chunk-CCUUTTTJ.js → chunk-DCJIXDO6.js} +2 -2
- package/dist/cli/chunks/chunk-DDQWW22L.js +6 -0
- package/dist/cli/chunks/{chunk-FWQZZ22V.js → chunk-DV7662EZ.js} +1 -1
- package/dist/cli/chunks/{chunk-HVE3EH36.js → chunk-ETGEGMYS.js} +3 -3
- package/dist/cli/chunks/{chunk-CO6UY7ZU.js → chunk-ETZ62NFD.js} +1 -1
- package/dist/cli/chunks/{chunk-G73PIM7X.js → chunk-F62ZQZQQ.js} +2 -2
- package/dist/cli/chunks/{chunk-AGQIJWAD.js → chunk-F6Y7DTHR.js} +2 -2
- package/dist/cli/chunks/{chunk-LT4OZHMK.js → chunk-FGOVDO3R.js} +2 -2
- package/dist/cli/chunks/{chunk-YUK4KU2B.js → chunk-FMKALHT3.js} +2 -2
- package/dist/cli/chunks/{chunk-X3NEQ3SL.js → chunk-FMULOSBL.js} +1 -1
- package/dist/cli/chunks/{chunk-3AG2MM7U.js → chunk-FTOICJQG.js} +2 -2
- package/dist/cli/chunks/{chunk-YQYTQRTR.js → chunk-G25YZ7Z6.js} +2 -2
- package/dist/cli/chunks/{chunk-QHLENBGB.js → chunk-G5VE3HQW.js} +2 -2
- package/dist/cli/chunks/{chunk-XLQX77KP.js → chunk-GBFAQ4DW.js} +1 -1
- package/dist/cli/chunks/{chunk-Z57UERQZ.js → chunk-GGSXHGWD.js} +2 -2
- package/dist/cli/chunks/{chunk-TXLLF7XR.js → chunk-HHSEIPSQ.js} +1 -1
- package/dist/cli/chunks/{chunk-4G2GTX2V.js → chunk-HJFQVKPI.js} +1 -1
- package/dist/cli/chunks/{chunk-WKLI5Z3L.js → chunk-HMSPPGUF.js} +2 -2
- package/dist/cli/chunks/{chunk-2KP5TJS2.js → chunk-HNSZDIQU.js} +2 -2
- package/dist/cli/chunks/{chunk-77BVW2CT.js → chunk-I2HQLBWG.js} +2 -2
- package/dist/cli/chunks/{chunk-G2J7WGOG.js → chunk-IFTEM672.js} +2 -2
- package/dist/cli/chunks/{chunk-Q7B7T4YK.js → chunk-IHNBZ5XG.js} +2 -2
- package/dist/cli/chunks/{chunk-5GPOSKGP.js → chunk-IKNDGXZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-ALFF4AAM.js → chunk-IOQYSR5S.js} +2 -2
- package/dist/cli/chunks/{chunk-7LHN6WBX.js → chunk-IQSPL2H4.js} +2 -2
- package/dist/cli/chunks/{chunk-E5GUTKET.js → chunk-ISVBO4XO.js} +2 -2
- package/dist/cli/chunks/{chunk-KTBBSOZG.js → chunk-ITRUZ3WE.js} +2 -2
- package/dist/cli/chunks/{chunk-OIU6PKLF.js → chunk-J425SQFE.js} +2 -2
- package/dist/cli/chunks/{chunk-NFZY6ZVY.js → chunk-JN3IQB4L.js} +1 -1
- package/dist/cli/chunks/{chunk-6B32USSC.js → chunk-JNX7IRSI.js} +2 -2
- package/dist/cli/chunks/{chunk-PRYSWF6F.js → chunk-JQM64WJ2.js} +1 -1
- package/dist/cli/chunks/{chunk-4B676LUC.js → chunk-JQSA6EMI.js} +2 -2
- package/dist/cli/chunks/{chunk-NL4EKO2J.js → chunk-JZFA2PWY.js} +2 -2
- package/dist/cli/chunks/{chunk-54PBHRRW.js → chunk-KBVXKFDI.js} +4 -4
- package/dist/cli/chunks/{chunk-Z4WAJ647.js → chunk-KOOY72E3.js} +2 -2
- package/dist/cli/chunks/{chunk-M5PBVK3V.js → chunk-KZE5UR4T.js} +3 -3
- package/dist/cli/chunks/{chunk-2RDWYJJY.js → chunk-L7GQKJLV.js} +2 -2
- package/dist/cli/chunks/{chunk-GXKCRIHK.js → chunk-LCDRRAES.js} +2 -2
- package/dist/cli/chunks/{chunk-VL4MSE3J.js → chunk-LFT7WYHW.js} +2 -2
- package/dist/cli/chunks/{chunk-LBR5FXPD.js → chunk-LTH6XARD.js} +5 -5
- package/dist/cli/chunks/{chunk-KWKGROPS.js → chunk-LYV7WJWA.js} +1 -1
- package/dist/cli/chunks/{chunk-HVFHPDXV.js → chunk-MDYI4IIW.js} +1 -1
- package/dist/cli/chunks/{chunk-KTEWRRDZ.js → chunk-MKLLB4PM.js} +4 -4
- package/dist/cli/chunks/{chunk-34LWJDCM.js → chunk-MTSMFEWK.js} +2 -2
- package/dist/cli/chunks/{chunk-CHPL7TA4.js → chunk-N3R3JGUY.js} +1 -1
- package/dist/cli/chunks/{chunk-HWJEHXPQ.js → chunk-N52ZBTPM.js} +2 -2
- package/dist/cli/chunks/{chunk-X4CHPEOQ.js → chunk-N7MKF4F4.js} +1 -1
- package/dist/cli/chunks/{chunk-H35FNLQJ.js → chunk-NBTKI2TX.js} +2 -2
- package/dist/cli/chunks/{chunk-FPEFIJQ6.js → chunk-NI7O3GKZ.js} +3 -3
- package/dist/cli/chunks/{chunk-2UL4UK6V.js → chunk-NQD4CMXC.js} +2 -2
- package/dist/cli/chunks/{chunk-DNEYBK7X.js → chunk-O6FN53HB.js} +1 -1
- package/dist/cli/chunks/{chunk-XPAH7SEX.js → chunk-OZQIDDXB.js} +2 -2
- package/dist/cli/chunks/{chunk-474ZUVGP.js → chunk-P3NV6KN3.js} +1 -1
- package/dist/cli/chunks/{chunk-JITZAJJN.js → chunk-PC3VIR2A.js} +3 -3
- package/dist/cli/chunks/{chunk-WYAHOUK2.js → chunk-PJ4HSXH3.js} +1 -1
- package/dist/cli/chunks/{chunk-Z7FWPSOK.js → chunk-PUTRXS5I.js} +2 -2
- package/dist/cli/chunks/{chunk-GDHJZPNC.js → chunk-PVBJUANU.js} +2 -2
- package/dist/cli/chunks/{chunk-PTPGYUT2.js → chunk-QCJ7YOVN.js} +2 -2
- package/dist/cli/chunks/{chunk-T2Z3M6HA.js → chunk-QGBXENIP.js} +1 -1
- package/dist/cli/chunks/{chunk-OLOKPY5O.js → chunk-QYXTESM3.js} +2 -2
- package/dist/cli/chunks/{chunk-OV3ESWN4.js → chunk-QZQGYSDG.js} +2 -2
- package/dist/cli/chunks/{chunk-HEC2UWY3.js → chunk-R3YO3Z7I.js} +4 -4
- package/dist/cli/chunks/{chunk-JQBD4JO2.js → chunk-R7FHQQAV.js} +2 -2
- package/dist/cli/chunks/{chunk-MSWBVPVQ.js → chunk-RKDNLPZM.js} +2 -2
- package/dist/cli/chunks/{chunk-BALWMVCX.js → chunk-RPYYS6BX.js} +2 -2
- package/dist/cli/chunks/{chunk-R2LWUBET.js → chunk-RVQW6CBF.js} +2 -2
- package/dist/cli/chunks/{chunk-VM5C4DIV.js → chunk-SHW43QQV.js} +2 -2
- package/dist/cli/chunks/{chunk-S6PGWJDK.js → chunk-SKL225P5.js} +2 -2
- package/dist/cli/chunks/{chunk-Y4XTPEAC.js → chunk-SLWJNHCR.js} +2 -2
- package/dist/cli/chunks/{chunk-XNFYQRJ2.js → chunk-SQPDGRYR.js} +1 -1
- package/dist/cli/chunks/{chunk-NOP5ZJ7E.js → chunk-T6KT63NC.js} +2 -2
- package/dist/cli/chunks/{chunk-C6TUX7YJ.js → chunk-TGLEREP5.js} +2 -2
- package/dist/cli/chunks/{chunk-O75ODKCX.js → chunk-TYS77XHV.js} +2 -2
- package/dist/cli/chunks/{chunk-Q32LITZL.js → chunk-UEH6C5JA.js} +1 -1
- package/dist/cli/chunks/{chunk-6R6RC6YJ.js → chunk-UFMW25MS.js} +2 -2
- package/dist/cli/chunks/{chunk-BMSMDD72.js → chunk-V6WJVFRN.js} +2 -2
- package/dist/cli/chunks/{chunk-GHIHW3IE.js → chunk-VGYUVMSN.js} +2 -2
- package/dist/cli/chunks/{chunk-33CLP2NE.js → chunk-VHON5NDM.js} +3 -3
- package/dist/cli/chunks/{chunk-D7IH2A3C.js → chunk-VVJXQ4FR.js} +2 -2
- package/dist/cli/chunks/{chunk-K5Y64X2U.js → chunk-WBQEOACC.js} +2 -2
- package/dist/cli/chunks/{chunk-NWIKNQLJ.js → chunk-WP6XUSVW.js} +1 -1
- package/dist/cli/chunks/{chunk-FXPAGKVS.js → chunk-X2L4POJE.js} +1 -1
- package/dist/cli/chunks/{chunk-H73AA2JI.js → chunk-X2TUDGFL.js} +18 -18
- package/dist/cli/chunks/{chunk-WDZT344G.js → chunk-XKRG2U3V.js} +15 -13
- package/dist/cli/chunks/{chunk-D7ZVIL3C.js → chunk-XMZ2DHUL.js} +1 -1
- package/dist/cli/chunks/{chunk-LJEO5R32.js → chunk-XSG4XKGO.js} +2 -2
- package/dist/cli/chunks/{chunk-UU422SST.js → chunk-XVQUVCFR.js} +2 -2
- package/dist/cli/chunks/{chunk-SSRMFU4P.js → chunk-XW5OXBVV.js} +2 -2
- package/dist/cli/chunks/{chunk-DDMKCHYT.js → chunk-Y7TBCHW4.js} +2 -2
- package/dist/cli/chunks/{chunk-XKIVOADM.js → chunk-Y7UJC5OL.js} +3 -3
- package/dist/cli/chunks/{chunk-HE3KLHNO.js → chunk-YQIMO7VJ.js} +2 -2
- package/dist/cli/chunks/{chunk-RXWPYY6H.js → chunk-YR44KQUK.js} +1 -1
- package/dist/cli/chunks/{chunk-QHGHWATK.js → chunk-YRP73HO4.js} +1 -1
- package/dist/cli/chunks/{chunk-5KUINS3D.js → chunk-YSTWLDVD.js} +3 -3
- package/dist/cli/chunks/{chunk-YMJ5AVVU.js → chunk-Z45QDDZQ.js} +1 -1
- package/dist/cli/chunks/{chunk-2F4VRCT6.js → chunk-ZEUUVLS2.js} +1 -1
- package/dist/cli/chunks/{chunk-7NKVEEXD.js → chunk-ZFP3O5FM.js} +1 -1
- package/dist/cli/chunks/{chunk-4AG2TQEF.js → chunk-ZK56THZT.js} +3 -3
- package/dist/cli/chunks/{chunk-4OHLPG6B.js → chunk-ZT4NPTML.js} +2 -2
- package/dist/cli/chunks/{ci-2G4BBIQD.js → ci-4JK2NFCD.js} +2 -2
- package/dist/cli/chunks/{ci-output-SI3ME52L.js → ci-output-LCGTJQWC.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-KTICF3EC.js → circuit-breaker-EJF7D3L4.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-F44PULFU.js → claude-flow-setup-3RUC6OB4.js} +2 -2
- package/dist/cli/chunks/client-ZLJ3JMBC.js +2 -0
- package/dist/cli/chunks/cline-installer-6LY5C5QH.js +4 -0
- package/dist/cli/chunks/{code-EDLIBN77.js → code-MPDG4UHS.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-P4NBWGTV.js → code-index-extractor-OY5GQJBM.js} +2 -2
- package/dist/cli/chunks/codex-installer-BO7E2ZVA.js +8 -0
- package/dist/cli/chunks/{completions-XPCXB5SR.js → completions-VGL3KJ2R.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-LAL5RSB7.js → complexity-analyzer-5DPUK7IL.js} +2 -2
- package/dist/cli/chunks/continuedev-installer-LFDG2D42.js +15 -0
- package/dist/cli/chunks/copilot-installer-SEMMMIZH.js +3 -0
- package/dist/cli/chunks/core-handlers-EM7FUYTI.js +2 -0
- package/dist/cli/chunks/{cost-tracker-EUJFKHGT.js → cost-tracker-OPBC6FQM.js} +2 -2
- package/dist/cli/chunks/{coverage-C75LPZYB.js → coverage-CFDUSRKU.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-DYGHQ6P5.js +2 -0
- package/dist/cli/chunks/cursor-installer-6TXUUVY4.js +3 -0
- package/dist/cli/chunks/{daemon-JR2MSTSK.js → daemon-5KO46YQR.js} +4 -4
- package/dist/cli/chunks/{daemon-BPVBZZQO.js → daemon-7BDBPPAF.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-I5H7DBNU.js → dag-attention-scheduler-6DQKZOUW.js} +2 -2
- package/dist/cli/chunks/{detect-O5TMML24.js → detect-R2QAYDPI.js} +2 -2
- package/dist/cli/chunks/{dist-node-MDZ6UQ3V.js → dist-node-3POCIJ4N.js} +2 -2
- package/dist/cli/chunks/{domain-handler-BGBTZETG.js → domain-handler-KW63CHUH.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-C2D2IEYV.js → domain-transfer-2QPOJCUD.js} +2 -2
- package/dist/cli/chunks/dream-DBE5D5BD.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-UJREBJF5.js → embed-and-insert-pattern-OIDJZQEP.js} +2 -2
- package/dist/cli/chunks/{eval-BDD24HQC.js → eval-UGEKTTAQ.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-KLVXIIYH.js → experience-capture-middleware-3BIM2TT7.js} +3 -3
- package/dist/cli/chunks/{fast-paths-5HIKAQZ7.js → fast-paths-HCJQXB7W.js} +2 -2
- package/dist/cli/chunks/{feature-flags-YE5SJPDS.js → feature-flags-GDGJKLN4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NM3S7OEW.js → feature-flags-W4JSFBMV.js} +2 -2
- package/dist/cli/chunks/{file-discovery-PWRQZNJQ.js → file-discovery-JMUZ4MUH.js} +2 -2
- package/dist/cli/chunks/{fleet-UIPKNQX3.js → fleet-YNNK2CKW.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-GWGKZRTO.js → gnn-wrapper-R2ZY6CDD.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-GQHJPNAY.js → heartbeat-handler-OZX2EJHQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-NFHAANNL.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-HMPCZFBY.js +2 -0
- package/dist/cli/chunks/hnsw-index-KRIWSXX4.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-NE5JIRG3.js → hnsw-legacy-bridge-3S6TYCG3.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-MROES2Y7.js → hnswlib-node-HMZC5TXM.js} +2 -2
- package/dist/cli/chunks/{hooks-3NBBUOB6.js → hooks-KM7WR35T.js} +10 -10
- package/dist/cli/chunks/hybrid-router-BAB32B2W.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-6NRFVDV7.js → hypergraph-engine-RX53A73M.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-F3OOGTXF.js → hypergraph-handler-3QQB3H3Z.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-3D6XHWQE.js +2 -0
- package/dist/cli/chunks/{init-handler-DOTXTVUI.js → init-handler-Y62RH4ZI.js} +22 -21
- package/dist/cli/chunks/init-wizard-LLU3WVGC.js +2 -0
- package/dist/cli/chunks/kernel-ZFHAYHHJ.js +2 -0
- package/dist/cli/chunks/kilocode-installer-26R253L2.js +4 -0
- package/dist/cli/chunks/{kiro-installer-WBJDXY7Q.js → kiro-installer-PFA5QPZZ.js} +4 -4
- package/dist/cli/chunks/knowledge-graph-ETZ65KOY.js +2 -0
- package/dist/cli/chunks/{learning-BC5N4V3D.js → learning-CQLM5ANX.js} +3 -3
- package/dist/cli/chunks/{llm-router-T427WD6R.js → llm-router-QZ5PG4PF.js} +4 -4
- package/dist/cli/chunks/llm-router-service-R6CTGF5I.js +2 -0
- package/dist/cli/chunks/{load-M6SL2O3M.js → load-UPA6LPHM.js} +2 -2
- package/dist/cli/chunks/load-test-UOWIJUCH.js +2 -0
- package/dist/cli/chunks/mcp-LSWTLAJ4.js +2 -0
- package/dist/cli/chunks/{memory-FJAO3CSF.js → memory-VGEYYGCG.js} +5 -5
- package/dist/cli/chunks/memory-backend-E3ZQKW7A.js +2 -0
- package/dist/cli/chunks/{memory-handlers-S3W6IQJL.js → memory-handlers-QBURG7NA.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-FYOVZ4OH.js → multi-model-executor-VZVFBIKC.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-APSBE4UR.js → opencode-installer-PBQAXNLV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-LN53EQ45.js → orchestrator-YND7JB5O.js} +16 -16
- package/dist/cli/chunks/pattern-null-store-OUOJO2RH.js +2 -0
- package/dist/cli/chunks/{pipeline-BYWXY2NO.js → pipeline-GM5RRUES.js} +2 -2
- package/dist/cli/chunks/{platform-CZ774YPS.js → platform-L7OGGRSL.js} +2 -2
- package/dist/cli/chunks/{plugin-72NXRX5Z.js → plugin-N4YAE6H5.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-G4DE6YKJ.js → prime-radiant-advanced-wasm-7D67XV6Z.js} +2 -2
- package/dist/cli/chunks/protocol-executor-KHAPG5CP.js +2 -0
- package/dist/cli/chunks/{protocol-handler-UH6CV63V.js → protocol-handler-V2WTFU7N.js} +2 -2
- package/dist/cli/chunks/{prove-V7FAT5HF.js → prove-33DS5Z3N.js} +2 -2
- package/dist/cli/chunks/provider-manager-FGPPW7T4.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-TS7XOJDA.js +2 -0
- package/dist/cli/chunks/{quality-N2K62FQM.js → quality-WCSEA5GH.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-J35FNFQ3.js +2 -0
- package/dist/cli/chunks/{real-embeddings-TKHUE2RL.js → real-embeddings-OQ5F37DG.js} +2 -2
- package/dist/cli/chunks/roocode-installer-II7LIR2X.js +4 -0
- package/dist/cli/chunks/router-AFTKPDI5.js +2 -0
- package/dist/cli/chunks/routing-feedback-SABZUJTF.js +2 -0
- package/dist/cli/chunks/{routing-handler-UUWD4IKG.js → routing-handler-6OFHARIY.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-B4WPTGCI.js → ruvector-commands-GD5JTR4M.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-MNRJGNIX.js → rvf-dual-writer-HSK6BYZV.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-P2RDBFA4.js → rvf-migration-adapter-554SMF5S.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-DFESZQSS.js → rvf-migration-coordinator-OFDBCAYE.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-57MDDSFQ.js +2 -0
- package/dist/cli/chunks/safe-db-2HR6MVYM.js +2 -0
- package/dist/cli/chunks/schedule-KLVAN6XI.js +2 -0
- package/dist/cli/chunks/scheduler-WYZ6BC5Y.js +2 -0
- package/dist/cli/chunks/{security-MHLTNKFX.js → security-GN4J6DSS.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-LR7E2EQI.js → shared-rvf-adapter-Q4PM3QCN.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-RFFON2F3.js → shared-rvf-dual-writer-R5WK5BXQ.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-2CGU5INO.js +2 -0
- package/dist/cli/chunks/{status-handler-ROPTYGQC.js → status-handler-AHS5WVMG.js} +2 -2
- package/dist/cli/chunks/{structural-health-YGUFXGJ6.js → structural-health-5KUKNLHZ.js} +2 -2
- package/dist/cli/chunks/{sync-6JTRTDL3.js → sync-PUMM3SR6.js} +2 -2
- package/dist/cli/chunks/{sync-NZZUMTKC.js → sync-TQLGD5HX.js} +2 -2
- package/dist/cli/chunks/{task-handler-KYMV3AC6.js → task-handler-D7VXV4AF.js} +2 -2
- package/dist/cli/chunks/{task-handlers-Z63YBQVU.js → task-handlers-QMN4SWUG.js} +3 -3
- package/dist/cli/chunks/{test-O6BQ7FGP.js → test-HEWZR6YQ.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-T3IOXEFI.js → test-scheduling-VTMLBEPA.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-CTI2ULJF.js → token-bootstrap-IYBG7PQ6.js} +2 -2
- package/dist/cli/chunks/{token-usage-TNQTNAVT.js → token-usage-C7H27BFZ.js} +2 -2
- package/dist/cli/chunks/{transformers-CJQDNQER.js → transformers-5ZJVC6NB.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-RBZWLEVQ.js → tree-sitter-wasm-parser-EARBJG2H.js} +2 -2
- package/dist/cli/chunks/{types-OMFCO364.js → types-3IHE42PZ.js} +2 -2
- package/dist/cli/chunks/unified-memory-PMYRQC5K.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-7TRL2K5Q.js +2 -0
- package/dist/cli/chunks/unified-persistence-S4BNJK4S.js +2 -0
- package/dist/cli/chunks/{upgrade-KRVOYWN3.js → upgrade-YP3VFSXO.js} +2 -2
- package/dist/cli/chunks/{validate-32FKHMKQ.js → validate-VSBNKPN6.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-45RPBPPH.js → validate-swarm-GOCJVWXE.js} +2 -2
- package/dist/cli/chunks/{vibium-LCTNDCKK.js → vibium-U6YKCLDF.js} +2 -2
- package/dist/cli/chunks/visual-security-RPMZ3J7L.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-FX2EFCLH.js → web-tree-sitter-TSNVGWSN.js} +2 -2
- package/dist/cli/chunks/windsurf-installer-2VKMEFSD.js +7 -0
- package/dist/cli/chunks/witness-chain-BTDZSQ6P.js +2 -0
- package/dist/cli/chunks/{witness-chain-YG2UWTYZ.js → witness-chain-BWZCW52H.js} +2 -2
- package/dist/cli/chunks/{workflow-AEJ37RNV.js → workflow-J6SCYLU3.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-42B62D3V.js +2 -0
- package/dist/cli/chunks/{wrappers-GSU6VNU6.js → wrappers-M5C7DONW.js} +2 -2
- package/dist/cli/commands/mcp.js +28 -28
- package/dist/cli/handlers/init-handler.d.ts +2 -0
- package/dist/cli/handlers/init-handler.js +22 -1
- package/dist/domains/test-generation/coordinator.d.ts +24 -1
- package/dist/domains/test-generation/coordinator.js +137 -2
- package/dist/domains/test-generation/plugin.js +23 -1
- package/dist/init/cline-installer.d.ts +6 -0
- package/dist/init/cline-installer.js +3 -1
- package/dist/init/codex-installer.d.ts +6 -0
- package/dist/init/codex-installer.js +3 -1
- package/dist/init/continuedev-installer.d.ts +6 -0
- package/dist/init/continuedev-installer.js +10 -3
- package/dist/init/copilot-installer.d.ts +6 -0
- package/dist/init/copilot-installer.js +3 -1
- package/dist/init/cursor-installer.d.ts +6 -0
- package/dist/init/cursor-installer.js +3 -1
- package/dist/init/kilocode-installer.d.ts +6 -0
- package/dist/init/kilocode-installer.js +3 -1
- package/dist/init/kiro-installer.d.ts +5 -0
- package/dist/init/kiro-installer.js +4 -4
- package/dist/init/orchestrator.js +1 -0
- package/dist/init/phases/07-hooks.js +5 -0
- package/dist/init/phases/08-mcp.js +34 -7
- package/dist/init/phases/09-assets.js +30 -27
- package/dist/init/phases/11-claude-md.d.ts +1 -0
- package/dist/init/phases/11-claude-md.js +8 -0
- package/dist/init/phases/13-governance.js +5 -0
- package/dist/init/phases/phase-interface.d.ts +8 -0
- package/dist/init/platform-config-generator.d.ts +3 -1
- package/dist/init/platform-config-generator.js +31 -17
- package/dist/init/roocode-installer.d.ts +6 -0
- package/dist/init/roocode-installer.js +3 -1
- package/dist/init/windsurf-installer.d.ts +6 -0
- package/dist/init/windsurf-installer.js +3 -1
- package/dist/integrations/darwin/index.d.ts +10 -0
- package/dist/integrations/darwin/index.js +2 -0
- package/dist/integrations/darwin/qe-fitness.d.ts +83 -0
- package/dist/integrations/darwin/qe-fitness.js +147 -0
- package/dist/integrations/darwin/types.d.ts +62 -0
- package/dist/integrations/darwin/types.js +14 -0
- package/dist/mcp/bundle.js +376 -371
- package/dist/mcp/entry.js +10 -1
- package/dist/mcp/protocol-server.js +17 -0
- package/dist/optimization/session-cache.d.ts +11 -0
- package/dist/optimization/session-cache.js +31 -0
- package/dist/routing/escalation/auto-escalation-tracker.d.ts +34 -15
- package/dist/routing/escalation/auto-escalation-tracker.js +24 -15
- package/dist/routing/free-tier/executor.d.ts +119 -0
- package/dist/routing/free-tier/executor.js +139 -0
- package/dist/routing/free-tier/feedback-sink.d.ts +49 -0
- package/dist/routing/free-tier/feedback-sink.js +52 -0
- package/dist/routing/free-tier/index.d.ts +14 -0
- package/dist/routing/free-tier/index.js +5 -0
- package/dist/routing/free-tier/ladder.d.ts +41 -0
- package/dist/routing/free-tier/ladder.js +78 -0
- package/dist/routing/free-tier/provider.d.ts +57 -0
- package/dist/routing/free-tier/provider.js +111 -0
- package/dist/routing/free-tier/types.d.ts +80 -0
- package/dist/routing/free-tier/types.js +16 -0
- package/package.json +6 -2
- package/dist/cli/chunks/adapter-PAMPC2X7.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DGKLEC6I.js +0 -2
- package/dist/cli/chunks/base-6HJR4VJT.js +0 -2
- package/dist/cli/chunks/browser-workflow-OWNU5XK7.js +0 -2
- package/dist/cli/chunks/chunk-2B2RLPK3.js +0 -2
- package/dist/cli/chunks/chunk-NSI3WL6P.js +0 -6
- package/dist/cli/chunks/client-E6GK5NWT.js +0 -2
- package/dist/cli/chunks/cline-installer-A7G7OXIS.js +0 -4
- package/dist/cli/chunks/codex-installer-JB3ULDQP.js +0 -8
- package/dist/cli/chunks/continuedev-installer-GSYBLQV7.js +0 -14
- package/dist/cli/chunks/copilot-installer-7B56CNU2.js +0 -3
- package/dist/cli/chunks/core-handlers-HJUORTFU.js +0 -2
- package/dist/cli/chunks/cross-domain-router-35WVZFAZ.js +0 -2
- package/dist/cli/chunks/cursor-installer-WXQFM4KJ.js +0 -3
- package/dist/cli/chunks/dream-QTZDMP6D.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-N433NZCG.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-MR6W2OA4.js +0 -2
- package/dist/cli/chunks/hnsw-index-XC6EMJA2.js +0 -2
- package/dist/cli/chunks/hybrid-router-SH4IEAJA.js +0 -2
- package/dist/cli/chunks/impact-analyzer-RUTVXE7P.js +0 -2
- package/dist/cli/chunks/init-wizard-56NY5BSP.js +0 -2
- package/dist/cli/chunks/kernel-7JAN7WCO.js +0 -2
- package/dist/cli/chunks/kilocode-installer-3AXYSZTO.js +0 -4
- package/dist/cli/chunks/knowledge-graph-ST4LW3V4.js +0 -2
- package/dist/cli/chunks/llm-router-service-JNDF5MVJ.js +0 -2
- package/dist/cli/chunks/load-test-I3P3DUS5.js +0 -2
- package/dist/cli/chunks/mcp-F2V3KKG6.js +0 -2
- package/dist/cli/chunks/memory-backend-27BBT57O.js +0 -2
- package/dist/cli/chunks/pattern-null-store-SRBYJRNX.js +0 -2
- package/dist/cli/chunks/protocol-executor-WJLJHWO2.js +0 -2
- package/dist/cli/chunks/provider-manager-UKUHSHAL.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-IMUECSFZ.js +0 -2
- package/dist/cli/chunks/queen-coordinator-EC4SVNMB.js +0 -2
- package/dist/cli/chunks/roocode-installer-DFUA6FXW.js +0 -4
- package/dist/cli/chunks/router-TVTOUQLL.js +0 -2
- package/dist/cli/chunks/routing-feedback-Y4WDXNXW.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-4YSC6QKO.js +0 -2
- package/dist/cli/chunks/safe-db-RGAY54O5.js +0 -2
- package/dist/cli/chunks/schedule-KJ4GWLPJ.js +0 -2
- package/dist/cli/chunks/scheduler-AONSLVA3.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-7RZUEPM4.js +0 -2
- package/dist/cli/chunks/unified-memory-G3BYQ3WU.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-F7XUZMKW.js +0 -2
- package/dist/cli/chunks/unified-persistence-V35NXJSO.js +0 -2
- package/dist/cli/chunks/visual-security-K47U7KUM.js +0 -2
- package/dist/cli/chunks/windsurf-installer-I3TSJCNL.js +0 -7
- package/dist/cli/chunks/witness-chain-G6GJXZD3.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-SKF7GC5X.js +0 -2
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { LoggerFactory } from '../../logging/index.js';
|
|
11
11
|
import { v4 as uuidv4 } from 'uuid';
|
|
12
|
-
import {
|
|
12
|
+
import { readFile } from 'node:fs/promises';
|
|
13
|
+
import { ok, err, } from '../../shared/types';
|
|
13
14
|
import { toError } from '../../shared/error-utils.js';
|
|
15
|
+
// Opt-in free-tier local test generation (cross-pollination plan 06, D7-wire/D8/D9).
|
|
16
|
+
import { FreeTierEscalatingExecutor, defaultFreeTierLadder, createRoutingFeedbackSink, } from '../../routing/free-tier/index.js';
|
|
14
17
|
import { TestGenerationEvents, LearningOptimizationEvents, createEvent, } from '../../shared/events/domain-events';
|
|
15
18
|
import { createTestGeneratorServiceWithDependencies, } from './services/test-generator';
|
|
16
19
|
import { PatternMatcherService, } from './services/pattern-matcher';
|
|
@@ -52,6 +55,8 @@ const DEFAULT_CONFIG = {
|
|
|
52
55
|
consensusThreshold: 0.7,
|
|
53
56
|
consensusStrategy: 'weighted',
|
|
54
57
|
consensusMinModels: 2,
|
|
58
|
+
// Free-tier local generation is OFF by default (opt-in).
|
|
59
|
+
enableFreeTier: false,
|
|
55
60
|
};
|
|
56
61
|
/**
|
|
57
62
|
* Test Generation Coordinator
|
|
@@ -71,6 +76,15 @@ const DEFAULT_CONFIG = {
|
|
|
71
76
|
* - Verifies test patterns, mock strategies, and edge cases
|
|
72
77
|
*/
|
|
73
78
|
const logger = LoggerFactory.create('test-generation');
|
|
79
|
+
/** Strip a single ```fenced``` block if the model wrapped its output (free-tier path). */
|
|
80
|
+
function stripFence(text) {
|
|
81
|
+
const m = text.match(/```(?:[a-zA-Z0-9]+)?\n([\s\S]*?)\n```/);
|
|
82
|
+
return (m ? m[1] : text).trim();
|
|
83
|
+
}
|
|
84
|
+
/** Derive a test file path from a source path: `foo.ts` → `foo.test.ts` (free-tier path). */
|
|
85
|
+
function deriveTestFilePath(src) {
|
|
86
|
+
return src.replace(/\.([cm]?[jt]sx?)$/, '.test.$1');
|
|
87
|
+
}
|
|
74
88
|
export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
75
89
|
memory;
|
|
76
90
|
agentCoordinator;
|
|
@@ -78,6 +92,8 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
78
92
|
hookRegistry;
|
|
79
93
|
testGenerator;
|
|
80
94
|
patternMatcher;
|
|
95
|
+
/** Opt-in free-tier local executor (null unless enabled). */
|
|
96
|
+
freeTierExecutor = null;
|
|
81
97
|
// @ruvector integrations (ADR-040)
|
|
82
98
|
qesona = null;
|
|
83
99
|
flashAttention = null;
|
|
@@ -87,7 +103,9 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
87
103
|
recentDreamInsights = [];
|
|
88
104
|
// Coherence gate (ADR-052)
|
|
89
105
|
coherenceGate = null;
|
|
90
|
-
constructor(eventBus, memory, agentCoordinator, config = {}, llmRouter, coherenceService, hookRegistry
|
|
106
|
+
constructor(eventBus, memory, agentCoordinator, config = {}, llmRouter, coherenceService, hookRegistry,
|
|
107
|
+
/** Optional D9 sink — when provided, free-tier outcomes feed routing-feedback. */
|
|
108
|
+
routingFeedback) {
|
|
91
109
|
const fullConfig = { ...DEFAULT_CONFIG, ...config };
|
|
92
110
|
super(eventBus, 'test-generation', fullConfig, {
|
|
93
111
|
verifyFindingTypes: [
|
|
@@ -105,6 +123,36 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
105
123
|
// ADR-043 wiring: dependencies factory accepts llmRouter.
|
|
106
124
|
this.testGenerator = createTestGeneratorServiceWithDependencies({ memory, llmRouter });
|
|
107
125
|
this.patternMatcher = new PatternMatcherService(memory);
|
|
126
|
+
// Opt-in free-tier local generation (plan 06, D7-wire/D8/D9). OFF by default;
|
|
127
|
+
// local-only with a same-tier repair loop and NO paid escalation yet.
|
|
128
|
+
const freeTierOn = this.config.enableFreeTier === true || process.env.AQE_FREE_TIER === '1';
|
|
129
|
+
if (freeTierOn) {
|
|
130
|
+
const model = this.config.freeTierModel || process.env.AQE_FREE_TIER_MODEL || 'qwen3:8b';
|
|
131
|
+
// Paid escalation: delegate Claude tiers to the existing HybridRouter, mapping
|
|
132
|
+
// the ladder tier to a complexity hint so the router selects that tier. When no
|
|
133
|
+
// router is wired, the executor stays local-only (Claude tiers report unavailable).
|
|
134
|
+
const claudeRunner = llmRouter
|
|
135
|
+
? async (tier, msgs) => {
|
|
136
|
+
const complexity = tier === 'opus' ? 'high' : tier === 'sonnet' ? 'medium' : 'low';
|
|
137
|
+
const resp = await llmRouter.chat({
|
|
138
|
+
messages: msgs.map((m) => ({ role: m.role, content: m.content })),
|
|
139
|
+
agentType: 'qe-test-architect',
|
|
140
|
+
complexity,
|
|
141
|
+
});
|
|
142
|
+
return { content: resp.content };
|
|
143
|
+
}
|
|
144
|
+
: undefined;
|
|
145
|
+
this.freeTierExecutor = new FreeTierEscalatingExecutor({
|
|
146
|
+
ladder: defaultFreeTierLadder(model),
|
|
147
|
+
claudeRunner,
|
|
148
|
+
defaultRepairAttempts: this.config.freeTierRepairAttempts ?? 1,
|
|
149
|
+
onOutcome: routingFeedback
|
|
150
|
+
? createRoutingFeedbackSink(routingFeedback, { taskKind: 'test-generation' }) // D9
|
|
151
|
+
: undefined,
|
|
152
|
+
});
|
|
153
|
+
logger.info(`Free-tier local test generation enabled (model=${model}, repair, ` +
|
|
154
|
+
`${claudeRunner ? 'escalation→HybridRouter' : 'local-only'})`);
|
|
155
|
+
}
|
|
108
156
|
// Initialize coherence gate if service is provided (ADR-052)
|
|
109
157
|
if (this.config.enableCoherenceGate && coherenceService) {
|
|
110
158
|
this.coherenceGate = createTestGenerationCoherenceGate(coherenceService, undefined, // Use default embedding service
|
|
@@ -219,6 +267,21 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
219
267
|
try {
|
|
220
268
|
// Create workflow tracking
|
|
221
269
|
this.startWorkflow(workflowId, 'generate');
|
|
270
|
+
// Opt-in (plan 06, D7-wire): try the FREE local model first with a repair
|
|
271
|
+
// loop. Fully guarded — any miss falls through to the normal LLM path.
|
|
272
|
+
if (this.freeTierExecutor) {
|
|
273
|
+
try {
|
|
274
|
+
const ft = await this.tryFreeTierGeneration(request);
|
|
275
|
+
if (ft) {
|
|
276
|
+
this.completeWorkflow(workflowId);
|
|
277
|
+
logger.info(`Free-tier local generation produced ${ft.tests.length} test file(s); skipped paid path`);
|
|
278
|
+
return ok(ft);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
logger.debug('Free-tier generation failed; falling back to the normal path');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
222
285
|
// ADR-047: Check topology health before expensive operations
|
|
223
286
|
if (this.config.enableMinCutAwareness && !this.isTopologyHealthy()) {
|
|
224
287
|
logger.warn('Topology degraded, using conservative strategy');
|
|
@@ -361,6 +424,78 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
|
|
|
361
424
|
return { success: false, error: err };
|
|
362
425
|
}
|
|
363
426
|
}
|
|
427
|
+
/**
|
|
428
|
+
* Opt-in free-tier local test generation (plan 06, D7-wire/D8/D9).
|
|
429
|
+
* Reads the first source file, asks the FREE local model to write tests,
|
|
430
|
+
* verifies the output is a real test (has a test + an assertion) with a
|
|
431
|
+
* same-tier repair loop, and parses it into a minimal GeneratedTests.
|
|
432
|
+
* Returns null on ANY miss so the caller falls back to the normal path.
|
|
433
|
+
*/
|
|
434
|
+
async tryFreeTierGeneration(request) {
|
|
435
|
+
if (!this.freeTierExecutor)
|
|
436
|
+
return null;
|
|
437
|
+
// Single-file only: the cheap-first path generates one test file. For
|
|
438
|
+
// multi-file requests fall back to the normal path so EVERY file is covered.
|
|
439
|
+
if (!request.sourceFiles || request.sourceFiles.length !== 1)
|
|
440
|
+
return null;
|
|
441
|
+
const src = request.sourceFiles[0];
|
|
442
|
+
if (!src)
|
|
443
|
+
return null;
|
|
444
|
+
let code = '';
|
|
445
|
+
try {
|
|
446
|
+
code = await readFile(src, 'utf8');
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
return null; // unreadable → fall back
|
|
450
|
+
}
|
|
451
|
+
if (!code.trim())
|
|
452
|
+
return null;
|
|
453
|
+
const framework = request.framework ?? 'vitest';
|
|
454
|
+
const messages = [
|
|
455
|
+
{ role: 'system', content: `You write ${framework} tests. Output ONLY a single fenced code block — no prose.` },
|
|
456
|
+
{
|
|
457
|
+
role: 'user',
|
|
458
|
+
content: `Write ${framework} ${request.testType ?? 'unit'} tests for this file ` +
|
|
459
|
+
`(aim for ~${request.coverageTarget ?? 80}% coverage). Use real assertions.\n\n` +
|
|
460
|
+
'```\n' + code.slice(0, 6000) + '\n```',
|
|
461
|
+
},
|
|
462
|
+
];
|
|
463
|
+
// Objective oracle: output must contain a test block AND an assertion.
|
|
464
|
+
const verify = (out) => {
|
|
465
|
+
const hasTest = /\b(test|it|describe)\s*\(/.test(out);
|
|
466
|
+
const hasAssert = /\b(expect|assert)\s*\(/.test(out);
|
|
467
|
+
return hasTest && hasAssert
|
|
468
|
+
? { passed: true }
|
|
469
|
+
: { passed: false, feedback: 'output must contain a test (test/it/describe) with an assertion (expect/assert)' };
|
|
470
|
+
};
|
|
471
|
+
const r = await this.freeTierExecutor.execute({
|
|
472
|
+
agentId: `test-gen:${src}`,
|
|
473
|
+
messages,
|
|
474
|
+
verify,
|
|
475
|
+
// Cheap-first: try local + repair, then escalate the hard tail up the
|
|
476
|
+
// ladder via the HybridRouter (when wired). Local-only if no router.
|
|
477
|
+
escalate: true,
|
|
478
|
+
repairAttempts: this.config.freeTierRepairAttempts ?? 1,
|
|
479
|
+
});
|
|
480
|
+
if (!r.ok)
|
|
481
|
+
return null;
|
|
482
|
+
const testCode = stripFence(r.content);
|
|
483
|
+
const assertions = (testCode.match(/\b(?:expect|assert)\s*\(/g) ?? []).length;
|
|
484
|
+
if (assertions === 0)
|
|
485
|
+
return null;
|
|
486
|
+
const test = {
|
|
487
|
+
id: uuidv4(),
|
|
488
|
+
name: `free-tier:${src.split('/').pop() ?? src}`,
|
|
489
|
+
sourceFile: src,
|
|
490
|
+
testFile: deriveTestFilePath(src),
|
|
491
|
+
testCode,
|
|
492
|
+
type: request.testType ?? 'unit',
|
|
493
|
+
assertions,
|
|
494
|
+
framework,
|
|
495
|
+
llmEnhanced: true,
|
|
496
|
+
};
|
|
497
|
+
return { tests: [test], coverageEstimate: 0, patternsUsed: ['free-tier-local', `tier:${r.tierUsed}`] };
|
|
498
|
+
}
|
|
364
499
|
/**
|
|
365
500
|
* Generate tests using TDD workflow
|
|
366
501
|
*/
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import { err } from '../../shared/types';
|
|
6
6
|
import { BaseDomainPlugin } from '../domain-interface';
|
|
7
7
|
import { TestGenerationCoordinator, } from './coordinator';
|
|
8
|
+
// D9: live routing-feedback so free-tier outcomes lift routing confidence.
|
|
9
|
+
import { RoutingFeedbackCollector } from '../../routing/routing-feedback.js';
|
|
8
10
|
import { createTestGeneratorServiceWithDependencies, } from './services/test-generator';
|
|
9
11
|
import { toError } from '../../shared/error-utils.js';
|
|
10
12
|
import { PatternMatcherService, } from './services/pattern-matcher';
|
|
@@ -149,8 +151,28 @@ export class TestGenerationPlugin extends BaseDomainPlugin {
|
|
|
149
151
|
// so analyzeXxxWithLLM branches become reachable.
|
|
150
152
|
this.testGenerator = createTestGeneratorServiceWithDependencies({ memory: this.memory, llmRouter: this.llmRouter }, this.pluginConfig.testGenerator);
|
|
151
153
|
this.patternMatcher = new PatternMatcherService(this.memory, this.pluginConfig.patternMatcher);
|
|
154
|
+
// D9: when the free tier is opted in, stand up a live RoutingFeedbackCollector
|
|
155
|
+
// (calibrator + auto-escalation enabled) so each cheap-vs-escalated outcome
|
|
156
|
+
// feeds routing confidence. Memory-only fallback if the DB is unavailable.
|
|
157
|
+
let routingFeedback;
|
|
158
|
+
const freeTierOn = this.pluginConfig.coordinator?.enableFreeTier === true || process.env.AQE_FREE_TIER === '1';
|
|
159
|
+
if (freeTierOn) {
|
|
160
|
+
routingFeedback = new RoutingFeedbackCollector(10000, {
|
|
161
|
+
enableEMACalibration: true,
|
|
162
|
+
enableAutoEscalation: true,
|
|
163
|
+
});
|
|
164
|
+
try {
|
|
165
|
+
await routingFeedback.initialize();
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// memory-only is fine — recording still drives calibration/escalation
|
|
169
|
+
}
|
|
170
|
+
}
|
|
152
171
|
// Create coordinator
|
|
153
|
-
this.coordinator = new TestGenerationCoordinator(this.eventBus, this.memory, this.agentCoordinator, this.pluginConfig.coordinator, this.llmRouter
|
|
172
|
+
this.coordinator = new TestGenerationCoordinator(this.eventBus, this.memory, this.agentCoordinator, this.pluginConfig.coordinator, this.llmRouter, undefined, // coherenceService
|
|
173
|
+
undefined, // hookRegistry
|
|
174
|
+
routingFeedback // D9 sink (undefined unless free tier is on)
|
|
175
|
+
);
|
|
154
176
|
// Initialize coordinator
|
|
155
177
|
await this.coordinator.initialize();
|
|
156
178
|
// Issue #205 fix: Start with 'idle' status (0 agents)
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
export interface ClineInstallerOptions {
|
|
9
9
|
projectRoot: string;
|
|
10
10
|
overwrite?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Memory backend for this install. 'memory' => database-free: the MCP config
|
|
13
|
+
* is written to run in-memory (AQE_MEMORY_BACKEND=memory, no AQE_MEMORY_PATH). (#533)
|
|
14
|
+
*/
|
|
15
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
11
16
|
}
|
|
12
17
|
export interface ClineInstallResult {
|
|
13
18
|
success: boolean;
|
|
@@ -20,6 +25,7 @@ export interface ClineInstallResult {
|
|
|
20
25
|
export declare class ClineInstaller {
|
|
21
26
|
private projectRoot;
|
|
22
27
|
private overwrite;
|
|
28
|
+
private options;
|
|
23
29
|
private generator;
|
|
24
30
|
constructor(options: ClineInstallerOptions);
|
|
25
31
|
install(): Promise<ClineInstallResult>;
|
|
@@ -15,10 +15,12 @@ import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
|
15
15
|
export class ClineInstaller {
|
|
16
16
|
projectRoot;
|
|
17
17
|
overwrite;
|
|
18
|
+
options;
|
|
18
19
|
generator;
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.projectRoot = options.projectRoot;
|
|
21
22
|
this.overwrite = options.overwrite ?? false;
|
|
23
|
+
this.options = options;
|
|
22
24
|
this.generator = createPlatformConfigGenerator();
|
|
23
25
|
}
|
|
24
26
|
async install() {
|
|
@@ -32,7 +34,7 @@ export class ClineInstaller {
|
|
|
32
34
|
};
|
|
33
35
|
try {
|
|
34
36
|
// Generate MCP config
|
|
35
|
-
const mcpConfig = this.generator.generateMcpConfig('cline');
|
|
37
|
+
const mcpConfig = this.generator.generateMcpConfig('cline', { memoryBackend: this.options.memoryBackend });
|
|
36
38
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
37
39
|
result.configPath = configPath;
|
|
38
40
|
if (!existsSync(configPath) || this.overwrite) {
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
export interface CodexInstallerOptions {
|
|
9
9
|
projectRoot: string;
|
|
10
10
|
overwrite?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Memory backend for this install. 'memory' => database-free: the MCP config
|
|
13
|
+
* is written to run in-memory (AQE_MEMORY_BACKEND=memory, no AQE_MEMORY_PATH). (#533)
|
|
14
|
+
*/
|
|
15
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
11
16
|
}
|
|
12
17
|
export interface CodexInstallResult {
|
|
13
18
|
success: boolean;
|
|
@@ -20,6 +25,7 @@ export interface CodexInstallResult {
|
|
|
20
25
|
export declare class CodexInstaller {
|
|
21
26
|
private projectRoot;
|
|
22
27
|
private overwrite;
|
|
28
|
+
private options;
|
|
23
29
|
private generator;
|
|
24
30
|
constructor(options: CodexInstallerOptions);
|
|
25
31
|
install(): Promise<CodexInstallResult>;
|
|
@@ -15,10 +15,12 @@ import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
|
15
15
|
export class CodexInstaller {
|
|
16
16
|
projectRoot;
|
|
17
17
|
overwrite;
|
|
18
|
+
options;
|
|
18
19
|
generator;
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.projectRoot = options.projectRoot;
|
|
21
22
|
this.overwrite = options.overwrite ?? false;
|
|
23
|
+
this.options = options;
|
|
22
24
|
this.generator = createPlatformConfigGenerator();
|
|
23
25
|
}
|
|
24
26
|
async install() {
|
|
@@ -32,7 +34,7 @@ export class CodexInstaller {
|
|
|
32
34
|
};
|
|
33
35
|
try {
|
|
34
36
|
// Generate TOML MCP config
|
|
35
|
-
const mcpConfig = this.generator.generateMcpConfig('codex');
|
|
37
|
+
const mcpConfig = this.generator.generateMcpConfig('codex', { memoryBackend: this.options.memoryBackend });
|
|
36
38
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
37
39
|
result.configPath = configPath;
|
|
38
40
|
if (!existsSync(configPath) || this.overwrite) {
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
export interface ContinueDevInstallerOptions {
|
|
9
9
|
projectRoot: string;
|
|
10
10
|
overwrite?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Memory backend for this install. 'memory' => database-free: the MCP config
|
|
13
|
+
* is written to run in-memory (AQE_MEMORY_BACKEND=memory, no AQE_MEMORY_PATH). (#533)
|
|
14
|
+
*/
|
|
15
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
11
16
|
}
|
|
12
17
|
export interface ContinueDevInstallResult {
|
|
13
18
|
success: boolean;
|
|
@@ -20,6 +25,7 @@ export interface ContinueDevInstallResult {
|
|
|
20
25
|
export declare class ContinueDevInstaller {
|
|
21
26
|
private projectRoot;
|
|
22
27
|
private overwrite;
|
|
28
|
+
private options;
|
|
23
29
|
private generator;
|
|
24
30
|
constructor(options: ContinueDevInstallerOptions);
|
|
25
31
|
install(): Promise<ContinueDevInstallResult>;
|
|
@@ -15,10 +15,12 @@ import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
|
15
15
|
export class ContinueDevInstaller {
|
|
16
16
|
projectRoot;
|
|
17
17
|
overwrite;
|
|
18
|
+
options;
|
|
18
19
|
generator;
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.projectRoot = options.projectRoot;
|
|
21
22
|
this.overwrite = options.overwrite ?? false;
|
|
23
|
+
this.options = options;
|
|
22
24
|
this.generator = createPlatformConfigGenerator();
|
|
23
25
|
}
|
|
24
26
|
async install() {
|
|
@@ -32,7 +34,7 @@ export class ContinueDevInstaller {
|
|
|
32
34
|
};
|
|
33
35
|
try {
|
|
34
36
|
// Generate YAML MCP config
|
|
35
|
-
const mcpConfig = this.generator.generateMcpConfig('continuedev');
|
|
37
|
+
const mcpConfig = this.generator.generateMcpConfig('continuedev', { memoryBackend: this.options.memoryBackend });
|
|
36
38
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
37
39
|
result.configPath = configPath;
|
|
38
40
|
if (!existsSync(configPath) || this.overwrite) {
|
|
@@ -83,6 +85,12 @@ export class ContinueDevInstaller {
|
|
|
83
85
|
// If existing config already has mcpServers key, append just the server entry
|
|
84
86
|
// to avoid duplicate mcpServers keys (which produces invalid YAML)
|
|
85
87
|
if (existing.includes('mcpServers:')) {
|
|
88
|
+
// #533: honor database-free mode on the merge path too — otherwise this
|
|
89
|
+
// hardcoded entry re-introduces AQE_MEMORY_PATH and the server recreates
|
|
90
|
+
// memory.db at runtime, defeating a --no-database install.
|
|
91
|
+
const envBlock = this.options.memoryBackend === 'memory'
|
|
92
|
+
? ` AQE_MEMORY_BACKEND: memory\n AQE_V3_MODE: "true"`
|
|
93
|
+
: ` AQE_MEMORY_PATH: .agentic-qe/memory.db\n AQE_V3_MODE: "true"`;
|
|
86
94
|
const serverEntry = ` - name: agentic-qe
|
|
87
95
|
command: npx
|
|
88
96
|
args:
|
|
@@ -90,8 +98,7 @@ export class ContinueDevInstaller {
|
|
|
90
98
|
- agentic-qe@latest
|
|
91
99
|
- mcp
|
|
92
100
|
env:
|
|
93
|
-
|
|
94
|
-
AQE_V3_MODE: "true"`;
|
|
101
|
+
${envBlock}`;
|
|
95
102
|
return existing.trimEnd() + '\n' + serverEntry + '\n';
|
|
96
103
|
}
|
|
97
104
|
// No existing mcpServers — append the full block
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
export interface CopilotInstallerOptions {
|
|
9
9
|
projectRoot: string;
|
|
10
10
|
overwrite?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Memory backend for this install. 'memory' => database-free: the MCP config
|
|
13
|
+
* is written to run in-memory (AQE_MEMORY_BACKEND=memory, no AQE_MEMORY_PATH). (#533)
|
|
14
|
+
*/
|
|
15
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
11
16
|
}
|
|
12
17
|
export interface CopilotInstallResult {
|
|
13
18
|
success: boolean;
|
|
@@ -20,6 +25,7 @@ export interface CopilotInstallResult {
|
|
|
20
25
|
export declare class CopilotInstaller {
|
|
21
26
|
private projectRoot;
|
|
22
27
|
private overwrite;
|
|
28
|
+
private options;
|
|
23
29
|
private generator;
|
|
24
30
|
constructor(options: CopilotInstallerOptions);
|
|
25
31
|
install(): Promise<CopilotInstallResult>;
|
|
@@ -15,10 +15,12 @@ import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
|
15
15
|
export class CopilotInstaller {
|
|
16
16
|
projectRoot;
|
|
17
17
|
overwrite;
|
|
18
|
+
options;
|
|
18
19
|
generator;
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.projectRoot = options.projectRoot;
|
|
21
22
|
this.overwrite = options.overwrite ?? false;
|
|
23
|
+
this.options = options;
|
|
22
24
|
this.generator = createPlatformConfigGenerator();
|
|
23
25
|
}
|
|
24
26
|
async install() {
|
|
@@ -32,7 +34,7 @@ export class CopilotInstaller {
|
|
|
32
34
|
};
|
|
33
35
|
try {
|
|
34
36
|
// Generate MCP config
|
|
35
|
-
const mcpConfig = this.generator.generateMcpConfig('copilot');
|
|
37
|
+
const mcpConfig = this.generator.generateMcpConfig('copilot', { memoryBackend: this.options.memoryBackend });
|
|
36
38
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
37
39
|
result.configPath = configPath;
|
|
38
40
|
if (!existsSync(configPath) || this.overwrite) {
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
export interface CursorInstallerOptions {
|
|
9
9
|
projectRoot: string;
|
|
10
10
|
overwrite?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Memory backend for this install. 'memory' => database-free: the MCP config
|
|
13
|
+
* is written to run in-memory (AQE_MEMORY_BACKEND=memory, no AQE_MEMORY_PATH). (#533)
|
|
14
|
+
*/
|
|
15
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
11
16
|
}
|
|
12
17
|
export interface CursorInstallResult {
|
|
13
18
|
success: boolean;
|
|
@@ -20,6 +25,7 @@ export interface CursorInstallResult {
|
|
|
20
25
|
export declare class CursorInstaller {
|
|
21
26
|
private projectRoot;
|
|
22
27
|
private overwrite;
|
|
28
|
+
private options;
|
|
23
29
|
private generator;
|
|
24
30
|
constructor(options: CursorInstallerOptions);
|
|
25
31
|
install(): Promise<CursorInstallResult>;
|
|
@@ -15,10 +15,12 @@ import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
|
15
15
|
export class CursorInstaller {
|
|
16
16
|
projectRoot;
|
|
17
17
|
overwrite;
|
|
18
|
+
options;
|
|
18
19
|
generator;
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.projectRoot = options.projectRoot;
|
|
21
22
|
this.overwrite = options.overwrite ?? false;
|
|
23
|
+
this.options = options;
|
|
22
24
|
this.generator = createPlatformConfigGenerator();
|
|
23
25
|
}
|
|
24
26
|
async install() {
|
|
@@ -32,7 +34,7 @@ export class CursorInstaller {
|
|
|
32
34
|
};
|
|
33
35
|
try {
|
|
34
36
|
// Generate MCP config
|
|
35
|
-
const mcpConfig = this.generator.generateMcpConfig('cursor');
|
|
37
|
+
const mcpConfig = this.generator.generateMcpConfig('cursor', { memoryBackend: this.options.memoryBackend });
|
|
36
38
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
37
39
|
result.configPath = configPath;
|
|
38
40
|
if (!existsSync(configPath) || this.overwrite) {
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
export interface KiloCodeInstallerOptions {
|
|
9
9
|
projectRoot: string;
|
|
10
10
|
overwrite?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Memory backend for this install. 'memory' => database-free: the MCP config
|
|
13
|
+
* is written to run in-memory (AQE_MEMORY_BACKEND=memory, no AQE_MEMORY_PATH). (#533)
|
|
14
|
+
*/
|
|
15
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
11
16
|
}
|
|
12
17
|
export interface KiloCodeInstallResult {
|
|
13
18
|
success: boolean;
|
|
@@ -20,6 +25,7 @@ export interface KiloCodeInstallResult {
|
|
|
20
25
|
export declare class KiloCodeInstaller {
|
|
21
26
|
private projectRoot;
|
|
22
27
|
private overwrite;
|
|
28
|
+
private options;
|
|
23
29
|
private generator;
|
|
24
30
|
constructor(options: KiloCodeInstallerOptions);
|
|
25
31
|
install(): Promise<KiloCodeInstallResult>;
|
|
@@ -15,10 +15,12 @@ import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
|
15
15
|
export class KiloCodeInstaller {
|
|
16
16
|
projectRoot;
|
|
17
17
|
overwrite;
|
|
18
|
+
options;
|
|
18
19
|
generator;
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.projectRoot = options.projectRoot;
|
|
21
22
|
this.overwrite = options.overwrite ?? false;
|
|
23
|
+
this.options = options;
|
|
22
24
|
this.generator = createPlatformConfigGenerator();
|
|
23
25
|
}
|
|
24
26
|
async install() {
|
|
@@ -32,7 +34,7 @@ export class KiloCodeInstaller {
|
|
|
32
34
|
};
|
|
33
35
|
try {
|
|
34
36
|
// Generate MCP config
|
|
35
|
-
const mcpConfig = this.generator.generateMcpConfig('kilocode');
|
|
37
|
+
const mcpConfig = this.generator.generateMcpConfig('kilocode', { memoryBackend: this.options.memoryBackend });
|
|
36
38
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
37
39
|
result.configPath = configPath;
|
|
38
40
|
if (!existsSync(configPath) || this.overwrite) {
|
|
@@ -18,6 +18,11 @@ export interface KiroInstallerOptions {
|
|
|
18
18
|
installSteering?: boolean;
|
|
19
19
|
/** Overwrite existing files (default: false) */
|
|
20
20
|
overwrite?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Memory backend for this install. 'memory' => database-free: the Kiro MCP
|
|
23
|
+
* config runs the server in-memory (AQE_MEMORY_BACKEND=memory). (#533)
|
|
24
|
+
*/
|
|
25
|
+
memoryBackend?: 'memory' | 'sqlite' | 'agentdb' | 'hybrid';
|
|
21
26
|
}
|
|
22
27
|
export interface KiroInstallResult {
|
|
23
28
|
success: boolean;
|
|
@@ -130,10 +130,10 @@ export class KiroInstaller {
|
|
|
130
130
|
'agentic-qe': {
|
|
131
131
|
command: 'npx',
|
|
132
132
|
args: ['-y', 'agentic-qe@latest', 'mcp'],
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
AQE_V3_MODE: 'true'
|
|
136
|
-
|
|
133
|
+
// Issue #533: database-free installs run the MCP server in-memory.
|
|
134
|
+
env: this.options.memoryBackend === 'memory'
|
|
135
|
+
? { AQE_MEMORY_BACKEND: 'memory', AQE_V3_MODE: 'true' }
|
|
136
|
+
: { AQE_MEMORY_PATH: '.agentic-qe/memory.db', AQE_V3_MODE: 'true' },
|
|
137
137
|
disabled: false,
|
|
138
138
|
autoApprove: [
|
|
139
139
|
'fleet_init',
|
|
@@ -25,6 +25,11 @@ export class HooksPhase extends BasePhase {
|
|
|
25
25
|
critical = false;
|
|
26
26
|
requiresPhases = ['configuration'];
|
|
27
27
|
async shouldRun(context) {
|
|
28
|
+
// #532: hooks write into .claude/ — part of the Claude Code surface.
|
|
29
|
+
if (context.options.noClaude) {
|
|
30
|
+
context.services.log(' Hooks skipped (--no-claude)');
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
28
33
|
const config = context.config;
|
|
29
34
|
return config?.hooks?.claudeCode ?? true;
|
|
30
35
|
}
|
|
@@ -26,6 +26,11 @@ export class MCPPhase extends BasePhase {
|
|
|
26
26
|
requiresPhases = ['configuration', 'database'];
|
|
27
27
|
async run(context) {
|
|
28
28
|
const { projectRoot } = context;
|
|
29
|
+
// #532: --no-claude suppresses the Claude Code surface, including .mcp.json.
|
|
30
|
+
if (context.options.noClaude) {
|
|
31
|
+
context.services.log(' MCP: skipped (--no-claude — .mcp.json is the Claude Code surface)');
|
|
32
|
+
return { configured: false, mcpPath: '', serverName: '' };
|
|
33
|
+
}
|
|
29
34
|
// MCP is enabled by default — skip only with --no-mcp
|
|
30
35
|
if (context.options.noMcp) {
|
|
31
36
|
context.services.log(' MCP: skipped (--no-mcp)');
|
|
@@ -39,14 +44,29 @@ export class MCPPhase extends BasePhase {
|
|
|
39
44
|
// AQE MCP server configuration
|
|
40
45
|
// AQE_PROJECT_ROOT omitted — runtime discovery via findProjectRoot() is
|
|
41
46
|
// portable across machines, devcontainers, and CI (#321)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
//
|
|
48
|
+
// Issue #533: in database-free mode (--no-database / memoryBackend:'memory')
|
|
49
|
+
// the server must run in-memory and must not have learning/workers forced
|
|
50
|
+
// on (those persist to SQLite, recreating .agentic-qe/memory.db at runtime
|
|
51
|
+
// and defeating the db-free install). Those phases are already skipped at
|
|
52
|
+
// install time; mirror that in the generated env.
|
|
53
|
+
const dbFree = context.options.memoryBackend === 'memory';
|
|
54
|
+
const env = dbFree
|
|
55
|
+
? {
|
|
56
|
+
AQE_MEMORY_BACKEND: 'memory',
|
|
57
|
+
AQE_LEARNING_ENABLED: 'false',
|
|
58
|
+
AQE_WORKERS_ENABLED: 'false',
|
|
59
|
+
NODE_ENV: 'production',
|
|
60
|
+
}
|
|
61
|
+
: {
|
|
46
62
|
AQE_LEARNING_ENABLED: 'true',
|
|
47
63
|
AQE_WORKERS_ENABLED: 'true',
|
|
48
64
|
NODE_ENV: 'production',
|
|
49
|
-
}
|
|
65
|
+
};
|
|
66
|
+
const aqeServerConfig = {
|
|
67
|
+
command: 'aqe-mcp',
|
|
68
|
+
args: [],
|
|
69
|
+
env,
|
|
50
70
|
};
|
|
51
71
|
// Write to .mcp.json at project root (the only location Claude Code reads)
|
|
52
72
|
const rootMcpPath = join(projectRoot, '.mcp.json');
|
|
@@ -68,8 +88,15 @@ export class MCPPhase extends BasePhase {
|
|
|
68
88
|
writeFileSync(rootMcpPath, JSON.stringify(rootMcpConfig, null, 2), 'utf-8');
|
|
69
89
|
context.services.log(` MCP config: ${rootMcpPath}`);
|
|
70
90
|
context.services.log(` Server: agentic-qe`);
|
|
71
|
-
|
|
72
|
-
|
|
91
|
+
if (dbFree) {
|
|
92
|
+
context.services.log(` Memory backend: in-memory (database-free)`);
|
|
93
|
+
context.services.log(` Learning: disabled (db-free)`);
|
|
94
|
+
context.services.log(` Workers: disabled (db-free)`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
context.services.log(` Learning: enabled`);
|
|
98
|
+
context.services.log(` Workers: enabled`);
|
|
99
|
+
}
|
|
73
100
|
return {
|
|
74
101
|
configured: true,
|
|
75
102
|
mcpPath: rootMcpPath,
|