@youtyan/browser-pilot 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,193 @@
1
+ ---
2
+ name: bp-testing
3
+ description: Use when testing web applications interactively using browser-pilot MCP tools. Triggers on "テスト", "動作確認", "E2Eテスト", "verify", "check functionality", "test scenario", "ブラウザテスト", "画面確認".
4
+ ---
5
+
6
+ # Browser Testing — エージェント駆動Webアプリテスト
7
+
8
+ webapp-testingの代替。Playwrightスクリプトを書く代わりに、browser-pilot MCPツールで直接テストする。
9
+
10
+ ## Authoritative Test Spec
11
+
12
+ `apps/test-sandbox/CHECKLIST.md` が全ツールのE2Eテスト仕様書。ツール追加・変更時はそちらを参照。
13
+
14
+ ## Decision Tree
15
+
16
+ ```dot
17
+ digraph {
18
+ "テスト対象?" [shape=diamond];
19
+ "サーバー起動済み?" [shape=diamond];
20
+ "browser_tab create" [shape=box];
21
+ "browser_tab list+connect" [shape=box];
22
+ "シナリオ実行" [shape=box];
23
+ "結果判定" [shape=box];
24
+
25
+ "テスト対象?" -> "サーバー起動済み?" [label="URL既知"];
26
+ "サーバー起動済み?" -> "browser_tab create" [label="yes"];
27
+ "サーバー起動済み?" -> "サーバー起動 → tab create" [label="no"];
28
+ "browser_tab create" -> "シナリオ実行";
29
+ "テスト対象?" -> "browser_tab list+connect" [label="既にタブで開いてる"];
30
+ "browser_tab list+connect" -> "シナリオ実行";
31
+ "シナリオ実行" -> "結果判定";
32
+ }
33
+ ```
34
+
35
+ ## Tool Quick Reference
36
+
37
+ ### Navigation & Page Content
38
+ | Tool | Purpose |
39
+ |------|---------|
40
+ | `browser_tab` | list / connect / create / close タブ管理 |
41
+ | `browser_get_page` | ページ取得(html / markdown / text / accessibility) |
42
+ | `browser_navigation` | back / forward / reload |
43
+ | `browser_screenshot` | スクリーンショット |
44
+ | `browser_pdf` | ページをPDFに保存 |
45
+
46
+ ### Interaction
47
+ | Tool | Purpose |
48
+ |------|---------|
49
+ | `browser_click` | テキスト or セレクタでクリック(all, waitSelector対応) |
50
+ | `browser_action` | hover / dblclick / contextmenu / drag / focus / blur + 座標モード |
51
+ | `browser_set_values` | input / textarea / select / contenteditable に値設定(fields配列で一括) |
52
+ | `browser_select_option` | native select + カスタムドロップダウン選択 |
53
+ | `browser_keyboard` | キー入力(modifier, repeat対応) |
54
+ | `browser_scroll` | direction / scrollTo / intoView / container scroll |
55
+ | `browser_handle_dialog` | alert / confirm / prompt 制御 |
56
+ | `browser_paste_file` | ドロップゾーンにファイルペースト |
57
+ | `browser_upload_file` | input[type=file] にファイルアップロード |
58
+ | `browser_batch` | 複数アクションを1回のラウンドトリップで実行 |
59
+
60
+ ### Query & Inspection
61
+ | Tool | Purpose |
62
+ |------|---------|
63
+ | `browser_find_elements` | tag / text / role / attribute / nearText で要素検索 |
64
+ | `browser_get_attributes` | 要素の属性値取得 |
65
+ | `browser_get_bounds` | 要素の座標・サイズ取得 |
66
+ | `browser_wait_for` | appear / disappear / count_change 待機 |
67
+ | `browser_execute_javascript` | 任意JS実行(BP_ALLOW_EXECUTE_JS=1 必須) |
68
+ | `browser_extract` | セマンティック構造化データ抽出(決定的アルゴリズム、LLM不使用) |
69
+
70
+ ### Debugging & Diagnostics
71
+ | Tool | Purpose |
72
+ |------|---------|
73
+ | `browser_console` | コンソールログ取得(level / textPattern フィルタ) |
74
+ | `browser_network` | ネットワークリクエスト取得(method / status / URL フィルタ) |
75
+ | `browser_performance` | メトリクス + diagnose_layout / diagnose_network / diagnose_runtime / diagnose_accessibility / diagnose_memory |
76
+ | `browser_css_inspect` | 要素のcomputed style + 競合CSSルール分析 |
77
+ | `browser_diagnose_interaction` | クリック/入力が効かない原因を診断(overlay, pointer-events, disabled等) |
78
+ | `browser_health` | ページ全体のヘルスチェック(console errors, failed requests, CWV概要) |
79
+ | `browser_storage` | localStorage / sessionStorage の読み書き |
80
+ | `browser_cookie` | Cookie の取得・設定・削除 |
81
+
82
+ ### Annotation & Recording
83
+ | Tool | Purpose |
84
+ |------|---------|
85
+ | `browser_annotate` | rect / arrow / text / mosaic / badge アノテーション |
86
+ | `browser_record` | 操作をWebM動画に録画 |
87
+
88
+ ### Assertion
89
+ | Tool | Purpose |
90
+ |------|---------|
91
+ | `browser_assert` | プログラマティックなページアサーション(テキスト存在、要素数、属性値等) |
92
+
93
+ ## テストシナリオの実行パターン
94
+
95
+ ### 1. Navigate & Assert
96
+
97
+ ```
98
+ browser_get_page { url: "http://localhost:3000", mode: "markdown" }
99
+ # → Markdownに "ダッシュボード" が含まれることを確認
100
+ ```
101
+
102
+ ### 2. Interact & Verify
103
+
104
+ ```
105
+ browser_set_values { selector: "#email", value: "test@example.com" }
106
+ browser_set_values { selector: "#password", value: "password123" }
107
+ browser_click { text: "ログイン" }
108
+ browser_wait_for { selector: ".dashboard", condition: "appear", timeout: 10000 }
109
+ browser_get_page { scope: ".dashboard", mode: "markdown" }
110
+ # → "ようこそ" が含まれることを確認
111
+ ```
112
+
113
+ ### 3. Programmatic Assertion
114
+
115
+ ```
116
+ browser_assert { selector: ".dashboard", condition: "contains_text", text: "ようこそ" }
117
+ # → pass/fail を自動判定。condition: exists/visible/contains_text/count
118
+ ```
119
+
120
+ ### 4. Visual Verification
121
+
122
+ ```
123
+ browser_screenshot {}
124
+ # → レイアウト崩れがないことを目視確認
125
+ ```
126
+
127
+ ### 5. Batch Execution (ラウンドトリップ削減)
128
+
129
+ ```
130
+ browser_batch { actions: [
131
+ { type: "setValue", selector: "#email", value: "test@example.com" },
132
+ { type: "setValue", selector: "#password", value: "password123" },
133
+ { type: "click", text: "ログイン" }
134
+ ] }
135
+ ```
136
+
137
+ ### 6. Diagnostic Flow
138
+
139
+ ```
140
+ # ページ全体のヘルスチェック
141
+ browser_health {}
142
+
143
+ # 特定要素のインタラクション問題を診断
144
+ browser_diagnose_interaction { selector: "#broken-button" }
145
+
146
+ # CSS問題の調査
147
+ browser_css_inspect { selector: "#misaligned-element" }
148
+
149
+ # レイアウト診断
150
+ browser_performance { action: "diagnose_layout", selector: "#overflowing-child" }
151
+ ```
152
+
153
+ ## アサーション方法
154
+
155
+ | 確認内容 | ツール | 判定方法 |
156
+ |---------|--------|---------|
157
+ | テキスト存在 | `browser_assert` | condition: "contains_text" で自動判定 |
158
+ | テキスト存在(手動) | `browser_get_page` | 返却Markdownに文字列が含まれるか |
159
+ | 要素存在 | `browser_find_elements` | マッチ件数 > 0 |
160
+ | 要素非存在 | `browser_find_elements` | マッチ件数 === 0 |
161
+ | 要素出現待ち | `browser_wait_for(condition: "appear")` | タイムアウトしなければOK |
162
+ | 要素消滅待ち | `browser_wait_for(condition: "disappear")` | タイムアウトしなければOK |
163
+ | 属性値 | `browser_get_attributes` | 期待値と一致 |
164
+ | CSS状態 | `browser_css_inspect` | computed style が期待値と一致 |
165
+ | レイアウト | `browser_screenshot` | 目視確認 |
166
+ | ページ健全性 | `browser_health` | console errors / failed requests / CWV |
167
+
168
+ ## テスト結果の報告
169
+
170
+ 各シナリオの結果を以下のフォーマットで報告:
171
+
172
+ ```
173
+ ## テスト結果
174
+
175
+ | # | シナリオ | 結果 | 備考 |
176
+ |---|---------|------|------|
177
+ | 1 | ログインフォーム表示 | PASS | |
178
+ | 2 | 正常ログイン | PASS | |
179
+ | 3 | 不正パスワード | FAIL | エラーメッセージが表示されない |
180
+ ```
181
+
182
+ ## Common Mistakes
183
+
184
+ | 間違い | 正しい対応 |
185
+ |--------|-----------|
186
+ | スクショだけでテスト完了 | `browser_assert` or テキスト取得で内容を確認してからスクショ |
187
+ | SPA操作後すぐにget_page | `browser_wait_for` で遷移完了を待つ |
188
+ | エラーケースをテストしない | 正常系の後に異常系も必ず実行 |
189
+ | 前のテストの状態に依存 | 各シナリオ開始時にページリロード or 初期状態に戻す |
190
+ | 個別ツール呼び出しが多すぎる | `browser_batch` でラウンドトリップ削減(MCP往復は約2秒) |
191
+ | クリックが効かない原因不明 | `browser_diagnose_interaction` で原因特定 |
192
+ | レイアウト崩れの原因不明 | `browser_css_inspect` + `browser_performance(action: "diagnose_layout")` |
193
+ | ページ全体の問題を個別に調査 | まず `browser_health` で全体像を把握 |
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: bp-usage
3
+ description: Use when interacting with websites, web apps, browsers, or anything involving URLs, pages, forms, buttons, screenshots, scraping, testing web UI, or automating browser tasks. Triggers on "ブラウザ", "サイト", "ページ", "URL", "Web", "フォーム", "クリック", "スクリーンショット".
4
+ ---
5
+
6
+ # Browser Pilot — ブラウザ自動化MCPツール活用ガイド
7
+
8
+ ## Overview
9
+
10
+ browser-pilot MCPツールを**積極的に**使ってWebサイトを操作する。ファイルを読むようにWebページを読み、CLIコマンドを叩くようにブラウザを操作する。「手動で確認して」ではなく、自分でやる。
11
+
12
+ ## 基本ワークフロー
13
+
14
+ ```dot
15
+ digraph workflow {
16
+ rankdir=TB;
17
+ "タブ接続" [shape=box];
18
+ "ページ取得" [shape=box];
19
+ "要素探索" [shape=box];
20
+ "操作実行" [shape=box];
21
+ "結果確認" [shape=box];
22
+ "追加操作?" [shape=diamond];
23
+
24
+ "タブ接続" -> "ページ取得";
25
+ "ページ取得" -> "要素探索";
26
+ "要素探索" -> "操作実行";
27
+ "操作実行" -> "結果確認";
28
+ "結果確認" -> "追加操作?";
29
+ "追加操作?" -> "要素探索" [label="yes"];
30
+ }
31
+ ```
32
+
33
+ ### Phase 1: 接続
34
+
35
+ ```
36
+ browser_tab(action: "list") # タブ一覧取得
37
+ browser_tab(action: "connect", tabId: 123) # 操作対象を固定
38
+ # または
39
+ browser_tab(action: "create", url: "https://...") # 新規タブ作成+自動接続
40
+ ```
41
+
42
+ ### Phase 2: ページ理解
43
+
44
+ ```
45
+ browser_get_page(mode: "compact") # 低トークンでページ概要+操作可能要素(推奨)
46
+ browser_get_page(mode: "smart") # 本文抽出(広告・ナビ除去)、長文記事向け
47
+ browser_get_page(scope: "main", mode: "markdown") # メインコンテンツのみmarkdown
48
+ browser_screenshot() # レイアウト・CSS確認
49
+ ```
50
+
51
+ ### Phase 3: 要素探索 → 操作
52
+
53
+ ```
54
+ browser_find_elements(text: "送信", tag: "button") # 要素を探す(デフォルト: accessibility engine)
55
+ browser_click(text: "送信") # クリック
56
+ browser_wait_for(selector: ".success", condition: "appear") # 結果待ち
57
+ ```
58
+
59
+ ## ツール早見表
60
+
61
+ | 目的 | ツール | 使い分け |
62
+ |------|--------|----------|
63
+ | ページ取得 | `browser_get_page` | compact(推奨): 低トークン概要+操作要素。smart: 本文抽出。navigate: 操作要素のみ。markdown/text/html/accessibility/tables/forms/links/metadata/items |
64
+ | ナビゲーション | `browser_get_page(url:)` | URL指定でページ遷移+取得を一発 |
65
+ | 戻る/進む/リロード | `browser_navigation` | action: back/forward/reload |
66
+ | クリック | `browser_click` | text/selector/ref/backendNodeId/nearTextで要素特定。cdpClick: CDP信頼イベント。nth: N番目。snapshotMode: クリック後スナップショット自動取得 |
67
+ | 一括クリック | `browser_click(all: true)` | 全マッチ要素を順にクリック |
68
+ | バッチ操作 | `browser_batch` | click/setValue/keyboard/assert/wait/selectOption/scrollを1回で連続実行。フォーム入力の高速化に最適 |
69
+ | マウス操作(セレクタ) | `browser_action` | hover, dblclick, contextmenu, drag等。通常クリックはbrowser_click |
70
+ | マウス操作(座標CDP) | `browser_action(x, y)` | Canvas/SVG/地図等の非DOM要素を座標で操作。click, hover, drag対応 |
71
+ | フォーム入力 | `browser_set_values` | fields配列で複数フィールド一括入力。React互換イベント発火 |
72
+ | ドロップダウン選択 | `browser_select_option` | ネイティブ`<select>`+カスタムドロップダウン対応 |
73
+ | キーボード | `browser_keyboard` | Enter送信, Escapeモーダル閉じ, Tab移動 |
74
+ | 要素検索 | `browser_find_elements` | engine: accessibility(デフォルト、AXツリー、backendNodeId付き)/ dom(CSS/テキスト検索)。テキスト/タグ/属性/ロール/ラベル近傍で検索 |
75
+ | 属性取得 | `browser_get_attributes` | href, src, data-*等の属性値を取得 |
76
+ | 待機 | `browser_wait_for` | 要素の出現/消滅/数量変化を待つ |
77
+ | アサーション | `browser_assert` | exists/visible/contains_text/countを即時チェック。not反転対応。wait_forと違いポーリングなし |
78
+ | 構造化データ抽出 | `browser_extract` | root+fieldsでスキーマ定義→構造化JSON抽出。semantic型(title/price/url等)で自動解決。root:"auto"で繰り返しパターン自動検出 |
79
+ | スクロール | `browser_scroll` | 方向指定, top/bottom, 要素までスクロール |
80
+ | スクショ | `browser_screenshot` | 視覚確認。レイアウト・CSS・操作結果の確認 |
81
+ | PDF保存 | `browser_pdf` | ページをPDFとして保存。savePath必須。landscape/scale/pageRanges対応 |
82
+ | 録画 | `browser_record` | action: start/stop/status。タブ操作をWebM動画で録画。~/Downloadsに保存。ffmpeg必須 |
83
+ | JS実行 | `browser_execute_javascript` | 他ツールで不可能な操作のエスケープハッチ |
84
+ | 座標取得 | `browser_get_bounds` | セレクタで要素の座標・サイズを取得 |
85
+ | アノテーション | `browser_annotate` | 要素にラベル・番号付きアノテーション描画。action: add/clear |
86
+ | ダイアログ処理 | `browser_handle_dialog` | alert/confirm/promptダイアログの応答 |
87
+ | ファイル貼付 | `browser_paste_file` | 画像/PDF等をクリップボード経由で貼付 |
88
+ | ファイルアップロード | `browser_upload_file` | `<input type="file">`にCDP経由でファイル設定。ネイティブファイル入力用 |
89
+ | コンソール | `browser_console` | console.log/warn/error等を取得。level/textPatternでフィルタ可 |
90
+ | ネットワーク | `browser_network` | HTTPリクエスト一覧取得。urlPattern/method/statusCodeでフィルタ可。requestId指定でheaders/body/cookies/timing詳細取得 |
91
+ | ストレージ | `browser_storage` | cookies(HttpOnly含む)、localStorage、sessionStorage読み取り。namePatternフィルタ対応 |
92
+ | Cookie操作 | `browser_cookie` | action: set/delete。Cookie作成・削除。url+name必須。HttpOnly/SameSite/Secure等の属性指定対応 |
93
+ | CSS検査 | `browser_css_inspect` | 要素のCSS詳細調査。inline style/matched rules/computed style/box model/ancestor chain。レイアウト問題のデバッグに |
94
+ | パフォーマンス | `browser_performance` | DOMノード数、JSヒープ、レイアウト時間等。action: metrics/start_trace/stop_trace/diagnose_load/diagnose_layout |
95
+ | 操作性診断 | `browser_diagnose_interaction` | 要素がクリック/入力可能か事前診断。not_found/invisible/disabled/coveredの原因特定。操作失敗の調査に |
96
+ | ヘルスチェック | `browser_health` | bridge/tab/lockの接続状態を1回で確認。ツール失敗時の初手診断 |
97
+ | タブ管理 | `browser_tab` | action: list/connect/create/close |
98
+ | 画像生成 | `gemini_generate_image` | Gemini Web UIで画像生成 |
99
+
100
+ ## 頻出パターン
101
+
102
+ ### SPA操作(React/Next.js等)
103
+
104
+ ```
105
+ browser_click(text: "次へ")
106
+ browser_wait_for(selector: ".step-2", condition: "appear") # 画面遷移待ち
107
+ browser_get_page(scope: ".step-2") # 新しい内容を取得
108
+ ```
109
+
110
+ **sleepは絶対使わない。** 必ず`browser_wait_for`で条件待ちする。
111
+
112
+ ### ドロップダウン(React Select等)
113
+
114
+ `browser_select_option`で統一的に選択可能(ネイティブ`<select>`もカスタムも対応):
115
+
116
+ ```
117
+ browser_select_option(selector: "#category", value: "tech") # ネイティブselect
118
+ browser_select_option(selector: ".react-select__control", text: "選択肢") # カスタム
119
+ ```
120
+
121
+ ### フォーム送信
122
+
123
+ ```
124
+ browser_set_values(fields: [
125
+ {selector: "#email", value: "user@example.com"},
126
+ {selector: "#password", value: "pass"}
127
+ ])
128
+ browser_click(text: "ログイン")
129
+ browser_wait_for(selector: ".dashboard", condition: "appear", timeout: 15000)
130
+ ```
131
+
132
+ ### フォーム一括操作(browser_batch)
133
+
134
+ ```
135
+ browser_batch(actions: [
136
+ {type: "setValue", selector: "#email", value: "user@example.com"},
137
+ {type: "setValue", selector: "#password", value: "pass"},
138
+ {type: "click", text: "ログイン"},
139
+ {type: "wait", selector: ".dashboard", condition: "appear", timeout: 15000}
140
+ ], snapshotMode: "compact")
141
+ ```
142
+
143
+ ### ページ内検索
144
+
145
+ ```
146
+ browser_find_elements(text: "エラー", tag: "div", visibleOnly: true)
147
+ browser_find_elements(role: "button", nearText: "保存")
148
+ browser_find_elements(attribute: "data-testid", attributeValue: "submit-btn")
149
+ ```
150
+
151
+ ### 構造化データ抽出
152
+
153
+ ```
154
+ browser_extract(root: ".product", fields: {
155
+ title: {semantic: "title"},
156
+ price: {semantic: "price"},
157
+ url: {semantic: "url"}
158
+ })
159
+ browser_extract() # 全自動: パターン検出+セマンティック推論
160
+ browser_extract(root: "auto") # 繰り返し要素を自動検出
161
+ ```
162
+
163
+ ### ファイルアップロード
164
+
165
+ ```
166
+ browser_upload_file(filePath: "/path/to/doc.pdf") # input[type="file"]に直接設定
167
+ browser_paste_file(filePath: "/path/to/image.png", selector: ".upload-area") # クリップボード経由で貼付
168
+ browser_wait_for(selector: ".preview img", condition: "appear") # アップロード確認
169
+ ```
170
+
171
+ ### デバッグ: 要素が見つからない時
172
+
173
+ ```
174
+ browser_get_page(mode: "html", scope: "body") # 生HTMLを確認
175
+ browser_find_elements(tag: "button", limit: 50) # ボタンを全列挙
176
+ browser_diagnose_interaction(selector: ".target") # 操作可否を事前診断
177
+ browser_annotate(annotations: [{selector: ".target", label: "これ"}]) # 視覚的に確認
178
+ browser_screenshot() # 画面状態を確認
179
+ ```
180
+
181
+ ### デバッグ: エラー・パフォーマンス調査
182
+
183
+ ```
184
+ browser_console(level: "error") # コンソールエラーを確認
185
+ browser_network(statusCode: 500) # 500エラーのリクエストを抽出
186
+ browser_network(urlPattern: "api/", method: "POST") # API呼び出しを確認
187
+ browser_network(requestId: "12345.6") # リクエスト詳細(headers/body/cookies/timing)
188
+ browser_storage(type: "cookies") # 全cookies取得(HttpOnly含む)
189
+ browser_storage(type: "cookies", namePattern: "auth") # authトークン検索
190
+ browser_storage(type: "localStorage") # localStorage全エントリ取得
191
+ browser_performance() # DOMノード数、JSヒープ等を確認
192
+ browser_performance(action: "diagnose_load") # ページ読み込み診断(LCP/CLS/INP原因特定)
193
+ browser_performance(action: "diagnose_layout", selector: ".btn") # CSS レイアウト診断(overflow/stacking/flex等)
194
+ browser_css_inspect(selector: ".misaligned-btn") # CSS詳細調査(inline/matched rules/computed/box model/ancestor chain)
195
+ browser_health() # 接続状態の確認(ツール失敗時の初手)
196
+ ```
197
+
198
+ ### 操作結果の検証
199
+
200
+ ```
201
+ browser_assert(selector: ".success", condition: "visible") # 成功メッセージが表示されているか
202
+ browser_assert(selector: ".error", condition: "exists", not: true) # エラーが存在しないことを確認
203
+ browser_assert(selector: ".item", condition: "count", expectedCount: 5) # アイテム数が正しいか
204
+ ```
205
+
206
+ ## Common Mistakes
207
+
208
+ | 間違い | 正しい対応 |
209
+ |--------|-----------|
210
+ | `sleep`で待機 | `browser_wait_for`で条件待ち |
211
+ | ドロップダウンに`browser_set_values` | `browser_select_option`を使う |
212
+ | 操作後に確認しない | `browser_wait_for`または`browser_get_page`で結果確認 |
213
+ | 接続せずに操作 | まず`browser_tab(action: "list")` → `browser_tab(action: "connect")` |
214
+ | スクショだけで判断 | `browser_get_page(mode: "compact")`でテキスト取得が基本 |
215
+ | `browser_click`後すぐ`browser_get_page` | SPAはクリック後に`browser_wait_for`を挟む。または`snapshotMode`で自動取得 |
216
+ | Extension再起動後に操作 | `browser_tab(action: "list")` → `browser_tab(action: "connect")`で再接続 |
217
+ | `browser_execute_javascript`を多用 | 専用ツールがあるならそちらを使う。JSは最終手段 |
218
+ | フォーム入力を1つずつ呼ぶ | `browser_batch`で一括実行(ラウンドトリップ削減) |
219
+ | ツール失敗時にリトライ | `browser_health`で接続状態を確認してから対処 |