agentic-qe 3.9.14 → 3.9.16

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 (313) hide show
  1. package/.claude/skills/accessibility-testing/SKILL.md +18 -0
  2. package/.claude/skills/enterprise-integration-testing/SKILL.md +1 -1
  3. package/.claude/skills/pentest-validation/SKILL.md +1 -1
  4. package/.claude/skills/qe-browser/evals/qe-browser.yaml +46 -63
  5. package/.claude/skills/qe-browser/scripts/smoke-test.sh +16 -4
  6. package/.claude/skills/skills-manifest.json +1 -1
  7. package/CHANGELOG.md +52 -0
  8. package/assets/skills/accessibility-testing/SKILL.md +18 -0
  9. package/assets/skills/qe-browser/evals/qe-browser.yaml +46 -63
  10. package/assets/skills/qe-browser/scripts/smoke-test.sh +16 -4
  11. package/assets/skills/skills-manifest.json +1 -1
  12. package/dist/cli/brain-commands.d.ts +14 -0
  13. package/dist/cli/brain-commands.js +24 -0
  14. package/dist/cli/bundle.js +7 -7
  15. package/dist/cli/chunks/adapter-XFJIW42U.js +2 -0
  16. package/dist/cli/chunks/{agent-booster-wasm-O6EXMPMF.js → agent-booster-wasm-IECTFMRK.js} +2 -2
  17. package/dist/cli/chunks/{agent-handler-4LPJVTJU.js → agent-handler-HLLTKZ5G.js} +2 -2
  18. package/dist/cli/chunks/{agent-memory-branch-PRR323JZ.js → agent-memory-branch-WJUD3DS4.js} +2 -2
  19. package/dist/cli/chunks/aqe-learning-engine-UD4SXENM.js +2 -0
  20. package/dist/cli/chunks/{audit-YCKXQOXD.js → audit-3DLZNWHO.js} +2 -2
  21. package/dist/cli/chunks/base-ETEN7L2V.js +2 -0
  22. package/dist/cli/chunks/{better-sqlite3-44RIH62G.js → better-sqlite3-Q356NEQ6.js} +2 -2
  23. package/dist/cli/chunks/brain-handler-MX2HP7LO.js +89 -0
  24. package/dist/cli/chunks/{branch-enumerator-RVVS2UYR.js → branch-enumerator-Z3TF3HVO.js} +2 -2
  25. package/dist/cli/chunks/{browser-L6IKC4PR.js → browser-Z6PQ7FTO.js} +2 -2
  26. package/dist/cli/chunks/browser-workflow-KVHPOIBA.js +2 -0
  27. package/dist/cli/chunks/{chunk-JOGKQTCU.js → chunk-2KCMS4UW.js} +3 -3
  28. package/dist/cli/chunks/{chunk-VUS4VRPQ.js → chunk-2MJEAEOW.js} +2 -2
  29. package/dist/cli/chunks/{chunk-FNKKENLS.js → chunk-3ADFXSO2.js} +2 -2
  30. package/dist/cli/chunks/{chunk-JN7MSUGK.js → chunk-3CAPNE2H.js} +2 -2
  31. package/dist/cli/chunks/{chunk-MFGYMNNY.js → chunk-3EUA73H6.js} +2 -2
  32. package/dist/cli/chunks/{chunk-ORHCO2I7.js → chunk-3H657FNU.js} +2 -2
  33. package/dist/cli/chunks/{chunk-OZBTC26R.js → chunk-3K4IX7L4.js} +2 -2
  34. package/dist/cli/chunks/{chunk-GIUAY4KY.js → chunk-3SLFWPRE.js} +3 -3
  35. package/dist/cli/chunks/{chunk-P5YSBYZV.js → chunk-3ZGYB23S.js} +1 -1
  36. package/dist/cli/chunks/{chunk-6BK2S2WE.js → chunk-46K7ALFU.js} +2 -2
  37. package/dist/cli/chunks/{chunk-I3P5RZX7.js → chunk-4CFQZHUC.js} +3 -3
  38. package/dist/cli/chunks/{chunk-DMZ2XOEW.js → chunk-4PFHQH4B.js} +2 -2
  39. package/dist/cli/chunks/{chunk-TOSFK4VG.js → chunk-4ZN4GM7W.js} +1 -1
  40. package/dist/cli/chunks/{chunk-MXIFVOYA.js → chunk-5A5XANSD.js} +2 -2
  41. package/dist/cli/chunks/{chunk-UG2J5MTY.js → chunk-5E7FVOOG.js} +1 -1
  42. package/dist/cli/chunks/chunk-5LDXAVDC.js +2 -0
  43. package/dist/cli/chunks/{chunk-KFAN5FZM.js → chunk-666L7MC2.js} +2 -2
  44. package/dist/cli/chunks/{chunk-ZCRLZINE.js → chunk-66BUIFFH.js} +2 -2
  45. package/dist/cli/chunks/{chunk-6EZY2QVM.js → chunk-6V5P2VMQ.js} +8 -8
  46. package/dist/cli/chunks/{chunk-YPMBD44A.js → chunk-6XKZ62O7.js} +2 -2
  47. package/dist/cli/chunks/{chunk-JNLKLC7G.js → chunk-77OVXVN2.js} +2 -2
  48. package/dist/cli/chunks/{chunk-I5U64MHU.js → chunk-7DP2IQ6F.js} +2 -2
  49. package/dist/cli/chunks/{chunk-FFACJODG.js → chunk-7IF4LRX2.js} +2 -2
  50. package/dist/cli/chunks/{chunk-36YZ2UF7.js → chunk-7JFSMXIA.js} +2 -2
  51. package/dist/cli/chunks/{chunk-VU4QET3C.js → chunk-7MF6LVLH.js} +2 -2
  52. package/dist/cli/chunks/{chunk-WELNFHDN.js → chunk-7NMLIJHL.js} +1 -1
  53. package/dist/cli/chunks/{chunk-IOHDE27P.js → chunk-7PHYOV2X.js} +2 -2
  54. package/dist/cli/chunks/{chunk-YZBY4ZRF.js → chunk-7V2Z3PUJ.js} +2 -2
  55. package/dist/cli/chunks/{chunk-GM5LIYLQ.js → chunk-AA6IUBCM.js} +2 -2
  56. package/dist/cli/chunks/{chunk-TJOZPPZR.js → chunk-AFLQFUXA.js} +2 -2
  57. package/dist/cli/chunks/{chunk-KJB6JJXT.js → chunk-BCT26J7X.js} +1 -1
  58. package/dist/cli/chunks/{chunk-D6APBW66.js → chunk-BEE5KXQT.js} +1 -1
  59. package/dist/cli/chunks/{chunk-A2TK52B2.js → chunk-BNDK7JRW.js} +2 -2
  60. package/dist/cli/chunks/{chunk-4EQWK6P6.js → chunk-CR7LLS26.js} +2 -2
  61. package/dist/cli/chunks/{chunk-S2KGZJHS.js → chunk-DBCN7R63.js} +1 -1
  62. package/dist/cli/chunks/{chunk-BNPJMPM3.js → chunk-DF3DZP7H.js} +2 -2
  63. package/dist/cli/chunks/{chunk-OGLS6HB4.js → chunk-DJPS7H2M.js} +1 -1
  64. package/dist/cli/chunks/{chunk-G7L5Y47C.js → chunk-ED5OUSYZ.js} +1 -1
  65. package/dist/cli/chunks/{chunk-PZF5ISGS.js → chunk-EFTK4ZVP.js} +1 -1
  66. package/dist/cli/chunks/chunk-FEQ5RDQL.js +18 -0
  67. package/dist/cli/chunks/{chunk-VDGWDDBC.js → chunk-FKQV52TC.js} +2 -2
  68. package/dist/cli/chunks/{chunk-DD4T7ZUM.js → chunk-FLWIEPAT.js} +1 -1
  69. package/dist/cli/chunks/{chunk-5DWTU2PN.js → chunk-FQTUUZVK.js} +1 -1
  70. package/dist/cli/chunks/{chunk-4JYLXYAH.js → chunk-G5DMEEQQ.js} +1 -1
  71. package/dist/cli/chunks/{chunk-JLBUS4PR.js → chunk-GB6D3SSY.js} +2 -2
  72. package/dist/cli/chunks/{chunk-HEQ23HBE.js → chunk-GP7IXB3E.js} +2 -2
  73. package/dist/cli/chunks/{chunk-3NUMJB3U.js → chunk-H3JEGAFC.js} +9 -9
  74. package/dist/cli/chunks/{chunk-ZFZX2NA3.js → chunk-H4BZJVKU.js} +2 -2
  75. package/dist/cli/chunks/{chunk-AOYN6XYJ.js → chunk-HFGCLV56.js} +1 -1
  76. package/dist/cli/chunks/{chunk-XNXOW7BQ.js → chunk-HJUC2DE6.js} +2 -2
  77. package/dist/cli/chunks/{chunk-NWZYULZE.js → chunk-HN6GVQ4Q.js} +4 -4
  78. package/dist/cli/chunks/{chunk-RQFC7Q33.js → chunk-HON4X4Z3.js} +2 -2
  79. package/dist/cli/chunks/{chunk-AEQMQVDJ.js → chunk-HVAW64YW.js} +2 -2
  80. package/dist/cli/chunks/{chunk-5MWNXDQW.js → chunk-HXF4FUPY.js} +2 -2
  81. package/dist/cli/chunks/{chunk-HJJTLOWZ.js → chunk-IUQ6HE2J.js} +2 -2
  82. package/dist/cli/chunks/{chunk-IH4OOAEP.js → chunk-J2ERTUDX.js} +1 -1
  83. package/dist/cli/chunks/{chunk-DNFDSDKE.js → chunk-JCQ5PXVM.js} +2 -2
  84. package/dist/cli/chunks/{chunk-XH774Q6Z.js → chunk-JNXIYHLI.js} +1 -1
  85. package/dist/cli/chunks/{chunk-ERMIIRYN.js → chunk-JUKCBZCZ.js} +1 -1
  86. package/dist/cli/chunks/{chunk-AHVUILGE.js → chunk-JZOMOYHZ.js} +1 -1
  87. package/dist/cli/chunks/{chunk-UAAJ3BSW.js → chunk-KLVS6FT2.js} +2 -2
  88. package/dist/cli/chunks/{chunk-GUEK5DOK.js → chunk-KR7S4IZZ.js} +2 -2
  89. package/dist/cli/chunks/{chunk-VQB5SLXZ.js → chunk-L2GANTQN.js} +2 -2
  90. package/dist/cli/chunks/{chunk-GALNZTYE.js → chunk-LJINNQNN.js} +2 -2
  91. package/dist/cli/chunks/{chunk-IL3ESNHA.js → chunk-LSA4XGSE.js} +3 -3
  92. package/dist/cli/chunks/{chunk-M2RO34V7.js → chunk-LVA53A5R.js} +4 -4
  93. package/dist/cli/chunks/{chunk-LJ3WQIBN.js → chunk-LVK2PDUW.js} +1 -1
  94. package/dist/cli/chunks/{chunk-3ZKTPPIC.js → chunk-LWG7LKOK.js} +1 -1
  95. package/dist/cli/chunks/{chunk-PFSSI3YR.js → chunk-MECDNFOJ.js} +2 -2
  96. package/dist/cli/chunks/{chunk-FWI7PK4X.js → chunk-MFRC267A.js} +1 -1
  97. package/dist/cli/chunks/{chunk-WE7KIXR6.js → chunk-MJKFU6A6.js} +2 -2
  98. package/dist/cli/chunks/{chunk-5U6M4XCP.js → chunk-MQHP65QB.js} +3 -3
  99. package/dist/cli/chunks/{chunk-7732TLNA.js → chunk-MTF6ABUH.js} +2 -2
  100. package/dist/cli/chunks/{chunk-ME4LVBTT.js → chunk-N5ZTPAX7.js} +2 -2
  101. package/dist/cli/chunks/{chunk-NWGIQCCO.js → chunk-NCXXXZGL.js} +1 -1
  102. package/dist/cli/chunks/{chunk-DJLRRCR6.js → chunk-NIXMFJJC.js} +2 -2
  103. package/dist/cli/chunks/{chunk-JWR3NNFA.js → chunk-NLU4XJBN.js} +1 -1
  104. package/dist/cli/chunks/{chunk-DGUAAG3T.js → chunk-NOJVROCD.js} +1 -1
  105. package/dist/cli/chunks/{chunk-Z3PSKGBO.js → chunk-OE7SGIX2.js} +2 -2
  106. package/dist/cli/chunks/{chunk-KHUFPJE4.js → chunk-OP7X434R.js} +2 -2
  107. package/dist/cli/chunks/{chunk-WUYJYRBY.js → chunk-P4IYRPCB.js} +1 -1
  108. package/dist/cli/chunks/{chunk-GOTVYSX5.js → chunk-PNZADZSI.js} +3 -3
  109. package/dist/cli/chunks/{chunk-3PZ2QLLR.js → chunk-PPUEXTH2.js} +3 -3
  110. package/dist/cli/chunks/{chunk-6J6GXRHX.js → chunk-PQLT3X6X.js} +3 -3
  111. package/dist/cli/chunks/{chunk-VVKENR4I.js → chunk-QEKZA2NJ.js} +1 -1
  112. package/dist/cli/chunks/{chunk-S6SM7LJK.js → chunk-QKQAQPXY.js} +2 -2
  113. package/dist/cli/chunks/{chunk-LWHM5BWD.js → chunk-RFLSJ7OL.js} +2 -2
  114. package/dist/cli/chunks/{chunk-WSZVSDD5.js → chunk-RVQXMMRO.js} +2 -2
  115. package/dist/cli/chunks/{chunk-Q4DAYLH4.js → chunk-RYCAVZSD.js} +2 -2
  116. package/dist/cli/chunks/{chunk-VEAVDXXT.js → chunk-SMNOZEM7.js} +2 -2
  117. package/dist/cli/chunks/{chunk-4RDTR2OF.js → chunk-T36IXY5W.js} +2 -2
  118. package/dist/cli/chunks/{chunk-J3XLOHWB.js → chunk-T7VIUEKI.js} +2 -2
  119. package/dist/cli/chunks/{chunk-J5YOXLBD.js → chunk-TFBEX7ED.js} +1 -1
  120. package/dist/cli/chunks/{chunk-Y3X5OS5F.js → chunk-TPRYLARW.js} +2 -2
  121. package/dist/cli/chunks/{chunk-SY74WSBN.js → chunk-TR4NPMRW.js} +2 -2
  122. package/dist/cli/chunks/{chunk-WVN4YJSF.js → chunk-TUPFBZKO.js} +1 -1
  123. package/dist/cli/chunks/{chunk-UUVTLYUK.js → chunk-TWEBJWJI.js} +2 -2
  124. package/dist/cli/chunks/{chunk-QUK34CSU.js → chunk-UH7TV6BY.js} +1 -1
  125. package/dist/cli/chunks/{chunk-QLWP7ZIT.js → chunk-UT4CXF6C.js} +2 -2
  126. package/dist/cli/chunks/{chunk-UIYK4Y7K.js → chunk-V2ELGHLG.js} +2 -2
  127. package/dist/cli/chunks/{chunk-ZU5VHW6P.js → chunk-VK2GKQYI.js} +2 -2
  128. package/dist/cli/chunks/{chunk-FYBTGEOV.js → chunk-VNAAXZGF.js} +1 -1
  129. package/dist/cli/chunks/{chunk-G2KQUEGY.js → chunk-VOAECU7B.js} +2 -2
  130. package/dist/cli/chunks/{chunk-3GIZRGX6.js → chunk-W4ZV6LAJ.js} +2 -2
  131. package/dist/cli/chunks/{chunk-5HUAD4UU.js → chunk-W6TMZY5R.js} +2 -2
  132. package/dist/cli/chunks/{chunk-KVN4FTPT.js → chunk-WKLSXJD4.js} +2 -2
  133. package/dist/cli/chunks/{chunk-BOMJHE4I.js → chunk-WSKASZYC.js} +2 -2
  134. package/dist/cli/chunks/{chunk-6GKXC6DE.js → chunk-WVFLNGOK.js} +2 -2
  135. package/dist/cli/chunks/{chunk-SUXUCW5I.js → chunk-WVHH3OQ4.js} +2 -2
  136. package/dist/cli/chunks/{chunk-CGC63MGF.js → chunk-XAULPLOC.js} +4 -4
  137. package/dist/cli/chunks/{chunk-L4IWZXSC.js → chunk-XKMMFQSJ.js} +1 -1
  138. package/dist/cli/chunks/{chunk-7IJBZGZY.js → chunk-XQ6WIPDC.js} +1 -1
  139. package/dist/cli/chunks/{chunk-LKGLKX2A.js → chunk-ZCE6JNRI.js} +2 -2
  140. package/dist/cli/chunks/{chunk-BFCMOMOF.js → chunk-ZCZJYM42.js} +1 -1
  141. package/dist/cli/chunks/{chunk-2L3BCZ2F.js → chunk-ZXLF3IKT.js} +1 -1
  142. package/dist/cli/chunks/{ci-QQ4F5TYO.js → ci-TTP5HJSW.js} +2 -2
  143. package/dist/cli/chunks/{ci-output-QC4WRENA.js → ci-output-TKESU45X.js} +2 -2
  144. package/dist/cli/chunks/{circuit-breaker-HFQUNYTK.js → circuit-breaker-GFRV5R7E.js} +2 -2
  145. package/dist/cli/chunks/{claude-flow-setup-XNSCWIUN.js → claude-flow-setup-LY6MADFA.js} +2 -2
  146. package/dist/cli/chunks/client-ZDVM5WFL.js +2 -0
  147. package/dist/cli/chunks/{cline-installer-S3CECBYL.js → cline-installer-OSAILLDH.js} +2 -2
  148. package/dist/cli/chunks/{code-QHUELDUH.js → code-ASRSOGYH.js} +2 -2
  149. package/dist/cli/chunks/{code-index-extractor-QLA5EQTE.js → code-index-extractor-AMLGVHB7.js} +2 -2
  150. package/dist/cli/chunks/{codex-installer-CQ7JNNOA.js → codex-installer-3CKH3WV4.js} +2 -2
  151. package/dist/cli/chunks/{completions-S33U3KIT.js → completions-MXNPWLOE.js} +91 -10
  152. package/dist/cli/chunks/{complexity-analyzer-J7IEW3EM.js → complexity-analyzer-2Z347PXF.js} +2 -2
  153. package/dist/cli/chunks/{continuedev-installer-DVU24D37.js → continuedev-installer-LE7K745N.js} +2 -2
  154. package/dist/cli/chunks/{copilot-installer-DYISOPBC.js → copilot-installer-CHJL3275.js} +2 -2
  155. package/dist/cli/chunks/{cost-tracker-URJADKKS.js → cost-tracker-C3ZWNNSV.js} +2 -2
  156. package/dist/cli/chunks/{coverage-NGMKJNW6.js → coverage-6JOXBVDL.js} +3 -3
  157. package/dist/cli/chunks/cross-domain-router-J5VK276J.js +2 -0
  158. package/dist/cli/chunks/{cursor-installer-DFBJRDSY.js → cursor-installer-RKCNWO42.js} +2 -2
  159. package/dist/cli/chunks/{daemon-JSKKVVCV.js → daemon-XXWOT6TM.js} +3 -3
  160. package/dist/cli/chunks/{dag-attention-scheduler-YITFS6MR.js → dag-attention-scheduler-37MG6XR4.js} +2 -2
  161. package/dist/cli/chunks/{detect-5APZP2D3.js → detect-QOTL36CE.js} +2 -2
  162. package/dist/cli/chunks/{domain-handler-WHH6XPSZ.js → domain-handler-TJNLNJ7Z.js} +2 -2
  163. package/dist/cli/chunks/{domain-transfer-SERX53SS.js → domain-transfer-FDHC2MGH.js} +2 -2
  164. package/dist/cli/chunks/dream-VCLN6RM4.js +2 -0
  165. package/dist/cli/chunks/esm-node-YZSRCH6T.js +2 -0
  166. package/dist/cli/chunks/eval-JP7CLUTD.js +15 -0
  167. package/dist/cli/chunks/{fast-paths-4MSOOJVK.js → fast-paths-CWTVLIIC.js} +2 -2
  168. package/dist/cli/chunks/{feature-flags-564YFR65.js → feature-flags-H2UU53L4.js} +2 -2
  169. package/dist/cli/chunks/{feature-flags-WJT57IEJ.js → feature-flags-SKFBAHR3.js} +2 -2
  170. package/dist/cli/chunks/{file-discovery-5QVG65WF.js → file-discovery-RWVGKIDB.js} +2 -2
  171. package/dist/cli/chunks/{fleet-CF5JRK5B.js → fleet-JOSUYRTZ.js} +3 -3
  172. package/dist/cli/chunks/{gnn-wrapper-NYQ77563.js → gnn-wrapper-WNOZFTDD.js} +2 -2
  173. package/dist/cli/chunks/{heartbeat-handler-42QJPKHE.js → heartbeat-handler-73YSR6K7.js} +4 -4
  174. package/dist/cli/chunks/{heartbeat-scheduler-7XEAV74Y.js → heartbeat-scheduler-EN52JZUX.js} +2 -2
  175. package/dist/cli/chunks/hnsw-adapter-Y5HVTNJW.js +2 -0
  176. package/dist/cli/chunks/hnsw-index-NZTCPZA5.js +2 -0
  177. package/dist/cli/chunks/{hnsw-legacy-bridge-ZRR6PGWN.js → hnsw-legacy-bridge-PWD6DXS4.js} +2 -2
  178. package/dist/cli/chunks/{hnswlib-node-DY7NOW76.js → hnswlib-node-VAZOCNY7.js} +2 -2
  179. package/dist/cli/chunks/{hooks-IRRHEJLR.js → hooks-K7XGDF2Y.js} +6 -6
  180. package/dist/cli/chunks/{hybrid-router-S4JXJLUY.js → hybrid-router-6W323WKW.js} +2 -2
  181. package/dist/cli/chunks/{hypergraph-engine-WFHZJMP2.js → hypergraph-engine-R2N4C24I.js} +2 -2
  182. package/dist/cli/chunks/{hypergraph-handler-LHUKR7PT.js → hypergraph-handler-AY4YZDOG.js} +3 -3
  183. package/dist/cli/chunks/impact-analyzer-ROWLIS6H.js +2 -0
  184. package/dist/cli/chunks/{init-handler-ZBIW7PSB.js → init-handler-UDBW4P3Z.js} +6 -6
  185. package/dist/cli/chunks/init-wizard-MI76CUL5.js +2 -0
  186. package/dist/cli/chunks/kernel-5WVAV5RX.js +2 -0
  187. package/dist/cli/chunks/{kilocode-installer-JYHA4NW7.js → kilocode-installer-J2NZUDEQ.js} +2 -2
  188. package/dist/cli/chunks/{kiro-installer-OBXTRK77.js → kiro-installer-AHOOKFQH.js} +2 -2
  189. package/dist/cli/chunks/knowledge-graph-QXL3AWPV.js +2 -0
  190. package/dist/cli/chunks/{learning-OAEJHEJD.js → learning-VC7X2HKA.js} +3 -3
  191. package/dist/cli/chunks/{llm-router-NNEOZAVB.js → llm-router-3PU7CH5P.js} +4 -4
  192. package/dist/cli/chunks/{load-WIKLBESW.js → load-WB4JD6X7.js} +2 -2
  193. package/dist/cli/chunks/load-test-2JOY7YH6.js +2 -0
  194. package/dist/cli/chunks/{mcp-KR43GFGP.js → mcp-QUU2DYYK.js} +2 -2
  195. package/dist/cli/chunks/{memory-KQIYKAYU.js → memory-UAEWPG34.js} +5 -5
  196. package/dist/cli/chunks/memory-backend-ZKGLAWQZ.js +2 -0
  197. package/dist/cli/chunks/{memory-handlers-LAI4AO4O.js → memory-handlers-3FBXIZG4.js} +2 -2
  198. package/dist/cli/chunks/{multi-model-executor-NPS3VOAR.js → multi-model-executor-CIUHXR43.js} +2 -2
  199. package/dist/cli/chunks/{opencode-installer-FE475WME.js → opencode-installer-VV6RIHNR.js} +2 -2
  200. package/dist/cli/chunks/{orchestrator-MW4MZ3RW.js → orchestrator-WV27PZZM.js} +20 -20
  201. package/dist/cli/chunks/{pipeline-R2TGZSUA.js → pipeline-JRBCX2U3.js} +2 -2
  202. package/dist/cli/chunks/{platform-N2GZBCBP.js → platform-TUPMH4ND.js} +2 -2
  203. package/dist/cli/chunks/{plugin-V2AQF23V.js → plugin-H757CYQK.js} +2 -2
  204. package/dist/cli/chunks/{prime-radiant-advanced-wasm-ZQSYRLRS.js → prime-radiant-advanced-wasm-5BWO25RA.js} +2 -2
  205. package/dist/cli/chunks/protocol-executor-3Q4QY7G6.js +2 -0
  206. package/dist/cli/chunks/{protocol-handler-V3U724F2.js → protocol-handler-Z6DCNTUU.js} +2 -2
  207. package/dist/cli/chunks/{prove-NCH56HZB.js → prove-4OGWFOUM.js} +2 -2
  208. package/dist/cli/chunks/{provider-manager-7NUHS3T5.js → provider-manager-K736L6LN.js} +2 -2
  209. package/dist/cli/chunks/qe-reasoning-bank-SAMJF3NF.js +2 -0
  210. package/dist/cli/chunks/{quality-J3IVPPPW.js → quality-YFLEATGZ.js} +2 -2
  211. package/dist/cli/chunks/queen-coordinator-OFRH67Y2.js +2 -0
  212. package/dist/cli/chunks/{real-embeddings-VURZXAEY.js → real-embeddings-5QUSL7J4.js} +2 -2
  213. package/dist/cli/chunks/{roocode-installer-STWFJGMR.js → roocode-installer-HDWE5XW3.js} +2 -2
  214. package/dist/cli/chunks/router-UDHEENEY.js +2 -0
  215. package/dist/cli/chunks/routing-feedback-PBZRVFVL.js +2 -0
  216. package/dist/cli/chunks/{routing-handler-6GZT7EXM.js → routing-handler-P6PP3FYW.js} +2 -2
  217. package/dist/cli/chunks/{ruvector-commands-LCPAH6WH.js → ruvector-commands-VNMTRQML.js} +2 -2
  218. package/dist/cli/chunks/{rvf-dual-writer-76LWFT5X.js → rvf-dual-writer-A7VW5CAT.js} +2 -2
  219. package/dist/cli/chunks/{rvf-migration-adapter-G7KFWJKY.js → rvf-migration-adapter-QIPSNASM.js} +2 -2
  220. package/dist/cli/chunks/{rvf-migration-coordinator-3DXOUPWF.js → rvf-migration-coordinator-XT4XDLRZ.js} +2 -2
  221. package/dist/cli/chunks/rvf-native-adapter-CJFEDG74.js +2 -0
  222. package/dist/cli/chunks/safe-db-YMSZFHWP.js +2 -0
  223. package/dist/cli/chunks/schedule-B43N6CVB.js +2 -0
  224. package/dist/cli/chunks/scheduler-ITZH5YQM.js +2 -0
  225. package/dist/cli/chunks/{security-XDBPYA5T.js → security-E2XCP5CG.js} +3 -3
  226. package/dist/cli/chunks/shared-rvf-adapter-PV5ZBJ25.js +2 -0
  227. package/dist/cli/chunks/{shared-rvf-dual-writer-UGXTS2XI.js → shared-rvf-dual-writer-NPWTXHUI.js} +2 -2
  228. package/dist/cli/chunks/sqlite-persistence-RK5CKPHB.js +2 -0
  229. package/dist/cli/chunks/{status-handler-ZLXES3QL.js → status-handler-MWVNDZSZ.js} +2 -2
  230. package/dist/cli/chunks/{structural-health-4PFCOQ7T.js → structural-health-2KZO43IF.js} +2 -2
  231. package/dist/cli/chunks/{sync-3DROIEZN.js → sync-C5BOK3WU.js} +2 -2
  232. package/dist/cli/chunks/{task-handler-4UGZ5VIE.js → task-handler-KRVSHJGJ.js} +2 -2
  233. package/dist/cli/chunks/{task-handlers-I5VVBTWI.js → task-handlers-CKOHD633.js} +2 -2
  234. package/dist/cli/chunks/{test-Z2MM7O5A.js → test-3B7FK6MJ.js} +4 -4
  235. package/dist/cli/chunks/{test-scheduling-AP76GKN5.js → test-scheduling-HZIMSTAX.js} +3 -3
  236. package/dist/cli/chunks/{token-bootstrap-P54N6PZV.js → token-bootstrap-JJCANIHJ.js} +2 -2
  237. package/dist/cli/chunks/{token-usage-AXAZTPA6.js → token-usage-5VCMBZU7.js} +2 -2
  238. package/dist/cli/chunks/{transformers-VOZ2Z7FS.js → transformers-ETUTMOTF.js} +2 -2
  239. package/dist/cli/chunks/{tree-sitter-wasm-parser-IYKLBTXB.js → tree-sitter-wasm-parser-TMR44BKP.js} +2 -2
  240. package/dist/cli/chunks/{types-TKDH5EBW.js → types-GYT6373C.js} +2 -2
  241. package/dist/cli/chunks/unified-memory-LIKELZVA.js +2 -0
  242. package/dist/cli/chunks/unified-memory-hnsw-VTN3MUB4.js +2 -0
  243. package/dist/cli/chunks/unified-persistence-MQVUY5WN.js +2 -0
  244. package/dist/cli/chunks/upgrade-534QLY7P.js +5 -0
  245. package/dist/cli/chunks/{validate-ZGF5FVZE.js → validate-UBVF3CSS.js} +2 -2
  246. package/dist/cli/chunks/{validate-swarm-OPWWUWYA.js → validate-swarm-2XD45EVM.js} +2 -2
  247. package/dist/cli/chunks/{vibium-HEQUGRKJ.js → vibium-NMT6AQ4S.js} +2 -2
  248. package/dist/cli/chunks/visual-security-HVJWGY7T.js +2 -0
  249. package/dist/cli/chunks/{web-tree-sitter-JZ7JCJJR.js → web-tree-sitter-RNG6NRDD.js} +2 -2
  250. package/dist/cli/chunks/{windsurf-installer-2SGRCS6C.js → windsurf-installer-RVCDSJT3.js} +2 -2
  251. package/dist/cli/chunks/witness-chain-5R322YYF.js +2 -0
  252. package/dist/cli/chunks/{witness-chain-LJUYOCB5.js → witness-chain-YDFB22MT.js} +2 -2
  253. package/dist/cli/chunks/{workflow-QORI3KO7.js → workflow-MHW4KHNK.js} +4 -4
  254. package/dist/cli/chunks/workflow-orchestrator-637BCZI4.js +2 -0
  255. package/dist/cli/chunks/{wrappers-3NR7LNB5.js → wrappers-SAZY3C2S.js} +2 -2
  256. package/dist/cli/commands/eval.js +86 -0
  257. package/dist/cli/commands/upgrade.d.ts +96 -0
  258. package/dist/cli/commands/upgrade.js +342 -0
  259. package/dist/cli/completions/index.d.ts +27 -0
  260. package/dist/cli/completions/index.js +112 -14
  261. package/dist/cli/handlers/brain-handler.d.ts +2 -0
  262. package/dist/cli/handlers/brain-handler.js +221 -1
  263. package/dist/cli/index.js +5 -1
  264. package/dist/init/browser-engine-installer.d.ts +60 -1
  265. package/dist/init/browser-engine-installer.js +73 -3
  266. package/dist/init/phases/09-assets.js +9 -2
  267. package/dist/integrations/ruvector/brain-diff.d.ts +93 -0
  268. package/dist/integrations/ruvector/brain-diff.js +281 -0
  269. package/dist/integrations/ruvector/brain-search.d.ts +78 -0
  270. package/dist/integrations/ruvector/brain-search.js +154 -0
  271. package/dist/mcp/bundle.js +1 -1
  272. package/dist/validation/command-eval-runner.d.ts +154 -0
  273. package/dist/validation/command-eval-runner.js +293 -0
  274. package/dist/validation/index.d.ts +2 -0
  275. package/dist/validation/index.js +4 -0
  276. package/package.json +1 -1
  277. package/dist/cli/chunks/adapter-W2EM7ZQ7.js +0 -2
  278. package/dist/cli/chunks/aqe-learning-engine-JQMPNHQU.js +0 -2
  279. package/dist/cli/chunks/base-EOPYE6JR.js +0 -2
  280. package/dist/cli/chunks/brain-handler-IAYJBAFL.js +0 -68
  281. package/dist/cli/chunks/browser-workflow-CSARLAJD.js +0 -2
  282. package/dist/cli/chunks/chunk-53KLVMAT.js +0 -18
  283. package/dist/cli/chunks/chunk-STYNOKOM.js +0 -2
  284. package/dist/cli/chunks/client-3GECKJWB.js +0 -2
  285. package/dist/cli/chunks/cross-domain-router-UYONX76U.js +0 -2
  286. package/dist/cli/chunks/dream-Z5QDQJSM.js +0 -2
  287. package/dist/cli/chunks/esm-node-FOI5Y3O2.js +0 -2
  288. package/dist/cli/chunks/eval-FM3BLVFO.js +0 -15
  289. package/dist/cli/chunks/hnsw-adapter-NOAQ76QF.js +0 -2
  290. package/dist/cli/chunks/hnsw-index-KDIZQRSB.js +0 -2
  291. package/dist/cli/chunks/impact-analyzer-VDXJBWFG.js +0 -2
  292. package/dist/cli/chunks/init-wizard-Q6DEACKX.js +0 -2
  293. package/dist/cli/chunks/kernel-YNQOGTM5.js +0 -2
  294. package/dist/cli/chunks/knowledge-graph-GOZG3YOM.js +0 -2
  295. package/dist/cli/chunks/load-test-UJLTMPXW.js +0 -2
  296. package/dist/cli/chunks/memory-backend-WJH6XER3.js +0 -2
  297. package/dist/cli/chunks/protocol-executor-LYYYHXAX.js +0 -2
  298. package/dist/cli/chunks/qe-reasoning-bank-JK4UKLYY.js +0 -2
  299. package/dist/cli/chunks/queen-coordinator-6OKLSCHV.js +0 -2
  300. package/dist/cli/chunks/router-DDZHCGUD.js +0 -2
  301. package/dist/cli/chunks/routing-feedback-BA66F37P.js +0 -2
  302. package/dist/cli/chunks/rvf-native-adapter-TXTRJNPW.js +0 -2
  303. package/dist/cli/chunks/safe-db-IFBVWIGF.js +0 -2
  304. package/dist/cli/chunks/schedule-WMZLOPCW.js +0 -2
  305. package/dist/cli/chunks/scheduler-WBORWJD5.js +0 -2
  306. package/dist/cli/chunks/shared-rvf-adapter-SQQ27EEI.js +0 -2
  307. package/dist/cli/chunks/sqlite-persistence-XH47B3BG.js +0 -2
  308. package/dist/cli/chunks/unified-memory-NHJHPLIC.js +0 -2
  309. package/dist/cli/chunks/unified-memory-hnsw-IMMCI2XK.js +0 -2
  310. package/dist/cli/chunks/unified-persistence-JS6CEV35.js +0 -2
  311. package/dist/cli/chunks/visual-security-XLO5JBVP.js +0 -2
  312. package/dist/cli/chunks/witness-chain-PPWPHYTY.js +0 -2
  313. package/dist/cli/chunks/workflow-orchestrator-H4DKRHVP.js +0 -2
