ruvnet/ruflo/tree/main/plugins/ruflo-browser
ruflo-browser
將工作階段作為 skill 使用的瀏覽器自動化:Playwright + RVF 認知容器 + ruvector 軌跡 + AgentDB 選擇器記憶 + AIDefence PII/注入守門。作為 mod(ADR-445 模式):只收緊的工具守門、本機斜線指令和控制台顯示的狀態檔。
關於這個 mod
ruflo-browser
将工作階段作为 skill 使用的浏览器自动化外掛。通过 23 个 mcp__plugin_ruflo-core_ruflo__browser_* 工具由 Playwright 驱动,每个工作階段都会被捕获为一等的 RVF 認知容器,其中包含 manifest、軌跡、截圖、已清理的 cookies 和發現結果;它们会建立 AgentDB 索引,并由 AIDefence 守門。
v0.2.0 架構——每个浏览器工作階段现在都是可定址、可重播、可聯邦的工件。狀態为 Proposed,见 ADR-0001;承重的重播假设需要先通过 Accept 前 spike(见 ADR Verification §4)。
基底層对齐(ADR-122)。 本外掛是面向使用者的 skill 层;簽署軌跡(Ed25519 + RVF)、因果图自我修復、AIDefence 驗證的 cookie vault、聯邦 MCTS、Session Capsules、Workflow Compiler 等基底層原語,都随
@claude-flow/[email protected]npm package 發布。见 基底層公告 和追蹤 issue #2041。
安裝
/plugin marketplace add ruvnet/ruflo
/plugin install ruflo-browser@ruflo
工作階段如何运行
浏览器工作階段会在開始时分配一个 RVF 容器,并在結束时提交:
<rvf-id>/
├── manifest.yaml # URL, viewport, profile, runner, lineage
├── trajectory.ndjson # one line per action via ruvector hooks trajectory-step
├── screenshots/<step>.png
├── snapshots/<step>.json # accessibility trees indexed by navigation
├── dom/ # optional, when --with-dom
├── cookies.json # AIDefence-sanitized
└── findings.md # test verdicts, scrape outputs, injection quarantine
使用 rvf ingest <id> 重新開啟,使用 rvf derive 分叉,使用 rvf export 聯邦匯出。
指令
/ruflo-browser 是一个动词分派器:
/ruflo-browser ls [--query <text>] # list sessions, AgentDB-indexed
/ruflo-browser show <session-id> # manifest + trajectory + verdict
/ruflo-browser replay <session-id> # re-drive trajectory
/ruflo-browser export <session-id> # rvf export → tar.zst
/ruflo-browser fork <session-id> # rvf derive → new lineage-tracked session
/ruflo-browser purge <session-id> # destroy, keep redacted manifest
/ruflo-browser doctor # check Playwright, MCP, AgentDB, AIDefence
Skills
| Skill | 用途 |
|-------|---------|
| browser-record | 打开一个有名称且带軌跡的工作階段,并放入 RVF 容器。其他原語在此基础上组合。 |
| browser-replay | 重播已保存的軌跡,可选在不同 URL 上运行或使用变更后的输入。 |
| browser-extract | 运行已保存的 browser-templates 配方,或进行一次性擷取。会扫描 PII。 |
| browser-login | 驱动一次驗證流程,清理并保存 cookies 供后续复用。 |
| browser-form-fill | 按字段名到值的映射进行表单互動。 |
| browser-screenshot-diff | 比较两个工作階段截圖的像素和 DOM 差异(视觉回归)。 |
| browser-auth-flow | 探测驗證流程中的重定向泄漏、缺少 CSRF 和弱工作階段 cookies。 |
| browser-test | UI 测试配方——组合 browser-record + browser-replay。 |
browser-scrape 是委托给 browser-extract 的淘汰兼容层,将在 v0.3.0 移除。
記憶层(AgentDB)
| 命名空间 | 键 | 值 | 用途 |
|-----------|-----|-------|---------|
| browser-sessions | <rvf-id> | manifest 摘要 + verdict + 标签 | /ruflo-browser ls 的工作階段索引 |
| browser-selectors | <host>:<intent> | {selector, ref, snapshot-hash, last-success} | 通过嵌入相似度适应 DOM 漂移 |
| browser-templates | <template-name> | 带 selector 链和后处理的抓取配方 | 取代临时的記憶字符串 |
| browser-cookies | <host> | claims 守門的 cookie blob + expiry + AIDefence verdict | 不重新驗證即可复用 cookie |
原始 cookies 和 tokens 不会未经包装就进入 AgentDB——见 ADR §3。
AIDefence 守門(强制)
- 儲存前扫描——每个抓取到的字符串在存入 AgentDB 前都要通过
aidefence_has_pii。 - Cookie 清理——
aidefence_scan会標記高熵字符串;将其保存到browser-cookiesvault。 - 提示注入檢查——回傳 LLM 的擷取文字要通过
aidefence_is_safe。命中内容会被隔離到findings.md。使用[email protected](ADR-118) 后,檢查除了规范的“ignore all previous instructions”系列,还能捕获角色劫持(you are now …/act as …/pretend to be …)和越獄標記(DAN mode/developer mode/god mode/root mode);这是针对浏览器抓取页面的高杠杆升级。
MCP 面
現有 18 个 mcp__plugin_ruflo-core_ruflo__browser_* 互動原語(位于 browser-tools.ts):open/close/click/type/fill/select/check/uncheck/hover/press/scroll/screenshot/snapshot/eval/wait/reload/back/forward,再加上 5 个新的 browser_session_* 工作階段生命周期工具(在 v0.2.0 实现),总数为 23:
| 工具 | 用途 |
|------|---------|
| browser_session_record | 分配 RVF + ruvector trajectory-begin + agent-browser open。回傳工作階段 id 和 rvf 路径。 |
| browser_session_end | 使用 verdict 执行 trajectory-end + rvf compact,并将索引写入 browser-sessions。 |
| browser_session_replay | 派生 RVF 子容器,并为呼叫方層級的分派加载軌跡步骤。 |
| browser_template_apply | 从 browser-templates AgentDB 命名空间获取配方。 |
| browser_cookie_use | 从 browser-cookies 获取不透明的 vault 句柄;不会回傳原始值。 |
实现位于 v3/@claude-flow/cli/src/mcp-tools/browser-session-tools.ts,并在 mcp-client.ts 中注册。每个 handler 都会呼叫固定版本的 [email protected] CLI 来处理軌跡和 RVF,呼叫現有的 agent-browser CLI 执行浏览器操作,并呼叫桥接的 claude-flow memory 处理 AgentDB。相依缺少时会降级为结构化的 success: false 错误,而不是崩溃。
browser_session_replay 刻意保持为原語:它派生子 RVF 容器,并向呼叫方提供源軌跡,由呼叫方通过相应的 browser_* 工具分派每一步。这样可以把重播引擎留在 MCP 层之外,使承重假设(跨 DOM 漂移的重播保真度)由下面的 spike harness 测试,而不是埋在工具内部。
驗證
有两项互补檢查:
结构 smoke(快速、离线)
bash plugins/ruflo-browser/scripts/smoke.sh
# Expected on green: "13 passed, 0 failed"
驗證外掛的结构完整性:檔案清單、frontmatter 有效性、ADR 交叉引用、agent 中的 AgentDB 命名空间涵蓋、skills 中的 allowed-tools 枚举,以及 CLI 原始碼中是否存在 5 个生命周期 MCP 工具。
重播 spike(互動式、在线——Accept 前的門檻)
bash plugins/ruflo-browser/scripts/replay-spike.sh
它会针对 scripts/SITES.txt 中的每个 URL 记录并重播基线工作階段(預設 10 个網站,漂移設定不同)。它会将每站 verdict 和汇总重播率写入 spike-results/<timestamp>/STATUS.md。ADR 門檻为 ≥80%;达到后才能把 ADR-0001 从 Proposed 切換为 Accepted。低於門檻时,提案会降级为“工作階段稽核日志”(重播和截圖差异比较尽力而为)。
spike 需要 agent-browser(或 npx --yes agent-browser)、[email protected](通过 npx 自动获取)和網路存取。它不属于 smoke test;运行它是一次刻意安排的稽核步骤。
架構决策
相關外掛
ruflo-ruvector— 軌跡 hooks、SONA 模式提炼、MCP 工具ruflo-agentdb— 支撑browser-sessions、browser-selectors、browser-templates、browser-cookies的控制器ruflo-aidefence— PII / 提示注入守門ruflo-federation— 通过 RVF export 跨安裝共用工作階段
授权
MIT
作为 mod
不需要模型呼叫、網路或进程的 function hooks(ADR-445 模式):
- 工具守門(預設开启,只能收紧:只能拒絕)。拒絕对 file/javascript/data/chrome URL 的 browser_open,拒絕含嵌入憑證或云元資料主機的 URL,也拒絕会取消页面隔離或开放调试端口的 Chrome 啟動标志;拒絕读取 cookies/storage 的 browser_eval 指令碼,也拒絕可将它们发送出页面的指令碼。拒絕时绝不会回显違規值。
/browser-mod在本地回答:status、scan <js>和url <url>(守門是否会拒絕它?)。(名称与外掛自己的指令/skills 区分开来,因为 hook 无法回答后者。)- 狀態檔案
.claude-flow/browser-mod/status.json(version、updatedMs、checked、blocked、byRule)在工作階段開始和每次拒絕后写入;控制台会读取它。
選項(userConfig):guard(on/off,預設 on)、strictUrls(預設 off:也拒絕 localhost 之外的一般 http)。
测试:claude plugin validate plugins/ruflo-browser && claude plugin test plugins/ruflo-browser && bash plugins/ruflo-browser/scripts/smoke.sh。
安裝
請先查看作者 README,確認 marketplace 與外掛名稱;指令可能隨儲存庫結構而變動。
claude plugin marketplace add ruvnet/ruflo claude plugin install ruflo-browser
原文 / README
ruflo-browser
Session-as-skill browser automation. Playwright-backed via 23 mcp__plugin_ruflo-core_ruflo__browser_* tools, with each session captured as a first-class RVF cognitive container holding manifest + trajectory + screenshots + sanitized cookies + findings, indexed in AgentDB and gated by AIDefence.
v0.2.0 architecture — every browser session is now an addressable, replayable, federatable artifact. Status is Proposed per ADR-0001; the load-bearing replay assumption requires a pre-Accept spike (see ADR Verification §4).
Substrate alignment (ADR-122). This plugin is the user-facing skill layer; the substrate primitives — signed trajectories (Ed25519 + RVF), causal-graph self-healing, AIDefence-attested cookie vault, federated MCTS, Session Capsules, Workflow Compiler — ship in the
@claude-flow/[email protected]npm package. See the substrate announcement and tracking issue #2041.
Install
/plugin marketplace add ruvnet/ruflo
/plugin install ruflo-browser@ruflo
How sessions work
A browser session is allocated an RVF container at session-start and committed at session-end:
<rvf-id>/
├── manifest.yaml # URL, viewport, profile, runner, lineage
├── trajectory.ndjson # one line per action via ruvector hooks trajectory-step
├── screenshots/<step>.png
├── snapshots/<step>.json # accessibility trees indexed by navigation
├── dom/ # optional, when --with-dom
├── cookies.json # AIDefence-sanitized
└── findings.md # test verdicts, scrape outputs, injection quarantine
Re-open with rvf ingest <id>, fork with rvf derive, federate with rvf export.
Commands
/ruflo-browser is a verb dispatcher:
/ruflo-browser ls [--query <text>] # list sessions, AgentDB-indexed
/ruflo-browser show <session-id> # manifest + trajectory + verdict
/ruflo-browser replay <session-id> # re-drive trajectory
/ruflo-browser export <session-id> # rvf export → tar.zst
/ruflo-browser fork <session-id> # rvf derive → new lineage-tracked session
/ruflo-browser purge <session-id> # destroy, keep redacted manifest
/ruflo-browser doctor # check Playwright, MCP, AgentDB, AIDefence
Skills
| Skill | Purpose |
|-------|---------|
| browser-record | Open a named, traced session into an RVF container. Primitive others compose. |
| browser-replay | Replay a stored trajectory, optionally on a different URL or with mutated inputs. |
| browser-extract | Run a stored browser-templates recipe or one-shot extraction. PII-scanned. |
| browser-login | Drive an auth flow once, sanitize+vault cookies for reuse. |
| browser-form-fill | Form interaction with field-name → value mapping. |
| browser-screenshot-diff | Pixel + DOM diff between two session screenshots (visual regression). |
| browser-auth-flow | Probe an auth flow for redirect leaks, missing CSRF, weak session cookies. |
| browser-test | UI test recipe — composes browser-record + browser-replay. |
browser-scrape is a deprecation shim that delegates to browser-extract. Removed in v0.3.0.
Memory layer (AgentDB)
| Namespace | Key | Value | Purpose |
|-----------|-----|-------|---------|
| browser-sessions | <rvf-id> | manifest summary + verdict + tags | session index for /ruflo-browser ls |
| browser-selectors | <host>:<intent> | {selector, ref, snapshot-hash, last-success} | survives DOM drift via embedding similarity |
| browser-templates | <template-name> | scrape recipe with selector chain + post-process | replaces ad-hoc memory strings |
| browser-cookies | <host> | claims-gated cookie blob + expiry + AIDefence verdict | cookie reuse without re-auth |
Raw cookies and tokens never enter AgentDB unwrapped — see ADR §3.
AIDefence gates (mandatory)
- Pre-storage scan — every scraped string passes
aidefence_has_piibefore AgentDB store. - Cookie sanitization —
aidefence_scanflags high-entropy strings; vault them inbrowser-cookies. - Prompt-injection check — extracted text returning to an LLM passes
aidefence_is_safe. Hits get quarantined tofindings.md. With[email protected](ADR-118) the check now catches role-hijack (you are now …/act as …/pretend to be …) and jailbreak markers (DAN mode/developer mode/god mode/root mode) in addition to the canonicalignore all previous instructionsfamily — high-leverage upgrade for browser-scraped pages.
MCP surface
18 existing mcp__plugin_ruflo-core_ruflo__browser_* interaction primitives (in browser-tools.ts: open/close/click/type/fill/select/check/uncheck/hover/press/scroll/screenshot/snapshot/eval/wait/reload/back/forward) + 5 new browser_session_* lifecycle tools (implemented in v0.2.0) for a total of 23:
| Tool | Purpose |
|------|---------|
| browser_session_record | RVF allocate + ruvector trajectory-begin + agent-browser open. Returns session id + rvf path. |
| browser_session_end | trajectory-end with verdict + rvf compact + AgentDB index in browser-sessions. |
| browser_session_replay | RVF derive child container + load trajectory steps for caller-level dispatch. |
| browser_template_apply | Fetch a recipe from browser-templates AgentDB namespace. |
| browser_cookie_use | Fetch an opaque vault handle from browser-cookies; raw values never returned. |
Implementation: v3/@claude-flow/cli/src/mcp-tools/browser-session-tools.ts, registered in mcp-client.ts. Each handler shells out to the pinned [email protected] CLI for trajectory + RVF, the existing agent-browser CLI for browser actions, and the bridged claude-flow memory for AgentDB. Missing dependencies degrade with structured success: false errors instead of crashing.
browser_session_replay is deliberately a primitive: it derives a child RVF container and surfaces the source trajectory so the caller dispatches each step through the appropriate browser_* tool. That keeps the replay engine out of the MCP layer and makes the load-bearing assumption (replay-fidelity across DOM drift) testable via the spike harness below rather than buried in tool internals.
Verification
Two complementary checks:
Structural smoke (fast, offline)
bash plugins/ruflo-browser/scripts/smoke.sh
# Expected on green: "13 passed, 0 failed"
Verifies plugin structural soundness — file inventory, frontmatter validity, ADR cross-references, AgentDB namespace coverage in the agent, allowed-tools enumeration in skills, and that the 5 lifecycle MCP tools are present in the CLI source.
Replay spike (interactive, online — pre-Accept gate)
bash plugins/ruflo-browser/scripts/replay-spike.sh
Records + replays a baseline session against each URL in scripts/SITES.txt (10 sites by default, varying drift profiles). Writes spike-results/<timestamp>/STATUS.md with per-site verdicts and the aggregate replay rate. The ADR threshold is ≥80%; meeting it is the gate to flip ADR-0001 from Proposed → Accepted. Below the threshold, the proposal degrades to "session as audit log" (replay and screenshot-diff become best-effort).
The spike requires agent-browser (or npx --yes agent-browser), [email protected] (auto-fetched via npx), and network access. It is not part of the smoke test — running it is a deliberate audit step.
Architecture Decisions
Related Plugins
ruflo-ruvector— trajectory hooks, SONA pattern distillation, MCP toolsruflo-agentdb— controllers backingbrowser-sessions,browser-selectors,browser-templates,browser-cookiesruflo-aidefence— PII / prompt-injection gatesruflo-federation— cross-installation session sharing via RVF export
License
MIT
As a mod
Function hooks (ADR-445 pattern, hooks/register.ts) that need no model call, no network and no process:
- Tool guard (default on, tighten-only: it can only deny). Refuses browser_open to file/javascript/data/chrome URLs, URLs with embedded credentials or cloud-metadata hosts, and Chrome launch flags that drop page isolation or open a debug port; refuses browser_eval scripts that read cookies/storage and can also send them off the page. A refusal never echoes the offending value.
/browser-modanswers locally:status,scan <js>andurl <url>(would the guard refuse this?). (A distinct name from the plugin's own commands/skills, which no hook can answer.)- Status file
.claude-flow/browser-mod/status.json(version,updatedMs,checked,blocked,byRule) is written at session start and after each refusal; the console reads it.
Options (userConfig): guard (on/off, default on), strictUrls (default off: also refuse plain http outside localhost).
Test: claude plugin validate plugins/ruflo-browser && claude plugin test plugins/ruflo-browser && bash plugins/ruflo-browser/scripts/smoke.sh.