agentic-qe 3.13.3 → 3.13.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/aqe-plan-work/SKILL.md +31 -0
- package/.agents/skills/aqe-plan-work/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-plan-work/references/planning-framework.md +39 -0
- package/.agents/skills/aqe-research/SKILL.md +31 -0
- package/.agents/skills/aqe-research/agents/openai.yaml +4 -0
- package/.agents/skills/aqe-research/references/evidence-rules.md +21 -0
- package/.agents/skills/aqe-ruflo/SKILL.md +29 -0
- package/.claude/commands/pair/README.md +261 -0
- package/.claude/commands/pair/commands.md +546 -0
- package/.claude/commands/pair/config.md +510 -0
- package/.claude/commands/pair/examples.md +512 -0
- package/.claude/commands/pair/modes.md +348 -0
- package/.claude/commands/pair/session.md +407 -0
- package/.claude/commands/pair/start.md +209 -0
- package/.claude/commands/stream-chain/pipeline.md +121 -0
- package/.claude/commands/stream-chain/run.md +70 -0
- package/.claude/commands/training/README.md +9 -0
- package/.claude/commands/training/model-update.md +25 -0
- package/.claude/commands/training/neural-patterns.md +108 -0
- package/.claude/commands/training/neural-train.md +75 -0
- package/.claude/commands/training/pattern-learn.md +25 -0
- package/.claude/commands/training/specialization.md +63 -0
- package/.claude/commands/truth/start.md +143 -0
- package/.claude/commands/verify/check.md +50 -0
- package/.claude/commands/verify/start.md +128 -0
- package/.claude/helpers/.helpers-version +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +430 -430
- package/.claude/helpers/helpers.manifest.json +6 -6
- package/.claude/helpers/hook-handler.cjs +565 -565
- package/.claude/helpers/intelligence.cjs +1058 -1058
- package/.claude/helpers/statusline.cjs +1022 -968
- package/.claude/helpers/v3/advisor-call.cjs +283 -0
- package/.claude/skills/README.md +54 -64
- package/.claude/skills/dual-mode/README.md +71 -0
- package/.claude/skills/dual-mode/dual-collect.md +103 -0
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -0
- package/.claude/skills/dual-mode/dual-spawn.md +81 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/.codex/hooks/aqe-codex-hook.cjs +34 -9
- package/.codex/hooks.json +9 -9
- package/CHANGELOG.md +90 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-QGJAFSG5.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-YIGGREZN.js → agent-booster-wasm-XDKGG2GP.js} +2 -2
- package/dist/cli/chunks/{agent-handler-64O7R55A.js → agent-handler-CTPXGR5P.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2ZZBYUP3.js → agent-memory-branch-MG5OV7AY.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-ZU735SG7.js +2 -0
- package/dist/cli/chunks/{arena-PF5WL2WM.js → arena-FAHVOHNG.js} +2 -2
- package/dist/cli/chunks/{arena-6YRNQNCX.js → arena-NYO4EUNQ.js} +4 -4
- package/dist/cli/chunks/{audit-R53FOYCK.js → audit-6544RL5D.js} +3 -3
- package/dist/cli/chunks/base-EKTX2PRE.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-QOULNHXS.js → better-sqlite3-MTEONNCQ.js} +2 -2
- package/dist/cli/chunks/{brain-handler-J4ICUOUX.js → brain-handler-DPKCUQUC.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-YVPD43TG.js → branch-enumerator-SU2KHC2C.js} +2 -2
- package/dist/cli/chunks/{browser-TKVHX53S.js → browser-ITDN72YJ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-BUPIMI3E.js +2 -0
- package/dist/cli/chunks/{chunk-ORXDKBZC.js → chunk-23AO43XW.js} +1 -1
- package/dist/cli/chunks/{chunk-3NML6POU.js → chunk-2CF3XZAS.js} +2 -2
- package/dist/cli/chunks/{chunk-5IVOY76M.js → chunk-2KPGJ4LO.js} +2 -2
- package/dist/cli/chunks/{chunk-SJWTNKPY.js → chunk-2QI3OJAC.js} +3 -3
- package/dist/cli/chunks/{chunk-MYR6CBXC.js → chunk-2RZ2S6YR.js} +2 -2
- package/dist/cli/chunks/{chunk-VKUH57JE.js → chunk-2XZWYKXQ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZU3XUBDQ.js → chunk-3EWWP3AO.js} +1 -1
- package/dist/cli/chunks/{chunk-4Z2AKQP4.js → chunk-3XKCC7LE.js} +1 -1
- package/dist/cli/chunks/chunk-42KQE5H6.js +12 -0
- package/dist/cli/chunks/{chunk-2MLPO3RZ.js → chunk-43BXSNKU.js} +2 -2
- package/dist/cli/chunks/{chunk-UOJ26GXD.js → chunk-4E2NA2GY.js} +2 -2
- package/dist/cli/chunks/{chunk-66KIIH6V.js → chunk-4Z7JP7CD.js} +2 -2
- package/dist/cli/chunks/{chunk-3J2QITXC.js → chunk-54C3OHES.js} +1 -1
- package/dist/cli/chunks/{chunk-5A5EC5RD.js → chunk-557BFPDB.js} +2 -2
- package/dist/cli/chunks/{chunk-JG267MVB.js → chunk-5I5KMIFY.js} +2 -2
- package/dist/cli/chunks/{chunk-IRX2THND.js → chunk-5YIGAWBO.js} +2 -2
- package/dist/cli/chunks/{chunk-PHGOMAIS.js → chunk-64GTU5LR.js} +2 -2
- package/dist/cli/chunks/{chunk-HJNFXYX4.js → chunk-6BEMH5K5.js} +1 -1
- package/dist/cli/chunks/{chunk-AJ45QR3K.js → chunk-6H3I36DL.js} +2 -2
- package/dist/cli/chunks/{chunk-X737I4SO.js → chunk-6L5V3JGJ.js} +1 -1
- package/dist/cli/chunks/{chunk-QGJYKXUO.js → chunk-6RV3W2UZ.js} +1 -1
- package/dist/cli/chunks/{chunk-XRF5MX4Q.js → chunk-6ZCAZ3TR.js} +2 -2
- package/dist/cli/chunks/{chunk-JQTDNUHA.js → chunk-74QRMQFR.js} +2 -2
- package/dist/cli/chunks/{chunk-DSUEJK33.js → chunk-76OWM3ZO.js} +2 -2
- package/dist/cli/chunks/{chunk-GTURQ454.js → chunk-7A4EXSMN.js} +2 -2
- package/dist/cli/chunks/{chunk-DPJLA7JW.js → chunk-7BLXINIL.js} +2 -2
- package/dist/cli/chunks/{chunk-4RYU4WMW.js → chunk-7LR4VP2I.js} +1 -1
- package/dist/cli/chunks/{chunk-NIA6VTIH.js → chunk-7M4X6WTF.js} +2 -2
- package/dist/cli/chunks/{chunk-N3KQRDTM.js → chunk-7PHF2JM3.js} +1 -1
- package/dist/cli/chunks/{chunk-7MBPKAQ3.js → chunk-7SQXEYII.js} +2 -2
- package/dist/cli/chunks/{chunk-PHBGMXTR.js → chunk-AAGOBPIJ.js} +2 -2
- package/dist/cli/chunks/{chunk-33SPAMQZ.js → chunk-AJYJFIKO.js} +2 -2
- package/dist/cli/chunks/{chunk-QP4UKSUJ.js → chunk-AKYOY5KR.js} +2 -2
- package/dist/cli/chunks/{chunk-HEF6XKA5.js → chunk-AKZ6PWHM.js} +2 -2
- package/dist/cli/chunks/{chunk-764G7VK6.js → chunk-APMLMLSL.js} +1 -1
- package/dist/cli/chunks/{chunk-KQFMCVBH.js → chunk-AX4XIG4G.js} +2 -2
- package/dist/cli/chunks/{chunk-ZLTAAROU.js → chunk-BAJK26EI.js} +2 -2
- package/dist/cli/chunks/{chunk-LLQG3F4H.js → chunk-BI6OTPC6.js} +2 -2
- package/dist/cli/chunks/chunk-BKI5NFQ5.js +2 -0
- package/dist/cli/chunks/{chunk-V6W4IHS5.js → chunk-BUN4WBPW.js} +2 -2
- package/dist/cli/chunks/{chunk-UF7JKDWB.js → chunk-BX5MY65W.js} +1 -1
- package/dist/cli/chunks/{chunk-KBQRYAHZ.js → chunk-CD4YWKJ2.js} +2 -2
- package/dist/cli/chunks/{chunk-VGWHFFK6.js → chunk-CHFZHORO.js} +5 -5
- package/dist/cli/chunks/{chunk-UX434RY5.js → chunk-CPIAZGHF.js} +2 -2
- package/dist/cli/chunks/{chunk-PS32DXYF.js → chunk-D4P6BKGF.js} +3 -3
- package/dist/cli/chunks/{chunk-CBLKYGKT.js → chunk-DFBJPOJR.js} +2 -2
- package/dist/cli/chunks/{chunk-XRQGWUDX.js → chunk-DIRFXY3J.js} +7 -7
- package/dist/cli/chunks/chunk-DK7MV2W3.js +2 -0
- package/dist/cli/chunks/chunk-DVYNBMMP.js +62 -0
- package/dist/cli/chunks/{chunk-LWPCGOQM.js → chunk-EGI6SKQD.js} +2 -2
- package/dist/cli/chunks/{chunk-RMQRSZB4.js → chunk-ELC3UEML.js} +1 -1
- package/dist/cli/chunks/chunk-ELKWYWTD.js +2 -0
- package/dist/cli/chunks/{chunk-2BYRQ5MV.js → chunk-EPMUAKU2.js} +2 -2
- package/dist/cli/chunks/{chunk-U7DGRHSB.js → chunk-EROQSNGD.js} +2 -2
- package/dist/cli/chunks/{chunk-GSG5FASF.js → chunk-EXXWOOUL.js} +3 -3
- package/dist/cli/chunks/{chunk-UWBHR4EZ.js → chunk-FQPYD6YE.js} +1 -1
- package/dist/cli/chunks/{chunk-OD5R7HRI.js → chunk-FW6OPDA6.js} +1 -1
- package/dist/cli/chunks/{chunk-M7XDTQHX.js → chunk-FYWTMDID.js} +2 -2
- package/dist/cli/chunks/{chunk-TK6CHESH.js → chunk-G47WJMHM.js} +1 -1
- package/dist/cli/chunks/{chunk-LOZRBK2Z.js → chunk-G73XY2NK.js} +2 -2
- package/dist/cli/chunks/{chunk-WRC66JTK.js → chunk-GHSP4AC5.js} +1 -1
- package/dist/cli/chunks/{chunk-37GCWGXT.js → chunk-GITS44TM.js} +2 -2
- package/dist/cli/chunks/{chunk-IH47VGC7.js → chunk-GUO6JZMS.js} +2 -2
- package/dist/cli/chunks/{chunk-JLFU5SCI.js → chunk-GWBV26SE.js} +2 -2
- package/dist/cli/chunks/{chunk-AXXFY7PX.js → chunk-HBYVYLBN.js} +2 -2
- package/dist/cli/chunks/{chunk-46U73TST.js → chunk-HMNBNGNO.js} +1 -1
- package/dist/cli/chunks/{chunk-J65XQ6WE.js → chunk-HZV3J4VQ.js} +2 -2
- package/dist/cli/chunks/{chunk-PHNNAIFA.js → chunk-IC5JGTM4.js} +1 -1
- package/dist/cli/chunks/{chunk-JOHWWTJF.js → chunk-IS3P5VBL.js} +2 -2
- package/dist/cli/chunks/{chunk-64C4SS66.js → chunk-JID7JO7K.js} +2 -2
- package/dist/cli/chunks/{chunk-DTOKJKSE.js → chunk-JOJ2UFHM.js} +2 -2
- package/dist/cli/chunks/{chunk-MGKJFO57.js → chunk-JTUTZUED.js} +2 -2
- package/dist/cli/chunks/{chunk-2QKSIHXO.js → chunk-JX5IY2YK.js} +1 -1
- package/dist/cli/chunks/{chunk-EEG4G5JG.js → chunk-K55D3PAR.js} +3 -3
- package/dist/cli/chunks/{chunk-TNM7X2GD.js → chunk-KAVYTFAS.js} +2 -2
- package/dist/cli/chunks/{chunk-NUPAGPN6.js → chunk-KRCIC4JK.js} +2 -2
- package/dist/cli/chunks/{chunk-VFZNVJP2.js → chunk-L6H4MWVN.js} +2 -2
- package/dist/cli/chunks/{chunk-QZ3EIONO.js → chunk-L6I2Q6UQ.js} +1 -1
- package/dist/cli/chunks/{chunk-A547LEUW.js → chunk-LARAXKTZ.js} +2 -2
- package/dist/cli/chunks/{chunk-6I2L22WS.js → chunk-LELWVGN6.js} +1 -1
- package/dist/cli/chunks/chunk-M7456ZW5.js +2 -0
- package/dist/cli/chunks/{chunk-J5AIMM2J.js → chunk-MF6OT43N.js} +1 -1
- package/dist/cli/chunks/{chunk-WHUQDBV7.js → chunk-MX35PIGJ.js} +2 -2
- package/dist/cli/chunks/{chunk-RRHIEG4Y.js → chunk-ND7IWTVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-TRPRFW27.js → chunk-NFE4RV2Q.js} +2 -2
- package/dist/cli/chunks/{chunk-37I4AMCT.js → chunk-NVZ3QROA.js} +2 -2
- package/dist/cli/chunks/{chunk-6C3PDY72.js → chunk-OF5UL3FA.js} +1 -1
- package/dist/cli/chunks/{chunk-JBWXBDJX.js → chunk-OGUPLNRY.js} +1 -1
- package/dist/cli/chunks/chunk-OJZ5LI3O.js +2 -0
- package/dist/cli/chunks/{chunk-ZIYCZZYD.js → chunk-OQ4HOHBI.js} +2 -2
- package/dist/cli/chunks/{chunk-2G2XD6EM.js → chunk-OUWZTYRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-IZIYFVAZ.js → chunk-PDOL3FGO.js} +3 -3
- package/dist/cli/chunks/{chunk-NF2N2FIY.js → chunk-PEHSTLU7.js} +1 -1
- package/dist/cli/chunks/{chunk-WVWWTRKT.js → chunk-PKCVQ2I4.js} +1 -1
- package/dist/cli/chunks/{chunk-CW7BWFFF.js → chunk-PNDWHSZO.js} +2 -2
- package/dist/cli/chunks/{chunk-IKPBQZQP.js → chunk-PSD2L2JB.js} +2 -2
- package/dist/cli/chunks/{chunk-DSGKRXHF.js → chunk-Q3J5OTZ2.js} +1 -1
- package/dist/cli/chunks/{chunk-PY55ZD2G.js → chunk-QHX7VLVT.js} +2 -2
- package/dist/cli/chunks/{chunk-7TG7LJAB.js → chunk-QIHKSRUZ.js} +2 -2
- package/dist/cli/chunks/{chunk-B7XZJBMT.js → chunk-QLD2WVWN.js} +2 -2
- package/dist/cli/chunks/{chunk-HOIH542Y.js → chunk-R4VDRE75.js} +1 -1
- package/dist/cli/chunks/{chunk-A6J5MAVO.js → chunk-RDHBUCKQ.js} +182 -201
- package/dist/cli/chunks/{chunk-OU5CZFBG.js → chunk-RGBYJAKQ.js} +3 -3
- package/dist/cli/chunks/{chunk-GNCGRDQ2.js → chunk-RKXN5TVS.js} +1 -1
- package/dist/cli/chunks/{chunk-RWPWD5GG.js → chunk-S2EUFKHL.js} +2 -2
- package/dist/cli/chunks/{chunk-CVFUANMU.js → chunk-SN57SNLU.js} +2 -2
- package/dist/cli/chunks/{chunk-OX6WPOGR.js → chunk-SQDHFTGQ.js} +3 -3
- package/dist/cli/chunks/{chunk-P5CQMDFQ.js → chunk-THQ5ZBWP.js} +2 -2
- package/dist/cli/chunks/{chunk-BDOD534O.js → chunk-TU5S33SD.js} +2 -2
- package/dist/cli/chunks/{chunk-22WFXSXB.js → chunk-U5GGDJ44.js} +2 -2
- package/dist/cli/chunks/{chunk-KQ5GLUOB.js → chunk-UGER2PGN.js} +4 -4
- package/dist/cli/chunks/{chunk-TW5QWNT4.js → chunk-UUFLYBUO.js} +2 -2
- package/dist/cli/chunks/{chunk-QFANYWC5.js → chunk-UWM4CCK7.js} +1 -1
- package/dist/cli/chunks/{chunk-FF53QW6C.js → chunk-V2T7QEPV.js} +1 -1
- package/dist/cli/chunks/{chunk-EMH54CO7.js → chunk-VE5STFDP.js} +2 -2
- package/dist/cli/chunks/{chunk-APXJJRU4.js → chunk-VNRWJ5JZ.js} +2 -2
- package/dist/cli/chunks/{chunk-N7IRBQ4D.js → chunk-VRV7CXEM.js} +1 -1
- package/dist/cli/chunks/{chunk-CXPMA7LY.js → chunk-W7H46LAX.js} +1 -1
- package/dist/cli/chunks/{chunk-3CFWNT3F.js → chunk-WAELEQP5.js} +2 -2
- package/dist/cli/chunks/{chunk-JHOJG5VO.js → chunk-WDDU4I5Z.js} +1 -1
- package/dist/cli/chunks/{chunk-SAMAYDVS.js → chunk-WLY2J6JP.js} +2 -2
- package/dist/cli/chunks/{chunk-62F5M5OO.js → chunk-WSSFH23M.js} +1 -1
- package/dist/cli/chunks/{chunk-N4OBRS6S.js → chunk-WZI2REDL.js} +2 -2
- package/dist/cli/chunks/{chunk-7AHQ7ROU.js → chunk-X53GJW2E.js} +2 -2
- package/dist/cli/chunks/{chunk-H2BR5MCX.js → chunk-XACF7ZLM.js} +2 -2
- package/dist/cli/chunks/{chunk-QZS3XCU5.js → chunk-XNGYWOAK.js} +2 -2
- package/dist/cli/chunks/{chunk-F6V5POSK.js → chunk-YFD6K7AS.js} +75 -75
- package/dist/cli/chunks/{chunk-W6OIDL4J.js → chunk-YG45ZONW.js} +2 -2
- package/dist/cli/chunks/{chunk-FGIZVGIE.js → chunk-YGMCRJSC.js} +2 -2
- package/dist/cli/chunks/{chunk-SSXCHSVM.js → chunk-YIEMVVUH.js} +2 -2
- package/dist/cli/chunks/{chunk-ZI7BWJJW.js → chunk-YSWI3APU.js} +2 -2
- package/dist/cli/chunks/{chunk-ADBTOUOX.js → chunk-YU4U3BUY.js} +1 -1
- package/dist/cli/chunks/{chunk-K2D3YW2N.js → chunk-Z5YNYVFO.js} +1 -1
- package/dist/cli/chunks/{chunk-UAXFRKR3.js → chunk-ZE3WS57T.js} +2 -2
- package/dist/cli/chunks/{chunk-C7AXBCMS.js → chunk-ZMA5OWIQ.js} +4 -4
- package/dist/cli/chunks/{chunk-RU23JXCG.js → chunk-ZOD37GNG.js} +3 -3
- package/dist/cli/chunks/{chunk-MNEQESQJ.js → chunk-ZQ7XQLLV.js} +3 -3
- package/dist/cli/chunks/{chunk-TGVDKSSS.js → chunk-ZUIPUO7Q.js} +1 -1
- package/dist/cli/chunks/{chunk-L4O2645U.js → chunk-ZWLFEZQC.js} +1 -1
- package/dist/cli/chunks/{ci-G2NEYLVO.js → ci-IRCNFD32.js} +2 -2
- package/dist/cli/chunks/{ci-output-SZFEXGBU.js → ci-output-NFOUNDJ2.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ZD7PJY6N.js → circuit-breaker-GB7SQRD2.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-DAVANGUJ.js → claude-flow-setup-STFKPPVL.js} +2 -2
- package/dist/cli/chunks/client-M4WF22UT.js +2 -0
- package/dist/cli/chunks/{cline-installer-WCPKWLY7.js → cline-installer-MLKKIHIV.js} +2 -2
- package/dist/cli/chunks/{code-324ZJR3V.js → code-ZRCJC42H.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-EWVSXJHR.js → code-index-extractor-VWDYYQY2.js} +2 -2
- package/dist/cli/chunks/codex-installer-I5BTWYQV.js +15 -0
- package/dist/cli/chunks/{completions-ZAWBZWYK.js → completions-5JCAFTQV.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-S3H2IRON.js → complexity-analyzer-6JLLAPGO.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-4DDFAJ26.js → continuedev-installer-YBOLMUZR.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-KBBAL3G5.js → copilot-installer-GDBJZBXS.js} +2 -2
- package/dist/cli/chunks/core-handlers-3MNFXL44.js +2 -0
- package/dist/cli/chunks/{cost-tracker-2YM7SGBW.js → cost-tracker-NEAVGEZI.js} +2 -2
- package/dist/cli/chunks/{coverage-6CCBAORJ.js → coverage-DXS5XNAA.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-Q5X6ZLJY.js +2 -0
- package/dist/cli/chunks/{cursor-installer-24DKXNU5.js → cursor-installer-3KEMFIFA.js} +2 -2
- package/dist/cli/chunks/{daemon-M2PSDIZF.js → daemon-FT2J6VY4.js} +3 -3
- package/dist/cli/chunks/{daemon-JLF6CRBS.js → daemon-JN377KTA.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-Y5HSZDRV.js → dag-attention-scheduler-EJFEWFXI.js} +2 -2
- package/dist/cli/chunks/{detect-6Y227IJ6.js → detect-E5MN6N3L.js} +2 -2
- package/dist/cli/chunks/{dist-node-EGOJXGTA.js → dist-node-ZFSAQMFD.js} +2 -2
- package/dist/cli/chunks/{domain-handler-G3JEWRE5.js → domain-handler-S7VFZ2MY.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-XOHI3EMJ.js → domain-transfer-LGHT3FN4.js} +2 -2
- package/dist/cli/chunks/dream-5QB6JABW.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-CSSA55L4.js → embed-and-insert-pattern-OVQS6IKK.js} +2 -2
- package/dist/cli/chunks/{eval-NHBXOXDV.js → eval-45UWDD2R.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-B7ZDV5UY.js → experience-capture-middleware-XDRJSNPY.js} +3 -3
- package/dist/cli/chunks/{fast-paths-XGKSBALA.js → fast-paths-VEDCJL75.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ZVD73ZYK.js → feature-flags-NOTQVBLP.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NBUDJSWJ.js → feature-flags-TGA3NWVL.js} +2 -2
- package/dist/cli/chunks/file-discovery-AHMR6IGX.js +2 -0
- package/dist/cli/chunks/{fleet-LF77P3BW.js → fleet-CQBUCH2S.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-UXNT7BEN.js → gnn-wrapper-SOZCIONJ.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-C4LMU5LA.js → heartbeat-handler-6XNV4DGM.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-ZRLIMPKO.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-R4VAEQ2B.js +2 -0
- package/dist/cli/chunks/hnsw-index-GTUOS6DF.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-EHHBIWS3.js → hnsw-legacy-bridge-UILVP37N.js} +2 -2
- package/dist/cli/chunks/hnswlib-node-OHJQOSAH.js +2 -0
- package/dist/cli/chunks/{hooks-AGE3HCFI.js → hooks-QVDOGEHG.js} +10 -10
- package/dist/cli/chunks/hybrid-router-CYEXFWDT.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-E5QX5MEB.js → hypergraph-engine-YMVPBXZS.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZZHBANYB.js → hypergraph-handler-SHUNZXUK.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-HMJ7LAXR.js +2 -0
- package/dist/cli/chunks/{init-handler-PNVRBZZT.js → init-handler-JE5FYJAV.js} +16 -12
- package/dist/cli/chunks/init-wizard-OIK6S3PQ.js +2 -0
- package/dist/cli/chunks/kernel-NZCGR72Y.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-TR53QKPU.js → kilocode-installer-TVP4YOOK.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-MJW6LCAX.js → kiro-installer-XBSGANX7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-HA7XW46B.js +2 -0
- package/dist/cli/chunks/{learning-6LLGHP2Q.js → learning-O4ZXQVRE.js} +3 -3
- package/dist/cli/chunks/{llm-router-DBLV3VGG.js → llm-router-FXXJHARR.js} +4 -4
- package/dist/cli/chunks/llm-router-service-FVGQSXYC.js +2 -0
- package/dist/cli/chunks/{load-LAZ3E5PE.js → load-IVF6G2SK.js} +2 -2
- package/dist/cli/chunks/load-test-IQTO35GE.js +2 -0
- package/dist/cli/chunks/{mcp-L5QXHSEY.js → mcp-VXSDVG3H.js} +2 -2
- package/dist/cli/chunks/{memory-YR5PCMWA.js → memory-BINJV3M6.js} +5 -5
- package/dist/cli/chunks/memory-backend-YGSOJ7SI.js +2 -0
- package/dist/cli/chunks/{memory-handlers-BSRTZQYR.js → memory-handlers-BJNFJZFP.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-RECZ3ACW.js → multi-model-executor-RJHYK6JI.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-4TDUB7HH.js → opencode-installer-VCTF5ETL.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PHDKJ5C4.js → orchestrator-5SKZ2BOK.js} +11 -11
- package/dist/cli/chunks/pattern-null-store-4WN5O2PF.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-QK2FADRS.js → pattern-usage-recorder-AY2DAOQO.js} +2 -2
- package/dist/cli/chunks/{pipeline-JQJYSN43.js → pipeline-EMBMC75N.js} +2 -2
- package/dist/cli/chunks/platform-GADIFXCI.js +2 -0
- package/dist/cli/chunks/{plugin-766MBGK6.js → plugin-Q234ZAAY.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-XQERZNSK.js → prime-radiant-advanced-wasm-CXXKYB2P.js} +2 -2
- package/dist/cli/chunks/protocol-executor-EYTJXPXY.js +2 -0
- package/dist/cli/chunks/{protocol-handler-FAK4MMNA.js → protocol-handler-ZZRFBVNA.js} +2 -2
- package/dist/cli/chunks/{prove-HYBVXOGW.js → prove-7674ATXK.js} +2 -2
- package/dist/cli/chunks/provider-manager-TM3JHYLL.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-6JLFP3HE.js +2 -0
- package/dist/cli/chunks/quality-QCIGVN2S.js +7 -0
- package/dist/cli/chunks/{quality-gate-RK32VMO7.js → quality-gate-AKV564GE.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-OKGOKGHI.js +2 -0
- package/dist/cli/chunks/{real-embeddings-GI7CRHE2.js → real-embeddings-74POUVMX.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-BS3XWJJI.js → roocode-installer-INBL5AG7.js} +2 -2
- package/dist/cli/chunks/router-J45OF4SP.js +2 -0
- package/dist/cli/chunks/routing-feedback-VTZFH57X.js +2 -0
- package/dist/cli/chunks/{routing-handler-XMGRJDHH.js → routing-handler-C7HMM7RL.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-NDL3ONNC.js → ruvector-commands-PT6LRVCW.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-XAJOYGJ2.js → rvf-dual-writer-PRKROTP3.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-WXFRZZ26.js → rvf-migration-adapter-ZI2XW4UX.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-WFXA2VUQ.js → rvf-migration-coordinator-5JTGP35V.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-BDPUBFNP.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-I7PFJZCK.js → rvf-store-integrity-3B5TZTFR.js} +2 -2
- package/dist/cli/chunks/safe-db-FHJBWJIB.js +2 -0
- package/dist/cli/chunks/schedule-LP7YYT4P.js +2 -0
- package/dist/cli/chunks/scheduler-BOZWGKJG.js +2 -0
- package/dist/cli/chunks/{security-H3WY76GF.js → security-IMIWSAHW.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-GRTJCLW6.js → shared-rvf-adapter-UDKJNX6I.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-46XE5R2B.js → shared-rvf-dual-writer-FQOBQ6S5.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-TDM36AHF.js +2 -0
- package/dist/cli/chunks/{status-handler-VUIFMY4F.js → status-handler-7WON7M7F.js} +2 -2
- package/dist/cli/chunks/{structural-health-I7HC477E.js → structural-health-JTKTO3A4.js} +2 -2
- package/dist/cli/chunks/{sync-M6LUV5R4.js → sync-6ABYTAOL.js} +2 -2
- package/dist/cli/chunks/{sync-RO2YGMBF.js → sync-UJSHBY3B.js} +2 -2
- package/dist/cli/chunks/{task-handler-BJJTZ7AU.js → task-handler-5TZNOCCB.js} +2 -2
- package/dist/cli/chunks/{task-handlers-B6S4NEN3.js → task-handlers-G7ZUGBHM.js} +3 -3
- package/dist/cli/chunks/test-BSJ6MVTG.js +33 -0
- package/dist/cli/chunks/{test-scheduling-4ISKEFR6.js → test-scheduling-OSJJXIYQ.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-BOIYBZHW.js → token-bootstrap-MRNFR4YI.js} +2 -2
- package/dist/cli/chunks/{token-usage-6ZZC7RLT.js → token-usage-YQN7ND7G.js} +2 -2
- package/dist/cli/chunks/{transformers-55VI4OGW.js → transformers-QL3AG25C.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-6GRRGB3K.js → tree-sitter-wasm-parser-BECZRRZP.js} +2 -2
- package/dist/cli/chunks/{types-SXDF7QQT.js → types-FQSNLPWS.js} +2 -2
- package/dist/cli/chunks/unified-memory-6PHUOZRH.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-WYSFH3PS.js +2 -0
- package/dist/cli/chunks/unified-persistence-QBGHDCCO.js +2 -0
- package/dist/cli/chunks/{upgrade-PMPB7NGB.js → upgrade-2ICXXV6D.js} +2 -2
- package/dist/cli/chunks/{validate-G37QKKXK.js → validate-LPAUH2F4.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-6X22J3VD.js → validate-swarm-VWVE2GM7.js} +2 -2
- package/dist/cli/chunks/{vibium-SGBJKHQL.js → vibium-U3LBEI4K.js} +2 -2
- package/dist/cli/chunks/visual-security-LH7DRCDS.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-S46Y5BUJ.js → web-tree-sitter-QGZXQPXU.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-PTYCETNM.js → windsurf-installer-GGLQJWUI.js} +2 -2
- package/dist/cli/chunks/witness-chain-2BDZOPJ2.js +2 -0
- package/dist/cli/chunks/{witness-chain-5SCRFT2K.js → witness-chain-47A2AXUS.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-XIAMRVUZ.js → witness-key-manager-FVS7UOWM.js} +2 -2
- package/dist/cli/chunks/{workflow-BPQA2NAI.js → workflow-KIZPLTYW.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UYOPFK2T.js +2 -0
- package/dist/cli/chunks/{wrappers-IWZZZOAU.js → wrappers-ER6XCMT6.js} +2 -2
- package/dist/cli/commands/platform.d.ts +17 -0
- package/dist/cli/commands/platform.js +91 -41
- package/dist/cli/commands/quality.d.ts +12 -0
- package/dist/cli/commands/quality.js +50 -74
- package/dist/cli/commands/test.js +33 -4
- package/dist/cli/handlers/init-handler.d.ts +3 -0
- package/dist/cli/handlers/init-handler.js +13 -4
- package/dist/cli/utils/file-discovery.d.ts +1 -0
- package/dist/cli/utils/file-discovery.js +13 -1
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +5 -0
- package/dist/domains/quality-assessment/index.d.ts +1 -0
- package/dist/domains/quality-assessment/index.js +1 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +41 -0
- package/dist/domains/quality-assessment/quality-evidence.js +115 -0
- package/dist/domains/test-execution/coordinator.d.ts +1 -0
- package/dist/domains/test-execution/coordinator.js +11 -4
- package/dist/domains/test-execution/interfaces.d.ts +2 -0
- package/dist/domains/test-execution/services/retry-handler.js +3 -3
- package/dist/domains/test-execution/services/test-executor.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.js +93 -30
- package/dist/domains/test-generation/gates/test-quality-gate.d.ts +8 -2
- package/dist/domains/test-generation/gates/test-quality-gate.js +93 -4
- package/dist/domains/test-generation/generators/base-test-generator.js +0 -15
- package/dist/domains/test-generation/generators/jest-vitest-generator.js +17 -26
- package/dist/domains/test-generation/services/test-generator.js +7 -2
- package/dist/init/codex-installer.d.ts +22 -3
- package/dist/init/codex-installer.js +132 -54
- package/dist/init/codex-skill-manifest.d.ts +43 -0
- package/dist/init/codex-skill-manifest.js +21 -0
- package/dist/init/orchestrator.js +2 -0
- package/dist/init/phases/07-hooks.js +3 -1
- package/dist/init/phases/09-assets.js +10 -1
- package/dist/init/phases/phase-interface.d.ts +4 -0
- package/dist/init/settings-merge.d.ts +3 -1
- package/dist/init/settings-merge.js +9 -3
- package/dist/integrations/embeddings/index/HNSWIndex.js +2 -0
- package/dist/learning/real-embeddings.js +19 -3
- package/dist/mcp/bundle.js +453 -472
- package/dist/mcp/tools/quality-assessment/evaluate.d.ts +7 -0
- package/dist/mcp/tools/quality-assessment/evaluate.js +72 -20
- package/dist/mcp/tools/security-compliance/scan.js +8 -1
- package/package.json +6 -2
- package/dist/cli/chunks/adapter-NIUFP6QX.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DC4DNCPB.js +0 -2
- package/dist/cli/chunks/base-EXD3ULZT.js +0 -2
- package/dist/cli/chunks/better-sqlite3-OW5HIPEN.js +0 -2
- package/dist/cli/chunks/browser-workflow-KOMASCB7.js +0 -2
- package/dist/cli/chunks/chunk-5IH22DLD.js +0 -12
- package/dist/cli/chunks/chunk-6R6QGQ7D.js +0 -2
- package/dist/cli/chunks/chunk-A22RTEJ3.js +0 -62
- package/dist/cli/chunks/chunk-H4XZOIV6.js +0 -2
- package/dist/cli/chunks/chunk-T5L65R23.js +0 -2
- package/dist/cli/chunks/chunk-VRTNRI4H.js +0 -2
- package/dist/cli/chunks/client-ZJQMJO5N.js +0 -2
- package/dist/cli/chunks/codex-installer-HVSZBHH2.js +0 -10
- package/dist/cli/chunks/core-handlers-U2YJLH6O.js +0 -2
- package/dist/cli/chunks/cross-domain-router-E7EMKZEK.js +0 -2
- package/dist/cli/chunks/dream-ZMNQYBJO.js +0 -2
- package/dist/cli/chunks/file-discovery-C42TEUKT.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-2JL4MAJR.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-AZD6O35G.js +0 -2
- package/dist/cli/chunks/hnsw-index-WJLE4S5L.js +0 -2
- package/dist/cli/chunks/hybrid-router-YTKJBAS2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-CX56GZXA.js +0 -2
- package/dist/cli/chunks/init-wizard-WE6HIC66.js +0 -2
- package/dist/cli/chunks/kernel-MT55LNNI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-WN3LQ2W7.js +0 -2
- package/dist/cli/chunks/llm-router-service-NKHEQQMN.js +0 -2
- package/dist/cli/chunks/load-test-3WIQASDF.js +0 -2
- package/dist/cli/chunks/memory-backend-W6YSNT6O.js +0 -2
- package/dist/cli/chunks/pattern-null-store-IV3ZESTR.js +0 -2
- package/dist/cli/chunks/platform-FA5TOPTH.js +0 -2
- package/dist/cli/chunks/protocol-executor-GFAG5G6K.js +0 -2
- package/dist/cli/chunks/provider-manager-TIVIJIYH.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-BYE7YF6Y.js +0 -2
- package/dist/cli/chunks/quality-EGSO2RAX.js +0 -7
- package/dist/cli/chunks/queen-coordinator-WOHYVV7A.js +0 -2
- package/dist/cli/chunks/router-VUW2UVCN.js +0 -2
- package/dist/cli/chunks/routing-feedback-WSUQMZAK.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-RHZCXVN6.js +0 -2
- package/dist/cli/chunks/safe-db-NTWEW7ZM.js +0 -2
- package/dist/cli/chunks/schedule-WEVC2GW2.js +0 -2
- package/dist/cli/chunks/scheduler-XHI5AJIS.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-QZUPKMHP.js +0 -2
- package/dist/cli/chunks/test-BE7EM6Y6.js +0 -33
- package/dist/cli/chunks/unified-memory-QKWUSEBV.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-Z2UQZRTK.js +0 -2
- package/dist/cli/chunks/unified-persistence-AVK2NSMI.js +0 -2
- package/dist/cli/chunks/visual-security-64UFH23G.js +0 -2
- package/dist/cli/chunks/witness-chain-ZIVSDX6C.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-TYP4MI2V.js +0 -2
- package/dist/cli/commands/init.d.ts +0 -19
- package/dist/cli/commands/init.js +0 -318
|
@@ -12,6 +12,7 @@ import chalk from 'chalk';
|
|
|
12
12
|
import { existsSync, readFileSync } from 'node:fs';
|
|
13
13
|
import path from 'node:path';
|
|
14
14
|
import { PLATFORM_REGISTRY, } from '../../init/platform-config-generator.js';
|
|
15
|
+
import { selectCodexSkills } from '../../init/codex-skill-manifest.js';
|
|
15
16
|
import { toErrorMessage } from '../../shared/error-utils.js';
|
|
16
17
|
// ============================================================================
|
|
17
18
|
// Helpers
|
|
@@ -55,7 +56,7 @@ function parseConfigFile(filePath, format) {
|
|
|
55
56
|
return { valid: false, error: toErrorMessage(error) };
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
|
-
function checkAqeEntry(filePath,
|
|
59
|
+
function checkAqeEntry(filePath, _platform) {
|
|
59
60
|
try {
|
|
60
61
|
const content = readFileSync(filePath, 'utf-8');
|
|
61
62
|
return content.includes('agentic-qe');
|
|
@@ -64,6 +65,72 @@ function checkAqeEntry(filePath, platform) {
|
|
|
64
65
|
return false;
|
|
65
66
|
}
|
|
66
67
|
}
|
|
68
|
+
/** Inspect the complete installed surface for a platform without changing it. */
|
|
69
|
+
export function verifyPlatformConfiguration(projectRoot, platformId, options = {}) {
|
|
70
|
+
const platform = PLATFORM_REGISTRY[platformId];
|
|
71
|
+
const checks = [];
|
|
72
|
+
const add = (label, passed, detail) => {
|
|
73
|
+
checks.push({ label, passed, detail });
|
|
74
|
+
};
|
|
75
|
+
const expectMcp = options.expectMcp !== false;
|
|
76
|
+
const configPath = path.join(projectRoot, platform.configPath);
|
|
77
|
+
const configExists = existsSync(configPath);
|
|
78
|
+
if (expectMcp) {
|
|
79
|
+
add('Config file', configExists, configExists ? platform.configPath : `missing: ${platform.configPath}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
add('MCP configuration', true, configExists ? `${platform.configPath} preserved` : 'intentionally disabled');
|
|
83
|
+
}
|
|
84
|
+
if (configExists && expectMcp) {
|
|
85
|
+
const parsed = parseConfigFile(configPath, platform.configFormat);
|
|
86
|
+
add('Config syntax', parsed.valid, parsed.valid
|
|
87
|
+
? `valid ${platform.configFormat.toUpperCase()}`
|
|
88
|
+
: parsed.error || 'invalid configuration');
|
|
89
|
+
add('AQE MCP entry', checkAqeEntry(configPath, platform), 'agentic-qe server entry');
|
|
90
|
+
}
|
|
91
|
+
const rulesPath = path.join(projectRoot, platform.rulesPath);
|
|
92
|
+
const rulesExists = existsSync(rulesPath);
|
|
93
|
+
add('Behavioral rules', rulesExists, rulesExists ? platform.rulesPath : `missing: ${platform.rulesPath}`);
|
|
94
|
+
if (platformId === 'codex' && rulesExists) {
|
|
95
|
+
const rules = readFileSync(rulesPath, 'utf-8');
|
|
96
|
+
add('AQE instructions', rules.includes('Quality Engineering Standards (Agentic QE)'), 'AGENTS.md contains generated AQE guidance');
|
|
97
|
+
}
|
|
98
|
+
if (platformId === 'codex') {
|
|
99
|
+
const hooksPath = path.join(projectRoot, '.codex', 'hooks.json');
|
|
100
|
+
let hookCommands = [];
|
|
101
|
+
let hooksValid = false;
|
|
102
|
+
if (existsSync(hooksPath)) {
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse(readFileSync(hooksPath, 'utf-8'));
|
|
105
|
+
hooksValid = Boolean(parsed.hooks && typeof parsed.hooks === 'object');
|
|
106
|
+
hookCommands = JSON.stringify(parsed).match(/\.codex\/hooks\/[a-z0-9-]+\.cjs/gi) || [];
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
hooksValid = false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
add('Lifecycle hooks', hooksValid, hooksValid ? '.codex/hooks.json is valid' : 'missing or invalid .codex/hooks.json');
|
|
113
|
+
const referencedAdapters = [...new Set(hookCommands.map((command) => command.split('/').pop()))];
|
|
114
|
+
const adaptersPresent = referencedAdapters.length > 0
|
|
115
|
+
&& referencedAdapters.every((file) => existsSync(path.join(projectRoot, '.codex', 'hooks', file)));
|
|
116
|
+
add('Hook adapters', adaptersPresent, referencedAdapters.length > 0 ? `${referencedAdapters.length} referenced adapter(s)` : 'no Codex hook adapters referenced');
|
|
117
|
+
const runtimes = [
|
|
118
|
+
'aqe-runtime.cjs',
|
|
119
|
+
...(referencedAdapters.includes('ruflo-codex-hook.cjs') ? ['ruflo-runtime.cjs'] : []),
|
|
120
|
+
];
|
|
121
|
+
const missingRuntimes = runtimes.filter((file) => !existsSync(path.join(projectRoot, '.codex', 'hooks', file)));
|
|
122
|
+
add('Hook runtimes', missingRuntimes.length === 0, missingRuntimes.length === 0 ? `${runtimes.length} runtime(s) present` : `missing: ${missingRuntimes.join(', ')}`);
|
|
123
|
+
const skillsPath = path.join(projectRoot, '.agents', 'skills');
|
|
124
|
+
const requiredSkills = selectCodexSkills({ includeRuflo: options.expectRuflo === true });
|
|
125
|
+
const missingSkills = requiredSkills
|
|
126
|
+
.filter((skill) => !existsSync(path.join(skillsPath, skill.name, 'SKILL.md')))
|
|
127
|
+
.map((skill) => skill.name);
|
|
128
|
+
add('QE skills', missingSkills.length === 0, missingSkills.length === 0
|
|
129
|
+
? `${requiredSkills.length} required AQE skill(s) present`
|
|
130
|
+
: `missing: ${missingSkills.join(', ')}`);
|
|
131
|
+
}
|
|
132
|
+
return { platform: platformId, passed: checks.every((check) => check.passed), checks };
|
|
133
|
+
}
|
|
67
134
|
// ============================================================================
|
|
68
135
|
// Platform Command
|
|
69
136
|
// ============================================================================
|
|
@@ -107,6 +174,7 @@ export function createPlatformCommand() {
|
|
|
107
174
|
.command('setup <name>')
|
|
108
175
|
.description('Set up a specific platform configuration')
|
|
109
176
|
.option('--overwrite', 'Overwrite existing configuration files')
|
|
177
|
+
.option('--with-ruflo', 'Add optional Ruflo guidance and lifecycle hooks (Codex only)')
|
|
110
178
|
.action(async (name, options) => {
|
|
111
179
|
const projectRoot = process.cwd();
|
|
112
180
|
if (!isValidPlatformId(name)) {
|
|
@@ -154,6 +222,7 @@ export function createPlatformCommand() {
|
|
|
154
222
|
const installer = factory({
|
|
155
223
|
projectRoot,
|
|
156
224
|
overwrite: options.overwrite,
|
|
225
|
+
...(name === 'codex' ? { includeRuflo: options.withRuflo } : {}),
|
|
157
226
|
});
|
|
158
227
|
const result = await installer.install();
|
|
159
228
|
if (result.success) {
|
|
@@ -161,9 +230,17 @@ export function createPlatformCommand() {
|
|
|
161
230
|
if (result.mcpConfigured) {
|
|
162
231
|
console.log(chalk.gray(` MCP config: ${platform.configPath}`));
|
|
163
232
|
}
|
|
164
|
-
if (result.rulesInstalled) {
|
|
233
|
+
if (result.rulesInstalled || result.agentsMdInstalled) {
|
|
165
234
|
console.log(chalk.gray(` Rules: ${platform.rulesPath}`));
|
|
166
235
|
}
|
|
236
|
+
if (name === 'codex') {
|
|
237
|
+
if (result.hooksConfigured)
|
|
238
|
+
console.log(chalk.gray(' Hooks: .codex/hooks.json'));
|
|
239
|
+
console.log(chalk.gray(` QE skills: ${result.skillsInstalled ?? 0} installed`));
|
|
240
|
+
console.log(options.withRuflo
|
|
241
|
+
? chalk.green(' Ruflo integration: enabled')
|
|
242
|
+
: chalk.gray(' Ruflo integration: not installed (opt in with --with-ruflo)'));
|
|
243
|
+
}
|
|
167
244
|
}
|
|
168
245
|
else {
|
|
169
246
|
console.log(chalk.red(` ${platform.name} setup failed`));
|
|
@@ -183,7 +260,9 @@ export function createPlatformCommand() {
|
|
|
183
260
|
platformCmd
|
|
184
261
|
.command('verify <name>')
|
|
185
262
|
.description('Verify a platform configuration is correct')
|
|
186
|
-
.
|
|
263
|
+
.option('--no-mcp', 'Verify a deliberately MCP-free platform installation')
|
|
264
|
+
.option('--with-ruflo', 'Require optional Ruflo guidance and lifecycle hooks (Codex only)')
|
|
265
|
+
.action(async (name, options) => {
|
|
187
266
|
const projectRoot = process.cwd();
|
|
188
267
|
if (!isValidPlatformId(name)) {
|
|
189
268
|
console.log('');
|
|
@@ -197,51 +276,22 @@ export function createPlatformCommand() {
|
|
|
197
276
|
console.log(chalk.bold.blue(` Verifying ${platform.name}`));
|
|
198
277
|
console.log(chalk.gray(' ─────────────────────────────────'));
|
|
199
278
|
console.log('');
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
console.log(chalk.red(` [fail] Config file missing: ${platform.configPath}`));
|
|
208
|
-
allPassed = false;
|
|
209
|
-
}
|
|
210
|
-
// Check 2: Config file is valid
|
|
211
|
-
if (existsSync(configPath)) {
|
|
212
|
-
const parseResult = parseConfigFile(configPath, platform.configFormat);
|
|
213
|
-
if (parseResult.valid) {
|
|
214
|
-
console.log(chalk.green(` [pass] Config file is valid ${platform.configFormat.toUpperCase()}`));
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
console.log(chalk.red(` [fail] Config file is invalid: ${parseResult.error}`));
|
|
218
|
-
allPassed = false;
|
|
219
|
-
}
|
|
220
|
-
// Check 3: Config contains agentic-qe entry
|
|
221
|
-
if (checkAqeEntry(configPath, platform)) {
|
|
222
|
-
console.log(chalk.green(' [pass] Config contains agentic-qe entry'));
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
console.log(chalk.red(' [fail] Config does not contain agentic-qe entry'));
|
|
226
|
-
allPassed = false;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// Check 4: Rules file exists
|
|
230
|
-
const rulesPath = path.join(projectRoot, platform.rulesPath);
|
|
231
|
-
if (existsSync(rulesPath)) {
|
|
232
|
-
console.log(chalk.green(` [pass] Rules file exists: ${platform.rulesPath}`));
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
console.log(chalk.red(` [fail] Rules file missing: ${platform.rulesPath}`));
|
|
236
|
-
allPassed = false;
|
|
279
|
+
const verification = verifyPlatformConfiguration(projectRoot, name, {
|
|
280
|
+
expectMcp: options.mcp !== false,
|
|
281
|
+
expectRuflo: options.withRuflo,
|
|
282
|
+
});
|
|
283
|
+
for (const check of verification.checks) {
|
|
284
|
+
const message = ` [${check.passed ? 'pass' : 'fail'}] ${check.label}: ${check.detail}`;
|
|
285
|
+
console.log(check.passed ? chalk.green(message) : chalk.red(message));
|
|
237
286
|
}
|
|
238
287
|
console.log('');
|
|
239
|
-
if (
|
|
288
|
+
if (verification.passed) {
|
|
240
289
|
console.log(chalk.green(` ${platform.name} configuration is valid`));
|
|
241
290
|
}
|
|
242
291
|
else {
|
|
243
292
|
console.log(chalk.yellow(` ${platform.name} configuration has issues`));
|
|
244
293
|
console.log(chalk.gray(` Run "aqe platform setup ${name}" to fix`));
|
|
294
|
+
process.exitCode = 1;
|
|
245
295
|
}
|
|
246
296
|
console.log('');
|
|
247
297
|
});
|
|
@@ -5,6 +5,18 @@
|
|
|
5
5
|
* Supports --format and --output for CI/CD pipeline integration.
|
|
6
6
|
*/
|
|
7
7
|
import { Command } from 'commander';
|
|
8
|
+
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
8
9
|
import type { CLIContext } from '../handlers/interfaces.js';
|
|
10
|
+
import { type QualityGateResult } from '../utils/ci-output.js';
|
|
11
|
+
import { type QualityEvidenceValues } from '../../domains/quality-assessment/quality-evidence.js';
|
|
12
|
+
export declare function loadQualityEvidence(memory: MemoryBackend): Promise<QualityEvidenceValues>;
|
|
13
|
+
export declare function evaluateMeasuredQualityEvidence(measured: QualityEvidenceValues): QualityGateResult;
|
|
14
|
+
/**
|
|
15
|
+
* Published quality command exit contract:
|
|
16
|
+
* 0 = passed with more than five percentage points of headroom
|
|
17
|
+
* 1 = one or more measured checks failed
|
|
18
|
+
* 2 = passed, but at least one measured check has less than five points of headroom
|
|
19
|
+
*/
|
|
20
|
+
export declare function getMeasuredQualityExitCode(result: QualityGateResult): 0 | 1 | 2;
|
|
9
21
|
export declare function createQualityCommand(context: CLIContext, cleanupAndExit: (code: number) => Promise<never>, ensureInitialized: () => Promise<boolean>): Command;
|
|
10
22
|
//# sourceMappingURL=quality.d.ts.map
|
|
@@ -7,6 +7,35 @@
|
|
|
7
7
|
import { Command } from 'commander';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import { writeOutput, toJSON, qualityGateToMarkdown } from '../utils/ci-output.js';
|
|
10
|
+
import { evaluateQualityEvidence, loadQualityEvidence as loadCanonicalQualityEvidence, } from '../../domains/quality-assessment/quality-evidence.js';
|
|
11
|
+
export async function loadQualityEvidence(memory) {
|
|
12
|
+
return loadCanonicalQualityEvidence(memory);
|
|
13
|
+
}
|
|
14
|
+
export function evaluateMeasuredQualityEvidence(measured) {
|
|
15
|
+
const evaluation = evaluateQualityEvidence(measured);
|
|
16
|
+
return {
|
|
17
|
+
passed: evaluation.passed,
|
|
18
|
+
score: 'N/A',
|
|
19
|
+
checks: evaluation.checks,
|
|
20
|
+
recommendations: evaluation.recommendations,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Published quality command exit contract:
|
|
25
|
+
* 0 = passed with more than five percentage points of headroom
|
|
26
|
+
* 1 = one or more measured checks failed
|
|
27
|
+
* 2 = passed, but at least one measured check has less than five points of headroom
|
|
28
|
+
*/
|
|
29
|
+
export function getMeasuredQualityExitCode(result) {
|
|
30
|
+
if (!result.passed)
|
|
31
|
+
return 1;
|
|
32
|
+
return result.checks.some(check => (check.direction !== 'max'
|
|
33
|
+
&&
|
|
34
|
+
typeof check.value === 'number'
|
|
35
|
+
&& typeof check.threshold === 'number'
|
|
36
|
+
&& check.value >= check.threshold
|
|
37
|
+
&& check.value < check.threshold + 5)) ? 2 : 0;
|
|
38
|
+
}
|
|
10
39
|
export function createQualityCommand(context, cleanupAndExit, ensureInitialized) {
|
|
11
40
|
const qualityCmd = new Command('quality')
|
|
12
41
|
.description('Quality assessment shortcut')
|
|
@@ -24,85 +53,32 @@ export function createQualityCommand(context, cleanupAndExit, ensureInitialized)
|
|
|
24
53
|
if (format === 'text') {
|
|
25
54
|
console.log(chalk.blue(`\n Running quality gate evaluation...\n`));
|
|
26
55
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
56
|
+
const measured = await loadQualityEvidence(context.kernel.memory);
|
|
57
|
+
const gateResult = evaluateMeasuredQualityEvidence(measured);
|
|
58
|
+
if (format === 'json') {
|
|
59
|
+
writeOutput(toJSON(gateResult), options.output);
|
|
31
60
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const defaultThresholds = {
|
|
44
|
-
coverage: { min: 80 },
|
|
45
|
-
testsPassing: { min: 95 },
|
|
46
|
-
criticalBugs: { max: 0 },
|
|
47
|
-
codeSmells: { max: 20 },
|
|
48
|
-
securityVulnerabilities: { max: 0 },
|
|
49
|
-
technicalDebt: { max: 5 },
|
|
50
|
-
duplications: { max: 5 },
|
|
51
|
-
};
|
|
52
|
-
const result = await qualityAPI.evaluateGate({
|
|
53
|
-
gateName: 'standard',
|
|
54
|
-
metrics: defaultMetrics,
|
|
55
|
-
thresholds: defaultThresholds,
|
|
56
|
-
});
|
|
57
|
-
if (result.success && result.value) {
|
|
58
|
-
const assessment = result.value;
|
|
59
|
-
const gateResult = {
|
|
60
|
-
passed: assessment.passed ?? assessment.meetsThreshold ?? true,
|
|
61
|
-
score: assessment.score ?? assessment.grade ?? 'N/A',
|
|
62
|
-
checks: assessment.checks || [],
|
|
63
|
-
recommendations: assessment.recommendations || [],
|
|
64
|
-
};
|
|
65
|
-
if (format === 'json') {
|
|
66
|
-
writeOutput(toJSON(gateResult), options.output);
|
|
67
|
-
}
|
|
68
|
-
else if (format === 'markdown') {
|
|
69
|
-
writeOutput(qualityGateToMarkdown(gateResult), options.output);
|
|
61
|
+
else if (format === 'markdown') {
|
|
62
|
+
writeOutput(qualityGateToMarkdown(gateResult), options.output);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const statusIcon = gateResult.passed ? chalk.green('✓ PASSED') : chalk.red('✗ FAILED');
|
|
66
|
+
console.log(` Quality Gate: ${statusIcon}`);
|
|
67
|
+
console.log(` Score: ${chalk.cyan(gateResult.score)}\n`);
|
|
68
|
+
console.log(chalk.cyan(' Checks:'));
|
|
69
|
+
for (const check of gateResult.checks) {
|
|
70
|
+
const icon = check.passed ? chalk.green('✓') : chalk.red('✗');
|
|
71
|
+
console.log(` ${icon} ${check.name}: ${check.value} (threshold: ${check.threshold})`);
|
|
70
72
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
console.log(` Score: ${chalk.cyan(gateResult.score)}\n`);
|
|
76
|
-
if (gateResult.checks.length > 0) {
|
|
77
|
-
console.log(chalk.cyan(' Checks:'));
|
|
78
|
-
for (const check of gateResult.checks) {
|
|
79
|
-
const icon = check.passed ? chalk.green('✓') : chalk.red('✗');
|
|
80
|
-
console.log(` ${icon} ${check.name}: ${check.value} (threshold: ${check.threshold})`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if (gateResult.recommendations && gateResult.recommendations.length > 0) {
|
|
84
|
-
console.log(chalk.cyan('\n Recommendations:'));
|
|
85
|
-
for (const rec of gateResult.recommendations) {
|
|
86
|
-
console.log(chalk.gray(` - ${rec}`));
|
|
87
|
-
}
|
|
73
|
+
if (gateResult.recommendations && gateResult.recommendations.length > 0) {
|
|
74
|
+
console.log(chalk.cyan('\n Recommendations:'));
|
|
75
|
+
for (const rec of gateResult.recommendations) {
|
|
76
|
+
console.log(chalk.gray(` - ${rec}`));
|
|
88
77
|
}
|
|
89
|
-
console.log('');
|
|
90
|
-
}
|
|
91
|
-
// Exit codes: 1 = gate failed, 2 = warning (score within 5% of threshold), 0 = passed
|
|
92
|
-
if (!gateResult.passed) {
|
|
93
|
-
await cleanupAndExit(1);
|
|
94
78
|
}
|
|
95
|
-
|
|
96
|
-
if (!isNaN(scoreNum) && scoreNum < 100 && scoreNum >= 95) {
|
|
97
|
-
// Score is within 5% of perfect — warn
|
|
98
|
-
await cleanupAndExit(2);
|
|
99
|
-
}
|
|
100
|
-
await cleanupAndExit(0);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
console.log(chalk.red(`Quality gate failed: ${result.error?.message || 'Unknown error'}`));
|
|
104
|
-
await cleanupAndExit(1);
|
|
79
|
+
console.log('');
|
|
105
80
|
}
|
|
81
|
+
await cleanupAndExit(getMeasuredQualityExitCode(gateResult));
|
|
106
82
|
}
|
|
107
83
|
}
|
|
108
84
|
catch (error) {
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
7
|
import chalk from 'chalk';
|
|
8
|
-
import { walkSourceFiles } from '../utils/file-discovery.js';
|
|
8
|
+
import { filterTestFilesForFramework, walkSourceFiles } from '../utils/file-discovery.js';
|
|
9
9
|
import { writeOutput, toJSON, toJUnit, testRunToMarkdown } from '../utils/ci-output.js';
|
|
10
|
+
import { writeQualityEvidence } from '../../domains/quality-assessment/quality-evidence.js';
|
|
10
11
|
export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
11
12
|
const testCmd = new Command('test')
|
|
12
13
|
.description('Test generation, execution, scheduling, and load testing')
|
|
@@ -52,6 +53,20 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
52
53
|
if (result.success && result.value) {
|
|
53
54
|
const generated = result.value;
|
|
54
55
|
const format = options.format;
|
|
56
|
+
const rejected = generated.tests.filter(test => test.qualityGateResult?.passed !== true);
|
|
57
|
+
if (rejected.length > 0) {
|
|
58
|
+
const details = rejected.map(test => {
|
|
59
|
+
const issues = test.qualityGateResult?.issues
|
|
60
|
+
?.map(issue => issue.description)
|
|
61
|
+
.filter(Boolean)
|
|
62
|
+
.join('; ') || 'missing passing quality evidence';
|
|
63
|
+
return `${test.sourceFile}: ${issues}`;
|
|
64
|
+
});
|
|
65
|
+
console.error(chalk.red(`Generation rejected ${rejected.length} invalid or unvalidated test artifact(s):`));
|
|
66
|
+
for (const detail of details)
|
|
67
|
+
console.error(chalk.red(` - ${detail}`));
|
|
68
|
+
await cleanupAndExit(1);
|
|
69
|
+
}
|
|
55
70
|
if (format === 'json') {
|
|
56
71
|
writeOutput(toJSON(generated), options.output);
|
|
57
72
|
}
|
|
@@ -105,7 +120,8 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
105
120
|
const path = await import('path');
|
|
106
121
|
const targetPath = path.resolve(target || '.');
|
|
107
122
|
// Fix #280: Use shared file discovery supporting all languages
|
|
108
|
-
const
|
|
123
|
+
const discoveredTestFiles = walkSourceFiles(targetPath, { testsOnly: true });
|
|
124
|
+
const testFiles = filterTestFilesForFramework(discoveredTestFiles, options.framework);
|
|
109
125
|
if (testFiles.length === 0) {
|
|
110
126
|
console.log(chalk.yellow('No test files found'));
|
|
111
127
|
return;
|
|
@@ -113,12 +129,27 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
113
129
|
console.log(chalk.gray(` Found ${testFiles.length} test files\n`));
|
|
114
130
|
const result = await testExecAPI.runTests({
|
|
115
131
|
testFiles,
|
|
132
|
+
framework: options.framework,
|
|
116
133
|
parallel: true,
|
|
117
134
|
retryCount: 2,
|
|
118
135
|
});
|
|
119
136
|
if (result.success && result.value) {
|
|
120
137
|
const run = result.value;
|
|
121
138
|
const format = options.format;
|
|
139
|
+
const total = run.passed + run.failed + run.skipped;
|
|
140
|
+
await context.kernel.memory.set('test-run:latest', {
|
|
141
|
+
passed: run.passed,
|
|
142
|
+
failed: run.failed,
|
|
143
|
+
skipped: run.skipped,
|
|
144
|
+
duration: run.duration,
|
|
145
|
+
measuredAt: new Date().toISOString(),
|
|
146
|
+
}, { namespace: 'test-execution', persist: true });
|
|
147
|
+
await writeQualityEvidence(context.kernel.memory, {
|
|
148
|
+
testsPassing: total > 0 ? (run.passed / total) * 100 : 0,
|
|
149
|
+
}, {
|
|
150
|
+
measuredAt: new Date().toISOString(),
|
|
151
|
+
source: 'aqe test execute',
|
|
152
|
+
});
|
|
122
153
|
if (format === 'json') {
|
|
123
154
|
writeOutput(toJSON(run), options.output);
|
|
124
155
|
}
|
|
@@ -130,7 +161,6 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
130
161
|
}
|
|
131
162
|
else {
|
|
132
163
|
// Default text output
|
|
133
|
-
const total = run.passed + run.failed + run.skipped;
|
|
134
164
|
console.log(chalk.green(`Test run complete`));
|
|
135
165
|
console.log(`\n Results:`);
|
|
136
166
|
console.log(` Total: ${chalk.white(total)}`);
|
|
@@ -143,7 +173,6 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
143
173
|
if (run.failed > 0) {
|
|
144
174
|
await cleanupAndExit(1);
|
|
145
175
|
}
|
|
146
|
-
const total = run.passed + run.failed + run.skipped;
|
|
147
176
|
if (total > 0 && run.skipped / total > 0.2) {
|
|
148
177
|
await cleanupAndExit(2);
|
|
149
178
|
}
|
|
@@ -93,6 +93,7 @@ interface InitOptions {
|
|
|
93
93
|
withKilocode?: boolean;
|
|
94
94
|
withRoocode?: boolean;
|
|
95
95
|
withCodex?: boolean;
|
|
96
|
+
withRuflo?: boolean;
|
|
96
97
|
withWindsurf?: boolean;
|
|
97
98
|
withContinuedev?: boolean;
|
|
98
99
|
withAllPlatforms?: boolean;
|
|
@@ -103,6 +104,8 @@ interface InitOptions {
|
|
|
103
104
|
noGovernance?: boolean;
|
|
104
105
|
/** commander negatable flag: `--no-claude` sets this to false (#532). */
|
|
105
106
|
claude?: boolean;
|
|
107
|
+
/** commander negatable flag: `--no-statusline` sets this to false (#591). */
|
|
108
|
+
statusline?: boolean;
|
|
106
109
|
modular?: boolean;
|
|
107
110
|
}
|
|
108
111
|
export declare function createInitHandler(cleanupAndExit: (code: number) => Promise<never>): InitHandler;
|
|
@@ -31,6 +31,7 @@ export class InitHandler {
|
|
|
31
31
|
.option('-m, --max-agents <number>', 'Maximum concurrent agents', '15')
|
|
32
32
|
.option('--memory <backend>', 'Memory backend (sqlite|agentdb|hybrid|memory). "memory" = database-free, in-memory only.', 'hybrid')
|
|
33
33
|
.option('--no-database', 'Database-free install: alias for `--memory memory`. Skips the SQLite database phase and runs any MCP server in-memory — nothing is written to .agentic-qe/.')
|
|
34
|
+
.option('--no-statusline', 'Do not install AQE\'s Claude Code status line; remove an existing AQE-owned status line while preserving custom ones')
|
|
34
35
|
.option('--lazy', 'Enable lazy loading of domains')
|
|
35
36
|
.option('--wizard', 'Run interactive setup wizard')
|
|
36
37
|
.option('--auto', 'Auto-configure based on project analysis')
|
|
@@ -48,6 +49,7 @@ export class InitHandler {
|
|
|
48
49
|
.option('--with-kilocode', 'Include Kilo Code MCP config and custom QE mode')
|
|
49
50
|
.option('--with-roocode', 'Include Roo Code MCP config and custom QE mode')
|
|
50
51
|
.option('--with-codex', 'Include OpenAI Codex CLI MCP, AGENTS.md, hooks, and QE skills')
|
|
52
|
+
.option('--with-ruflo', 'Add optional Ruflo guidance and lifecycle hooks to the Codex setup')
|
|
51
53
|
.option('--with-windsurf', 'Include Windsurf MCP config and rules')
|
|
52
54
|
.option('--with-continuedev', 'Include Continue.dev MCP config and rules')
|
|
53
55
|
.option('--no-mcp', 'Skip MCP server config (MCP is enabled by default)')
|
|
@@ -121,7 +123,8 @@ export class InitHandler {
|
|
|
121
123
|
// silently falls through to runStandardInit and installs the full Claude
|
|
122
124
|
// surface it was meant to suppress.
|
|
123
125
|
const noClaudeRequested = options.claude === false;
|
|
124
|
-
|
|
126
|
+
const noStatusLineRequested = options.statusline === false;
|
|
127
|
+
if (options.modular || platformRequested || databaseFree || noClaudeRequested || noStatusLineRequested) {
|
|
125
128
|
console.log(chalk.blue('\n Agentic QE v3 Initialization\n'));
|
|
126
129
|
await this.runModularInit(options, context);
|
|
127
130
|
return;
|
|
@@ -177,11 +180,13 @@ export class InitHandler {
|
|
|
177
180
|
withKiloCode: options.withKilocode,
|
|
178
181
|
withRooCode: options.withRoocode,
|
|
179
182
|
withCodex: options.withCodex,
|
|
183
|
+
withRuflo: options.withRuflo,
|
|
180
184
|
withWindsurf: options.withWindsurf,
|
|
181
185
|
withContinueDev: options.withContinuedev,
|
|
182
186
|
noMcp: options.noMcp && !options.withMcp,
|
|
183
187
|
noGovernance: options.noGovernance,
|
|
184
188
|
noClaude,
|
|
189
|
+
noStatusLine: options.statusline === false,
|
|
185
190
|
memoryBackend: memoryOnly ? 'memory' : undefined,
|
|
186
191
|
});
|
|
187
192
|
console.log(chalk.white(' Analyzing project...\n'));
|
|
@@ -440,7 +445,9 @@ Options:
|
|
|
440
445
|
--minimal Minimal configuration (skip optional features)
|
|
441
446
|
--skip-patterns Skip loading pre-trained patterns
|
|
442
447
|
--with-n8n Install n8n workflow testing agents and skills
|
|
443
|
-
--with-opencode Include OpenCode agent/skill provisioning
|
|
448
|
+
--with-opencode Include OpenCode agent/skill provisioning
|
|
449
|
+
--with-codex Include OpenAI Codex hooks, instructions, skills, and MCP
|
|
450
|
+
--with-ruflo Opt into Ruflo guidance and lifecycle hooks for Codex
|
|
444
451
|
--auto-migrate Automatically migrate from v2 if detected
|
|
445
452
|
--with-claude-flow Force Claude Flow integration setup
|
|
446
453
|
--skip-claude-flow Skip Claude Flow integration
|
|
@@ -461,8 +468,10 @@ Governance:
|
|
|
461
468
|
Use --no-governance to skip, or set GOVERNANCE_*=false env vars for
|
|
462
469
|
fine-grained control over individual gates (ContinueGate, MemoryWriteGate, etc.)
|
|
463
470
|
|
|
464
|
-
Examples:
|
|
465
|
-
aqe init --auto # Auto-configure based on project (keeps existing skills)
|
|
471
|
+
Examples:
|
|
472
|
+
aqe init --auto # Auto-configure based on project (keeps existing skills)
|
|
473
|
+
aqe init --auto --with-codex --with-ruflo
|
|
474
|
+
# Codex plus optional Ruflo coordination
|
|
466
475
|
aqe init --auto --upgrade # Auto-configure AND update all skills/agents
|
|
467
476
|
aqe init --upgrade # Upgrade existing installation
|
|
468
477
|
aqe init --wizard # Run interactive wizard
|
|
@@ -25,4 +25,5 @@ export interface WalkOptions {
|
|
|
25
25
|
* @returns Array of absolute file paths
|
|
26
26
|
*/
|
|
27
27
|
export declare function walkSourceFiles(targetPath: string, options?: WalkOptions): string[];
|
|
28
|
+
export declare function filterTestFilesForFramework(testFiles: string[], framework: string): string[];
|
|
28
29
|
//# sourceMappingURL=file-discovery.d.ts.map
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Fixes #280: CLI commands previously only found .ts files.
|
|
8
8
|
*/
|
|
9
|
-
import { existsSync, readdirSync, statSync } from 'fs';
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
10
10
|
import { join, extname } from 'path';
|
|
11
11
|
// ============================================================================
|
|
12
12
|
// Source File Extensions by Language
|
|
@@ -102,4 +102,16 @@ export function walkSourceFiles(targetPath, options = {}) {
|
|
|
102
102
|
walk(targetPath, 0);
|
|
103
103
|
return result;
|
|
104
104
|
}
|
|
105
|
+
export function filterTestFilesForFramework(testFiles, framework) {
|
|
106
|
+
if (framework !== 'node' && framework !== 'node-test')
|
|
107
|
+
return testFiles;
|
|
108
|
+
return testFiles.filter(file => {
|
|
109
|
+
try {
|
|
110
|
+
return !/@playwright\/test|require\(\s*['"]playwright['"]\s*\)/.test(readFileSync(file, 'utf8'));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
105
117
|
//# sourceMappingURL=file-discovery.js.map
|
|
@@ -8,6 +8,7 @@ import { LoggerFactory } from '../../../logging/index.js';
|
|
|
8
8
|
import { ok, err } from '../../../shared/types';
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
|
+
import { writeQualityEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
11
12
|
const DEFAULT_CONFIG = {
|
|
12
13
|
defaultThreshold: 80,
|
|
13
14
|
enableLLMAnalysis: true, // On by default - opt-out
|
|
@@ -451,6 +452,10 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
451
452
|
}
|
|
452
453
|
// Store latest snapshot
|
|
453
454
|
await this.memory.set('coverage:latest', summary, { persist: true });
|
|
455
|
+
await writeQualityEvidence(this.memory, { coverage: summary.line }, {
|
|
456
|
+
measuredAt: new Date().toISOString(),
|
|
457
|
+
source: 'coverage-analysis',
|
|
458
|
+
});
|
|
454
459
|
// Store historical snapshot
|
|
455
460
|
const timestamp = Date.now();
|
|
456
461
|
await this.memory.set(`coverage:history:${timestamp}`, summary, {
|
|
@@ -9,6 +9,7 @@ export { QualityAssessmentCoordinator, type IQualityAssessmentCoordinator, type
|
|
|
9
9
|
export { QualityGateService, type IQualityGateService, type QualityGateConfig, } from './services/quality-gate';
|
|
10
10
|
export { QualityAnalyzerService, type IQualityAnalyzerService, type QualityAnalyzerConfig, } from './services/quality-analyzer';
|
|
11
11
|
export { DeploymentAdvisorService, type IDeploymentAdvisorService, type DeploymentAdvisorConfig, type DeploymentAccuracy, } from './services/deployment-advisor';
|
|
12
|
+
export { DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS, DEFAULT_QUALITY_THRESHOLDS, QUALITY_EVIDENCE_NAMESPACE, QUALITY_METRICS, evaluateQualityEvidence, loadQualityEvidence, writeQualityEvidence, type EvaluatedQualityCheck, type QualityEvidenceRecord, type QualityEvidenceValues, type QualityMetricName, type QualityThreshold, } from './quality-evidence.js';
|
|
12
13
|
export { CoherenceGateService, createCoherenceGateService, type CoherenceGateResult, type CoherenceGateServiceConfig, } from './services/coherence-gate';
|
|
13
14
|
export * from './coherence';
|
|
14
15
|
export type { QualityAssessmentAPI, GateEvaluationRequest, QualityAnalysisRequest, DeploymentRequest, ComplexityRequest, GateResult, GateCheck, QualityReport, QualityMetricDetail, QualityTrend, Recommendation, DeploymentAdvice, ComplexityReport, FileComplexity, ComplexitySummary, ComplexityHotspot, QualityMetrics, GateThresholds, } from './interfaces';
|
|
@@ -18,6 +18,7 @@ export { QualityAssessmentCoordinator, } from './coordinator';
|
|
|
18
18
|
export { QualityGateService, } from './services/quality-gate';
|
|
19
19
|
export { QualityAnalyzerService, } from './services/quality-analyzer';
|
|
20
20
|
export { DeploymentAdvisorService, } from './services/deployment-advisor';
|
|
21
|
+
export { DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS, DEFAULT_QUALITY_THRESHOLDS, QUALITY_EVIDENCE_NAMESPACE, QUALITY_METRICS, evaluateQualityEvidence, loadQualityEvidence, writeQualityEvidence, } from './quality-evidence.js';
|
|
21
22
|
// ============================================================================
|
|
22
23
|
// Coherence-Gated Quality Gates (ADR-030)
|
|
23
24
|
// ============================================================================
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
2
|
+
export declare const QUALITY_EVIDENCE_NAMESPACE = "quality-assessment";
|
|
3
|
+
export declare const DEFAULT_QUALITY_EVIDENCE_MAX_AGE_MS: number;
|
|
4
|
+
export declare const QUALITY_METRICS: readonly ["coverage", "testsPassing", "criticalBugs", "codeSmells", "securityVulnerabilities", "technicalDebt", "duplications"];
|
|
5
|
+
export type QualityMetricName = typeof QUALITY_METRICS[number];
|
|
6
|
+
export type QualityEvidenceValues = Record<QualityMetricName, number>;
|
|
7
|
+
export interface QualityEvidenceRecord {
|
|
8
|
+
schemaVersion: 1;
|
|
9
|
+
metric: QualityMetricName;
|
|
10
|
+
value: number;
|
|
11
|
+
measuredAt: string;
|
|
12
|
+
source: string;
|
|
13
|
+
}
|
|
14
|
+
export interface QualityThreshold {
|
|
15
|
+
direction: 'min' | 'max';
|
|
16
|
+
value: number;
|
|
17
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
18
|
+
}
|
|
19
|
+
export declare const DEFAULT_QUALITY_THRESHOLDS: Record<QualityMetricName, QualityThreshold>;
|
|
20
|
+
export interface EvaluatedQualityCheck {
|
|
21
|
+
name: QualityMetricName;
|
|
22
|
+
passed: boolean;
|
|
23
|
+
value: number;
|
|
24
|
+
threshold: number;
|
|
25
|
+
direction: 'min' | 'max';
|
|
26
|
+
severity: QualityThreshold['severity'];
|
|
27
|
+
}
|
|
28
|
+
export declare function writeQualityEvidence(memory: MemoryBackend, values: Partial<QualityEvidenceValues>, metadata: {
|
|
29
|
+
measuredAt: string;
|
|
30
|
+
source: string;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
export declare function loadQualityEvidence(memory: MemoryBackend, options?: {
|
|
33
|
+
now?: number;
|
|
34
|
+
maxAgeMs?: number;
|
|
35
|
+
}): Promise<QualityEvidenceValues>;
|
|
36
|
+
export declare function evaluateQualityEvidence(values: QualityEvidenceValues): {
|
|
37
|
+
passed: boolean;
|
|
38
|
+
checks: EvaluatedQualityCheck[];
|
|
39
|
+
recommendations: string[];
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=quality-evidence.d.ts.map
|