agentic-qe 3.9.7 → 3.9.9

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 (335) hide show
  1. package/.claude/skills/README.md +4 -3
  2. package/.claude/skills/a11y-ally/SKILL.md +40 -18
  3. package/.claude/skills/accessibility-testing/SKILL.md +4 -0
  4. package/.claude/skills/compatibility-testing/SKILL.md +23 -0
  5. package/.claude/skills/e2e-flow-verifier/SKILL.md +87 -52
  6. package/.claude/skills/enterprise-integration-testing/SKILL.md +4 -0
  7. package/.claude/skills/localization-testing/SKILL.md +14 -0
  8. package/.claude/skills/observability-testing-patterns/SKILL.md +16 -0
  9. package/.claude/skills/qe-browser/SKILL.md +409 -0
  10. package/.claude/skills/qe-browser/evals/qe-browser.yaml +291 -0
  11. package/.claude/skills/qe-browser/fixtures/package.json +7 -0
  12. package/.claude/skills/qe-browser/fixtures/serve-skills.js +130 -0
  13. package/.claude/skills/qe-browser/references/assertion-kinds.md +132 -0
  14. package/.claude/skills/qe-browser/references/migration-from-playwright.md +195 -0
  15. package/.claude/skills/qe-browser/schemas/output.json +188 -0
  16. package/.claude/skills/qe-browser/scripts/assert.js +378 -0
  17. package/.claude/skills/qe-browser/scripts/batch.js +292 -0
  18. package/.claude/skills/qe-browser/scripts/check-injection.js +267 -0
  19. package/.claude/skills/qe-browser/scripts/intent-score.js +325 -0
  20. package/.claude/skills/qe-browser/scripts/lib/vibium.js +330 -0
  21. package/.claude/skills/qe-browser/scripts/package.json +7 -0
  22. package/.claude/skills/qe-browser/scripts/smoke-test.sh +212 -0
  23. package/.claude/skills/qe-browser/scripts/validate-config.json +46 -0
  24. package/.claude/skills/qe-browser/scripts/visual-diff.js +276 -0
  25. package/.claude/skills/qe-visual-accessibility/SKILL.md +31 -1
  26. package/.claude/skills/security-visual-testing/SKILL.md +18 -0
  27. package/.claude/skills/skills-manifest.json +20 -13
  28. package/.claude/skills/testability-scoring/SKILL.md +23 -0
  29. package/.claude/skills/trust-tier-manifest.json +14 -3
  30. package/.claude/skills/visual-testing-advanced/SKILL.md +41 -1
  31. package/CHANGELOG.md +79 -0
  32. package/README.md +5 -3
  33. package/assets/skills/README.md +4 -3
  34. package/assets/skills/a11y-ally/SKILL.md +40 -18
  35. package/assets/skills/accessibility-testing/SKILL.md +4 -0
  36. package/assets/skills/compatibility-testing/SKILL.md +23 -0
  37. package/assets/skills/e2e-flow-verifier/SKILL.md +87 -52
  38. package/assets/skills/enterprise-integration-testing/SKILL.md +4 -0
  39. package/assets/skills/localization-testing/SKILL.md +14 -0
  40. package/assets/skills/observability-testing-patterns/SKILL.md +16 -0
  41. package/assets/skills/qe-browser/SKILL.md +409 -0
  42. package/assets/skills/qe-browser/evals/qe-browser.yaml +291 -0
  43. package/assets/skills/qe-browser/fixtures/package.json +7 -0
  44. package/assets/skills/qe-browser/fixtures/serve-skills.js +130 -0
  45. package/assets/skills/qe-browser/references/assertion-kinds.md +132 -0
  46. package/assets/skills/qe-browser/references/migration-from-playwright.md +195 -0
  47. package/assets/skills/qe-browser/schemas/output.json +188 -0
  48. package/assets/skills/qe-browser/scripts/assert.js +378 -0
  49. package/assets/skills/qe-browser/scripts/batch.js +292 -0
  50. package/assets/skills/qe-browser/scripts/check-injection.js +267 -0
  51. package/assets/skills/qe-browser/scripts/intent-score.js +325 -0
  52. package/assets/skills/qe-browser/scripts/lib/vibium.js +330 -0
  53. package/assets/skills/qe-browser/scripts/package.json +7 -0
  54. package/assets/skills/qe-browser/scripts/smoke-test.sh +212 -0
  55. package/assets/skills/qe-browser/scripts/validate-config.json +46 -0
  56. package/assets/skills/qe-browser/scripts/visual-diff.js +276 -0
  57. package/assets/skills/qe-visual-accessibility/SKILL.md +31 -1
  58. package/assets/skills/security-visual-testing/SKILL.md +18 -0
  59. package/assets/skills/skills-manifest.json +211 -15
  60. package/assets/skills/testability-scoring/SKILL.md +23 -0
  61. package/assets/skills/trust-tier-manifest.json +14 -3
  62. package/assets/skills/visual-testing-advanced/SKILL.md +41 -1
  63. package/dist/cli/bundle.js +5 -5
  64. package/dist/cli/chunks/adapter-XKXEZEMM.js +2 -0
  65. package/dist/cli/chunks/{agent-booster-wasm-MXTWTD4D.js → agent-booster-wasm-QEN7W6VC.js} +2 -2
  66. package/dist/cli/chunks/{agent-handler-6NEP2BOA.js → agent-handler-F3RLG42J.js} +2 -2
  67. package/dist/cli/chunks/{agent-memory-branch-SAPEIGE2.js → agent-memory-branch-U3PZ3CPL.js} +2 -2
  68. package/dist/cli/chunks/aqe-learning-engine-K7XGBDMZ.js +2 -0
  69. package/dist/cli/chunks/{audit-53LCI6R3.js → audit-FF6SP7Q2.js} +2 -2
  70. package/dist/cli/chunks/base-NUF35LIJ.js +2 -0
  71. package/dist/cli/chunks/{better-sqlite3-UZSKFGCK.js → better-sqlite3-CVXRDGQX.js} +2 -2
  72. package/dist/cli/chunks/{brain-handler-67NDDXVO.js → brain-handler-AMTRZ35W.js} +3 -3
  73. package/dist/cli/chunks/{branch-enumerator-IUIGYEK5.js → branch-enumerator-Y4A34YFT.js} +2 -2
  74. package/dist/cli/chunks/{browser-UFUF65LQ.js → browser-ETSF5GZR.js} +2 -2
  75. package/dist/cli/chunks/browser-workflow-MWPELXFA.js +2 -0
  76. package/dist/cli/chunks/{chunk-XD4UFF2Y.js → chunk-22HQFULR.js} +1 -1
  77. package/dist/cli/chunks/{chunk-W4Y4GFRB.js → chunk-2BSVGL35.js} +1 -1
  78. package/dist/cli/chunks/{chunk-KHH5UJXY.js → chunk-2HFPJPQW.js} +2 -2
  79. package/dist/cli/chunks/{chunk-LPLCT2HH.js → chunk-2JAYDTSE.js} +2 -2
  80. package/dist/cli/chunks/{chunk-RGJ4RMUR.js → chunk-2KY5B4ON.js} +8 -8
  81. package/dist/cli/chunks/{chunk-XB2GVTY6.js → chunk-2O3WZ6E3.js} +1 -1
  82. package/dist/cli/chunks/{chunk-5EOM3W6Q.js → chunk-2UP3DYNH.js} +2 -2
  83. package/dist/cli/chunks/{chunk-DS3XAGGL.js → chunk-2X7LDTVD.js} +2 -2
  84. package/dist/cli/chunks/{chunk-NJ5IC6ZR.js → chunk-2ZHA6ORO.js} +1 -1
  85. package/dist/cli/chunks/{chunk-FKJ4XZ6E.js → chunk-3F666FYP.js} +2 -2
  86. package/dist/cli/chunks/{chunk-7TKZ6LK6.js → chunk-3FAEM5M7.js} +1 -1
  87. package/dist/cli/chunks/{chunk-TLTRL32T.js → chunk-3JCZTTFY.js} +1 -1
  88. package/dist/cli/chunks/{chunk-BPYWDM2Y.js → chunk-3NU4C62D.js} +3 -3
  89. package/dist/cli/chunks/{chunk-ZETZATNY.js → chunk-3XR7ARS6.js} +2 -2
  90. package/dist/cli/chunks/{chunk-FHBIJBZ3.js → chunk-4CDSEZD6.js} +2 -2
  91. package/dist/cli/chunks/{chunk-OURDPRGM.js → chunk-4CSINHCB.js} +1 -1
  92. package/dist/cli/chunks/{chunk-YTF5G3RQ.js → chunk-4HDG7OS4.js} +2 -2
  93. package/dist/cli/chunks/{chunk-PMZJ54WX.js → chunk-52RZZV4M.js} +3 -3
  94. package/dist/cli/chunks/{chunk-GOG6L2F7.js → chunk-5DU4YW2S.js} +2 -2
  95. package/dist/cli/chunks/{chunk-6MMRZYYS.js → chunk-5HM66R4W.js} +3 -3
  96. package/dist/cli/chunks/{chunk-BTZEKSWH.js → chunk-5L3EUZJA.js} +2 -2
  97. package/dist/cli/chunks/{chunk-TD2WOW75.js → chunk-5SWY75MJ.js} +2 -2
  98. package/dist/cli/chunks/{chunk-3DXO5CWI.js → chunk-65XCVUP7.js} +1 -1
  99. package/dist/cli/chunks/{chunk-VMWLVRJO.js → chunk-6KQLF3ZO.js} +2 -2
  100. package/dist/cli/chunks/{chunk-HVJXXGB4.js → chunk-6LTJP3DO.js} +4 -4
  101. package/dist/cli/chunks/{chunk-FJEIX3IS.js → chunk-6PJUDLCT.js} +2 -2
  102. package/dist/cli/chunks/{chunk-2TRWUJWG.js → chunk-74FBSJVC.js} +2 -2
  103. package/dist/cli/chunks/{chunk-D3KORDD5.js → chunk-A6GYFTIA.js} +1 -1
  104. package/dist/cli/chunks/{chunk-3KX7CQEM.js → chunk-ADJGMTIW.js} +1 -1
  105. package/dist/cli/chunks/{chunk-TT2YXNHH.js → chunk-AHOP227C.js} +4 -4
  106. package/dist/cli/chunks/{chunk-UXCEJ3AV.js → chunk-ANLFEGDG.js} +2 -2
  107. package/dist/cli/chunks/{chunk-SQQ57TSJ.js → chunk-AT2VD2ZP.js} +2 -2
  108. package/dist/cli/chunks/{chunk-KLLHSXIC.js → chunk-AYMIF4W5.js} +2 -2
  109. package/dist/cli/chunks/{chunk-JJSJSQNJ.js → chunk-B3DA4SCL.js} +1 -1
  110. package/dist/cli/chunks/{chunk-FBVEHGNE.js → chunk-BSES27JE.js} +3 -3
  111. package/dist/cli/chunks/{chunk-MUEFXLGX.js → chunk-BVKS3X2I.js} +1 -1
  112. package/dist/cli/chunks/{chunk-MR7V7QVL.js → chunk-BVOGMK6N.js} +2 -2
  113. package/dist/cli/chunks/{chunk-PHBE2VBN.js → chunk-BYJEK6LX.js} +2 -2
  114. package/dist/cli/chunks/{chunk-YV2PVXJE.js → chunk-BYPBKVTC.js} +1 -1
  115. package/dist/cli/chunks/{chunk-IQLFWO5U.js → chunk-C7YD7O74.js} +2 -2
  116. package/dist/cli/chunks/{chunk-ZEFDSMF4.js → chunk-CCCBGKVY.js} +2 -2
  117. package/dist/cli/chunks/{chunk-SIIYQLKH.js → chunk-CJQLJEO4.js} +2 -2
  118. package/dist/cli/chunks/{chunk-AT6LBLUV.js → chunk-CXWA34RL.js} +2 -2
  119. package/dist/cli/chunks/{chunk-HFPT7QXQ.js → chunk-CZYTPNUI.js} +2 -2
  120. package/dist/cli/chunks/{chunk-YIVZ5Z4V.js → chunk-DI6R2AVP.js} +1 -1
  121. package/dist/cli/chunks/{chunk-JNEG6DKU.js → chunk-DNS7DP2O.js} +1 -1
  122. package/dist/cli/chunks/{chunk-DKBXIBRS.js → chunk-ECNPBD4Y.js} +2 -2
  123. package/dist/cli/chunks/{chunk-7OPVTN5W.js → chunk-ENG5UF7M.js} +2 -2
  124. package/dist/cli/chunks/{chunk-EIGXGMOR.js → chunk-EV2NMWJV.js} +1 -1
  125. package/dist/cli/chunks/{chunk-426OO3RH.js → chunk-FGW5W3YK.js} +2 -2
  126. package/dist/cli/chunks/{chunk-SMKRBNO7.js → chunk-FTF34UME.js} +1 -1
  127. package/dist/cli/chunks/{chunk-VAKJOTGU.js → chunk-GYNGJHYF.js} +2 -2
  128. package/dist/cli/chunks/{chunk-AHB2F42G.js → chunk-HDM43P7H.js} +1 -1
  129. package/dist/cli/chunks/{chunk-ZWAJV4SN.js → chunk-HOWZFW7G.js} +2 -2
  130. package/dist/cli/chunks/{chunk-INJPS7RF.js → chunk-IZC5NPHD.js} +1 -1
  131. package/dist/cli/chunks/{chunk-HEENVPYF.js → chunk-J2DNMVB5.js} +3 -3
  132. package/dist/cli/chunks/{chunk-SP3X35XC.js → chunk-J62N66ZH.js} +1 -1
  133. package/dist/cli/chunks/{chunk-QKJ4LUAM.js → chunk-JIPU4YQK.js} +2 -2
  134. package/dist/cli/chunks/{chunk-4B5IYFKE.js → chunk-JK4K4EH3.js} +2 -2
  135. package/dist/cli/chunks/{chunk-LP6EQI2P.js → chunk-JQJHRQRX.js} +2 -2
  136. package/dist/cli/chunks/{chunk-FOCGOVIM.js → chunk-KSJCMXAJ.js} +2 -2
  137. package/dist/cli/chunks/{chunk-EFHR7LML.js → chunk-MDTF7LE6.js} +2 -2
  138. package/dist/cli/chunks/{chunk-PFTR6XAO.js → chunk-MUCFC3YG.js} +2 -2
  139. package/dist/cli/chunks/{chunk-JRHKFRUB.js → chunk-MUIJVPGB.js} +2 -2
  140. package/dist/cli/chunks/{chunk-WLYSZV5U.js → chunk-MWZN4PYF.js} +2 -2
  141. package/dist/cli/chunks/{chunk-JZYCZMHN.js → chunk-MXMKHI2I.js} +2 -2
  142. package/dist/cli/chunks/{chunk-XOHRM3M7.js → chunk-MZOYBHJ3.js} +3 -3
  143. package/dist/cli/chunks/{chunk-WV3R5JFE.js → chunk-NLKJI73E.js} +2 -2
  144. package/dist/cli/chunks/{chunk-D2C4XNF5.js → chunk-NQ3WHTLT.js} +4 -4
  145. package/dist/cli/chunks/{chunk-BJKRAFS2.js → chunk-NVVF5ROM.js} +2 -2
  146. package/dist/cli/chunks/{chunk-STASZVMY.js → chunk-OEZA7Q2Z.js} +2 -2
  147. package/dist/cli/chunks/{chunk-LHGZRKPO.js → chunk-OFOFXJ3M.js} +2 -2
  148. package/dist/cli/chunks/{chunk-2SJQ3CYN.js → chunk-OMRZUYXN.js} +9 -9
  149. package/dist/cli/chunks/{chunk-KHEAWN23.js → chunk-P6YMECV2.js} +2 -2
  150. package/dist/cli/chunks/{chunk-ZSXSUUBS.js → chunk-PEEN4AAK.js} +1 -1
  151. package/dist/cli/chunks/{chunk-6ULPQTIE.js → chunk-PRJUO2OQ.js} +2 -2
  152. package/dist/cli/chunks/{chunk-ECRYU5XG.js → chunk-PYTXZMXR.js} +2 -2
  153. package/dist/cli/chunks/{chunk-4NHE7AJE.js → chunk-Q2ZBPOUX.js} +1 -1
  154. package/dist/cli/chunks/{chunk-XY5FMZRA.js → chunk-QHATTMJC.js} +2 -2
  155. package/dist/cli/chunks/{chunk-HE5VY2BI.js → chunk-QMNAELZG.js} +2 -2
  156. package/dist/cli/chunks/{chunk-KZSZHP32.js → chunk-QQLQEQJM.js} +2 -2
  157. package/dist/cli/chunks/{chunk-7GPYOMVY.js → chunk-QSA23PJ6.js} +1 -1
  158. package/dist/cli/chunks/{chunk-GGPGY5QT.js → chunk-QTYTM7C7.js} +2 -2
  159. package/dist/cli/chunks/{chunk-YR5ZNQT2.js → chunk-QZMBJ67L.js} +2 -2
  160. package/dist/cli/chunks/{chunk-URBXUDY3.js → chunk-R23PJGH7.js} +2 -2
  161. package/dist/cli/chunks/{chunk-NKX2Z546.js → chunk-R5ZKFJ3H.js} +1 -1
  162. package/dist/cli/chunks/{chunk-KO5HO6MY.js → chunk-RLLDZNLF.js} +2 -2
  163. package/dist/cli/chunks/{chunk-ZLQYGO6N.js → chunk-RZYTJSQT.js} +1 -1
  164. package/dist/cli/chunks/{chunk-ZV7FGZNJ.js → chunk-S6VT7VAO.js} +2 -2
  165. package/dist/cli/chunks/{chunk-QI5VGEKC.js → chunk-SVLO2DVL.js} +2 -2
  166. package/dist/cli/chunks/{chunk-SURZYSSL.js → chunk-TTENF6AH.js} +1 -1
  167. package/dist/cli/chunks/{chunk-6OKXGDT3.js → chunk-UEKDDUGV.js} +2 -2
  168. package/dist/cli/chunks/{chunk-UEFAPTBV.js → chunk-UYKIPSRX.js} +1 -1
  169. package/dist/cli/chunks/{chunk-WS4OVAWU.js → chunk-VIIUJRKA.js} +2 -2
  170. package/dist/cli/chunks/chunk-VRH3YLO2.js +2 -0
  171. package/dist/cli/chunks/{chunk-YHZWNT45.js → chunk-VTX4NAWB.js} +2 -2
  172. package/dist/cli/chunks/{chunk-APPVAGD5.js → chunk-VWHALAEO.js} +1 -1
  173. package/dist/cli/chunks/{chunk-BWNH22V2.js → chunk-W4VDPHWC.js} +1 -1
  174. package/dist/cli/chunks/{chunk-CDFYF33M.js → chunk-W57I57M4.js} +2 -2
  175. package/dist/cli/chunks/{chunk-LZ34CKYE.js → chunk-WDWIJDQR.js} +2 -2
  176. package/dist/cli/chunks/{chunk-W4HUWBPK.js → chunk-WEJJWJ5M.js} +2 -2
  177. package/dist/cli/chunks/{chunk-A5VULTCD.js → chunk-WZR4CKR4.js} +1 -1
  178. package/dist/cli/chunks/{chunk-DL46KSFX.js → chunk-XZ2JYMFT.js} +2 -2
  179. package/dist/cli/chunks/{chunk-WAP7ROO5.js → chunk-YISXT54V.js} +2 -2
  180. package/dist/cli/chunks/{chunk-HWDE4RB3.js → chunk-YRORPSPA.js} +2 -2
  181. package/dist/cli/chunks/{chunk-T7R5NXJW.js → chunk-YXE67VME.js} +6 -6
  182. package/dist/cli/chunks/{chunk-UDBSEFUT.js → chunk-Z7AFNZMI.js} +2 -2
  183. package/dist/cli/chunks/{chunk-52MUZGZF.js → chunk-ZEUORIH2.js} +2 -2
  184. package/dist/cli/chunks/{chunk-SQZ3H6WR.js → chunk-ZKXA4VBK.js} +3 -3
  185. package/dist/cli/chunks/{chunk-EL2WLSUI.js → chunk-ZTI3BATG.js} +2 -2
  186. package/dist/cli/chunks/{ci-F4F3SDHP.js → ci-4QYE6JBM.js} +2 -2
  187. package/dist/cli/chunks/{ci-output-4SUMOQGO.js → ci-output-MV75HUK7.js} +2 -2
  188. package/dist/cli/chunks/{claude-flow-setup-NKXPDFMJ.js → claude-flow-setup-CZITY7SG.js} +2 -2
  189. package/dist/cli/chunks/client-VXVVUQDV.js +2 -0
  190. package/dist/cli/chunks/{cline-installer-3FMNXEKM.js → cline-installer-ZLQKCPFF.js} +2 -2
  191. package/dist/cli/chunks/{code-5QEDZNKI.js → code-NYEXOJVP.js} +2 -2
  192. package/dist/cli/chunks/{code-index-extractor-RD5EAOLE.js → code-index-extractor-TITXUC44.js} +2 -2
  193. package/dist/cli/chunks/{codex-installer-UU4O2FIE.js → codex-installer-TWT4LIL2.js} +2 -2
  194. package/dist/cli/chunks/{completions-CS6RJLYZ.js → completions-2KNV2MZG.js} +2 -2
  195. package/dist/cli/chunks/{complexity-analyzer-U4DE2QTP.js → complexity-analyzer-2U3OVRDX.js} +2 -2
  196. package/dist/cli/chunks/{continuedev-installer-E55EG2TB.js → continuedev-installer-BWQBRVTC.js} +2 -2
  197. package/dist/cli/chunks/{copilot-installer-TVJUX3AZ.js → copilot-installer-CYN33NMG.js} +2 -2
  198. package/dist/cli/chunks/{cost-tracker-IAKDLDJH.js → cost-tracker-2GUCBYLK.js} +2 -2
  199. package/dist/cli/chunks/{coverage-LX7UIEKV.js → coverage-BAVD66VL.js} +3 -3
  200. package/dist/cli/chunks/cross-domain-router-HUJG6CFC.js +2 -0
  201. package/dist/cli/chunks/{cursor-installer-2NJ7MK23.js → cursor-installer-ZQAUD47B.js} +2 -2
  202. package/dist/cli/chunks/{daemon-T4CPOFHM.js → daemon-VY2LZPIM.js} +3 -3
  203. package/dist/cli/chunks/{dag-attention-scheduler-GAPYYUHZ.js → dag-attention-scheduler-JNQWWXSW.js} +2 -2
  204. package/dist/cli/chunks/{detect-RU5LBCCI.js → detect-Y7BBW4LI.js} +2 -2
  205. package/dist/cli/chunks/{domain-handler-LKPDVPF6.js → domain-handler-473WNSR2.js} +2 -2
  206. package/dist/cli/chunks/{domain-transfer-Q76ITWBK.js → domain-transfer-R4VK7CRR.js} +2 -2
  207. package/dist/cli/chunks/dream-QQDRI2EQ.js +2 -0
  208. package/dist/cli/chunks/esm-node-Y3HIFLTX.js +2 -0
  209. package/dist/cli/chunks/{eval-TFFIZGTW.js → eval-TJAZGRCM.js} +2 -2
  210. package/dist/cli/chunks/{fast-paths-V6KA3VWH.js → fast-paths-LMN542IB.js} +2 -2
  211. package/dist/cli/chunks/{feature-flags-MYSY53UU.js → feature-flags-IMFZ7KED.js} +2 -2
  212. package/dist/cli/chunks/{feature-flags-DWS4XL2P.js → feature-flags-WMXIDTXL.js} +2 -2
  213. package/dist/cli/chunks/{file-discovery-AMKZRFLT.js → file-discovery-GXXWQJV3.js} +2 -2
  214. package/dist/cli/chunks/{fleet-B2BJFKEV.js → fleet-WIC7RHJV.js} +3 -3
  215. package/dist/cli/chunks/{gnn-wrapper-SOJHQ7VC.js → gnn-wrapper-PVKCXV25.js} +2 -2
  216. package/dist/cli/chunks/{heartbeat-handler-O7FF6NRE.js → heartbeat-handler-BJ6ZZP7Q.js} +4 -4
  217. package/dist/cli/chunks/{heartbeat-scheduler-WOGW5R7J.js → heartbeat-scheduler-3SQXTFYU.js} +2 -2
  218. package/dist/cli/chunks/hnsw-adapter-VKS7ORL2.js +2 -0
  219. package/dist/cli/chunks/hnsw-index-GPUBY6EQ.js +2 -0
  220. package/dist/cli/chunks/{hnsw-legacy-bridge-CC5YS47X.js → hnsw-legacy-bridge-23HFWIPK.js} +2 -2
  221. package/dist/cli/chunks/{hnswlib-node-FTWYRETS.js → hnswlib-node-4GRFMUPD.js} +2 -2
  222. package/dist/cli/chunks/{hooks-ETOFFBMV.js → hooks-IXH5454I.js} +6 -6
  223. package/dist/cli/chunks/{hypergraph-engine-FGAHFWFO.js → hypergraph-engine-TEQMJFJJ.js} +2 -2
  224. package/dist/cli/chunks/{hypergraph-handler-GNWJD7E3.js → hypergraph-handler-3ECUWIG3.js} +3 -3
  225. package/dist/cli/chunks/impact-analyzer-D6MBGRKX.js +2 -0
  226. package/dist/cli/chunks/{init-handler-BEYOLKQO.js → init-handler-TZRKW3NZ.js} +6 -6
  227. package/dist/cli/chunks/init-wizard-S6P2MFJF.js +2 -0
  228. package/dist/cli/chunks/kernel-EFDDMNXJ.js +2 -0
  229. package/dist/cli/chunks/{kilocode-installer-ED6LYSEM.js → kilocode-installer-IPH3O3ZS.js} +2 -2
  230. package/dist/cli/chunks/{kiro-installer-NG77T5YR.js → kiro-installer-VROMOOQO.js} +2 -2
  231. package/dist/cli/chunks/knowledge-graph-4PM4DFH3.js +2 -0
  232. package/dist/cli/chunks/{learning-P3WY3LTI.js → learning-JYQLD66S.js} +3 -3
  233. package/dist/cli/chunks/{llm-router-ETSFMOWS.js → llm-router-CIICNICY.js} +2 -2
  234. package/dist/cli/chunks/{load-PP3GVQT7.js → load-DMAQB4NC.js} +2 -2
  235. package/dist/cli/chunks/load-test-PPSWF3TO.js +2 -0
  236. package/dist/cli/chunks/{mcp-B2VX7EKL.js → mcp-K6CSUBMU.js} +2 -2
  237. package/dist/cli/chunks/{memory-SBZQ6MZ4.js → memory-5BSXKHSK.js} +5 -5
  238. package/dist/cli/chunks/memory-backend-3E6BA2JU.js +2 -0
  239. package/dist/cli/chunks/{memory-handlers-5RMGG2CR.js → memory-handlers-APOLXPNH.js} +2 -2
  240. package/dist/cli/chunks/{opencode-installer-PIDIFO2L.js → opencode-installer-IUWO2QV6.js} +2 -2
  241. package/dist/cli/chunks/{orchestrator-FSGUODZI.js → orchestrator-Z2EM76CR.js} +22 -19
  242. package/dist/cli/chunks/{pipeline-BQ5MWZPT.js → pipeline-OL5SI2RI.js} +2 -2
  243. package/dist/cli/chunks/{platform-6EJK4QMD.js → platform-VNJIKIHZ.js} +2 -2
  244. package/dist/cli/chunks/{plugin-EDGOMUJY.js → plugin-SJJUE47D.js} +2 -2
  245. package/dist/cli/chunks/{prime-radiant-advanced-wasm-4S6FYKPP.js → prime-radiant-advanced-wasm-ZLVTCNSH.js} +2 -2
  246. package/dist/cli/chunks/protocol-executor-2RD52J5J.js +2 -0
  247. package/dist/cli/chunks/{protocol-handler-ETM7PMQU.js → protocol-handler-HTX44YTW.js} +2 -2
  248. package/dist/cli/chunks/{prove-YUBORZAP.js → prove-MGFLVZNS.js} +2 -2
  249. package/dist/cli/chunks/qe-reasoning-bank-OGKT52EN.js +2 -0
  250. package/dist/cli/chunks/{quality-XPZDC5FJ.js → quality-FMFKPICZ.js} +2 -2
  251. package/dist/cli/chunks/queen-coordinator-B63YXNI6.js +2 -0
  252. package/dist/cli/chunks/{real-embeddings-KTDUTUJL.js → real-embeddings-2BMEEOA2.js} +2 -2
  253. package/dist/cli/chunks/{roocode-installer-WADVKI3P.js → roocode-installer-2PA3B5JI.js} +2 -2
  254. package/dist/cli/chunks/router-NDQCJQC6.js +2 -0
  255. package/dist/cli/chunks/routing-feedback-PSN2RLDO.js +2 -0
  256. package/dist/cli/chunks/{routing-handler-OOPOYHEV.js → routing-handler-SNGSQ757.js} +2 -2
  257. package/dist/cli/chunks/{ruvector-commands-UPEZL4OK.js → ruvector-commands-54MYLF63.js} +2 -2
  258. package/dist/cli/chunks/{rvf-dual-writer-TOBBCJ7K.js → rvf-dual-writer-6Q44XJOJ.js} +2 -2
  259. package/dist/cli/chunks/{rvf-migration-adapter-U7UM2U36.js → rvf-migration-adapter-JECN625C.js} +2 -2
  260. package/dist/cli/chunks/{rvf-migration-coordinator-CUX3EU2X.js → rvf-migration-coordinator-MEAVIHQY.js} +2 -2
  261. package/dist/cli/chunks/rvf-native-adapter-F56HQKLS.js +2 -0
  262. package/dist/cli/chunks/safe-db-LMRMNROL.js +2 -0
  263. package/dist/cli/chunks/schedule-OZSUYPPC.js +2 -0
  264. package/dist/cli/chunks/scheduler-GFXCQ6ZA.js +2 -0
  265. package/dist/cli/chunks/{security-AQ4N5YKV.js → security-CXLXTNIV.js} +3 -3
  266. package/dist/cli/chunks/shared-rvf-adapter-RZPF4WWK.js +2 -0
  267. package/dist/cli/chunks/{shared-rvf-dual-writer-OKRIHVSY.js → shared-rvf-dual-writer-SOQDKE6S.js} +2 -2
  268. package/dist/cli/chunks/sqlite-persistence-VP67CJPK.js +2 -0
  269. package/dist/cli/chunks/{status-handler-HSJLJPNG.js → status-handler-NNEF4SQV.js} +2 -2
  270. package/dist/cli/chunks/{structural-health-KWZAS7ON.js → structural-health-FY6QIA55.js} +2 -2
  271. package/dist/cli/chunks/{sync-6L5Z4IWH.js → sync-2QMSZ67Q.js} +2 -2
  272. package/dist/cli/chunks/{task-handler-KEAIPB6G.js → task-handler-GZJPE2QW.js} +2 -2
  273. package/dist/cli/chunks/{task-handlers-BPDN6OSM.js → task-handlers-AHM37D4I.js} +2 -2
  274. package/dist/cli/chunks/{test-PICO6RLU.js → test-JVA2S2R2.js} +4 -4
  275. package/dist/cli/chunks/{test-scheduling-BI3R3DX5.js → test-scheduling-PRMP4H6X.js} +3 -3
  276. package/dist/cli/chunks/{token-bootstrap-KMQC6ALU.js → token-bootstrap-YJEHCBV2.js} +2 -2
  277. package/dist/cli/chunks/{token-usage-QGDX7MLB.js → token-usage-G73L32OF.js} +2 -2
  278. package/dist/cli/chunks/{transformers-UNRYJSIU.js → transformers-U3TSLEGO.js} +2 -2
  279. package/dist/cli/chunks/{tree-sitter-wasm-parser-U22JYPOG.js → tree-sitter-wasm-parser-QXP2MNSX.js} +2 -2
  280. package/dist/cli/chunks/{types-CYXAGOY5.js → types-BIQ7O5VR.js} +2 -2
  281. package/dist/cli/chunks/unified-memory-JB4KPMPI.js +2 -0
  282. package/dist/cli/chunks/unified-memory-hnsw-RPSZZIWP.js +2 -0
  283. package/dist/cli/chunks/unified-persistence-L23T4C5C.js +2 -0
  284. package/dist/cli/chunks/{validate-IUY5BWAV.js → validate-CTBEA4BZ.js} +2 -2
  285. package/dist/cli/chunks/{validate-swarm-FXFKSEOI.js → validate-swarm-PHT6XW3A.js} +2 -2
  286. package/dist/cli/chunks/{vibium-DKZ64NR3.js → vibium-CRCYAH3V.js} +2 -2
  287. package/dist/cli/chunks/visual-security-F2I524IQ.js +2 -0
  288. package/dist/cli/chunks/{web-tree-sitter-WQDTN5CV.js → web-tree-sitter-2MH3G7K7.js} +2 -2
  289. package/dist/cli/chunks/{windsurf-installer-O5WOBFOQ.js → windsurf-installer-LBRNYFSI.js} +2 -2
  290. package/dist/cli/chunks/witness-chain-CN6FCWRY.js +2 -0
  291. package/dist/cli/chunks/{witness-chain-F7WXEVJA.js → witness-chain-HNFQLO7Q.js} +2 -2
  292. package/dist/cli/chunks/{workflow-47524I5G.js → workflow-DNAF6BQ2.js} +4 -4
  293. package/dist/cli/chunks/workflow-orchestrator-JJBCCNYI.js +2 -0
  294. package/dist/cli/chunks/{wrappers-MP2HWQD7.js → wrappers-U7AO6ZZN.js} +2 -2
  295. package/dist/init/browser-engine-installer.d.ts +60 -0
  296. package/dist/init/browser-engine-installer.js +92 -0
  297. package/dist/init/phases/09-assets.d.ts +2 -0
  298. package/dist/init/phases/09-assets.js +65 -0
  299. package/dist/init/skills-installer.js +1 -0
  300. package/dist/mcp/bundle.js +1 -1
  301. package/package.json +1 -1
  302. package/dist/cli/chunks/adapter-GE3RSG32.js +0 -2
  303. package/dist/cli/chunks/aqe-learning-engine-IYL6TK6E.js +0 -2
  304. package/dist/cli/chunks/base-L3G3GEZY.js +0 -2
  305. package/dist/cli/chunks/browser-workflow-7KTCY5FI.js +0 -2
  306. package/dist/cli/chunks/chunk-N5SLJOBK.js +0 -2
  307. package/dist/cli/chunks/client-3DPPDO2H.js +0 -2
  308. package/dist/cli/chunks/cross-domain-router-JOYTUBFT.js +0 -2
  309. package/dist/cli/chunks/dream-IF2HCRW4.js +0 -2
  310. package/dist/cli/chunks/esm-node-LNRP5BNU.js +0 -2
  311. package/dist/cli/chunks/hnsw-adapter-UPX4AXOQ.js +0 -2
  312. package/dist/cli/chunks/hnsw-index-CSI2EXXR.js +0 -2
  313. package/dist/cli/chunks/impact-analyzer-2YVBHMES.js +0 -2
  314. package/dist/cli/chunks/init-wizard-V6GZQMMR.js +0 -2
  315. package/dist/cli/chunks/kernel-EHJ4SP2Y.js +0 -2
  316. package/dist/cli/chunks/knowledge-graph-ZYXBWGKL.js +0 -2
  317. package/dist/cli/chunks/load-test-VDZEYGKV.js +0 -2
  318. package/dist/cli/chunks/memory-backend-IB3BU4VM.js +0 -2
  319. package/dist/cli/chunks/protocol-executor-H2ZG7JBJ.js +0 -2
  320. package/dist/cli/chunks/qe-reasoning-bank-ZCSHSKZU.js +0 -2
  321. package/dist/cli/chunks/queen-coordinator-NEC373VS.js +0 -2
  322. package/dist/cli/chunks/router-3PP5XRTD.js +0 -2
  323. package/dist/cli/chunks/routing-feedback-JNUFV2X3.js +0 -2
  324. package/dist/cli/chunks/rvf-native-adapter-PTOZXG4W.js +0 -2
  325. package/dist/cli/chunks/safe-db-CGYNYUES.js +0 -2
  326. package/dist/cli/chunks/schedule-NRN4WOHX.js +0 -2
  327. package/dist/cli/chunks/scheduler-DRAQGYLL.js +0 -2
  328. package/dist/cli/chunks/shared-rvf-adapter-6UVVDOHK.js +0 -2
  329. package/dist/cli/chunks/sqlite-persistence-3WG7PBPL.js +0 -2
  330. package/dist/cli/chunks/unified-memory-EXRANFUS.js +0 -2
  331. package/dist/cli/chunks/unified-memory-hnsw-GB752D44.js +0 -2
  332. package/dist/cli/chunks/unified-persistence-V2B3YWFD.js +0 -2
  333. package/dist/cli/chunks/visual-security-YMPI7X7V.js +0 -2
  334. package/dist/cli/chunks/witness-chain-7LIPUVMI.js +0 -2
  335. package/dist/cli/chunks/workflow-orchestrator-QPIAR4LI.js +0 -2
