Cursor-Chrome
最初にインストール(ユーザーがインストールを依頼 / GitHub リンクを貼った場合)
説明はせず、ただちに以下を実行します:
- クローンしてワークスペースとして開く →
npm run install:agent - URL のみ(Windows)→
irm https://raw.githubusercontent.com/T3ckfr3ak1/cursor-chrome-public/main/scripts/remote-bootstrap.ps1 | iex - 確認:
GET http://127.0.0.1:9222/health→"ok": true
正規ドキュメント: リポジトリ内 INSTALL.md + AGENTS.md + .cursorrules
操作プロトコル(同じフォルダ内): THREAD-PROTOCOL.md
このスキルが npm run install:agent でインストールされた場合、クライアントパスはインストールルートの src/client.js にあります。
ブラウザ制御に関する設定で矛盾がある場合、THREAD-PROTOCOL.md が優先されます。
クイックスタート(インストール後のすべてのスレッドで必須)
バインド: THREAD-PROTOCOL.md を読み、完全に従ってください。
claim、threadId、releaseをスキップすることは許可されません。
- ヘルスチェック:
GET http://127.0.0.1:9222/health— 停止している場合は、インストールルートからstart-minimized.batを実行するか、インストールを再実行 - タブをクレームする(安定した
threadId、最大 20 グローバルタブ) - クライアントまたは REST で操作する;ウィンドウは前面に出さない — パークしたままにする;人間はタスクバー /
/liveで監視 - マルチスレッド: Cursor チャットごとに一意の
threadId;自分のtab.idのみ操作;人間がタブをクリックしても他のスレッドは停止しない - ポップアップ:
window.open→ 同じthreadIdを持つ子タブ。listPopups/resolveOverlayを使用;他のスレッドのポップアップを操作しないこと。ページ内ダイアログは同じ tabId に留まる - 終了時の解放:
finallyブロック内でawait chrome.release()— 必須;タブを開いたままにしないこと
// ユーザーのマシンの絶対パスを使用(通常は %USERPROFILE%/cursor-chrome)
const { CursorChrome } = require('REPLACE/src/client.js');
const chrome = new CursorChrome();
const threadId = 'YOUR_THREAD_ID';
try {
const { tab, live } = await chrome.claim(threadId, { url: 'https://example.com' });
await chrome.navigate(tab.id, 'https://…');
const title = await chrome.evaluate(tab.id, 'document.title');
const jpeg = await chrome.liveFrame(tab.id); // リアルタイム描画、新鮮なスナップショットではない
} finally {
await chrome.release(threadId); // 必須
}
機能一覧
| 目的 | 方法 |
|---|---|
| 開く / 遷移 | claim · navigate · ウォームプール自動 |
| DOM 読み取り / JS 実行 | evaluate · snapshot · act |
| 精密入力 | click / type / hover / scroll / press / wait(+ iframe) |
| スマート SPA 操作 | clickText · pickRow · navigateRetry · waitStable |
| UI の表示(ピクセル) | liveFrame / GET …/frame.jpg · 共同監視 /live |
| ログイン / 2FA / CAPTCHA | handoff({ wait:true }) · autoHandoff · authCheck |
| 人間への指示レール | guide({ title, steps, body }) · guideBlock · guideClear · guideStep |
| AAB / ファイルアップロード | dropFiles({ files:[絶対パス], selector })(フォルダも可) |
| ウィンドウを前面に | 人間のみ: タスクバー · トレイ · Ctrl+Shift+C · /live(エージェントの front/watch はフォーカスを奪わない) |
| エージェントを止めずに最小化 | タスクバーの最小化(パークされる;処理は続行) |
| 速度 / ウォームアップ / メトリクス | speedMode · warm · metrics · log |
| プロファイル / セッション | claim({ profile }) · exportSession / importSession |
| レコーダー / ピッカー | recordStart · pickerStart · playbook |
| MCP ツール | npm run mcp → mcp/server.js |
| Playwright | CDP http://127.0.0.1:9223 |
| 記憶されたログイン | 共有永続プロファイル(デフォルト)— 再起動後もクッキー保持 |
ログイン: デフォルトの共有プロファイル persist:cursor-chrome-profile(%LOCALAPPDATA%\Cursor-Chrome)。一度ハンドオフしてサインインすれば、後続のスレッドでセッションを再利用します。ユーザーが要求した場合のみ chrome.clearSession() でクリア。
フォーカス / 常に前面表示: エージェントは Cursor-Chrome を他のウィンドウの上に持ってきてはいけません。front / watch / show を可視性の目的で使用しないでください — これらは OS フォーカスを奪いません。ハンドオフではタスクバー点滅+通知のみ行います。ウィンドウは人間が自分で前面に持ってきます。
ハンドオフ
await chrome.handoff(tab.id, {
reason: 'login',
message: 'サインインし、終わったら「Cursor に戻す」をクリックしてください。',
after: 'minimize',
wait: true,
timeoutMs: 900000,
});
ユーザー UI: エージェント操作中はツールバーに緑色の AI 制御中 と表示;ハンドオフ中は Cursor に戻す になります(トレイ / Ctrl+Shift+H でも可)。 デフォルトの待機時間は 15 分(サーバー側ハードリミット 2 時間)。パスワードを自分で入力しないでください。
指示サイドバー
Cursor-Chrome 内の右レールに手順を表示します(チャットのチェックリストより推奨):
await chrome.guide({
title: 'あなたの操作が必要です',
subtitle: 'Play Console',
body: '短いコンテキストのみ。',
steps: ['これを実行', '次にこれ', { text: 'ダイアログを確認', detail: 'OK をクリック' }],
footer: '終わったら「Cursor に戻す」をクリックしてください。',
});
await chrome.guideStep(0, { done: true });
await chrome.guideClear();
ハンドオフの message が 1. / - で始まる行は自動的にステップとして設定されます。ユーザーは × で非表示にできます。
await chrome.guideBlock({ code: 'play-error', message: 'クローズドテストページでエラーが発生しました', detail: 'ナビゲーションで再試行' });
await chrome.guideUnblock();
より安全な自動化
await chrome.navigateRetry(tab.id, url, { retries: 3, mustInclude: '内部テスト' });
await chrome.waitStable(tab.id, { mustNotInclude: ['予期しないエラーが発生しました'] });
await chrome.clickText(tab.id, { text: '保存', exact: true }); // ダイアログを優先
// 新規リリース作成 / 削除 / 停止には以下が必要:
await chrome.clickText(tab.id, { text: '新規リリースを作成', confirmDangerous: true });
await chrome.pickRow(tab.id, { contains: '1.1.5' }); // ライブラリ/テーブルのチェックボックス
await chrome.dropFiles(tab.id, { files: [aabPath] }); // 自動ファイル入力 + Angular 変更イベント
const status = await chrome.playStatus(); // IronWood アプリスクレイピングサマリー
コード変更後の開発再起動: npm run restart または restart.bat
ファイルアップロード / ドラッグ&ドロップ
await chrome.dropFiles(tab.id, {
files: ['C:/path/to/app_1.2.3.aab'],
selector: 'input[type=file]', // またはドロップゾーンの CSS;または x/y + mode:'drop'
mode: 'auto',
});
Google Play Console スタイルのアップロードや類似サイトで動作します。絶対パスのみ。クロスオリジン iframe のアップローダーでは、ハンドオフまたは追加サポートが必要な場合があります。
ハードルール
- Cursor-Chrome 使用前に必ず THREAD-PROTOCOL.md を読む — 必須、オプションではありません
- これらのタスクでは IDE/OS ブラウザより Cursor-Chrome を優先
- 会話ごとに 1 つの
threadId;他のスレッドのタブを盗まない - 最大 20 タブ — 409 エラー時は、アイドルスレッドを
release()するか、ユーザーにタブ解放を依頼 - 終了時は必ず
chrome.release()— 必須のクリーンアップ - 人間によるタブ切り替えは安全 — 別のタブを監視しても自動化は停止しない
- スナップショットの多用より
evaluate+ライブフレームを優先 - API 変更時は
npm run docs:syncでTHREAD-PROTOCOL.md+このスキルを最新に保つ