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.
Files changed (414) hide show
  1. package/.agents/skills/aqe-plan-work/SKILL.md +31 -0
  2. package/.agents/skills/aqe-plan-work/agents/openai.yaml +4 -0
  3. package/.agents/skills/aqe-plan-work/references/planning-framework.md +39 -0
  4. package/.agents/skills/aqe-research/SKILL.md +31 -0
  5. package/.agents/skills/aqe-research/agents/openai.yaml +4 -0
  6. package/.agents/skills/aqe-research/references/evidence-rules.md +21 -0
  7. package/.agents/skills/aqe-ruflo/SKILL.md +29 -0
  8. package/.claude/commands/pair/README.md +261 -0
  9. package/.claude/commands/pair/commands.md +546 -0
  10. package/.claude/commands/pair/config.md +510 -0
  11. package/.claude/commands/pair/examples.md +512 -0
  12. package/.claude/commands/pair/modes.md +348 -0
  13. package/.claude/commands/pair/session.md +407 -0
  14. package/.claude/commands/pair/start.md +209 -0
  15. package/.claude/commands/stream-chain/pipeline.md +121 -0
  16. package/.claude/commands/stream-chain/run.md +70 -0
  17. package/.claude/commands/training/README.md +9 -0
  18. package/.claude/commands/training/model-update.md +25 -0
  19. package/.claude/commands/training/neural-patterns.md +108 -0
  20. package/.claude/commands/training/neural-train.md +75 -0
  21. package/.claude/commands/training/pattern-learn.md +25 -0
  22. package/.claude/commands/training/specialization.md +63 -0
  23. package/.claude/commands/truth/start.md +143 -0
  24. package/.claude/commands/verify/check.md +50 -0
  25. package/.claude/commands/verify/start.md +128 -0
  26. package/.claude/helpers/.helpers-version +1 -1
  27. package/.claude/helpers/auto-memory-hook.mjs +430 -430
  28. package/.claude/helpers/helpers.manifest.json +6 -6
  29. package/.claude/helpers/hook-handler.cjs +565 -565
  30. package/.claude/helpers/intelligence.cjs +1058 -1058
  31. package/.claude/helpers/statusline.cjs +1022 -968
  32. package/.claude/helpers/v3/advisor-call.cjs +283 -0
  33. package/.claude/skills/README.md +54 -64
  34. package/.claude/skills/dual-mode/README.md +71 -0
  35. package/.claude/skills/dual-mode/dual-collect.md +103 -0
  36. package/.claude/skills/dual-mode/dual-coordinate.md +85 -0
  37. package/.claude/skills/dual-mode/dual-spawn.md +81 -0
  38. package/.claude/skills/skills-manifest.json +1 -1
  39. package/.codex/hooks/aqe-codex-hook.cjs +34 -9
  40. package/.codex/hooks.json +9 -9
  41. package/CHANGELOG.md +90 -0
  42. package/assets/skills/skills-manifest.json +1 -1
  43. package/dist/cli/bundle.js +5 -5
  44. package/dist/cli/chunks/adapter-QGJAFSG5.js +2 -0
  45. package/dist/cli/chunks/{agent-booster-wasm-YIGGREZN.js → agent-booster-wasm-XDKGG2GP.js} +2 -2
  46. package/dist/cli/chunks/{agent-handler-64O7R55A.js → agent-handler-CTPXGR5P.js} +2 -2
  47. package/dist/cli/chunks/{agent-memory-branch-2ZZBYUP3.js → agent-memory-branch-MG5OV7AY.js} +2 -2
  48. package/dist/cli/chunks/aqe-learning-engine-ZU735SG7.js +2 -0
  49. package/dist/cli/chunks/{arena-PF5WL2WM.js → arena-FAHVOHNG.js} +2 -2
  50. package/dist/cli/chunks/{arena-6YRNQNCX.js → arena-NYO4EUNQ.js} +4 -4
  51. package/dist/cli/chunks/{audit-R53FOYCK.js → audit-6544RL5D.js} +3 -3
  52. package/dist/cli/chunks/base-EKTX2PRE.js +2 -0
  53. package/dist/cli/chunks/{hnswlib-node-QOULNHXS.js → better-sqlite3-MTEONNCQ.js} +2 -2
  54. package/dist/cli/chunks/{brain-handler-J4ICUOUX.js → brain-handler-DPKCUQUC.js} +3 -3
  55. package/dist/cli/chunks/{branch-enumerator-YVPD43TG.js → branch-enumerator-SU2KHC2C.js} +2 -2
  56. package/dist/cli/chunks/{browser-TKVHX53S.js → browser-ITDN72YJ.js} +2 -2
  57. package/dist/cli/chunks/browser-workflow-BUPIMI3E.js +2 -0
  58. package/dist/cli/chunks/{chunk-ORXDKBZC.js → chunk-23AO43XW.js} +1 -1
  59. package/dist/cli/chunks/{chunk-3NML6POU.js → chunk-2CF3XZAS.js} +2 -2
  60. package/dist/cli/chunks/{chunk-5IVOY76M.js → chunk-2KPGJ4LO.js} +2 -2
  61. package/dist/cli/chunks/{chunk-SJWTNKPY.js → chunk-2QI3OJAC.js} +3 -3
  62. package/dist/cli/chunks/{chunk-MYR6CBXC.js → chunk-2RZ2S6YR.js} +2 -2
  63. package/dist/cli/chunks/{chunk-VKUH57JE.js → chunk-2XZWYKXQ.js} +1 -1
  64. package/dist/cli/chunks/{chunk-ZU3XUBDQ.js → chunk-3EWWP3AO.js} +1 -1
  65. package/dist/cli/chunks/{chunk-4Z2AKQP4.js → chunk-3XKCC7LE.js} +1 -1
  66. package/dist/cli/chunks/chunk-42KQE5H6.js +12 -0
  67. package/dist/cli/chunks/{chunk-2MLPO3RZ.js → chunk-43BXSNKU.js} +2 -2
  68. package/dist/cli/chunks/{chunk-UOJ26GXD.js → chunk-4E2NA2GY.js} +2 -2
  69. package/dist/cli/chunks/{chunk-66KIIH6V.js → chunk-4Z7JP7CD.js} +2 -2
  70. package/dist/cli/chunks/{chunk-3J2QITXC.js → chunk-54C3OHES.js} +1 -1
  71. package/dist/cli/chunks/{chunk-5A5EC5RD.js → chunk-557BFPDB.js} +2 -2
  72. package/dist/cli/chunks/{chunk-JG267MVB.js → chunk-5I5KMIFY.js} +2 -2
  73. package/dist/cli/chunks/{chunk-IRX2THND.js → chunk-5YIGAWBO.js} +2 -2
  74. package/dist/cli/chunks/{chunk-PHGOMAIS.js → chunk-64GTU5LR.js} +2 -2
  75. package/dist/cli/chunks/{chunk-HJNFXYX4.js → chunk-6BEMH5K5.js} +1 -1
  76. package/dist/cli/chunks/{chunk-AJ45QR3K.js → chunk-6H3I36DL.js} +2 -2
  77. package/dist/cli/chunks/{chunk-X737I4SO.js → chunk-6L5V3JGJ.js} +1 -1
  78. package/dist/cli/chunks/{chunk-QGJYKXUO.js → chunk-6RV3W2UZ.js} +1 -1
  79. package/dist/cli/chunks/{chunk-XRF5MX4Q.js → chunk-6ZCAZ3TR.js} +2 -2
  80. package/dist/cli/chunks/{chunk-JQTDNUHA.js → chunk-74QRMQFR.js} +2 -2
  81. package/dist/cli/chunks/{chunk-DSUEJK33.js → chunk-76OWM3ZO.js} +2 -2
  82. package/dist/cli/chunks/{chunk-GTURQ454.js → chunk-7A4EXSMN.js} +2 -2
  83. package/dist/cli/chunks/{chunk-DPJLA7JW.js → chunk-7BLXINIL.js} +2 -2
  84. package/dist/cli/chunks/{chunk-4RYU4WMW.js → chunk-7LR4VP2I.js} +1 -1
  85. package/dist/cli/chunks/{chunk-NIA6VTIH.js → chunk-7M4X6WTF.js} +2 -2
  86. package/dist/cli/chunks/{chunk-N3KQRDTM.js → chunk-7PHF2JM3.js} +1 -1
  87. package/dist/cli/chunks/{chunk-7MBPKAQ3.js → chunk-7SQXEYII.js} +2 -2
  88. package/dist/cli/chunks/{chunk-PHBGMXTR.js → chunk-AAGOBPIJ.js} +2 -2
  89. package/dist/cli/chunks/{chunk-33SPAMQZ.js → chunk-AJYJFIKO.js} +2 -2
  90. package/dist/cli/chunks/{chunk-QP4UKSUJ.js → chunk-AKYOY5KR.js} +2 -2
  91. package/dist/cli/chunks/{chunk-HEF6XKA5.js → chunk-AKZ6PWHM.js} +2 -2
  92. package/dist/cli/chunks/{chunk-764G7VK6.js → chunk-APMLMLSL.js} +1 -1
  93. package/dist/cli/chunks/{chunk-KQFMCVBH.js → chunk-AX4XIG4G.js} +2 -2
  94. package/dist/cli/chunks/{chunk-ZLTAAROU.js → chunk-BAJK26EI.js} +2 -2
  95. package/dist/cli/chunks/{chunk-LLQG3F4H.js → chunk-BI6OTPC6.js} +2 -2
  96. package/dist/cli/chunks/chunk-BKI5NFQ5.js +2 -0
  97. package/dist/cli/chunks/{chunk-V6W4IHS5.js → chunk-BUN4WBPW.js} +2 -2
  98. package/dist/cli/chunks/{chunk-UF7JKDWB.js → chunk-BX5MY65W.js} +1 -1
  99. package/dist/cli/chunks/{chunk-KBQRYAHZ.js → chunk-CD4YWKJ2.js} +2 -2
  100. package/dist/cli/chunks/{chunk-VGWHFFK6.js → chunk-CHFZHORO.js} +5 -5
  101. package/dist/cli/chunks/{chunk-UX434RY5.js → chunk-CPIAZGHF.js} +2 -2
  102. package/dist/cli/chunks/{chunk-PS32DXYF.js → chunk-D4P6BKGF.js} +3 -3
  103. package/dist/cli/chunks/{chunk-CBLKYGKT.js → chunk-DFBJPOJR.js} +2 -2
  104. package/dist/cli/chunks/{chunk-XRQGWUDX.js → chunk-DIRFXY3J.js} +7 -7
  105. package/dist/cli/chunks/chunk-DK7MV2W3.js +2 -0
  106. package/dist/cli/chunks/chunk-DVYNBMMP.js +62 -0
  107. package/dist/cli/chunks/{chunk-LWPCGOQM.js → chunk-EGI6SKQD.js} +2 -2
  108. package/dist/cli/chunks/{chunk-RMQRSZB4.js → chunk-ELC3UEML.js} +1 -1
  109. package/dist/cli/chunks/chunk-ELKWYWTD.js +2 -0
  110. package/dist/cli/chunks/{chunk-2BYRQ5MV.js → chunk-EPMUAKU2.js} +2 -2
  111. package/dist/cli/chunks/{chunk-U7DGRHSB.js → chunk-EROQSNGD.js} +2 -2
  112. package/dist/cli/chunks/{chunk-GSG5FASF.js → chunk-EXXWOOUL.js} +3 -3
  113. package/dist/cli/chunks/{chunk-UWBHR4EZ.js → chunk-FQPYD6YE.js} +1 -1
  114. package/dist/cli/chunks/{chunk-OD5R7HRI.js → chunk-FW6OPDA6.js} +1 -1
  115. package/dist/cli/chunks/{chunk-M7XDTQHX.js → chunk-FYWTMDID.js} +2 -2
  116. package/dist/cli/chunks/{chunk-TK6CHESH.js → chunk-G47WJMHM.js} +1 -1
  117. package/dist/cli/chunks/{chunk-LOZRBK2Z.js → chunk-G73XY2NK.js} +2 -2
  118. package/dist/cli/chunks/{chunk-WRC66JTK.js → chunk-GHSP4AC5.js} +1 -1
  119. package/dist/cli/chunks/{chunk-37GCWGXT.js → chunk-GITS44TM.js} +2 -2
  120. package/dist/cli/chunks/{chunk-IH47VGC7.js → chunk-GUO6JZMS.js} +2 -2
  121. package/dist/cli/chunks/{chunk-JLFU5SCI.js → chunk-GWBV26SE.js} +2 -2
  122. package/dist/cli/chunks/{chunk-AXXFY7PX.js → chunk-HBYVYLBN.js} +2 -2
  123. package/dist/cli/chunks/{chunk-46U73TST.js → chunk-HMNBNGNO.js} +1 -1
  124. package/dist/cli/chunks/{chunk-J65XQ6WE.js → chunk-HZV3J4VQ.js} +2 -2
  125. package/dist/cli/chunks/{chunk-PHNNAIFA.js → chunk-IC5JGTM4.js} +1 -1
  126. package/dist/cli/chunks/{chunk-JOHWWTJF.js → chunk-IS3P5VBL.js} +2 -2
  127. package/dist/cli/chunks/{chunk-64C4SS66.js → chunk-JID7JO7K.js} +2 -2
  128. package/dist/cli/chunks/{chunk-DTOKJKSE.js → chunk-JOJ2UFHM.js} +2 -2
  129. package/dist/cli/chunks/{chunk-MGKJFO57.js → chunk-JTUTZUED.js} +2 -2
  130. package/dist/cli/chunks/{chunk-2QKSIHXO.js → chunk-JX5IY2YK.js} +1 -1
  131. package/dist/cli/chunks/{chunk-EEG4G5JG.js → chunk-K55D3PAR.js} +3 -3
  132. package/dist/cli/chunks/{chunk-TNM7X2GD.js → chunk-KAVYTFAS.js} +2 -2
  133. package/dist/cli/chunks/{chunk-NUPAGPN6.js → chunk-KRCIC4JK.js} +2 -2
  134. package/dist/cli/chunks/{chunk-VFZNVJP2.js → chunk-L6H4MWVN.js} +2 -2
  135. package/dist/cli/chunks/{chunk-QZ3EIONO.js → chunk-L6I2Q6UQ.js} +1 -1
  136. package/dist/cli/chunks/{chunk-A547LEUW.js → chunk-LARAXKTZ.js} +2 -2
  137. package/dist/cli/chunks/{chunk-6I2L22WS.js → chunk-LELWVGN6.js} +1 -1
  138. package/dist/cli/chunks/chunk-M7456ZW5.js +2 -0
  139. package/dist/cli/chunks/{chunk-J5AIMM2J.js → chunk-MF6OT43N.js} +1 -1
  140. package/dist/cli/chunks/{chunk-WHUQDBV7.js → chunk-MX35PIGJ.js} +2 -2
  141. package/dist/cli/chunks/{chunk-RRHIEG4Y.js → chunk-ND7IWTVQ.js} +2 -2
  142. package/dist/cli/chunks/{chunk-TRPRFW27.js → chunk-NFE4RV2Q.js} +2 -2
  143. package/dist/cli/chunks/{chunk-37I4AMCT.js → chunk-NVZ3QROA.js} +2 -2
  144. package/dist/cli/chunks/{chunk-6C3PDY72.js → chunk-OF5UL3FA.js} +1 -1
  145. package/dist/cli/chunks/{chunk-JBWXBDJX.js → chunk-OGUPLNRY.js} +1 -1
  146. package/dist/cli/chunks/chunk-OJZ5LI3O.js +2 -0
  147. package/dist/cli/chunks/{chunk-ZIYCZZYD.js → chunk-OQ4HOHBI.js} +2 -2
  148. package/dist/cli/chunks/{chunk-2G2XD6EM.js → chunk-OUWZTYRZ.js} +2 -2
  149. package/dist/cli/chunks/{chunk-IZIYFVAZ.js → chunk-PDOL3FGO.js} +3 -3
  150. package/dist/cli/chunks/{chunk-NF2N2FIY.js → chunk-PEHSTLU7.js} +1 -1
  151. package/dist/cli/chunks/{chunk-WVWWTRKT.js → chunk-PKCVQ2I4.js} +1 -1
  152. package/dist/cli/chunks/{chunk-CW7BWFFF.js → chunk-PNDWHSZO.js} +2 -2
  153. package/dist/cli/chunks/{chunk-IKPBQZQP.js → chunk-PSD2L2JB.js} +2 -2
  154. package/dist/cli/chunks/{chunk-DSGKRXHF.js → chunk-Q3J5OTZ2.js} +1 -1
  155. package/dist/cli/chunks/{chunk-PY55ZD2G.js → chunk-QHX7VLVT.js} +2 -2
  156. package/dist/cli/chunks/{chunk-7TG7LJAB.js → chunk-QIHKSRUZ.js} +2 -2
  157. package/dist/cli/chunks/{chunk-B7XZJBMT.js → chunk-QLD2WVWN.js} +2 -2
  158. package/dist/cli/chunks/{chunk-HOIH542Y.js → chunk-R4VDRE75.js} +1 -1
  159. package/dist/cli/chunks/{chunk-A6J5MAVO.js → chunk-RDHBUCKQ.js} +182 -201
  160. package/dist/cli/chunks/{chunk-OU5CZFBG.js → chunk-RGBYJAKQ.js} +3 -3
  161. package/dist/cli/chunks/{chunk-GNCGRDQ2.js → chunk-RKXN5TVS.js} +1 -1
  162. package/dist/cli/chunks/{chunk-RWPWD5GG.js → chunk-S2EUFKHL.js} +2 -2
  163. package/dist/cli/chunks/{chunk-CVFUANMU.js → chunk-SN57SNLU.js} +2 -2
  164. package/dist/cli/chunks/{chunk-OX6WPOGR.js → chunk-SQDHFTGQ.js} +3 -3
  165. package/dist/cli/chunks/{chunk-P5CQMDFQ.js → chunk-THQ5ZBWP.js} +2 -2
  166. package/dist/cli/chunks/{chunk-BDOD534O.js → chunk-TU5S33SD.js} +2 -2
  167. package/dist/cli/chunks/{chunk-22WFXSXB.js → chunk-U5GGDJ44.js} +2 -2
  168. package/dist/cli/chunks/{chunk-KQ5GLUOB.js → chunk-UGER2PGN.js} +4 -4
  169. package/dist/cli/chunks/{chunk-TW5QWNT4.js → chunk-UUFLYBUO.js} +2 -2
  170. package/dist/cli/chunks/{chunk-QFANYWC5.js → chunk-UWM4CCK7.js} +1 -1
  171. package/dist/cli/chunks/{chunk-FF53QW6C.js → chunk-V2T7QEPV.js} +1 -1
  172. package/dist/cli/chunks/{chunk-EMH54CO7.js → chunk-VE5STFDP.js} +2 -2
  173. package/dist/cli/chunks/{chunk-APXJJRU4.js → chunk-VNRWJ5JZ.js} +2 -2
  174. package/dist/cli/chunks/{chunk-N7IRBQ4D.js → chunk-VRV7CXEM.js} +1 -1
  175. package/dist/cli/chunks/{chunk-CXPMA7LY.js → chunk-W7H46LAX.js} +1 -1
  176. package/dist/cli/chunks/{chunk-3CFWNT3F.js → chunk-WAELEQP5.js} +2 -2
  177. package/dist/cli/chunks/{chunk-JHOJG5VO.js → chunk-WDDU4I5Z.js} +1 -1
  178. package/dist/cli/chunks/{chunk-SAMAYDVS.js → chunk-WLY2J6JP.js} +2 -2
  179. package/dist/cli/chunks/{chunk-62F5M5OO.js → chunk-WSSFH23M.js} +1 -1
  180. package/dist/cli/chunks/{chunk-N4OBRS6S.js → chunk-WZI2REDL.js} +2 -2
  181. package/dist/cli/chunks/{chunk-7AHQ7ROU.js → chunk-X53GJW2E.js} +2 -2
  182. package/dist/cli/chunks/{chunk-H2BR5MCX.js → chunk-XACF7ZLM.js} +2 -2
  183. package/dist/cli/chunks/{chunk-QZS3XCU5.js → chunk-XNGYWOAK.js} +2 -2
  184. package/dist/cli/chunks/{chunk-F6V5POSK.js → chunk-YFD6K7AS.js} +75 -75
  185. package/dist/cli/chunks/{chunk-W6OIDL4J.js → chunk-YG45ZONW.js} +2 -2
  186. package/dist/cli/chunks/{chunk-FGIZVGIE.js → chunk-YGMCRJSC.js} +2 -2
  187. package/dist/cli/chunks/{chunk-SSXCHSVM.js → chunk-YIEMVVUH.js} +2 -2
  188. package/dist/cli/chunks/{chunk-ZI7BWJJW.js → chunk-YSWI3APU.js} +2 -2
  189. package/dist/cli/chunks/{chunk-ADBTOUOX.js → chunk-YU4U3BUY.js} +1 -1
  190. package/dist/cli/chunks/{chunk-K2D3YW2N.js → chunk-Z5YNYVFO.js} +1 -1
  191. package/dist/cli/chunks/{chunk-UAXFRKR3.js → chunk-ZE3WS57T.js} +2 -2
  192. package/dist/cli/chunks/{chunk-C7AXBCMS.js → chunk-ZMA5OWIQ.js} +4 -4
  193. package/dist/cli/chunks/{chunk-RU23JXCG.js → chunk-ZOD37GNG.js} +3 -3
  194. package/dist/cli/chunks/{chunk-MNEQESQJ.js → chunk-ZQ7XQLLV.js} +3 -3
  195. package/dist/cli/chunks/{chunk-TGVDKSSS.js → chunk-ZUIPUO7Q.js} +1 -1
  196. package/dist/cli/chunks/{chunk-L4O2645U.js → chunk-ZWLFEZQC.js} +1 -1
  197. package/dist/cli/chunks/{ci-G2NEYLVO.js → ci-IRCNFD32.js} +2 -2
  198. package/dist/cli/chunks/{ci-output-SZFEXGBU.js → ci-output-NFOUNDJ2.js} +2 -2
  199. package/dist/cli/chunks/{circuit-breaker-ZD7PJY6N.js → circuit-breaker-GB7SQRD2.js} +2 -2
  200. package/dist/cli/chunks/{claude-flow-setup-DAVANGUJ.js → claude-flow-setup-STFKPPVL.js} +2 -2
  201. package/dist/cli/chunks/client-M4WF22UT.js +2 -0
  202. package/dist/cli/chunks/{cline-installer-WCPKWLY7.js → cline-installer-MLKKIHIV.js} +2 -2
  203. package/dist/cli/chunks/{code-324ZJR3V.js → code-ZRCJC42H.js} +2 -2
  204. package/dist/cli/chunks/{code-index-extractor-EWVSXJHR.js → code-index-extractor-VWDYYQY2.js} +2 -2
  205. package/dist/cli/chunks/codex-installer-I5BTWYQV.js +15 -0
  206. package/dist/cli/chunks/{completions-ZAWBZWYK.js → completions-5JCAFTQV.js} +2 -2
  207. package/dist/cli/chunks/{complexity-analyzer-S3H2IRON.js → complexity-analyzer-6JLLAPGO.js} +2 -2
  208. package/dist/cli/chunks/{continuedev-installer-4DDFAJ26.js → continuedev-installer-YBOLMUZR.js} +2 -2
  209. package/dist/cli/chunks/{copilot-installer-KBBAL3G5.js → copilot-installer-GDBJZBXS.js} +2 -2
  210. package/dist/cli/chunks/core-handlers-3MNFXL44.js +2 -0
  211. package/dist/cli/chunks/{cost-tracker-2YM7SGBW.js → cost-tracker-NEAVGEZI.js} +2 -2
  212. package/dist/cli/chunks/{coverage-6CCBAORJ.js → coverage-DXS5XNAA.js} +3 -3
  213. package/dist/cli/chunks/cross-domain-router-Q5X6ZLJY.js +2 -0
  214. package/dist/cli/chunks/{cursor-installer-24DKXNU5.js → cursor-installer-3KEMFIFA.js} +2 -2
  215. package/dist/cli/chunks/{daemon-M2PSDIZF.js → daemon-FT2J6VY4.js} +3 -3
  216. package/dist/cli/chunks/{daemon-JLF6CRBS.js → daemon-JN377KTA.js} +4 -4
  217. package/dist/cli/chunks/{dag-attention-scheduler-Y5HSZDRV.js → dag-attention-scheduler-EJFEWFXI.js} +2 -2
  218. package/dist/cli/chunks/{detect-6Y227IJ6.js → detect-E5MN6N3L.js} +2 -2
  219. package/dist/cli/chunks/{dist-node-EGOJXGTA.js → dist-node-ZFSAQMFD.js} +2 -2
  220. package/dist/cli/chunks/{domain-handler-G3JEWRE5.js → domain-handler-S7VFZ2MY.js} +2 -2
  221. package/dist/cli/chunks/{domain-transfer-XOHI3EMJ.js → domain-transfer-LGHT3FN4.js} +2 -2
  222. package/dist/cli/chunks/dream-5QB6JABW.js +2 -0
  223. package/dist/cli/chunks/{embed-and-insert-pattern-CSSA55L4.js → embed-and-insert-pattern-OVQS6IKK.js} +2 -2
  224. package/dist/cli/chunks/{eval-NHBXOXDV.js → eval-45UWDD2R.js} +2 -2
  225. package/dist/cli/chunks/{experience-capture-middleware-B7ZDV5UY.js → experience-capture-middleware-XDRJSNPY.js} +3 -3
  226. package/dist/cli/chunks/{fast-paths-XGKSBALA.js → fast-paths-VEDCJL75.js} +2 -2
  227. package/dist/cli/chunks/{feature-flags-ZVD73ZYK.js → feature-flags-NOTQVBLP.js} +2 -2
  228. package/dist/cli/chunks/{feature-flags-NBUDJSWJ.js → feature-flags-TGA3NWVL.js} +2 -2
  229. package/dist/cli/chunks/file-discovery-AHMR6IGX.js +2 -0
  230. package/dist/cli/chunks/{fleet-LF77P3BW.js → fleet-CQBUCH2S.js} +3 -3
  231. package/dist/cli/chunks/{gnn-wrapper-UXNT7BEN.js → gnn-wrapper-SOZCIONJ.js} +2 -2
  232. package/dist/cli/chunks/{heartbeat-handler-C4LMU5LA.js → heartbeat-handler-6XNV4DGM.js} +4 -4
  233. package/dist/cli/chunks/heartbeat-scheduler-ZRLIMPKO.js +2 -0
  234. package/dist/cli/chunks/hnsw-adapter-R4VAEQ2B.js +2 -0
  235. package/dist/cli/chunks/hnsw-index-GTUOS6DF.js +2 -0
  236. package/dist/cli/chunks/{hnsw-legacy-bridge-EHHBIWS3.js → hnsw-legacy-bridge-UILVP37N.js} +2 -2
  237. package/dist/cli/chunks/hnswlib-node-OHJQOSAH.js +2 -0
  238. package/dist/cli/chunks/{hooks-AGE3HCFI.js → hooks-QVDOGEHG.js} +10 -10
  239. package/dist/cli/chunks/hybrid-router-CYEXFWDT.js +2 -0
  240. package/dist/cli/chunks/{hypergraph-engine-E5QX5MEB.js → hypergraph-engine-YMVPBXZS.js} +2 -2
  241. package/dist/cli/chunks/{hypergraph-handler-ZZHBANYB.js → hypergraph-handler-SHUNZXUK.js} +3 -3
  242. package/dist/cli/chunks/impact-analyzer-HMJ7LAXR.js +2 -0
  243. package/dist/cli/chunks/{init-handler-PNVRBZZT.js → init-handler-JE5FYJAV.js} +16 -12
  244. package/dist/cli/chunks/init-wizard-OIK6S3PQ.js +2 -0
  245. package/dist/cli/chunks/kernel-NZCGR72Y.js +2 -0
  246. package/dist/cli/chunks/{kilocode-installer-TR53QKPU.js → kilocode-installer-TVP4YOOK.js} +2 -2
  247. package/dist/cli/chunks/{kiro-installer-MJW6LCAX.js → kiro-installer-XBSGANX7.js} +2 -2
  248. package/dist/cli/chunks/knowledge-graph-HA7XW46B.js +2 -0
  249. package/dist/cli/chunks/{learning-6LLGHP2Q.js → learning-O4ZXQVRE.js} +3 -3
  250. package/dist/cli/chunks/{llm-router-DBLV3VGG.js → llm-router-FXXJHARR.js} +4 -4
  251. package/dist/cli/chunks/llm-router-service-FVGQSXYC.js +2 -0
  252. package/dist/cli/chunks/{load-LAZ3E5PE.js → load-IVF6G2SK.js} +2 -2
  253. package/dist/cli/chunks/load-test-IQTO35GE.js +2 -0
  254. package/dist/cli/chunks/{mcp-L5QXHSEY.js → mcp-VXSDVG3H.js} +2 -2
  255. package/dist/cli/chunks/{memory-YR5PCMWA.js → memory-BINJV3M6.js} +5 -5
  256. package/dist/cli/chunks/memory-backend-YGSOJ7SI.js +2 -0
  257. package/dist/cli/chunks/{memory-handlers-BSRTZQYR.js → memory-handlers-BJNFJZFP.js} +2 -2
  258. package/dist/cli/chunks/{multi-model-executor-RECZ3ACW.js → multi-model-executor-RJHYK6JI.js} +2 -2
  259. package/dist/cli/chunks/{opencode-installer-4TDUB7HH.js → opencode-installer-VCTF5ETL.js} +2 -2
  260. package/dist/cli/chunks/{orchestrator-PHDKJ5C4.js → orchestrator-5SKZ2BOK.js} +11 -11
  261. package/dist/cli/chunks/pattern-null-store-4WN5O2PF.js +2 -0
  262. package/dist/cli/chunks/{pattern-usage-recorder-QK2FADRS.js → pattern-usage-recorder-AY2DAOQO.js} +2 -2
  263. package/dist/cli/chunks/{pipeline-JQJYSN43.js → pipeline-EMBMC75N.js} +2 -2
  264. package/dist/cli/chunks/platform-GADIFXCI.js +2 -0
  265. package/dist/cli/chunks/{plugin-766MBGK6.js → plugin-Q234ZAAY.js} +2 -2
  266. package/dist/cli/chunks/{prime-radiant-advanced-wasm-XQERZNSK.js → prime-radiant-advanced-wasm-CXXKYB2P.js} +2 -2
  267. package/dist/cli/chunks/protocol-executor-EYTJXPXY.js +2 -0
  268. package/dist/cli/chunks/{protocol-handler-FAK4MMNA.js → protocol-handler-ZZRFBVNA.js} +2 -2
  269. package/dist/cli/chunks/{prove-HYBVXOGW.js → prove-7674ATXK.js} +2 -2
  270. package/dist/cli/chunks/provider-manager-TM3JHYLL.js +2 -0
  271. package/dist/cli/chunks/qe-reasoning-bank-6JLFP3HE.js +2 -0
  272. package/dist/cli/chunks/quality-QCIGVN2S.js +7 -0
  273. package/dist/cli/chunks/{quality-gate-RK32VMO7.js → quality-gate-AKV564GE.js} +3 -3
  274. package/dist/cli/chunks/queen-coordinator-OKGOKGHI.js +2 -0
  275. package/dist/cli/chunks/{real-embeddings-GI7CRHE2.js → real-embeddings-74POUVMX.js} +2 -2
  276. package/dist/cli/chunks/{roocode-installer-BS3XWJJI.js → roocode-installer-INBL5AG7.js} +2 -2
  277. package/dist/cli/chunks/router-J45OF4SP.js +2 -0
  278. package/dist/cli/chunks/routing-feedback-VTZFH57X.js +2 -0
  279. package/dist/cli/chunks/{routing-handler-XMGRJDHH.js → routing-handler-C7HMM7RL.js} +2 -2
  280. package/dist/cli/chunks/{ruvector-commands-NDL3ONNC.js → ruvector-commands-PT6LRVCW.js} +2 -2
  281. package/dist/cli/chunks/{rvf-dual-writer-XAJOYGJ2.js → rvf-dual-writer-PRKROTP3.js} +2 -2
  282. package/dist/cli/chunks/{rvf-migration-adapter-WXFRZZ26.js → rvf-migration-adapter-ZI2XW4UX.js} +2 -2
  283. package/dist/cli/chunks/{rvf-migration-coordinator-WFXA2VUQ.js → rvf-migration-coordinator-5JTGP35V.js} +2 -2
  284. package/dist/cli/chunks/rvf-native-adapter-BDPUBFNP.js +2 -0
  285. package/dist/cli/chunks/{rvf-store-integrity-I7PFJZCK.js → rvf-store-integrity-3B5TZTFR.js} +2 -2
  286. package/dist/cli/chunks/safe-db-FHJBWJIB.js +2 -0
  287. package/dist/cli/chunks/schedule-LP7YYT4P.js +2 -0
  288. package/dist/cli/chunks/scheduler-BOZWGKJG.js +2 -0
  289. package/dist/cli/chunks/{security-H3WY76GF.js → security-IMIWSAHW.js} +3 -3
  290. package/dist/cli/chunks/{shared-rvf-adapter-GRTJCLW6.js → shared-rvf-adapter-UDKJNX6I.js} +2 -2
  291. package/dist/cli/chunks/{shared-rvf-dual-writer-46XE5R2B.js → shared-rvf-dual-writer-FQOBQ6S5.js} +2 -2
  292. package/dist/cli/chunks/sqlite-persistence-TDM36AHF.js +2 -0
  293. package/dist/cli/chunks/{status-handler-VUIFMY4F.js → status-handler-7WON7M7F.js} +2 -2
  294. package/dist/cli/chunks/{structural-health-I7HC477E.js → structural-health-JTKTO3A4.js} +2 -2
  295. package/dist/cli/chunks/{sync-M6LUV5R4.js → sync-6ABYTAOL.js} +2 -2
  296. package/dist/cli/chunks/{sync-RO2YGMBF.js → sync-UJSHBY3B.js} +2 -2
  297. package/dist/cli/chunks/{task-handler-BJJTZ7AU.js → task-handler-5TZNOCCB.js} +2 -2
  298. package/dist/cli/chunks/{task-handlers-B6S4NEN3.js → task-handlers-G7ZUGBHM.js} +3 -3
  299. package/dist/cli/chunks/test-BSJ6MVTG.js +33 -0
  300. package/dist/cli/chunks/{test-scheduling-4ISKEFR6.js → test-scheduling-OSJJXIYQ.js} +3 -3
  301. package/dist/cli/chunks/{token-bootstrap-BOIYBZHW.js → token-bootstrap-MRNFR4YI.js} +2 -2
  302. package/dist/cli/chunks/{token-usage-6ZZC7RLT.js → token-usage-YQN7ND7G.js} +2 -2
  303. package/dist/cli/chunks/{transformers-55VI4OGW.js → transformers-QL3AG25C.js} +2 -2
  304. package/dist/cli/chunks/{tree-sitter-wasm-parser-6GRRGB3K.js → tree-sitter-wasm-parser-BECZRRZP.js} +2 -2
  305. package/dist/cli/chunks/{types-SXDF7QQT.js → types-FQSNLPWS.js} +2 -2
  306. package/dist/cli/chunks/unified-memory-6PHUOZRH.js +2 -0
  307. package/dist/cli/chunks/unified-memory-hnsw-WYSFH3PS.js +2 -0
  308. package/dist/cli/chunks/unified-persistence-QBGHDCCO.js +2 -0
  309. package/dist/cli/chunks/{upgrade-PMPB7NGB.js → upgrade-2ICXXV6D.js} +2 -2
  310. package/dist/cli/chunks/{validate-G37QKKXK.js → validate-LPAUH2F4.js} +2 -2
  311. package/dist/cli/chunks/{validate-swarm-6X22J3VD.js → validate-swarm-VWVE2GM7.js} +2 -2
  312. package/dist/cli/chunks/{vibium-SGBJKHQL.js → vibium-U3LBEI4K.js} +2 -2
  313. package/dist/cli/chunks/visual-security-LH7DRCDS.js +2 -0
  314. package/dist/cli/chunks/{web-tree-sitter-S46Y5BUJ.js → web-tree-sitter-QGZXQPXU.js} +2 -2
  315. package/dist/cli/chunks/{windsurf-installer-PTYCETNM.js → windsurf-installer-GGLQJWUI.js} +2 -2
  316. package/dist/cli/chunks/witness-chain-2BDZOPJ2.js +2 -0
  317. package/dist/cli/chunks/{witness-chain-5SCRFT2K.js → witness-chain-47A2AXUS.js} +2 -2
  318. package/dist/cli/chunks/{witness-key-manager-XIAMRVUZ.js → witness-key-manager-FVS7UOWM.js} +2 -2
  319. package/dist/cli/chunks/{workflow-BPQA2NAI.js → workflow-KIZPLTYW.js} +4 -4
  320. package/dist/cli/chunks/workflow-orchestrator-UYOPFK2T.js +2 -0
  321. package/dist/cli/chunks/{wrappers-IWZZZOAU.js → wrappers-ER6XCMT6.js} +2 -2
  322. package/dist/cli/commands/platform.d.ts +17 -0
  323. package/dist/cli/commands/platform.js +91 -41
  324. package/dist/cli/commands/quality.d.ts +12 -0
  325. package/dist/cli/commands/quality.js +50 -74
  326. package/dist/cli/commands/test.js +33 -4
  327. package/dist/cli/handlers/init-handler.d.ts +3 -0
  328. package/dist/cli/handlers/init-handler.js +13 -4
  329. package/dist/cli/utils/file-discovery.d.ts +1 -0
  330. package/dist/cli/utils/file-discovery.js +13 -1
  331. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +5 -0
  332. package/dist/domains/quality-assessment/index.d.ts +1 -0
  333. package/dist/domains/quality-assessment/index.js +1 -0
  334. package/dist/domains/quality-assessment/quality-evidence.d.ts +41 -0
  335. package/dist/domains/quality-assessment/quality-evidence.js +115 -0
  336. package/dist/domains/test-execution/coordinator.d.ts +1 -0
  337. package/dist/domains/test-execution/coordinator.js +11 -4
  338. package/dist/domains/test-execution/interfaces.d.ts +2 -0
  339. package/dist/domains/test-execution/services/retry-handler.js +3 -3
  340. package/dist/domains/test-execution/services/test-executor.d.ts +5 -0
  341. package/dist/domains/test-execution/services/test-executor.js +93 -30
  342. package/dist/domains/test-generation/gates/test-quality-gate.d.ts +8 -2
  343. package/dist/domains/test-generation/gates/test-quality-gate.js +93 -4
  344. package/dist/domains/test-generation/generators/base-test-generator.js +0 -15
  345. package/dist/domains/test-generation/generators/jest-vitest-generator.js +17 -26
  346. package/dist/domains/test-generation/services/test-generator.js +7 -2
  347. package/dist/init/codex-installer.d.ts +22 -3
  348. package/dist/init/codex-installer.js +132 -54
  349. package/dist/init/codex-skill-manifest.d.ts +43 -0
  350. package/dist/init/codex-skill-manifest.js +21 -0
  351. package/dist/init/orchestrator.js +2 -0
  352. package/dist/init/phases/07-hooks.js +3 -1
  353. package/dist/init/phases/09-assets.js +10 -1
  354. package/dist/init/phases/phase-interface.d.ts +4 -0
  355. package/dist/init/settings-merge.d.ts +3 -1
  356. package/dist/init/settings-merge.js +9 -3
  357. package/dist/integrations/embeddings/index/HNSWIndex.js +2 -0
  358. package/dist/learning/real-embeddings.js +19 -3
  359. package/dist/mcp/bundle.js +453 -472
  360. package/dist/mcp/tools/quality-assessment/evaluate.d.ts +7 -0
  361. package/dist/mcp/tools/quality-assessment/evaluate.js +72 -20
  362. package/dist/mcp/tools/security-compliance/scan.js +8 -1
  363. package/package.json +6 -2
  364. package/dist/cli/chunks/adapter-NIUFP6QX.js +0 -2
  365. package/dist/cli/chunks/aqe-learning-engine-DC4DNCPB.js +0 -2
  366. package/dist/cli/chunks/base-EXD3ULZT.js +0 -2
  367. package/dist/cli/chunks/better-sqlite3-OW5HIPEN.js +0 -2
  368. package/dist/cli/chunks/browser-workflow-KOMASCB7.js +0 -2
  369. package/dist/cli/chunks/chunk-5IH22DLD.js +0 -12
  370. package/dist/cli/chunks/chunk-6R6QGQ7D.js +0 -2
  371. package/dist/cli/chunks/chunk-A22RTEJ3.js +0 -62
  372. package/dist/cli/chunks/chunk-H4XZOIV6.js +0 -2
  373. package/dist/cli/chunks/chunk-T5L65R23.js +0 -2
  374. package/dist/cli/chunks/chunk-VRTNRI4H.js +0 -2
  375. package/dist/cli/chunks/client-ZJQMJO5N.js +0 -2
  376. package/dist/cli/chunks/codex-installer-HVSZBHH2.js +0 -10
  377. package/dist/cli/chunks/core-handlers-U2YJLH6O.js +0 -2
  378. package/dist/cli/chunks/cross-domain-router-E7EMKZEK.js +0 -2
  379. package/dist/cli/chunks/dream-ZMNQYBJO.js +0 -2
  380. package/dist/cli/chunks/file-discovery-C42TEUKT.js +0 -2
  381. package/dist/cli/chunks/heartbeat-scheduler-2JL4MAJR.js +0 -2
  382. package/dist/cli/chunks/hnsw-adapter-AZD6O35G.js +0 -2
  383. package/dist/cli/chunks/hnsw-index-WJLE4S5L.js +0 -2
  384. package/dist/cli/chunks/hybrid-router-YTKJBAS2.js +0 -2
  385. package/dist/cli/chunks/impact-analyzer-CX56GZXA.js +0 -2
  386. package/dist/cli/chunks/init-wizard-WE6HIC66.js +0 -2
  387. package/dist/cli/chunks/kernel-MT55LNNI.js +0 -2
  388. package/dist/cli/chunks/knowledge-graph-WN3LQ2W7.js +0 -2
  389. package/dist/cli/chunks/llm-router-service-NKHEQQMN.js +0 -2
  390. package/dist/cli/chunks/load-test-3WIQASDF.js +0 -2
  391. package/dist/cli/chunks/memory-backend-W6YSNT6O.js +0 -2
  392. package/dist/cli/chunks/pattern-null-store-IV3ZESTR.js +0 -2
  393. package/dist/cli/chunks/platform-FA5TOPTH.js +0 -2
  394. package/dist/cli/chunks/protocol-executor-GFAG5G6K.js +0 -2
  395. package/dist/cli/chunks/provider-manager-TIVIJIYH.js +0 -2
  396. package/dist/cli/chunks/qe-reasoning-bank-BYE7YF6Y.js +0 -2
  397. package/dist/cli/chunks/quality-EGSO2RAX.js +0 -7
  398. package/dist/cli/chunks/queen-coordinator-WOHYVV7A.js +0 -2
  399. package/dist/cli/chunks/router-VUW2UVCN.js +0 -2
  400. package/dist/cli/chunks/routing-feedback-WSUQMZAK.js +0 -2
  401. package/dist/cli/chunks/rvf-native-adapter-RHZCXVN6.js +0 -2
  402. package/dist/cli/chunks/safe-db-NTWEW7ZM.js +0 -2
  403. package/dist/cli/chunks/schedule-WEVC2GW2.js +0 -2
  404. package/dist/cli/chunks/scheduler-XHI5AJIS.js +0 -2
  405. package/dist/cli/chunks/sqlite-persistence-QZUPKMHP.js +0 -2
  406. package/dist/cli/chunks/test-BE7EM6Y6.js +0 -33
  407. package/dist/cli/chunks/unified-memory-QKWUSEBV.js +0 -2
  408. package/dist/cli/chunks/unified-memory-hnsw-Z2UQZRTK.js +0 -2
  409. package/dist/cli/chunks/unified-persistence-AVK2NSMI.js +0 -2
  410. package/dist/cli/chunks/visual-security-64UFH23G.js +0 -2
  411. package/dist/cli/chunks/witness-chain-ZIVSDX6C.js +0 -2
  412. package/dist/cli/chunks/workflow-orchestrator-TYP4MI2V.js +0 -2
  413. package/dist/cli/commands/init.d.ts +0 -19
  414. 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, platform) {
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
- .action(async (name) => {
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
- let allPassed = true;
201
- // Check 1: Config file exists
202
- const configPath = path.join(projectRoot, platform.configPath);
203
- if (existsSync(configPath)) {
204
- console.log(chalk.green(` [pass] Config file exists: ${platform.configPath}`));
205
- }
206
- else {
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 (allPassed) {
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 qualityAPI = await context.kernel.getDomainAPIAsync('quality-assessment');
28
- if (!qualityAPI) {
29
- console.log(chalk.red('Quality assessment domain not available'));
30
- await cleanupAndExit(1);
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
- // Provide default metrics when user doesn't supply explicit values.
33
- // The gate service requires metrics + thresholds to evaluate.
34
- const defaultMetrics = {
35
- coverage: 0,
36
- testsPassing: 0,
37
- criticalBugs: 0,
38
- codeSmells: 0,
39
- securityVulnerabilities: 0,
40
- technicalDebt: 0,
41
- duplications: 0,
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
- else {
72
- // Text output
73
- const statusIcon = gateResult.passed ? chalk.green('✓ PASSED') : chalk.red('✗ FAILED');
74
- console.log(` Quality Gate: ${statusIcon}`);
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
- const scoreNum = parseFloat(String(gateResult.score));
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 testFiles = walkSourceFiles(targetPath, { testsOnly: true });
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
- if (options.modular || platformRequested || databaseFree || noClaudeRequested) {
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