@@ -0,0 +1,409 @@
1
+ ---
2
+ name: "qe-browser"
3
+ description: "Browser automation for QE agents using Vibium (WebDriver BiDi) with assertions, batch execution, visual diff, prompt-injection scanning, and semantic intents. Use when any QE skill needs to drive a real browser — visual testing, accessibility audits, E2E flow verification, pentest validation, or exploratory testing."
4
+ trust_tier: 3
5
+ validation:
6
+ schema_path: schemas/output.json
7
+ validator_path: scripts/validate-config.json
8
+ eval_path: evals/qe-browser.yaml
9
+ ---
10
+
11
+ # QE Browser
12
+
13
+ Thin AQE-owned wrapper around [Vibium](https://github.com/VibiumDev/vibium) that adds QE-specific primitives: typed assertions, batch execution, visual-diff against baselines, prompt-injection scanning, and semantic intent scoring.
14
+
15
+ **Engine:** Vibium — single ~10MB Go binary, built on WebDriver BiDi (W3C standard), Apache-2.0 licensed, published on npm/PyPI/Maven Central. Auto-launches a background daemon and auto-downloads Chrome for Testing on first use.
16
+
17
+ **Why Vibium, not Playwright?**
18
+ - 10MB binary vs ~300MB Playwright install
19
+ - WebDriver BiDi standard (not CDP) — future-proof for Firefox/Safari
20
+ - `--json` mode on every command (matches AQE structured-output rule)
21
+ - Built-in MCP server: `npx -y vibium mcp`
22
+ - First-class semantic locators: `find text|label|placeholder|testid|role|xpath|alt|title`
23
+
24
+ ## Platform support (verified 2026-04-09 against Vibium v26.3.18)
25
+
26
+ | Platform | `npm install -g vibium` | `vibium go <url>` | smoke-test.sh |
27
+ |---|---|---|---|
28
+ | macOS arm64 (Apple Silicon native) | ✅ | ✅ | ✅ |
29
+ | macOS x64 (Intel) | ✅ | ✅ | ✅ |
30
+ | Linux x86_64 | ✅ | ✅ | ✅ |
31
+ | Windows x64 | ✅ | ✅ | not yet tested |
32
+ | **Linux ARM64 (aarch64)** | ✅ binary itself | ⚠️ **Workaround required** | ✅ after workaround |
33
+
34
+ ### Linux ARM64 workaround
35
+
36
+ Google Chrome for Testing does not publish a `linux-arm64` build. Vibium falls back to `chrome-linux64` (x86_64) on aarch64 hosts, which fails under Rosetta with `failed to open elf at /lib64/ld-linux-x86-64.so.2`. To run qe-browser on a Linux ARM64 codespace or container:
37
+
38
+ ```bash
39
+ # 1. Install Vibium normally — the vibium binary itself IS native ARM64
40
+ npm install -g vibium
41
+
42
+ # 2. Install Debian's native ARM64 chromium + chromedriver
43
+ sudo apt-get update
44
+ sudo apt-get install -y chromium chromium-driver
45
+
46
+ # 3. Symlink Vibium's broken cached binaries to the native system ones.
47
+ # Run after `vibium install` (auto-runs on first `vibium go`).
48
+ for dir in ~/.cache/vibium/chrome-for-testing/*/; do
49
+ # Newer Vibium layout (v26.3.x): chromedriver and chrome at the root
50
+ if [ -e "$dir/chromedriver" ]; then
51
+ rm -f "$dir/chromedriver" "$dir/chrome"
52
+ ln -s /usr/bin/chromedriver "$dir/chromedriver"
53
+ ln -s /usr/bin/chromium "$dir/chrome"
54
+ fi
55
+ # Older Vibium layout: chromedriver-linux64/ and chrome-linux64/ subdirs
56
+ if [ -e "$dir/chromedriver-linux64/chromedriver" ]; then
57
+ rm -f "$dir/chromedriver-linux64/chromedriver" "$dir/chrome-linux64/chrome"
58
+ ln -s /usr/bin/chromedriver "$dir/chromedriver-linux64/chromedriver"
59
+ ln -s /usr/bin/chromium "$dir/chrome-linux64/chrome"
60
+ fi
61
+ done
62
+
63
+ # 4. Verify
64
+ vibium --headless go https://httpbin.org/html
65
+ vibium --headless title # → "Herman Melville - Moby-Dick"
66
+ ```
67
+
68
+ This workaround is verified working on Debian bookworm aarch64 with chromium 146.0.7680.177-1~deb12u1. Track upstream — when Vibium adds a `--browser-path` flag or Google ships `linux-arm64` Chrome for Testing, this section becomes obsolete.
69
+
70
+ ## Headless mode
71
+
72
+ Helper scripts (`assert.js`, `batch.js`, `visual-diff.js`, `check-injection.js`, `intent-score.js`) automatically inject `--headless` into every `vibium` invocation because the qe-browser skill is designed for QE/CI use cases where there's no display server. **Vibium itself defaults to "visible by default"** — running `vibium go` on a headless container without `--headless` fails with `Missing X server or $DISPLAY`.
73
+
74
+ Opt out for interactive debugging:
75
+ ```bash
76
+ QE_BROWSER_HEADED=1 node .claude/skills/qe-browser/scripts/assert.js --checks '...'
77
+ ```
78
+
79
+ When you call `vibium` directly (not through a helper), pass `--headless` yourself if you're in a container:
80
+ ```bash
81
+ vibium --headless go https://example.com
82
+ vibium --headless title
83
+ ```
84
+
85
+ ## Activation
86
+
87
+ - When a QE skill needs to navigate, read, interact with, or capture a web page
88
+ - When running visual regression tests against stored baselines
89
+ - When asserting page state (URL, text visibility, console errors, network failures)
90
+ - When validating exploitability of security findings (pentest)
91
+ - When scanning untrusted pages for prompt injection
92
+ - When running batch automation with explicit pass/fail gates
93
+
94
+ ## Core Workflow
95
+
96
+ Every browser-driven QE task follows the same shape:
97
+
98
+ 1. **Navigate** — `vibium go <url>`
99
+ 2. **Map** — `vibium map` to get element refs (`@e1`, `@e2`, …)
100
+ 3. **Interact** — `vibium click @e1`, `vibium fill @e2 "text"`
101
+ 4. **Verify** — use this skill's `assert.js` to run typed checks, OR use `vibium diff map` to see what changed
102
+ 5. **Re-map** if DOM changed
103
+
104
+ ```bash
105
+ # Typical login flow verification
106
+ vibium go https://app.example.com/login
107
+ vibium map --json > /tmp/refs.json
108
+ vibium fill @e1 "$USERNAME"
109
+ vibium fill @e2 "$PASSWORD"
110
+ vibium click @e3
111
+ vibium wait url "/dashboard"
112
+ node .claude/skills/qe-browser/scripts/assert.js --checks '[
113
+ {"kind": "url_contains", "text": "/dashboard"},
114
+ {"kind": "no_console_errors"},
115
+ {"kind": "no_failed_requests"}
116
+ ]'
117
+ ```
118
+
119
+ ## Ref Lifecycle — use `diff map`
120
+
121
+ Vibium refs are invalidated when the DOM changes. Instead of versioning refs manually, Vibium gives you `vibium diff map` which shows exactly what's new, removed, or repositioned since the last `map` call. After any interaction that changes the DOM:
122
+
123
+ ```bash
124
+ vibium click @e3
125
+ vibium diff map --json # shows added/removed/moved refs
126
+ ```
127
+
128
+ This is cleaner than tracking version numbers — you get a structured delta you can feed directly into the next action.
129
+
130
+ ## QE Primitives (this skill's value-add)
131
+
132
+ All scripts live in `.claude/skills/qe-browser/scripts/` and shell out to `vibium`. They expect `vibium` to be on PATH (installed by `aqe init`).
133
+
134
+ ### `assert.js` — Typed assertions with 16 check kinds
135
+
136
+ ```bash
137
+ node scripts/assert.js --checks '[
138
+ {"kind": "url_contains", "text": "/dashboard"},
139
+ {"kind": "text_visible", "text": "Welcome"},
140
+ {"kind": "selector_visible", "selector": "#user-menu"},
141
+ {"kind": "value_equals", "selector": "input[name=email]", "value": "user@test.com"},
142
+ {"kind": "no_console_errors"},
143
+ {"kind": "no_failed_requests"},
144
+ {"kind": "response_status", "url": "/api/user", "status": 200},
145
+ {"kind": "element_count", "selector": ".result", "op": ">=", "count": 5}
146
+ ]'
147
+ ```
148
+
149
+ All 16 kinds: `url_contains`, `url_equals`, `text_visible`, `text_hidden`, `selector_visible`, `selector_hidden`, `value_equals`, `attribute_equals`, `no_console_errors`, `no_failed_requests`, `response_status`, `request_url_seen`, `console_message_matches`, `element_count`, `title_matches`, `page_source_contains`.
150
+
151
+ Full reference: [references/assertion-kinds.md](references/assertion-kinds.md).
152
+
153
+ Exit code is non-zero if any check fails. Output is JSON: `{ "passed": N, "failed": M, "results": [...] }`.
154
+
155
+ ### `batch.js` — Multi-step execution with stop-on-failure
156
+
157
+ ```bash
158
+ node scripts/batch.js --steps '[
159
+ {"action": "go", "url": "https://example.com/login"},
160
+ {"action": "fill", "ref": "@e1", "text": "user@test.com"},
161
+ {"action": "fill", "ref": "@e2", "text": "secret"},
162
+ {"action": "click", "ref": "@e3"},
163
+ {"action": "wait_url", "pattern": "/dashboard"},
164
+ {"action": "assert", "checks": [{"kind": "no_console_errors"}]}
165
+ ]' --summary-only
166
+ ```
167
+
168
+ Reduces round-trips vs calling `vibium` per step. Supports `--stop-on-failure` (default true) and `--summary-only`.
169
+
170
+ ### `visual-diff.js` — Pixel diff against stored baselines
171
+
172
+ ```bash
173
+ # First run — creates baseline
174
+ node scripts/visual-diff.js --name "homepage"
175
+
176
+ # Subsequent runs — compare
177
+ node scripts/visual-diff.js --name "homepage" --threshold 0.05
178
+
179
+ # Scope to an element
180
+ node scripts/visual-diff.js --name "hero" --selector "#hero"
181
+
182
+ # Reset baseline after intentional change
183
+ node scripts/visual-diff.js --name "homepage" --update-baseline
184
+ ```
185
+
186
+ Baselines stored in `.aqe/visual-baselines/` (project-local, gitignored by default). Uses `pixelmatch` for pixel comparison; returns similarity % and diff image path.
187
+
188
+ ### `check-injection.js` — Prompt injection scanner
189
+
190
+ Scans the current page content for known prompt-injection patterns (ignore previous instructions, system prompts in hidden text, etc.). Ported from gsd-browser's heuristic scanner (MIT/Apache).
191
+
192
+ ```bash
193
+ vibium go https://untrusted-page.com
194
+ node scripts/check-injection.js --include-hidden --json
195
+ ```
196
+
197
+ Returns severity-ranked findings. Intended for `pentest-validation`, `injection-analyst`, and `aidefence-guardian`.
198
+
199
+ ### `intent-score.js` — 15 semantic intents
200
+
201
+ Heuristic-scored element discovery — no LLM round-trip. Ported from gsd-browser's `intent.rs:59-385` (MIT/Apache).
202
+
203
+ ```bash
204
+ node scripts/intent-score.js --intent accept_cookies
205
+ node scripts/intent-score.js --intent submit_form --scope "#login-form"
206
+ node scripts/intent-score.js --intent primary_cta
207
+ ```
208
+
209
+ Intents: `submit_form`, `close_dialog`, `primary_cta`, `search_field`, `next_step`, `dismiss`, `auth_action`, `back_navigation`, `fill_email`, `fill_password`, `fill_username`, `accept_cookies`, `main_content`, `pagination_next`, `pagination_prev`.
210
+
211
+ Returns top 5 candidates with scores and selectors. Useful for dismissing cookie banners, finding login forms, and navigating through wizards without having to map the whole page.
212
+
213
+ ## Common QE Patterns
214
+
215
+ ### Pattern 1 — Visual regression in CI
216
+
217
+ ```bash
218
+ vibium go "$STAGING_URL"
219
+ vibium wait load
220
+ node scripts/visual-diff.js --name "homepage-$(uname -m)" --threshold 0.02
221
+ # Non-zero exit if diff exceeds threshold
222
+ ```
223
+
224
+ ### Pattern 2 — E2E flow with explicit assertions
225
+
226
+ ```bash
227
+ node scripts/batch.js --steps @flows/login-flow.json
228
+ node scripts/assert.js --checks @assertions/post-login.json
229
+ ```
230
+
231
+ ### Pattern 3 — Accessibility audit without axe round-trip
232
+
233
+ ```bash
234
+ vibium go "$URL"
235
+ vibium a11y-tree --json > a11y.json
236
+ # Analyze a11y.json with axe-core or in-skill rules
237
+ ```
238
+
239
+ ### Pattern 4 — Auth state reuse
240
+
241
+ ```bash
242
+ # Once: log in and save state
243
+ vibium go https://app.example.com/login
244
+ vibium fill "input[name=email]" "$USERNAME"
245
+ vibium fill "input[name=password]" "$PASSWORD"
246
+ vibium click "button[type=submit]"
247
+ vibium wait url "/dashboard"
248
+ vibium storage -o .aqe/auth/myapp.json
249
+
250
+ # Every subsequent run
251
+ vibium storage restore .aqe/auth/myapp.json
252
+ vibium go https://app.example.com/dashboard
253
+ ```
254
+
255
+ ### Pattern 5 — Pentest exploit validation
256
+
257
+ ```bash
258
+ vibium go "$TARGET"
259
+ node scripts/check-injection.js --include-hidden > injection-report.json
260
+ vibium record start --name "exploit-$(date +%s)"
261
+ # Perform exploit steps via vibium commands
262
+ vibium record stop -o evidence.zip
263
+ ```
264
+
265
+ ### Pattern 6 — Semantic cookie banner dismissal
266
+
267
+ ```bash
268
+ vibium go "$URL"
269
+ # Heuristic scoring — no LLM needed
270
+ ACCEPT=$(node scripts/intent-score.js --intent accept_cookies --json | jq -r '.candidates[0].selector // empty')
271
+ [ -n "$ACCEPT" ] && vibium click "$ACCEPT"
272
+ ```
273
+
274
+ ## MCP Integration
275
+
276
+ Vibium ships its own MCP server. Use via:
277
+
278
+ ```bash
279
+ claude mcp add vibium -- npx -y vibium mcp
280
+ ```
281
+
282
+ When Vibium MCP tools are available (`mcp__vibium__*`), prefer them over shell-out for the core navigate/map/click/fill operations. Continue to use this skill's `scripts/` for the QE-specific primitives (assertions, batch, visual-diff, injection, intents) — they are not part of Vibium.
283
+
284
+ ## Fallback Policy
285
+
286
+ If `vibium` is not installed (e.g., `aqe init` hasn't run or user opted out), the qe-browser helper scripts implement the contract automatically. **You don't have to grep error strings.** Each script:
287
+
288
+ 1. Catches the `VibiumUnavailableError` thrown by `lib/vibium.js` when the binary isn't on PATH
289
+ 2. Emits a structured `skipped` envelope (see Output Contract below) with `vibiumUnavailable: true` at the top level and `output.reason: "browser-engine-unavailable"`
290
+ 3. Exits with **exit code 2** (skipped, distinct from 0=success and 1=failed)
291
+ 4. Never silently falls back to Playwright or puppeteer-extra
292
+
293
+ Downstream skills that shell out to these helpers can branch on the structured fields:
294
+
295
+ ```bash
296
+ node .claude/skills/qe-browser/scripts/assert.js --checks "$CHECKS"
297
+ EXIT=$?
298
+ case $EXIT in
299
+ 0) echo "passed" ;;
300
+ 1) echo "failed" ; cat last-output.json ;;
301
+ 2) echo "skipped — vibium not installed; run \`aqe init\` or \`npm install -g vibium\`" ;;
302
+ esac
303
+ ```
304
+
305
+ Or in Node:
306
+ ```javascript
307
+ const result = JSON.parse(stdout);
308
+ if (result.vibiumUnavailable) {
309
+ // Surface skipped status to the caller; do NOT mark as failed
310
+ return { status: 'skipped', reason: result.output.reason };
311
+ }
312
+ ```
313
+
314
+ ## Migration from Playwright
315
+
316
+ If you have an existing Playwright test:
317
+
318
+ ```javascript
319
+ // Playwright
320
+ await page.goto('https://example.com');
321
+ await page.fill('input[name=email]', 'user@test.com');
322
+ await page.click('button[type=submit]');
323
+ await expect(page).toHaveURL(/dashboard/);
324
+ ```
325
+
326
+ Becomes:
327
+
328
+ ```bash
329
+ # qe-browser
330
+ vibium go https://example.com
331
+ vibium fill "input[name=email]" "user@test.com"
332
+ vibium click "button[type=submit]"
333
+ vibium wait url "/dashboard"
334
+ node .claude/skills/qe-browser/scripts/assert.js --checks '[
335
+ {"kind": "url_contains", "text": "/dashboard"}
336
+ ]'
337
+ ```
338
+
339
+ Full migration guide: [references/migration-from-playwright.md](references/migration-from-playwright.md).
340
+
341
+ ## Output Contract
342
+
343
+ All scripts emit a structured JSON envelope. There are three valid `status` values:
344
+
345
+ ### success (exit code 0)
346
+
347
+ ```json
348
+ {
349
+ "skillName": "qe-browser",
350
+ "version": "1.0.0",
351
+ "timestamp": "2026-04-09T12:00:00Z",
352
+ "status": "success",
353
+ "trustTier": 3,
354
+ "output": {
355
+ "operation": "assert",
356
+ "summary": "All 6 assertions passed",
357
+ "assert": { ... }
358
+ },
359
+ "metadata": { "executionTimeMs": 142 }
360
+ }
361
+ ```
362
+
363
+ ### failed (exit code 1)
364
+
365
+ Same shape; `status: "failed"` indicates a genuine assertion failure or operation error. The `output.*` block carries the per-check details.
366
+
367
+ ### skipped (exit code 2) — F1 contract
368
+
369
+ Emitted when vibium is not installed on PATH. Top-level `vibiumUnavailable: true` is the **canonical signal** for downstream skills.
370
+
371
+ ```json
372
+ {
373
+ "skillName": "qe-browser",
374
+ "version": "1.0.0",
375
+ "timestamp": "2026-04-09T12:00:00Z",
376
+ "status": "skipped",
377
+ "trustTier": 3,
378
+ "vibiumUnavailable": true,
379
+ "output": {
380
+ "operation": "assert",
381
+ "summary": "vibium binary not found on PATH. Install via `npm install -g vibium` or run `aqe init`.",
382
+ "reason": "browser-engine-unavailable",
383
+ "error": "vibium binary not found on PATH...",
384
+ "remediation": [
385
+ "Install vibium globally: `npm install -g vibium`",
386
+ "Or re-run `aqe init` to install via the AQE bootstrap",
387
+ "Set QE_BROWSER_HEADED=1 only for interactive debugging (not the cause here)"
388
+ ]
389
+ },
390
+ "metadata": { "executionTimeMs": 0 }
391
+ }
392
+ ```
393
+
394
+ ### Exit code summary
395
+
396
+ | Exit | Status | Meaning |
397
+ |------|-------------|-----------------------------------------------------------|
398
+ | 0 | `success` | every assertion passed / operation completed |
399
+ | 1 | `failed` | genuine assertion failure or operation error |
400
+ | 2 | `skipped` | vibium unavailable; environment problem, not a test result |
401
+
402
+ CI tooling can use the exit code to distinguish "test legitimately failed" (block the build) from "we couldn't run the test because the browser engine isn't installed" (warn but don't block).
403
+
404
+ Validate with `scripts/validate-config.json` + `schemas/output.json`.
405
+
406
+ ## Attribution
407
+
408
+ - Prompt-injection scanner and intent-scoring logic ported from [gsd-browser](https://github.com/gsd-build/gsd-browser) (MIT/Apache-2.0).
409
+ - Engine: [Vibium](https://github.com/VibiumDev/vibium) (Apache-2.0).
@@ -0,0 +1,291 @@
1
+ skill: qe-browser
2
+ version: 1.0.0
3
+ status: design-spec
4
+ description: >
5
+ Manual smoke-test plan for the qe-browser fleet skill, NOT yet a runnable
6
+ automated eval.
7
+
8
+ HONESTY NOTE (devil's-advocate H8): the test cases below use structured
9
+ assertion fields (`exit_code`, `json_fields`, `severity_at_least`,
10
+ `candidate_count_at_least`) that the existing AQE eval runner
11
+ (`src/validation/parallel-eval-runner.ts`) does NOT support — it expects
12
+ `expected_output.must_contain` keyword matching only. This file is
13
+ therefore a SPECIFICATION for what the eval should do, not a runnable
14
+ yaml. Two paths to make it runnable:
15
+
16
+ 1. Extend the eval runner with a `structured_assertions` block that
17
+ evaluates JSON paths against script JSON envelopes (preferred — gives
18
+ us the precision the qe-browser primitives need).
19
+ 2. Rewrite each tc as a `must_contain` test by piping the script's JSON
20
+ envelope through jq and matching keywords (loses precision).
21
+
22
+ Until one of those lands, run `scripts/smoke-test.sh` (alongside this
23
+ file) for the same fixture coverage in shell-script form. That script IS
24
+ runnable today and is what gates PR-reopen per ADR-091 Phase 3.
25
+
26
+ models_to_test:
27
+ - claude-3.5-sonnet
28
+ - claude-3-haiku
29
+
30
+ mcp_integration:
31
+ enabled: true
32
+ namespace: skill-validation
33
+ query_patterns: true
34
+ track_outcomes: true
35
+ store_patterns: true
36
+ target_agents:
37
+ - qe-visual-tester
38
+ - qe-accessibility-auditor
39
+ - qe-pentest-validator
40
+
41
+ learning:
42
+ store_success_patterns: true
43
+ pattern_ttl_days: 90
44
+
45
+ result_format:
46
+ json_output: true
47
+ include_timing: true
48
+ include_token_usage: true
49
+
50
+ setup:
51
+ required_tools:
52
+ - vibium
53
+ - node
54
+ - jq
55
+ optional_tools:
56
+ - pixelmatch
57
+ - pngjs
58
+ local_fixtures:
59
+ # A tiny static server serving this repo's .claude/skills/ docs.
60
+ # Rationale (feedback_synthetic_fixtures_dont_count.md): rather than a
61
+ # synthetic fixture, we serve real markdown content from the repo via a
62
+ # one-liner Node server so every run tests against prose that actually
63
+ # exists and is versioned with the skill.
64
+ local_docs_server:
65
+ command: "node .claude/skills/qe-browser/fixtures/serve-skills.js"
66
+ port: 8088
67
+ base_url: "http://localhost:8088"
68
+
69
+ fixtures:
70
+ public_pinned:
71
+ # Pinned public endpoints — chosen because they're stable, well-known, and
72
+ # serve predictable forms / HTML. Per feedback_no_unverified_failure_modes,
73
+ # these are the canonical "does the tool actually work" fixtures.
74
+ httpbin_form:
75
+ url: "https://httpbin.org/forms/post"
76
+ description: "Classic simple form — custname, custtel, custemail, size, toppings"
77
+ httpbin_html:
78
+ url: "https://httpbin.org/html"
79
+ description: "Static HTML page with known headings"
80
+ httpbin_status_404:
81
+ url: "https://httpbin.org/status/404"
82
+ description: "Known 404 for testing no_failed_requests"
83
+ pinned_docs_site:
84
+ # Pinned to a specific Git tag so the docs don't change under us.
85
+ url: "https://vibiumdev.github.io/vibium/tutorials/getting-started-js"
86
+ pin_version: "v26.3.18"
87
+ description: "Vibium's own getting-started docs — stable, public, versioned"
88
+ local_skills_docs:
89
+ base_url: "http://localhost:8088"
90
+ pages:
91
+ - "/qe-browser/SKILL.md.html"
92
+ - "/qe-browser/references/assertion-kinds.md.html"
93
+
94
+ test_cases:
95
+ # -------- assert.js --------
96
+ - id: tc001_assert_url_contains_httpbin
97
+ description: "url_contains assertion on pinned httpbin form page"
98
+ category: assert
99
+ priority: critical
100
+ input:
101
+ setup:
102
+ - "vibium go https://httpbin.org/forms/post"
103
+ command: |
104
+ node .claude/skills/qe-browser/scripts/assert.js --checks \
105
+ '[{"kind": "url_contains", "text": "httpbin.org/forms"}]'
106
+ expected:
107
+ exit_code: 0
108
+ json_fields:
109
+ ".status": "success"
110
+ ".output.assert.passed": 1
111
+ ".output.assert.failed": 0
112
+
113
+ - id: tc002_assert_selector_visible_h1
114
+ description: "selector_visible on pinned httpbin /html page"
115
+ category: assert
116
+ priority: critical
117
+ input:
118
+ setup:
119
+ - "vibium go https://httpbin.org/html"
120
+ command: |
121
+ node .claude/skills/qe-browser/scripts/assert.js --checks \
122
+ '[{"kind": "selector_visible", "selector": "h1"}]'
123
+ expected:
124
+ exit_code: 0
125
+ json_fields:
126
+ ".status": "success"
127
+
128
+ - id: tc003_assert_failure_detected
129
+ description: "Failing assertion must exit non-zero and report failed>0"
130
+ category: assert
131
+ priority: critical
132
+ input:
133
+ setup:
134
+ - "vibium go https://httpbin.org/html"
135
+ command: |
136
+ node .claude/skills/qe-browser/scripts/assert.js --checks \
137
+ '[{"kind": "url_contains", "text": "this-does-not-exist"}]'
138
+ expected:
139
+ exit_code: 1
140
+ json_fields:
141
+ ".status": "failed"
142
+ ".output.assert.failed": 1
143
+
144
+ # -------- batch.js --------
145
+ - id: tc004_batch_navigate_and_assert
146
+ description: "batch: navigate + wait + assert in a single call"
147
+ category: batch
148
+ priority: critical
149
+ input:
150
+ command: |
151
+ node .claude/skills/qe-browser/scripts/batch.js --steps \
152
+ '[
153
+ {"action": "go", "url": "https://httpbin.org/html"},
154
+ {"action": "wait_load"},
155
+ {"action": "assert", "checks": [
156
+ {"kind": "url_contains", "text": "/html"},
157
+ {"kind": "selector_visible", "selector": "h1"}
158
+ ]}
159
+ ]' --summary-only
160
+ expected:
161
+ exit_code: 0
162
+ json_fields:
163
+ ".status": "success"
164
+ ".output.batch.passedSteps": 3
165
+ ".output.batch.totalSteps": 3
166
+
167
+ - id: tc005_batch_stops_on_failure
168
+ description: "batch: stop-on-failure halts after failed step"
169
+ category: batch
170
+ priority: high
171
+ input:
172
+ command: |
173
+ node .claude/skills/qe-browser/scripts/batch.js --steps \
174
+ '[
175
+ {"action": "go", "url": "https://httpbin.org/html"},
176
+ {"action": "click", "selector": "#does-not-exist"},
177
+ {"action": "go", "url": "https://httpbin.org/forms/post"}
178
+ ]'
179
+ expected:
180
+ exit_code: 1
181
+ json_fields:
182
+ ".status": "failed"
183
+ ".output.batch.passedSteps": 1
184
+ ".output.batch.failedStep.index": 1
185
+
186
+ # -------- visual-diff.js --------
187
+ - id: tc006_visual_diff_baseline_created
188
+ description: "First run creates a baseline and reports baseline_created"
189
+ category: visual-diff
190
+ priority: high
191
+ input:
192
+ setup:
193
+ - "vibium go http://localhost:8088/qe-browser/SKILL.md.html"
194
+ - "rm -rf .aqe/visual-baselines/eval_local_docs*"
195
+ command: |
196
+ node .claude/skills/qe-browser/scripts/visual-diff.js \
197
+ --name eval_local_docs --threshold 0.02
198
+ expected:
199
+ exit_code: 0
200
+ json_fields:
201
+ ".status": "success"
202
+ ".output.visualDiff.status": "baseline_created"
203
+
204
+ - id: tc007_visual_diff_match_second_run
205
+ description: "Second identical run reports match"
206
+ category: visual-diff
207
+ priority: high
208
+ input:
209
+ setup:
210
+ - "vibium go http://localhost:8088/qe-browser/SKILL.md.html"
211
+ command: |
212
+ node .claude/skills/qe-browser/scripts/visual-diff.js \
213
+ --name eval_local_docs --threshold 0.02
214
+ expected:
215
+ exit_code: 0
216
+ json_fields:
217
+ ".status": "success"
218
+ ".output.visualDiff.status": "match"
219
+
220
+ # -------- check-injection.js --------
221
+ - id: tc008_check_injection_clean_page
222
+ description: "Clean page (httpbin /html) reports no findings"
223
+ category: check-injection
224
+ priority: critical
225
+ input:
226
+ setup:
227
+ - "vibium go https://httpbin.org/html"
228
+ command: |
229
+ node .claude/skills/qe-browser/scripts/check-injection.js --include-hidden
230
+ expected:
231
+ exit_code: 0
232
+ json_fields:
233
+ ".status": "success"
234
+ ".output.checkInjection.severity": "none"
235
+
236
+ - id: tc009_check_injection_poisoned_page
237
+ description: "Local poisoned fixture with hidden instructions is detected"
238
+ category: check-injection
239
+ priority: critical
240
+ input:
241
+ setup:
242
+ - "vibium go http://localhost:8088/fixtures/injection-poisoned.html"
243
+ command: |
244
+ node .claude/skills/qe-browser/scripts/check-injection.js --include-hidden
245
+ expected:
246
+ exit_code: 1
247
+ json_fields:
248
+ ".status": "failed"
249
+ severity_at_least: "high"
250
+
251
+ # -------- intent-score.js --------
252
+ - id: tc010_intent_submit_form_on_httpbin
253
+ description: "find submit_form on the httpbin form"
254
+ category: intent-score
255
+ priority: critical
256
+ input:
257
+ setup:
258
+ - "vibium go https://httpbin.org/forms/post"
259
+ command: |
260
+ node .claude/skills/qe-browser/scripts/intent-score.js \
261
+ --intent submit_form
262
+ expected:
263
+ exit_code: 0
264
+ json_fields:
265
+ ".status": "success"
266
+ ".output.intentScore.intent": "submit_form"
267
+ candidate_count_at_least: 1
268
+
269
+ - id: tc011_intent_fill_email_returns_empty_for_non_form_page
270
+ description: "fill_email returns no candidates on httpbin /html"
271
+ category: intent-score
272
+ priority: medium
273
+ input:
274
+ setup:
275
+ - "vibium go https://httpbin.org/html"
276
+ command: |
277
+ node .claude/skills/qe-browser/scripts/intent-score.js --intent fill_email
278
+ expected:
279
+ exit_code: 0
280
+ json_fields:
281
+ ".status": "partial"
282
+ ".output.intentScore.candidateCount": 0
283
+
284
+ validation:
285
+ required_pass_rate: 0.9
286
+ critical_must_pass: true
287
+ notes: |
288
+ Evaluation assumes:
289
+ - `vibium` v26.3.x+ is on PATH (from `aqe init` or `npm install -g vibium`)
290
+ - Network access to httpbin.org (public, stable)
291
+ - Local fixtures server running on :8088 (started in setup.local_docs_server)