ClaudeMods
☰
JA
● 0 人がオンライン ・閲覧 0 回
スポンサー作品を投稿
GitHub リポジトリ · 投稿者 ruvnet

ruflo-browser

セッションを skill として扱うブラウザー自動化。Playwright + RVF cognitive containers + ruvector 軌跡 + AgentDB セレクターメモリー + AIDefence PII/インジェクションゲートを組み合わせます。mod(ADR-445 パターン)として、締め付け専用のツールガード、ローカルのスラッシュコマンド、コンソールが表示するステータスファイルを提供します。

ruvnet@ruvnet

ruvnet/ruflo/tree/main/plugins/ruflo-browser

翻訳済み

この 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 ゲート(必須)

  1. 保存前スキャン — スクレイプしたすべての文字列は、AgentDB に保存する前に aidefence_has_pii を通ります。
  2. Cookie のサニタイズ — aidefence_scan が高エントロピー文字列を検出し、browser-cookies に vault します。
  3. プロンプトインジェクション検査 — 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)

  1. Pre-storage scan — every scraped string passes aidefence_has_pii before AgentDB store.
  2. Cookie sanitization — aidefence_scan flags high-entropy strings; vault them in browser-cookies.
  3. Prompt-injection check — extracted text returning to an LLM passes aidefence_is_safe. Hits get quarantined to findings.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 canonical ignore all previous instructions family — 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 tools
  • ruflo-agentdb — controllers backing browser-sessions, browser-selectors, browser-templates, browser-cookies
  • ruflo-aidefence — PII / prompt-injection gates
  • ruflo-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-mod answers locally: status, scan <js> and url <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.

関連作品