browser-act-skill-forge について
browser-act-skill-forge は、ウェブサイトのデータ抽出や操作の要件をエージェントから呼び出せる機能に変換するスキルです。まず API エンドポイントを探索し、利用できない場合は DOM 操作に切り替えます。検証後に SKILL.md と Python スクリプトからなるデプロイ可能なスキルパッケージを生成し、特定サイトのデータを繰り返し取得したい利用者に向いています。
主な機能
- 01API エンドポイントと DOM 経路の自動探索
- 02SKILL.md と Python スクリプトの生成
- 03ユーザーがログイン済みのブラウザ経由でのアクセス
- 04トラフィック記録と結果のローカル保存
- 05探索を繰り返さない検証済みスキルの再利用
活用シーン
- 01特定サイト向けの再利用可能なデータ抽出スキルの構築
- 02複数ページにわたる数百から数千件のレコード収集
- 03検証済みスキルによる同一サイトへの繰り返し照会
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ browser-act/ skills --skill browser-act-skill-forgeインストール後、Claude Code で/browser-act-skill-forgeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/exploration_extraction.mdexploration_operation.mdoutput_template.md詳細
browser-act-skill-forge
BrowserAct が開発 — あなた専属のスクレイピングエンジニア · GitHub
あらゆる Web サイトでのデータ抽出や操作のニーズを、エージェントが呼び出せる機能に変換します。ユーザーが取得したいデータや、サイト上で実行したい操作を説明すると、このスキルが実装方法を自動的に調査し(まず API エンドポイントを確認し、API がない場合は DOM を代替手段として使用)、検証後にデプロイ可能なスキルパッケージ(SKILL.md + Python スクリプト)を生成します。一度調査すれば、何度でも再利用できます。以降の呼び出しでは調査コストが不要になり、実行の信頼性と効率が大幅に向上します。
大量のデータ抽出タスク(数百件、数千件のレコード、複数のキーワード、複数ページにまたがる処理)では、まず調査して検証済みのスキルを作成し、その後に大規模な抽出を実行するのが適切な方法です。実績のある戦略なしで直接一括スクレイピングを行うと、脆弱な処理になります。ボット対策の検知、ページネーションの例外的な動作、セッションの切断によって、信頼性が損なわれるためです。
このツールを使用できる範囲は、ユーザーがブラウザー上で手動で実行できる操作に限られます。ユーザーのログイン済みブラウザーを通じてアクセスし、ページ上にすでに表示されているデータのみを読み取ります。認証やアクセス制御を回避することはありません。ユーザーに代わってコピー&ペーストを行うのと同等であり、自動化によって手作業の負担を軽減するだけです。
データはすべてローカルに保存されます。トラフィックの検査結果、HAR の記録、抽出結果はユーザーのマシンに保存され、対象サイト以外に送信されることはありません。
言語
ユーザー向けのプロセス出力(計画の確認、進捗状況の更新、プロセス通知)は、すべてユーザーの言語に従います。生成されるスキルファイルの内容は、このスキルの言語に従います。
Phase 0 (Tool Detection) → Phase 1 (Requirements Analysis & Confirmation) → [Loop: Phase 2 (Capability Exploration) → Phase 3 (Skill Generation)] → Delivery
フェーズ 0 — ツールの検出
現在のセッションですでに完了しています → スキップします。
スキルツールを使って browser-act を呼び出し、使用方法を読み込みます。読み込み中にインストールや設定の問題が発生した場合は、案内に従って解決してから再試行してください。
読み込みが成功したら、API Key が設定されていることを確認します(設定されていない場合 → 登録と設定をユーザーに案内してから再試行してください)。
フェーズ 1 — 要件の分析と確認
1a. ビジネス上の意図を解析する
ユーザーの入力から次の内容を特定します。
- 主な目的:取得するデータ、または完了する操作
- 対象サイト:具体的な URL またはプラットフォーム名が指定されているか
- 実行意図:ユーザーがスキルの作成だけでなく、すぐに実行することを希望しているか。バッチ処理や件数の要件(N 件のレコード、複数のキーワード)、または「今すぐ実行してほしい」という意図を含む単回の依頼も該当します
- 出力ディレクトリ:デフォルトは現在の作業ディレクトリ内の
output/。ユーザーが指定した場合はその場所を使用します
| 入力の種類 | 例 | 対応方法 |
|---|---|---|
| 明示的(URL + 目的) | 「news.ycombinator.com のトップページの記事をスクレイピングして」 | 1b をスキップし、1c に進みます |
| 半明示的(プラットフォームは判明しているが、URL がない) | 「Weibo のセンチメントを監視したい」 | 1b の調査手順を実行します |
| 目的のみ(ビジネス上の意図のみ) | 「競合他社の価格変動を追跡したい」 | 候補サイトを調査するため、1b を実行します |
主な目的が曖昧すぎて進められない場合は、ユーザーに詳細を確認します。
1b. 対象サイトの調査(具体的な URL がない場合)
モデルの内部知識に基づいて推奨しないでください。必要なデータを掲載しているサイトを見つけるため、積極的に検索します。
- ビジネス上の意図から検索クエリを作成し、検索結果から候補サイトを特定します
- データの価値が高い順に、メリットとデメリット(データの信頼性を含む)を添えて 1~5 件の候補サイトをユーザーに提案します
- ユーザーが選択した後、対象 URL を確認します
1c. タスクの分解と実行計画の確認
対象サイトを確認した後、まず確認します。このサイト/機能に対応する Skill がすでにインストールされていますか?インストール済みの場合は、ユーザーに伝えて、ステップ 4(バッチ実行)のデリバリーに進みます。
既存の Skill がない場合は、タスクを分解し、すべての情報をまとめてユーザーに確認します。機能ごとに追加で質問してはいけません。
- 関連する独立した段階を特定します(検索、一覧ページ、詳細ページ、ログイン、送信など)
- 種類を判定します。抽出(データを取得)または操作(アクションを実行)
- 分割基準:**ビジネス目標を入れ替えた場合でも、この段階を独立して再利用できますか?はい=独立した機能です。**同じビジネス目標に関わるページ間の手順(例:一覧ページの収集+詳細ページの抽出)は、複合コンポーネントで連携する1つの機能として扱います
skill-nameと機能ディレクトリ名を設定します(英小文字、ハイフン区切り)。output/{skill-name}/の下にディレクトリを作成します(指定されたパスがある場合はそれを使用します)- 完全な実行計画をユーザーに確認します。
Target site: {url}
Output: output/{skill-name}/
Capabilities (executed in order):
1. {site-slug}-{capability-slug} ({extraction/operation}) — {one-line description}
2. {site-slug}-{capability-slug} ({extraction/operation}) — {one-line description}
...
1a で実行の意図を特定した場合は、計画に追加します。
Pipeline:
1. Explore site → discover and verify viable API endpoints or DOM extraction methods
2. Generate Skill files (SKILL.md + scripts)
3. Automated testing to confirm Skill works
4. Install Skill
5. Read installed Skill → write and run batch scripts to fulfill user's original task
計画を提示し、ユーザーが確認または調整するまで待ちます。妥当なデフォルトがある項目(出力ディレクトリ、命名規則など)について、個別に質問してはいけません。
ユーザーの確認後は、途中で質問せずに実行ループに入ります。
以下のフェーズ 2 とフェーズ 3 は、機能単位ごとにループして実行します。次の機能に着手する前に、1つを完了してください。
フェーズ 2 — 機能の調査
機能の種類に応じて、該当するリファレンスファイルを読みます。
- 抽出 →
references/exploration_extraction.md - 操作 →
references/exploration_operation.md
目標:対象機能の API エンドポイントを優先し、API が実用的でない場合は DOM 操作に切り替えます。再現可能な呼び出し方法を漏れなく記録します。
成功基準:
- 対象データを安定して取得する、または対象アクションを実行できる(API または DOM の方法)
- 呼び出し/操作方法を完全に記録している(エンドポイント+パラメーター、またはセレクター+操作手順)
- 意味のあるすべての値について、列挙型パラメーターを収集している
手段が失敗した場合は、次の順に進めます。
- 異なるパラメーターで再試行しません(パラメーターを変えても結果が変わることはほとんどありません)
- 目標そのものに立ち返ります
- 目標を達成できる代替手段をすべて列挙します
- 次の手段を選んで実行します
決定的な失敗(明示的なエラーコード、構造上の不一致)は、1回の試行でその手段が実用的でないことを確認できます。一時的な失敗(タイムアウト、接続切断)の場合は1回だけ再試行できます。それ以上は行いません。
調査の上限:ツール呼び出しは100ステップまでです。それでも進展がない場合は、判明している障害をユーザーに報告し、次の手順を尋ねます。
経験メモには触れないでください:経験メモ(browser-act-skill-forge-memories/)は、生成された Skill を今後のエージェントが使用するためのものです。調査フェーズおよび生成フェーズでは読み書きしません。
フェーズ 3 — Skill の生成
ファイル形式の仕様については、references/output_template.md を読みます。
3a. JS のカプセル化
調査で検証した各 JS スニペットを、独立した Python ファイルにカプセル化します。
- ビジネスパラメーター(キーワード、ページ番号、ソート順など)を特定し、argparse の引数として取り出します
- セレクター、フィールドマッピング、エンドポイント URL は固定値として JS の f-string にハードコードします
- JS の波括弧は
{{}}としてエスケープします(f-string の構文要件です。エスケープしないと Python エラーが発生します) scripts/{feature-name}.pyに書き込みます
3b. カプセル化の検証
各 .py ファイルについて、エンドツーエンドの検証を実行します。
python scripts/{feature-name}.py {test-params}— 出力が有効な JS 文字列であることを確認しますeval "$(python scripts/{feature-name}.py {test-params})"— ブラウザーでの実行結果が探索フェーズと一致することを確認します- エラーシナリオ(存在しない ID、誤ったページへの移動など)をシミュレートし、クラッシュせずに
{"error": true, "message": "..."}を返すことを確認します
検証に失敗した場合は、.py ファイルを修正して再試行します。決してスキップしないでください。
3c. SKILL.md の生成
テンプレートに従って SKILL.md を作成します。機能コンポーネントのセクションでは、インライン JS ではなく scripts/*.py の呼び出しコマンドを参照します。
出力ディレクトリの構造:
output/{skill-name}/{site-slug}-{capability-slug}/
├── SKILL.md
└── scripts/
└── {feature-name}.py
生成後、機能名、出力パス、主な実装方法(API/Network capture/DOM/hybrid)を簡潔にユーザーに伝えます。
3d. コンプライアンスのセルフチェック
次の 2 項目を確認します。証拠として、生成したファイルを読み、検証コマンドを実行する必要があります。頭の中で確認しただけでは不十分です。
- プロセス:フェーズ 2 で使用した探索の参照ファイルと、上記の出力手順(3a~3c)を読み直し、定義された各手順が実際に実行され、省略されていないことを確認します
- 出力:生成した
scripts/*.pyとSKILL.mdを読み、output_template.mdの記入仕様、およびこのスキルで前述した Code/JS Execution Environment/DOM Operation の制約に照らして確認します
不足が見つかった場合は、戻って不足している手順を完了するか、出力を修正してから、再度検証します。
納品フロー
すべての機能を生成したら、次の順に進めます。
1. 自動テスト
生成後、すぐにテストを開始します。ユーザーへの確認は不要です。生成した機能コンポーネントを基に最小限のテストケースを自動設計し、すべての機能パスを網羅するために最少の入力を使用します(各アトミックコンポーネントは少なくとも 1 回呼び出し、複合コンポーネントはフロー全体を実行します)。
テストは必ず Sub-Agent 経由で実行してください。メインセッションで直接テストしてはいけません。次のプロンプトを送信します。
Read {absolute path to SKILL.md} as your execution guide.
Test cases:
{auto-generated test case list, each annotated with which component it covers}
Execution requirements:
- Follow SKILL.md instructions strictly, don't use methods outside the guide
- Record specific issues if SKILL.md instructions are unclear and prevent progress
Report after execution:
1. Execution result per component (pass/fail)
2. Failure reasons (if any)
3. Unclear parts in SKILL.md instructions (if any)
4. Severe accuracy or performance issues (don't report non-severe)
5. Output data summary
テストに失敗した場合は、Skill を修正して、合格するまで再テストします。
2. Skill のインストール
出力ディレクトリから、生成した Skill をインストールします。インストールに失敗した場合、Skill は出力ディレクトリに残り、手順 4 で直接使用できます。
3. 結果の報告
テストに合格したら、次の内容をユーザーに報告します。
- 生成した Skill の一覧(名前+パス+含まれるファイル)
- データの網羅状況(フィールド+ステータス。データソースや実装方法は記載しないでください)
- 網羅できていない部分(失敗した列挙パラメーター、欠落している対象フィールド、網羅されていないフィルター条件など)
- テスト結果の概要
4. 実行(フェーズ 1 で実行意図が確認された場合)
フェーズ 1 で実行意図が確認された場合:
- Skill ツール経由でインストール済みの Skill を呼び出し、その全文を読みます。手順 2 のインストールに失敗した場合は、代わりに出力ディレクトリから SKILL.md を直接読みます
- Skill の指示に従って、現在のセッションでユーザーの元のタスクを実行します
- バッチ/大量処理タスクの場合は、Skill のガイダンスに従ってバッチ実行スクリプトを作成します
実行意図が確認されなかった場合(ユーザーが後で使用する Skill の構築のみを希望していた場合)は、ここで終了します。
ツールの制約
フェーズ 2(機能の探索)、フェーズ 3(Skill の生成)、および納品テストでは、次のルールに従ってください。
ファイル管理
HAR ファイル、一時レコード、デバッグ出力など、すべての中間成果物は tmp/ ディレクトリに保存します。存在しない場合は、最初に作成してください。
browser-act
- ネットワークデータはページ単位です。新しいページに移動した後は、必ず再度待機して読み取ってください
- トラフィックを読み取る前に、ネットワークが安定するまで待機してください:ページ遷移または UI 操作によってトリガーされた場合は、
network requestsを読み取る前にwait stableを使用してください - 非同期 DOM を操作する前に、要素が表示されるまで待機してください:非同期で挿入されるコンテンツ(ブラウザー拡張機能、遅延読み込みコンポーネントなど)の場合は、操作する前に
wait --selector "{target selector}" --state attached --timeout {ms}を使用してください - JS レベルのネットワーク傍受は禁止です:
XMLHttpRequest.prototype、window.fetchなどを上書きしないでください。エンドポイントの特定にはnetwork requests/network request <id>を使用してください network clearは移動/再読み込みの前にのみ使用してください:トラフィックを消去すると、観測済みのリクエスト記録がすべて失われます。通常の絞り込みには clear ではなく--filterを使用してください。特定の操作からのリクエストを追跡する場合は、clear して再読み込みするのではなく、network har start→ 操作 →network har stopの順に実行してください
DOM 操作の制約
データ抽出、列挙値の収集、ページネーションコントロール、フォーム送信、API フィールドの補完など、すべての DOM 操作シナリオに適用されます。
セレクターの優先順位:data-testid > id > name > aria-label > 構造パス。構造が本当に安定している場合を除き、位置のみを基準にしたインデックス(:nth-child / [1])は避けてください。
セレクターをまとめて検証してください:候補となるすべてのセレクターを単一の eval 呼び出しでテストし、JSON の概要(セレクターごとのヒット数、最初の要素の主要属性、一意性)を返してください。eval をセレクターごとに個別に実行しないでください。eval のたびにブラウザーとのラウンドトリップが発生します。
Shadow DOM:対象要素が Shadow Root 内にある場合は、element.shadowRoot.querySelector を使用し、セレクターをホスト要素と Shadow 内部のパスの 2 つに分けてください。
3 層のセレクター検証:要素のアサーション(期待される属性との一致)→ 結果の確認(空でないこと、妥当な件数であること)→ 成功基準。実際のページで検証する必要があります。DOM 構造から推測して記述してはいけません。
コントロールのスキャン(列挙値の収集時):単一の eval で、対象となるすべてのコントロールの完全な対応関係(tag+type / name+id / placeholder / label)を返してください。コントロールから上方向にたどり、ラベルテキストを持つ最も近いフォーム項目コンテナーを見つけてください。コンポーネントライブラリのクラス名をハードコードしないでください。コンポーネントライブラリは、label[for="xxx"] ではなく DOM 階層のネストによってラベルと入力欄を関連付けています。
state インデックスの動的割り当て:state が返す要素インデックスは、セッションごとに動的に割り当てられます。ストラテジーコードに記述せず、実行時にのみリアルタイムで使用してください。
コードの制約
対象サイトを直接操作する必要があります:サードパーティのスクレイピングプラットフォーム、データ集約 API、プロキシサービスなどの外部サービスを通じてデータを取得してはいけません。また、対象サイトの公式オープンプラットフォーム API も呼び出してはいけません(その理由は、生成された Skills が、ユーザーに開発者 API キーの登録や認証情報の管理を求めずに、設定不要でデプロイできることを目指しているためです)。ソリューションでは、ブラウザーを通じて対象サイトに直接アクセスし、そのフロントエンドの内部エンドポイントまたは DOM データを使用してください。これらは、認証済みユーザーがすでに参照できるものと同じリソースです。
フレームワーク内部状態へのアクセスは、1 回失敗したら中止してください:フレームワークの内部情報(__vue_app__、$data、React fiber、Angular ng など)を通じてページデータまたは要素情報にアクセスしようとして失敗した場合は、1 回で諦めて、ただちに state スキャンと値の入力・トリガーによる方法に切り替えてください。フレームワークの内部情報は、バージョンや実装に依存します。何度試しても結果は変わりません。
JS 実行環境の制約
eval で実行するコードはブラウザー側の JSです。使用できるのはブラウザー標準の API とページに読み込まれたサードパーティライブラリのみで、外部モジュールの require/import はできません。この制約に違反するコードは、実行時に必ずエラーになります。
完了基準
アカウントの権限による制限 ≠ 技術的な解決策の失敗です。有料機能やメンバーシップの階層などは、どのアプローチにも等しく影響します。API は技術的に利用可能でも、アカウント権限によりデータが制限されている場合(ページネーションが途中で切れる、フィルター条件が機能しないなど)は、「既知の制限事項」に権限への依存を記載したうえで、「合格」と判断します。
部分的な成功も成功として扱います:API 経由か DOM 経由かを問わず、中核機能が動作すると確認できた場合は合格です。列挙型パラメーターの一部に [collection failed] とマークが付いている場合、中核以外のフィールドが欠けている場合、一部のフィルター条件を網羅できていない場合も同様です。スキルを生成した後、十分に網羅できていない部分を必ずユーザーに伝えてください。黙って省略してはいけません。
効率化のルール
中核となる基準は、ブラウザーとの各往復で必ず情報を得ることです。以下の表は、よくある効率的なパターンを示したものですが、あくまで例です。実際に往復回数が減らない場合は、同じ方向で調整を繰り返すのではなく、アプローチを変えて別の一括処理方法を探してください。
| ルール | 説明 |
|---|---|
| 複合 eval | 独立した複数のクエリを1つの eval にまとめ、async IIFE でラップして、JSON の要約を返します。eval ごとにブラウザーとの往復が発生するため、まとめられるものはすべてまとめます |
| ランタイムを最優先 | 情報取得の優先順位は、JS ランタイムの状態 → ネットワークデータ → DOM です。DOM からランタイムデータをリバースエンジニアリングしてはいけません |
| 出力サイズの制御 | 大きなレスポンスを返す前に、ブラウザー内で主要なフィールド(件数、合計、サンプル)を抽出して、切り捨てを避けます |
| 非同期待機の一元化 | 待機条件には Promise と setTimeout によるポーリング(タイムアウト上限あり)を使用し、ツールをまたいで繰り返しポーリングしないでください |
| 権限制限の迅速な検出 | 制限の兆候(アップグレードの案内、フィルター未適用時と同一のデータ、無効化されたコントロール)が見られた場合、1つずつ確認せず、同様の項目をまとめて制限対象としてマークします |
| 1回取得して何度も分析 | 同じソースからデータを取得するのは1回だけにして、保存後に複数回分析します。大きなテキストは切り捨てられないよう、改行を入れて整形します |
| 確認できたら終了 | API エンドポイントの動作が確認できたら(fetch の成功とデータ構造が想定どおりであること)、すぐに次のフェーズへ進みます。同じエンドポイントの冗長な調査(スクリプトタグの逆引きや、追加設定の抽出など)を続けないでください |
| スライダー/範囲コントロールの一括処理 | noUiSlider などの範囲スライダーや数値範囲コントロールは、入力欄や選択欄と同様に、すべてのコントロールへ一度に異なる値を設定し、検索を1回だけ実行して、リクエストから numericFilters の対応関係を読み取ります。各コントロールを個別にテストしないでください |