@@ -231,6 +231,23 @@ export const COMMANDS = {
231
231
  install: { options: ['--shell'] },
232
232
  },
233
233
  },
234
+ // Brain export/import/diff/search
235
+ brain: {
236
+ description: 'Export, import, and inspect QE brain state',
237
+ subcommands: {
238
+ export: { options: ['-o', '--output', '--format', '--db'] },
239
+ import: { options: ['-i', '--input', '--strategy', '--dry-run', '--db'] },
240
+ info: { options: ['-i', '--input'] },
241
+ diff: { options: ['--table', '--verbose', '--json'] },
242
+ search: { options: ['-i', '--input', '--table', '--domain', '--pattern-type', '--since', '--until', '-q', '--query', '-l', '--limit', '--json'] },
243
+ 'witness-backfill': { options: ['--db'] },
244
+ },
245
+ },
246
+ // Native binding advisor
247
+ upgrade: {
248
+ description: 'Detect optional native bindings and recommend install / flag changes',
249
+ options: ['--json', '--strict'],
250
+ },
234
251
  };
235
252
  /**
236
253
  * Task types for completion
@@ -284,40 +301,40 @@ export function generateBashCompletion() {
284
301
 
285
302
  # Helper function to complete test files (*.test.ts, *.spec.ts, *.test.js, etc.)
286
303
  _aqe_complete_test_files() {
287
- local cur="\$1"
304
+ local cur="$1"
288
305
  local IFS=$'\\n'
289
306
  local files=()
290
307
 
291
308
  # Complete test files with common test file patterns
292
309
  # Use find for more reliable glob matching across directories
293
- if [[ -z "\$cur" || "\$cur" == "." ]]; then
310
+ if [[ -z "$cur" || "$cur" == "." ]]; then
294
311
  # No prefix - search from current directory
295
312
  while IFS= read -r file; do
296
- files+=("\$file")
313
+ files+=("$file")
297
314
  done < <(find . -maxdepth 3 -type f \\( -name "*.test.ts" -o -name "*.spec.ts" -o -name "*.test.js" -o -name "*.spec.js" -o -name "*.test.tsx" -o -name "*.spec.tsx" \\) 2>/dev/null | head -30)
298
315
  else
299
316
  # Has prefix - use compgen with glob patterns
300
- files+=(\$(compgen -f -X '!*.test.ts' -- "\$cur" 2>/dev/null))
301
- files+=(\$(compgen -f -X '!*.spec.ts' -- "\$cur" 2>/dev/null))
302
- files+=(\$(compgen -f -X '!*.test.js' -- "\$cur" 2>/dev/null))
303
- files+=(\$(compgen -f -X '!*.spec.js' -- "\$cur" 2>/dev/null))
304
- files+=(\$(compgen -f -X '!*.test.tsx' -- "\$cur" 2>/dev/null))
305
- files+=(\$(compgen -f -X '!*.spec.tsx' -- "\$cur" 2>/dev/null))
317
+ files+=($(compgen -f -X '!*.test.ts' -- "$cur" 2>/dev/null))
318
+ files+=($(compgen -f -X '!*.spec.ts' -- "$cur" 2>/dev/null))
319
+ files+=($(compgen -f -X '!*.test.js' -- "$cur" 2>/dev/null))
320
+ files+=($(compgen -f -X '!*.spec.js' -- "$cur" 2>/dev/null))
321
+ files+=($(compgen -f -X '!*.test.tsx' -- "$cur" 2>/dev/null))
322
+ files+=($(compgen -f -X '!*.spec.tsx' -- "$cur" 2>/dev/null))
306
323
  fi
307
324
 
308
325
  # Also include directories for navigation
309
- COMPREPLY=(\$(compgen -d -- "\$cur"))
326
+ COMPREPLY=($(compgen -d -- "$cur"))
310
327
 
311
328
  # Add test files to completions
312
329
  for file in "\${files[@]}"; do
313
- [[ -n "\$file" ]] && COMPREPLY+=("\$file")
330
+ [[ -n "$file" ]] && COMPREPLY+=("$file")
314
331
  done
315
332
  }
316
333
 
317
334
  # Helper function to complete directories
318
335
  _aqe_complete_directories() {
319
- local cur="\$1"
320
- COMPREPLY=( \$(compgen -d -- "$cur") )
336
+ local cur="$1"
337
+ COMPREPLY=( $(compgen -d -- "$cur") )
321
338
  }
322
339
 
323
340
  # Main completion function (version-agnostic name per ADR-042)
@@ -325,12 +342,13 @@ _aqe_completions() {
325
342
  local cur prev words cword
326
343
  _init_completion || return
327
344
 
328
- local commands="init status health task agent domain protocol test coverage quality security code migrate hypergraph completions"
345
+ local commands="init status health task agent domain protocol test coverage quality security code migrate hypergraph completions brain upgrade"
329
346
  local task_subcmds="submit list cancel status"
330
347
  local agent_subcmds="list spawn"
331
348
  local domain_subcmds="list health"
332
349
  local protocol_subcmds="run"
333
350
  local completions_subcmds="bash zsh fish powershell install"
351
+ local brain_subcmds="export import info diff search witness-backfill"
334
352
  local code_actions="index search impact deps"
335
353
  local test_actions="generate execute"
336
354
 
@@ -663,6 +681,48 @@ _aqe_completions() {
663
681
  ;;
664
682
  esac
665
683
  ;;
684
+ brain)
685
+ case "\${words[2]}" in
686
+ export)
687
+ COMPREPLY=( $(compgen -W "-o --output --format --db" -- "$cur") )
688
+ return
689
+ ;;
690
+ import)
691
+ COMPREPLY=( $(compgen -W "-i --input --strategy --dry-run --db" -- "$cur") )
692
+ return
693
+ ;;
694
+ info)
695
+ COMPREPLY=( $(compgen -W "-i --input" -- "$cur") )
696
+ return
697
+ ;;
698
+ diff)
699
+ COMPREPLY=( $(compgen -W "--table --verbose --json" -- "$cur") )
700
+ return
701
+ ;;
702
+ search)
703
+ case "$prev" in
704
+ --domain)
705
+ COMPREPLY=( $(compgen -W "$domains" -- "$cur") )
706
+ return
707
+ ;;
708
+ esac
709
+ COMPREPLY=( $(compgen -W "-i --input --table --domain --pattern-type --since --until -q --query -l --limit --json" -- "$cur") )
710
+ return
711
+ ;;
712
+ witness-backfill)
713
+ COMPREPLY=( $(compgen -W "--db" -- "$cur") )
714
+ return
715
+ ;;
716
+ *)
717
+ COMPREPLY=( $(compgen -W "$brain_subcmds" -- "$cur") )
718
+ return
719
+ ;;
720
+ esac
721
+ ;;
722
+ upgrade)
723
+ COMPREPLY=( $(compgen -W "--json --strict" -- "$cur") )
724
+ return
725
+ ;;
666
726
  *)
667
727
  COMPREPLY=( $(compgen -W "$commands" -- "$cur") )
668
728
  return
@@ -722,6 +782,8 @@ _aqe() {
722
782
  'hypergraph:Query the code knowledge hypergraph'
723
783
  'migrate:V2 to V3 migration'
724
784
  'completions:Generate shell completions'
785
+ 'brain:Export, import, and inspect QE brain state'
786
+ 'upgrade:Detect optional native bindings and recommend flags'
725
787
  )
726
788
 
727
789
  domains=(
@@ -1016,6 +1078,30 @@ _aqe() {
1016
1078
  ;;
1017
1079
  esac
1018
1080
  ;;
1081
+ brain)
1082
+ local -a brain_commands
1083
+ brain_commands=(
1084
+ 'export:Export brain state to a portable file/directory'
1085
+ 'import:Import a brain export into the local database'
1086
+ 'info:Show manifest metadata for a brain export'
1087
+ 'diff:Compare two brain exports'
1088
+ 'search:Filtered search over a JSONL brain export'
1089
+ 'witness-backfill:Create witness chain entries for legacy patterns'
1090
+ )
1091
+ _arguments -C \\
1092
+ '1:brain subcommand:->brain_cmd' \\
1093
+ '*::arg:->brain_args'
1094
+ case "$state" in
1095
+ brain_cmd)
1096
+ _describe -t commands 'brain subcommands' brain_commands
1097
+ ;;
1098
+ esac
1099
+ ;;
1100
+ upgrade)
1101
+ _arguments \\
1102
+ '--json[Emit the report as JSON]' \\
1103
+ '--strict[Exit non-zero if any optional native is missing]'
1104
+ ;;
1019
1105
  esac
1020
1106
  ;;
1021
1107
  esac
@@ -1063,6 +1149,16 @@ complete -c aqe -n "__fish_seen_subcommand_from hypergraph; and not __fish_seen_
1063
1149
  complete -c aqe -n "__fish_seen_subcommand_from hypergraph; and not __fish_seen_subcommand_from stats untested impacted gaps" -a "impacted" -d "Find impacted tests"
1064
1150
  complete -c aqe -n "__fish_seen_subcommand_from hypergraph; and not __fish_seen_subcommand_from stats untested impacted gaps" -a "gaps" -d "Find coverage gaps"
1065
1151
  complete -c aqe -n "__fish_use_subcommand" -a "migrate" -d "V2 to V3 migration"
1152
+ complete -c aqe -n "__fish_use_subcommand" -a "brain" -d "Export, import, and inspect QE brain state"
1153
+ complete -c aqe -n "__fish_seen_subcommand_from brain; and not __fish_seen_subcommand_from export import info diff search witness-backfill" -a "export" -d "Export brain state"
1154
+ complete -c aqe -n "__fish_seen_subcommand_from brain; and not __fish_seen_subcommand_from export import info diff search witness-backfill" -a "import" -d "Import a brain export"
1155
+ complete -c aqe -n "__fish_seen_subcommand_from brain; and not __fish_seen_subcommand_from export import info diff search witness-backfill" -a "info" -d "Show manifest info"
1156
+ complete -c aqe -n "__fish_seen_subcommand_from brain; and not __fish_seen_subcommand_from export import info diff search witness-backfill" -a "diff" -d "Compare two brain exports"
1157
+ complete -c aqe -n "__fish_seen_subcommand_from brain; and not __fish_seen_subcommand_from export import info diff search witness-backfill" -a "search" -d "Filtered search over a JSONL brain export"
1158
+ complete -c aqe -n "__fish_seen_subcommand_from brain; and not __fish_seen_subcommand_from export import info diff search witness-backfill" -a "witness-backfill" -d "Backfill witness chain entries"
1159
+ complete -c aqe -n "__fish_use_subcommand" -a "upgrade" -d "Detect optional native bindings and recommend install / flag changes"
1160
+ complete -c aqe -n "__fish_seen_subcommand_from upgrade" -l json -d "Emit the report as JSON"
1161
+ complete -c aqe -n "__fish_seen_subcommand_from upgrade" -l strict -d "Exit non-zero if any optional native is missing"
1066
1162
  complete -c aqe -n "__fish_use_subcommand" -a "completions" -d "Generate shell completions"
1067
1163
 
1068
1164
  # Domains list
@@ -1267,6 +1363,8 @@ $script:AQE_COMMANDS = @{
1267
1363
  'hypergraph' = 'Query the code knowledge hypergraph'
1268
1364
  'migrate' = 'V2 to V3 migration'
1269
1365
  'completions' = 'Generate shell completions'
1366
+ 'brain' = 'Export, import, and inspect QE brain state'
1367
+ 'upgrade' = 'Detect optional native bindings and recommend flags'
1270
1368
  }
1271
1369
 
1272
1370
  Register-ArgumentCompleter -Native -CommandName 'aqe' -ScriptBlock {
@@ -16,6 +16,8 @@ export declare class BrainHandler implements ICommandHandler {
16
16
  private executeExport;
17
17
  private executeImport;
18
18
  private executeInfo;
19
+ private executeDiff;
20
+ private executeSearch;
19
21
  private executeWitnessBackfill;
20
22
  getHelp(): string;
21
23
  }
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import path from 'path';
8
8
  import chalk from 'chalk';
9
- import { exportBrain, importBrain, brainInfo, witnessBackfill, } from '../brain-commands.js';
9
+ import { exportBrain, importBrain, brainInfo, brainDiff, brainSearch, witnessBackfill, } from '../brain-commands.js';
10
10
  // ============================================================================
11
11
  // Brain Handler
12
12
  // ============================================================================
@@ -56,6 +56,32 @@ export class BrainHandler {
56
56
  .action(async (options) => {
57
57
  await this.executeWitnessBackfill(options);
58
58
  });
59
+ brain
60
+ .command('diff')
61
+ .description('Compare two brain exports (JSONL directory or .rvf file)')
62
+ .argument('<a>', 'Path to first brain export')
63
+ .argument('<b>', 'Path to second brain export')
64
+ .option('--table <name>', 'Restrict comparison to a single table')
65
+ .option('--verbose', 'Show the IDs of added/removed/changed records', false)
66
+ .option('--json', 'Emit the diff as JSON to stdout', false)
67
+ .action(async (a, b, options) => {
68
+ await this.executeDiff(a, b, options);
69
+ });
70
+ brain
71
+ .command('search')
72
+ .description('Search a JSONL brain export with filters')
73
+ .requiredOption('-i, --input <path>', 'Path to brain export directory (JSONL)')
74
+ .option('--table <name>', 'Table to search (default: qe_patterns)')
75
+ .option('--domain <name...>', 'Restrict to one or more domains')
76
+ .option('--pattern-type <type>', 'Restrict to a specific pattern_type (qe_patterns only)')
77
+ .option('--since <iso>', 'Include rows with timestamp ≥ <iso>')
78
+ .option('--until <iso>', 'Include rows with timestamp ≤ <iso>')
79
+ .option('-q, --query <text>', 'Substring match across name + description (case-insensitive)')
80
+ .option('-l, --limit <n>', 'Maximum results to return', '20')
81
+ .option('--json', 'Emit results as JSON to stdout', false)
82
+ .action(async (options) => {
83
+ await this.executeSearch(options);
84
+ });
59
85
  }
60
86
  async executeExport(options) {
61
87
  try {
@@ -224,6 +250,51 @@ export class BrainHandler {
224
250
  await this.cleanupAndExit(1);
225
251
  }
226
252
  }
253
+ async executeDiff(a, b, options) {
254
+ try {
255
+ const result = await brainDiff(path.resolve(a), path.resolve(b), {
256
+ tableFilter: options.table,
257
+ });
258
+ if (options.json) {
259
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
260
+ await this.cleanupAndExit(result.identical ? 0 : 1);
261
+ return;
262
+ }
263
+ renderDiff(result, options.verbose);
264
+ // Exit code convention: 0 when identical, 1 when differences exist.
265
+ await this.cleanupAndExit(result.identical ? 0 : 1);
266
+ }
267
+ catch (error) {
268
+ console.error(chalk.red('\n Brain diff failed:'), error);
269
+ await this.cleanupAndExit(2);
270
+ }
271
+ }
272
+ async executeSearch(options) {
273
+ try {
274
+ const limit = parseLimit(options.limit);
275
+ const domains = normalizeDomainOption(options.domain);
276
+ const result = await brainSearch(path.resolve(options.input), {
277
+ table: options.table,
278
+ domains,
279
+ patternType: options.patternType,
280
+ since: options.since,
281
+ until: options.until,
282
+ query: options.query,
283
+ limit,
284
+ });
285
+ if (options.json) {
286
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
287
+ await this.cleanupAndExit(result.totalMatched > 0 ? 0 : 3);
288
+ return;
289
+ }
290
+ renderSearch(result);
291
+ await this.cleanupAndExit(result.totalMatched > 0 ? 0 : 3);
292
+ }
293
+ catch (error) {
294
+ console.error(chalk.red('\n Brain search failed:'), error);
295
+ await this.cleanupAndExit(2);
296
+ }
297
+ }
227
298
  async executeWitnessBackfill(options) {
228
299
  try {
229
300
  console.log(chalk.blue('\n Running witness chain backfill...\n'));
@@ -258,6 +329,8 @@ Subcommands:
258
329
  export Export brain state to a portable .rvf file or JSONL directory
259
330
  import Import a brain export into the local database
260
331
  info Show manifest metadata for an existing brain export
332
+ diff Compare two brain exports (manifest always; record-level for JSONL)
333
+ search Filtered search over a JSONL brain export
261
334
 
262
335
  Examples:
263
336
  aqe brain export -o .agentic-qe/brain.rvf
@@ -266,6 +339,9 @@ Examples:
266
339
  aqe brain import -i .agentic-qe/brain.rvf --strategy latest-wins
267
340
  aqe brain import -i .agentic-qe/brain.rvf --dry-run
268
341
  aqe brain info -i .agentic-qe/brain.rvf
342
+ aqe brain diff ./brain-a ./brain-b --verbose
343
+ aqe brain search -i ./brain-export --query oauth --domain test-generation
344
+ aqe brain search -i ./brain-export --since 2026-03-01 --limit 50 --json
269
345
  `;
270
346
  }
271
347
  }
@@ -285,6 +361,150 @@ function formatBytes(bytes) {
285
361
  return `${(bytes / 1024).toFixed(1)} KB`;
286
362
  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
287
363
  }
364
+ function parseLimit(raw) {
365
+ const n = Number.parseInt(raw, 10);
366
+ if (!Number.isFinite(n) || n < 1)
367
+ return 20;
368
+ return n;
369
+ }
370
+ function normalizeDomainOption(value) {
371
+ if (value === undefined)
372
+ return undefined;
373
+ const arr = Array.isArray(value) ? value : [value];
374
+ const out = [];
375
+ for (const raw of arr) {
376
+ for (const part of raw.split(',')) {
377
+ const trimmed = part.trim();
378
+ if (trimmed)
379
+ out.push(trimmed);
380
+ }
381
+ }
382
+ return out.length > 0 ? out : undefined;
383
+ }
384
+ function renderDiff(result, verbose) {
385
+ console.log(chalk.blue('\n Brain Diff\n'));
386
+ console.log(` A: ${chalk.cyan(result.pathA)} (${result.formatA})`);
387
+ console.log(` B: ${chalk.cyan(result.pathB)} (${result.formatB})`);
388
+ console.log(` Versions: ${chalk.cyan(result.manifestA.version)} → ${chalk.cyan(result.manifestB.version)}` +
389
+ (result.versionMatch ? chalk.gray(' (match)') : chalk.yellow(' (differ)')));
390
+ console.log(` Checksums: ${chalk.gray(result.manifestA.checksum.slice(0, 12))}… → ` +
391
+ `${chalk.gray(result.manifestB.checksum.slice(0, 12))}…` +
392
+ (result.checksumMatch ? chalk.gray(' (match)') : chalk.yellow(' (differ)')));
393
+ console.log(` Exported: ${chalk.gray(result.manifestA.exportedAt)} → ${chalk.gray(result.manifestB.exportedAt)}`);
394
+ console.log(` Records: ${chalk.cyan(result.manifestA.totalRecords)} → ${chalk.cyan(result.manifestB.totalRecords)} ` +
395
+ formatDelta(result.manifestB.totalRecords - result.manifestA.totalRecords));
396
+ if (result.domainsOnlyInA.length > 0 || result.domainsOnlyInB.length > 0) {
397
+ console.log(chalk.blue('\n Domains:'));
398
+ if (result.domainsOnlyInA.length > 0) {
399
+ console.log(` Only in A: ${chalk.yellow(result.domainsOnlyInA.join(', '))}`);
400
+ }
401
+ if (result.domainsOnlyInB.length > 0) {
402
+ console.log(` Only in B: ${chalk.yellow(result.domainsOnlyInB.join(', '))}`);
403
+ }
404
+ }
405
+ if (!result.recordLevel) {
406
+ console.log(chalk.gray('\n Note: record-level diff is only available when both sides are JSONL exports.\n' +
407
+ ' Per-table counts shown below; re-export with --format jsonl for added/removed/changed IDs.'));
408
+ }
409
+ console.log(chalk.blue('\n Tables:'));
410
+ const changed = result.tableDiffs.filter(tableHasChange);
411
+ if (changed.length === 0) {
412
+ console.log(chalk.gray(' (no differences)'));
413
+ }
414
+ else {
415
+ for (const t of changed) {
416
+ console.log(` ${t.tableName.padEnd(28)} ${chalk.cyan(String(t.countA).padStart(7))} → ` +
417
+ `${chalk.cyan(String(t.countB).padStart(7))} ${formatDelta(t.delta)}` +
418
+ formatRecordBuckets(t, verbose));
419
+ if (verbose) {
420
+ if (t.added && t.added.length > 0)
421
+ printIdBucket('added', t.added);
422
+ if (t.removed && t.removed.length > 0)
423
+ printIdBucket('removed', t.removed);
424
+ if (t.changed && t.changed.length > 0)
425
+ printIdBucket('changed', t.changed);
426
+ }
427
+ }
428
+ }
429
+ console.log('');
430
+ if (result.identical) {
431
+ console.log(chalk.green(' Result: identical\n'));
432
+ }
433
+ else {
434
+ console.log(chalk.yellow(' Result: differences found\n'));
435
+ }
436
+ }
437
+ function tableHasChange(t) {
438
+ if (t.delta !== 0)
439
+ return true;
440
+ if (t.added && t.added.length > 0)
441
+ return true;
442
+ if (t.removed && t.removed.length > 0)
443
+ return true;
444
+ if (t.changed && t.changed.length > 0)
445
+ return true;
446
+ return false;
447
+ }
448
+ function formatDelta(delta) {
449
+ if (delta === 0)
450
+ return chalk.gray('(±0)');
451
+ if (delta > 0)
452
+ return chalk.green(`(+${delta})`);
453
+ return chalk.red(`(${delta})`);
454
+ }
455
+ function formatRecordBuckets(t, verbose) {
456
+ const parts = [];
457
+ if (t.added && t.added.length > 0)
458
+ parts.push(chalk.green(`+${t.added.length}`));
459
+ if (t.removed && t.removed.length > 0)
460
+ parts.push(chalk.red(`-${t.removed.length}`));
461
+ if (t.changed && t.changed.length > 0)
462
+ parts.push(chalk.yellow(`~${t.changed.length}`));
463
+ if (parts.length === 0)
464
+ return '';
465
+ if (verbose)
466
+ return ' ' + parts.join(' ');
467
+ return ' ' + chalk.gray('[') + parts.join(' ') + chalk.gray(']');
468
+ }
469
+ function printIdBucket(label, ids) {
470
+ const preview = ids.slice(0, 10).join(', ');
471
+ const suffix = ids.length > 10 ? chalk.gray(` …(+${ids.length - 10} more)`) : '';
472
+ console.log(` ${chalk.gray(label + ':')} ${preview}${suffix}`);
473
+ }
474
+ function renderSearch(result) {
475
+ console.log(chalk.blue('\n Brain Search\n'));
476
+ console.log(` Input: ${chalk.cyan(result.inputPath)}`);
477
+ console.log(` Table: ${chalk.cyan(result.table)}`);
478
+ console.log(` Scanned: ${chalk.cyan(result.totalScanned)} ` +
479
+ `Matched: ${chalk.cyan(result.totalMatched)} ` +
480
+ `Shown: ${chalk.cyan(result.hits.length)}` +
481
+ (result.truncated ? chalk.yellow(` (truncated to limit ${result.limit})`) : ''));
482
+ if (result.hits.length === 0) {
483
+ console.log(chalk.yellow('\n No matching rows.\n'));
484
+ return;
485
+ }
486
+ console.log('');
487
+ for (const hit of result.hits) {
488
+ const header = chalk.cyan(hit.id) +
489
+ (hit.display.patternType ? chalk.gray(` ${hit.display.patternType}`) : '') +
490
+ (hit.display.domain ? chalk.gray(` [${hit.display.domain}]`) : '') +
491
+ (hit.display.confidence !== undefined
492
+ ? chalk.gray(` conf=${hit.display.confidence.toFixed(2)}`)
493
+ : '');
494
+ console.log(` ${header}`);
495
+ if (hit.display.name)
496
+ console.log(` ${chalk.bold(hit.display.name)}`);
497
+ if (hit.display.description) {
498
+ const desc = hit.display.description.length > 200
499
+ ? hit.display.description.slice(0, 200) + '…'
500
+ : hit.display.description;
501
+ console.log(` ${chalk.gray(desc)}`);
502
+ }
503
+ if (hit.display.updatedAt)
504
+ console.log(` ${chalk.gray(hit.display.updatedAt)}`);
505
+ console.log('');
506
+ }
507
+ }
288
508
  // ============================================================================
289
509
  // Factory
290
510
  // ============================================================================
package/dist/cli/index.js CHANGED
@@ -47,7 +47,6 @@ console.log = (...args) => {
47
47
  originalConsoleLog(...args);
48
48
  };
49
49
  // Also redirect timestamped INFO/WARN/ERROR log lines (e.g. "[07:12:24.372] [INFO ]")
50
- const originalConsoleInfo = console.info.bind(console);
51
50
  console.info = (...args) => {
52
51
  process.stderr.write(args.map(String).join(' ') + '\n');
53
52
  };
@@ -249,6 +248,11 @@ registerLazyCommand(program, {
249
248
  description: 'Generate shell completions for aqe',
250
249
  factory: () => import('./commands/completions.js').then(m => m.createCompletionsCommand(cleanupAndExit)),
251
250
  });
251
+ registerLazyCommand(program, {
252
+ name: 'upgrade',
253
+ description: 'Detect optional native bindings and recommend install / flag changes',
254
+ factory: () => import('./commands/upgrade.js').then(m => m.createUpgradeCommand(cleanupAndExit)),
255
+ });
252
256
  registerLazyCommand(program, {
253
257
  name: 'fleet',
254
258
  description: 'Fleet operations with multi-agent progress tracking',
@@ -13,6 +13,21 @@
13
13
  * - No new runtime deps: shells out to `npm install -g vibium` via child_process.
14
14
  */
