Skip to content

Add: 利用者の Chrome を開発コンテナから CDP で操作する Skill chrome-cdp を足す - #2153

Open
takemi-ohama wants to merge 5 commits into
developfrom
feature/chrome-cdp
Open

takemi-ohama wants to merge 5 commits into
developfrom
feature/chrome-cdp

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

開発コンテナの中のエージェントが、利用者の PC で動いている Chrome を CDP で操作する手順を Skill にした。認証のある画面は、利用者がいつもの Chrome でログインして目視し、E2E のような大量の操作は、その Chrome から取り出した Cookie でコンテナの headless の Chromium が回す。

開発環境がリモートのホスト(AWS EC2)の上のコンテナへ移り、以前の host.docker.internal:9222 が使えなくなったことがきっかけ。エディタのポート転送は向きが逆で代わりにならないため、SSH の RemoteForward と、ホストのネットワークで動く中継(socat)で届かせる。carmo-system-console の画面モックの E2E で、この経路を実際に使って alpha の検証を通した。

  • plugins/ndf/skills/chrome-cdp/SKILL.md: 経路の判定(同じ PC の Docker / リモートのホスト)、PC 側の設定、中継の立て方、Host ヘッダの上書き、Playwright での接続、Cookie の取り出し、安全のための決まり
  • references/local-side-setup.md: 利用者の PC で動くエージェント(WSL の Claude など)へそのまま渡す指示書
  • 4 ランタイムすべてへ配る(manifests・plugin.json・数の記載・EXPECTED_COUNTS)
  • playwright-kit を chrome-cdp へ寄せる。references/browser-connection.md から Chrome の起動フラグ・WSL2 / macOS の経路・ネットワーク別の到達手段を外し、/ndf:chrome-cdp を案内する。pytest の cdp-remote 設定と conftest の統合は残す。既定のプロファイルで CDP を開く手順は Chrome 136 以降で動かず、--remote-allow-origins=* は検査ごと外すため使わない。同じ前提の scripts/start-host-chrome.sh は削除する
  • cdp_endpoint は IP で書く。名前だと Chrome が Host ヘッダを理由に拒むが、IP なら Host を書き換えずに connectOverCDP が通る(Chrome 155 で確認)。テンプレートの例も IP に揃え、chrome-cdp にもこの点を書き足す

安全のための決まり: 9222 をネットワークへ開かない(CDP には認証が無い)、context.cookies() は対象の origin を渡して呼ぶ(引数なしだと全サイトの Cookie が取れる)、利用者のタブを閉じない。

関連する issue: なし(利用者の依頼で直接起こした)

Test plan

  • bash scripts/build-runtime-plugins.sh --check — 生成物は最新
  • python3 scripts/check-skill-frontmatter.py — 通過(codex の初期一覧 10753 / 15177 文字)
  • python3 scripts/check-skill-repo-assumptions.py — 通過
  • python3 scripts/check-doc-staleness.py --root . — 通過
  • python3 scripts/check-markdown-links.py --root . — 通過
  • uv run --frozen --project . --all-extras pytest . -q -n 4 — 10412 passed, 1 failed(下の既存の失敗)
  • bash scripts/validate-runtime-plugins.sh — 8 errors(下の既存の失敗)

未検証の項目: Codex・Kiro・agy での実際の発動(Claude Code では手順どおりに使って alpha の E2E を通した)
既存の失敗:

  • validate-runtime-plugins.sh の 8 errors はエージェント定義の model(Invalid model tier sonnet)に対するもので、変更前の develop でも同じ 8 件が出る
  • test_external_ai_run.py::test_success_returns_file[agy] は、手元の環境で agy の CLI が起動できない(launch_failed)ため。今回の変更は agy の起動に触れていない
    範囲外と判断したもの: 中継コンテナを立てる処理のスクリプト化(いまは本文のコマンド 1 つで足りる)

影響範囲

配布先 変わるか
Claude Code 変わる(Skill が 48 → 49 個)
Codex 変わる(44 → 45 個)
Kiro CLI 変わる(45 → 46 個)
agy 変わる(44 → 45 個)
playwright-kit 変わる(start-host-chrome.sh を削除。CDP 接続の説明は /ndf:chrome-cdp へ)

🤖 Generated with Claude Code

https://claude.ai/code/session_01KYHP7zFtYgAYtprVz6q6a2

takemi-ohama and others added 5 commits October 27, 2026 10:06
ログインと目視は利用者の Chrome で行い、大量の操作は Cookie を取り出して
コンテナの headless で回す。リモートのホスト(EC2 など)の上のコンテナからは、
SSH の RemoteForward とホストの中継(socat)で届かせる。9222 をネットワークへ
開かないこと、対象の origin の Cookie だけを取ることを決まりにする。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP7zFtYgAYtprVz6q6a2
… を読む形に置き換える

Claude Code が Skill 本文の $2 $3 を起動時の引数に置き換えるため、skill-frontmatter-check が落ちていた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP82g1gdLBLQ9WcKeiJo
- browser-connection.md から Chrome の起動フラグ・WSL2 / macOS の経路・ネットワーク別の到達手段を外し、/ndf:chrome-cdp を案内する。pytest の cdp-remote 設定と conftest の統合は残す
- 既定のプロファイルで CDP を開く手順は Chrome 136 以降で動かず、--remote-allow-origins=* は検査ごと外すため、どちらも使わない
- 同じ前提に立つ scripts/start-host-chrome.sh を削除する
- cdp_endpoint は IP で書く(名前だと Chrome が Host ヘッダを理由に拒む。IP なら Host を書き換えずに connect_over_cdp が通ることを Chrome 155 で確認)。テンプレートの例も IP に揃える
- chrome-cdp に、Host の書き換えが要るのは名前で接続するときだけであることを書き足す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP82g1gdLBLQ9WcKeiJo
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

範囲外と判断し、#2154 として残した(CI の pytest が 1 回 10〜13 分かかる件。目標 3 分)。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant