功能

Hover 今天能做什么,分布在它的四个面:通过 MCP 编写,在可选的驾驶舱中审阅,在 CI 中运行。

编写 —— MCP

编写引擎是一个 MCP server@hover-dev/mcp),把它接入你已经在用的编码 agent 即可。接好之后,你的 agent 就获得了 Hover 那套带有落地约束(grounded)的浏览器工具,外加一个 test_app prompt,用来探索你的应用并 crystallize 出一整套测试。

  • MCP 工具 —— 带落地约束的操作工具(click_control / fill_control / select_control / check_control)、browser_navigate / browser_snapshotcrystallize_specrecall / record_fact 记忆工具,以及 test_app / heal prompt。agent 通过这些工具执行动作,所以驱动某个动作的那个 selector,就是最终被保存下来的那个。
  • API testing —— Hover 在同一条 CDP 连接上被动捕获应用的浏览器流量(不走 proxy),把值得固定下来的检查 crystallize 成一个纯粹的 *.api-test.spec.ts,并用 replay_request 验证过,绝不凭空编造 status code。
  • 登录与凭据 —— agent 通过每个环境各自的 @account 登录;密码会被脱敏成 process.env.HOVER_PASSWORD,登录动作被提取到一个 auth.setup.ts fixture,整套测试只跑一次。密码绝不写进 spec、JSDoc 或 sidecar。
  • 白盒源码阅读 —— 一个可选的、只读的源码阅读器,agent 可以用它把测试落到你的代码上。默认关闭;限定为只读。

输出

  • Crystallize 一个 spec —— __vibe_tests__/<slug>.spec.ts,使用 getByRole / getByLabel / getByTestId,以确定性方式生成(没有 LLM 在写代码)。不依赖 Hover 就能在 CI 里跑。每个交互都被包在一段可见性前置校验里,所以 UI 一旦漂移,大约 3 秒就会以 Locator expected to be visible 失败,而不是拖到 30 秒的 actionability 超时。
  • 结构化的 spec 输出 —— 保存下来的 spec 会长出一套结构:test.step 阶段划分、弹窗 / 新标签页的 Promise.all 配对,以及一个 .hover/sidecars/<slug>.json sidecar。
  • Page Object 抽取 —— 当某个非登录流程在多个 spec 里重复出现时,Hover 把它提取到 pages/ + fixtures.ts 并把相关 spec 折叠进来,这样对该流程的改动就变成改一个文件。确定性,无 LLM。
  • 优化一个 spec —— 一个可选、默认关闭的 AI pass,把一份确定性草稿打磨成一个经过 diff 审阅的候选版本:补上运行时观察到的断言,把有 bug 的行为标记为 // KNOWN BUG,并始终保留原始版本。

维护

  • 自愈一个漂移的 spec —— 当 UI 变化、某个录制下来的 selector 不再匹配时,/mcp__hover__heal 会把该 spec 对着线上应用重放,找到坏掉的那一步,只对那一步重新落地约束。record == replay 得以保留。

记忆

  • 会复利增长的测试知识 —— Hover 在 .hover/ 下维护一份 Business Map,记录你应用的各条流程 + 记下来的规则,随你的代码一起提交。整套测试始终"自知",并随你的应用成长而变得更聪明。

审阅 —— 可选的驾驶舱

VS Code 扩展hyperyond.hover-dev)是一个可选的审阅驾驶舱,不是引擎:一张展示你各条流程 + 覆盖情况的 Business Map 图,以及一个 Dashboard(通过 / 失败 / flaky + CI 结果),支持一键运行。它只做审阅 —— 它不驱动任何 agent。

运行 —— CI

crystallize 出来的 spec 就是纯粹的 @playwright/test。它们在每个 PR 上运行,不需要 agent、不需要 token、不需要 key。Hover 可以帮你生成 GitHub Actions workflow,并把运行结果拉回 Dashboard。