15
15
  import { type SpawnSyncReturns } from 'node:child_process';
16
+ /**
17
+ * Default Vibium npm spec. Major-line pin via caret (`^26.3.18`) — npm
18
+ * semver will accept any 26.x.y >= 26.3.18 but reject 27.0.0+. The intent
19
+ * is to auto-receive security patches and additive minor features while
20
+ * blocking breaking-change major bumps, which is where Vibium's CLI
21
+ * contract (`go`, `--headless`, `viewport`, exit codes) can change.
22
+ *
23
+ * This is NOT a minor-line pin. If a future Vibium 26.y release changes
24
+ * the primitives' expectations, the CI smoke gate (scripts/smoke-test.sh)
25
+ * is the belt-and-suspenders check.
26
+ *
27
+ * Bump procedure: update this constant (e.g. to ^27.0.0 at a major), run
28
+ * scripts/smoke-test.sh against the new version, then land the bump.
29
+ */
30
+ export declare const DEFAULT_VIBIUM_SPEC = "vibium@^26.3.18";
16
31
  /**
17
32
  * Spawner injected into {@link installBrowserEngine} so tests can mock the
18
33
  * shell-out without monkey-patching the child_process module (ESM namespaces
@@ -26,7 +41,7 @@ export type Spawner = (bin: string, args: string[], options: {
26
41
  export interface BrowserEngineInstallerOptions {
27
42
  /** Skip installation entirely (for --minimal or --no-browser-engine). */
