ruvnet/ruflo/tree/main/plugins/ruflo-browser
ruflo-browser
セッションを skill として扱うブラウザー自動化。Playwright + RVF cognitive containers + ruvector 軌跡 + AgentDB セレクターメモリー + AIDefence PII/インジェクションゲートを組み合わせます。mod(ADR-445 パターン)として、締め付け専用のツールガード、ローカルのスラッシュコマンド、コンソールが表示するステータスファイルを提供します。
この mod について
ruflo-browser
セッションを skill として扱うブラウザー自動化です。23 個の mcp__plugin_ruflo-core_ruflo__browser_* ツールを Playwright 経由で使い、各セッションを manifest、軌跡、スクリーンショット、サニタイズ済み cookies、検出結果を持つ一級の RVF cognitive container として保存します。AgentDB に索引を作り、AIDefence でゲートします。
v0.2.0 アーキテクチャ — すべてのブラウザーセッションが、アドレス指定可能で、再生可能かつフェデレーション可能なアーティファクトになりました。ステータスは ADR-0001 に従う Proposed です。重要な再生の前提には Accept 前の spike が必要です(ADR Verification §4 を参照)。
基盤との整合(ADR-122)。 本プラグインはユーザー向けの skill 層です。署名済み軌跡(Ed25519 + RVF)、因果グラフの自己修復、AIDefence が認証する cookie vault、フェデレーテッド MCTS、Session Capsules、Workflow Compiler などの基盤プリミティブは、
@claude-flow/[email protected]npm パッケージで提供されます。基盤の告知 と追跡 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 をサニタイズして vault に保存します。 |
| browser-form-fill | フィールド名から値へのマッピングでフォームを操作します。 |
| browser-screenshot-diff | 2 つのセッションのスクリーンショットをピクセル + DOM 差分で比較します(ビジュアル回帰)。 |
| browser-auth-flow | 認証フローのリダイレクト漏れ、CSRF 欠落、弱いセッション cookie を調べます。 |
| browser-test | UI テストレシピ。browser-record + browser-replay を組み合わせます。 |
browser-scrape は browser-extract に委譲する非推奨 shim です。v0.3.0 で削除されます。
メモリーレイヤー(AgentDB)
| 名前空間 | キー | 値 | 目的 |
|-----------|-----|-------|---------|
| browser-sessions | <rvf-id> | manifest の概要 + verdict + tags | /ruflo-browser ls のセッション索引 |
| browser-selectors | <host>:<intent> | {selector, ref, snapshot-hash, last-success} | 埋め込み類似度で DOM の変化に追従 |
| browser-templates | <template-name> | selector chain + post-process を持つスクレイプレシピ | 場当たり的なメモリー文字列を置き換える |
| browser-cookies | <host> | claims でゲートされた cookie blob + expiry + AIDefence verdict | 再認証なしの cookie 再利用 |
生の cookies と tokens はラップされないまま AgentDB に入りません。ADR §3 を参照してください。
AIDefence ゲート(必須)
- 保存前スキャン — スクレイプしたすべての文字列は、AgentDB に保存する前に
aidefence_has_piiを通ります。 - Cookie のサニタイズ —
aidefence_scanが高エントロピー文字列を検出し、browser-cookiesに vault します。 - プロンプトインジェクション検査 — LLM に戻す抽出テキストは
aidefence_is_safeを通ります。検出内容はfindings.mdに隔離されます。[email protected](ADR-118) では、正規のignore all previous instructions系列に加えて、ロール乗っ取り(you are now …/act as …/pretend to be …)と jailbreak マーカー(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 を実行します。session id と rvf path を返します。 |
| browser_session_end | verdict 付きの trajectory-end、rvf compact、browser-sessions への AgentDB 索引を行います。 |
| 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 でテストできます。
検証
相補的なチェックが 2 つあります。
構造 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 サイト、異なる drift プロファイル)。サイトごとの verdict と集計した再生率を spike-results/<timestamp>/STATUS.md に書き込みます。ADR のしきい値は ≥80% で、達成すると ADR-0001 を Proposed から Accepted に変更するゲートになります。しきい値を下回ると、提案は「セッションを監査ログとして扱う」形に下がり、再生と screenshot-diff は best-effort になります。
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 パターン):
- ツールガード(デフォルト on、締め付けのみ:拒否だけ可能)。file/javascript/data/chrome URL、埋め込み資格情報やクラウドメタデータのホストを持つ URL、ページ分離を外したりデバッグポートを開いたりする Chrome 起動フラグへの browser_open を拒否します。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.