28
43
  skip?: boolean;
29
- /** Package name/version spec. Defaults to "vibium". */
44
+ /** Package name/version spec. Defaults to {@link DEFAULT_VIBIUM_SPEC}. */
30
45
  packageSpec?: string;
31
46
  /** Override the npm binary (default: "npm"). */
32
47
  npmBin?: string;
@@ -34,6 +49,8 @@ export interface BrowserEngineInstallerOptions {
34
49
  timeoutMs?: number;
35
50
  /** Test seam — inject a spawner to avoid hitting real processes. */
36
51
  spawner?: Spawner;
52
+ /** Test seam — inject a platform probe for cross-OS diagnostic tests. */
53
+ platformProbe?: PlatformProbe;
37
54
  }
38
55
  export type BrowserEngineInstallStatus = 'already-installed' | 'installed' | 'skipped' | 'install-failed' | 'npm-unavailable';
39
56
  export interface BrowserEngineInstallResult {
@@ -41,7 +58,49 @@ export interface BrowserEngineInstallResult {
41
58
  version?: string;
42
59
  message?: string;
43
60
  packageSpec: string;
61
+ /**
62
+ * Platform diagnostic emitted after a successful install. Present when
63
+ * the current host is one where Vibium's first-run Chrome auto-download
64
+ * is known to fail (e.g. Linux aarch64 at v26.3.x) and we were able to
65
+ * point at a system browser, or couldn't and are saying so explicitly.
66
+ */
67
+ platformHint?: PlatformHint;
68
+ }
69
+ export interface PlatformHint {
70
+ /**
71
+ * Short machine-readable tag for the condition being reported. Consumers
72
+ * can assert on this in tests or suppress the hint in known-good envs.
73
+ */
74
+ code: 'linux-arm64-system-chromium-found' | 'linux-arm64-no-system-chromium';
75
+ /** Single-line human message suitable for `console.warn`. */
76
+ message: string;
77
+ /**
78
+ * Optional filesystem path to a system browser binary the user can point
79
+ * Vibium at via `VIBIUM_BROWSER_PATH`.
80
+ */
81
+ browserPath?: string;
44
82
  }
83
+ /**
84
+ * Injectable seam for `os.platform()` / `os.arch()`. Tests override this
85
+ * to simulate running on a different host.
86
+ */
87
+ export interface PlatformProbe {
88
+ platform: () => NodeJS.Platform;
89
+ arch: () => string;
90
+ existsSync: (path: string) => boolean;
91
+ }
92
+ /**
93
+ * Build a platform hint for hosts where Vibium's first-run Chrome auto-
94
+ * download is known to fail. Today that's just Linux aarch64 at the
95
+ * pinned Vibium version (v26.3.x). Returns `undefined` when no hint
96
+ * applies, so callers can cheaply check for presence.
97
+ *
98
+ * Intentionally conservative: we don't mutate the user's env or create
99
+ * symlinks — we surface a diagnostic with an exact `VIBIUM_BROWSER_PATH`
100
+ * export the user can add. Silent modifications to system state are out
101
+ * of scope for an installer that runs during `aqe init`.
102
+ */
103
+ export declare function diagnosePlatform(probe?: PlatformProbe): PlatformHint | undefined;
45
104
  /**
46
105
  * Detect whether `vibium` is already on PATH. Returns the version string
47
106
  * on success, `null` otherwise. Uses a short timeout because we don't want